Como assim enigma ?
Eu não sabia como resolver este problema…
Daí com a dica que você deu, onde o command recebe um mapa, ai ficou claro!!!
Já to vendo que vou ter que fazer um Refactoring no Projeto!
Abraços!
Thiago
Uns tutoriais interessante!
http://www.argonavis.com.br/cursos/java/j550/j550_13.pdf
http://www.argonavis.com.br/cursos/java/j931/J931_02.pdf
Abraços!
Thiago
Um dos melhores tutoriais que eu vi.
Muito bem feito.
Simples e bem feito
[quote=Rafael Nunes]Então você não tem um FrontController, você tem um Controller. FrontController seria específico de cada serviço.
[/quote]
Nao, eh o contrario
FrontController eh um ponto unico de acesso. Em ambiente web, se voce tem um controller para cada servico / pagina, tem o que chamam de PageController
Rafael
[quote=jprogrammer]Obs:
Mas o esquema seria não passar para o command nem request, nem response para que o mesmo fique desacoploado do ambiente web e possa ser reaproveitado mais facilmente.
[code]
class Command
{
public void execute(Map parameters)
{
int valor = ((Integer) parameters.get(“valor”)).intValue();
// faz o que tem que fazer
}
}
[/code][/quote]
Eh um motivo nobre, mas passar um Map nao eh uma solucao muito adequada. O ideal seria encapsular os dados em uma classe propria, como “RequestData”, que voce popula com os parametros / dados que quiser.
Rafael
Mas na especificação diz que você pode ter mais de um Controller, no FrontController. :roll:
While the Front Controller pattern suggests centralizing the handling of all requests, it does not limit the number of handlers in the system, as does a Singleton. An application may use multiple controllers in a system, each mapping to a set of distinct services.
Tudo bem, mas o ponto inicial de entrada eh o teu unico FrontController. Ele, por sua vez, delega para os casos especificos. Ou seja, a requisicao chega nos controllers “inferiores” atraves do FrontController, e nao diretamente.
Rafael
Então o FrontController seria uma Interface, e os Controllers os Servlets que implementam esta interface, como no diagrama?
Aquele diagrama sugere que voce tera um controllador extra-generico que pode delegar servicos para uma camada web, swing, texto e etc… Nao eh muito comum voce encontrar implementacoes assim… o xwork, creio, faz algo parecido com isso.
O FrontController nao eh uma interface, mas sim uma implementacao concreta que tem um minimo de conhecimento sobre o ambiente e a capacidade de delegar a requisicao para alguem mais especializado, que, nesse caso entao, seria interessante ter uma interface padrao, como se fosse um Command (considerando que nao seja um command), evitando assim um monte de if-else no teu codigo.
Rafael
Também poderia ser interessante fazer um esquema para injetar os parâmetros, não?
[]'s
Bem melhor. Essa é a evolução de ideias.
Isso é o bom do GUJ.
Poderia ser assim
class RequestData
{
private HttpServletRequest req;
public RequestData(HttpServletRequest req)
{
thisreq = req;
}
public int getInt(String key) {
return Integer.parseInt(req.getParameter)(key)
}
// asim vai...
}
class Command
{
public void execute(RequestData requestData)
{
int valor = requestData.getInt("valor");
}
}
// no controller
command.execute(new RequestData(request));
Aviso o Thiago antes que ele afça o refactory
EDITADO
Obs:
Um dos motivos por eu não gostar do struts é esse. Ele deixa a Action com forte acoplamento.
Entao, oRequestData nao deveria nem receber um HttpServletRequest… assim voce ainda esta acoplando as coisas. Voce poderia ter algo assim:
public interface RequestData {
public String getValue(String key);
// outros metodos que possam ser uteis
}
public class HttpRequestData implements RequestData {
private HttpServletRequest request;
public HttpRequestData(HttpServletRequest request) {
this.request = request;
}
public String getValue(String key) {
return this.request.getParameter(key);
}
}
public class MapRequestData implements RequestData {
private Map dados;
public MapRequestData(Map dados) {
this.dados = dados;
}
public String getValue(String key) {
return (String)this.dados.get(key);
}
}
e ai vc passa a implementacao concreta especifica para o ambiente que voce esta.
Rafael
Outra pergunta…
Seria válido eu dizer que o meu FrontController é um Filter?
Não teria alguma problema com isso?
Legal !
Mas voltando a discussão eu acredito que o FrontController é caracterizado por um objeto que atenda as requisições relacionadas a um determinado serviço como o Rafael Nunes falou.
Ou Não ?
Valeu!
Mas ainda assim estou acompanhando o tópico!
Estou distribuindo estrelas pra galera toda, pois estas informações estão sendo muito úteis para mim!
Quero aproveitar e fazer uma colocação!
O ideal seria que esta conversão do Request para um RequestData acontecesse dentro de uma classe RequestHelper…
Ou eu estou viajando? Pelo que li, foi isso que eu entendi!
Outro ponto interessante é que é no RequestHelper que ficaria a tabela contendo quais são as operações de cada command, como por exemplo,
a operação x = IncluiEmpresa, y = excluiEmpresa, e por ai vai!
É isso mesmo?
Abraços!
thiago
Poderia sim.
Não estou falando de acordo com a documentação, mas pelo que acho.
Poderia, pois o código de conversão ficarei dentro de um lugar só e você poderia usar o RequestHelper em diversos Controllers e os mesmos só teriam o papel de “despachar” requisições.
O que acham ?
Pessoal… olhem este outro tutorialzinho!
http://www.inf.ufrgs.br/procpar/direto/trabalhos/apresentacao_tc_romulo_rosinha.pdf
Dá um salvar destino como… eu só consegui visualizar assim!
Pelo que está neste tutorial, o objetivo do Request Helper é:
:arrow: Descobrir o comando que será executado!
Sem Mais!
Thiago
[quote=kina]Outra pergunta…
Seria válido eu dizer que o meu FrontController é um Filter?
Não teria alguma problema com isso?[/quote]
Nao, nao da para chamar de Filter. Embora ambos tenham algumas propriedades parecidas - o que, alias, aconcente com muitos patterns -, eles ainda sao para propositos bem distintos
Rafael
[quote=Rafael Steil][quote=kina]Outra pergunta…
Seria válido eu dizer que o meu FrontController é um Filter?
Não teria alguma problema com isso?[/quote]
Nao, nao da para chamar de Filter. Embora ambos tenham algumas propriedades parecidas - o que, alias, aconcente com muitos patterns -, eles ainda sao para propositos bem distintos
Rafael[/quote]
E usar a classe Filter como FrontController?
Há algum problema?