Desacoplamento

7 respostas
I

Estou tentando fazer a coisa da maneira correta para ter facilidades futuras, estou criando uma Servlet que recebe a requisição e instancia um novo servlet chamando o metodo execute().
-Os servlets implementam uma interface com o metodo execute.

Só que eu tenho de passsar o Obejto HttpServletRequest e HttpServletResponse.

Obejto.execute(req,resp);

Queria abstrais isso e não depender de passar o request e o response para os outros servlets que são instanciados. porque hoje em todos os Servlets tenho.

public void execute(HttpServletRequest req, HttpServletResponse res)
			throws Exception {...}

como eu posso fazer isso ?

Ja tentei criar um metodo que me retorne o Response, pois preciso do getWriter(), mas não estou indo bem.

Toda dica é válida muito válida mesmo. Obrigado.

7 Respostas

cv1

Que tal usar um framework web tipo WebWork, Struts, Mentawai ou tantos outros? Vc podia pelo menos dar uma olhada neles e ver como eles resolvem esse problema (dica, dica: o Struts nao resolve, nao se preocupe em olhar prele :))

I

Não pretendo usar nenhum Framework :slight_smile: mas andei dando uma olhada num Mentawai , só que não entendi muito bem ainda, pois ainda não cheguei em um nivel tão avançado. algo mais básico para mim entender o funcionamento seria o idéal.

Grato!

pcalcado

Ok, Igor, você está indo pelo caminh certo então (presumindo que você efetivamente sabe programar bem em java antes de se aventurar por Servlets).

1 - Por que você rpecisa isntanciar outro Servlet, por que não uma classe Java normal, um POJO?

(um POJO é uma classe Java que não implementa nenhuma interface ou estende nenhuma classe que foi obrigado, pore xemplo um Servlet é obrigado a estender HttpServlet)

I

oi pcalcado tudo bem…

Deixa eu entender, então eu continuaria tendo meu controlador(que ´um servlet no caso) e esse instanciaria uma class POJO(que não depende de ninguem :slight_smile: ), Mas como eu poderia tratar as requisições com esse POJO?
Request, Reponse essa coisa toda ?

Tipo até mesmo usar o velocity ou freeemarker com esse POJO ?
poxa se conseguir isso é fascinante, porque o meu problema é o forte aclopamento com os Objetos Response e Request.

:wink:

pcalcado

Uhmm…

O que você quer fazer é um Controlador que receba a requisição e passe apra alguém responsável por tratá-la? Bom, isso é 99% do que um framework MVC faz :slight_smile:

Para não acoplar aos objetos response/request ou qualquer oturo do Servlet, o que você deve fazer é simplesmente não deixar que esses objetos saiam dos seus servlets (ou actions, se voce usar um MVC qualquer).

Como assim?

Imagina que eu tenho:

<form action="blablsbla">
 <input name="nome" />
 <input name="idade" />
</form>

E recupero estes valores num servlet:

public void doPost(...){
 String nome = request.getParameter("nome");
 String idade = request.getParameter("idade");
}

O que você deve fazer é trabalhar com objetos. Por exemplo, poderíamos ter uma classe assim:

public class Usuario{
 private String nome=null;
 private int idade=null;

 public void setNome(String a){...}
 public void setIdade(int i){...}
 public String getNome(){...}
 public int getIdade(){...}

}

Então, seu Servlet cria uma isntãncia dessa classe usando os atributos passados:

public void doPost(...){
 String nome = request.getParameter("nome");
 String idade = request.getParameter("idade");

  usuario u =new Usuario();
  u.setNome(nome);
  u.setIdade(idade);

  ClasseQueFazAlgumaCoisa c = nw ClasseQuefazAlgumaCoisa();
   

   c.fazerAlgumaCoisa(u);
 
}

Agora, a sua “ClasseQueFazAlgumaCoisa” não depende de nada mais que do objeto Usuario :wink:

I

Essa solução é muito boa e ate mesmo eu ja conhecia ela, mas se eu precisar tratar mais de um Objeto além de usuario, vou entrar em outro problema encher meu Servlet de if/else.

if(acao.equals("cad_usuario")
  User = new User ...
if(acao.equals("cad_imovel")
.........

Eu quero meu servlet, somente para passar a requisição para alguém responsavel… por tratar esse objeto, deixar esse controlador bem pobre mesmo so instanciando os reponsaveis por cada objeto, hoje eu faço isso mas tenho de passar o req e res para os mesmos…

eu quero que eles continuem tratanto os Req e Resp mas eu passando pra eles de uma maneira mais bonita :slight_smile: . sem repetir tanto codigo como eu faço hoje em toda classe ter de Reescrever o metodo execute passando os Req e Resp por esse metodo.

pcalcado

Oi,

Quando você for usar só Servlets, não é legal colcoar todo o processamento num Servlet só, exatamente pelo problema que você mencionou. Você deveria ter Servlets diferentes para requisições diferentes, logo não ia cair neste problema.

O que você precisa é de um Front Controller. Se está pensando em usar isso numa aplicação real, novamente considere um framework. Se não, você pdoe dar uma ldia nos fontes dos frameworks (veja a do mentawai que é mais simples) para ver como eles implementam isso.

Basicamnete, você precisa descobrir qual a UIR acessada e qual classe correspondeo àquela URI, isntanciar essa classe e passar para ela os parâmetros de request e response. Sim, você vai continuar preso a eles a nesta classe (a menos que use alguma técnica de Adapter), mas isso não é ruim,e stas classes foram criadas para processar equests HTTP, é normal que elas tenham dependência com a API de HTTP.

Criado 19 de julho de 2005
Ultima resposta 19 de jul. de 2005
Respostas 7
Participantes 3