MVC - JSP/Servlet

8 respostas
A

Pessoal estou com uma duvida referente a MVC com Servlet/JSP

Lendo alguns livros e a apostila da Caelum o modelo apresentado por eles são o seguinte

  • Cliente faz uma requisição para o ServletControle
  • O ServletControle verifica qual a solicitação e cria uma classe Java (Controle), e chama esta classe atraves de um metodo execute, definido por uma interface !!!
  • A Classe Controle acessa DAO, POJO, etc e cria um retorno, uma lista de Usuarios por exemplo
  • A Classe Controle, então faz um dispatcher para um JSP para o mesmo mostrar os dados

o Servlet controle faz mais ou menos isto String businessLogicClassName = "br.com.caelum.mvc." + request.getParameter("business"); Class businessLogicClass = Class.forName(businessLogicClassName); BusinessLogic businessLogicObject = (BusinessLogic)businessLogicClass.newInstance(); businessLogicObject.execute(request, response);
A minha duvida é assim, pelo que entendi neste modelo, como na requisição eu so passo o nome da classe que vai fazer algo, caso eu precise listar os usuarios e inserir os usuarios, vão ser classes diferentes?

Ou seja vou ter criar links passando os parametros assim
bussiness=“UsuarioListar” e bussiness=“UsuarioInserir”

e vou ter que ter a classe br.com.caelum.mvc.UsuarioListar e br.com.caelum.mvc.UsuarioInserir

É assim que o pessoal utiliza? digo utilizar MVC sem nenhum framework !! quero aprender fazer somente com Servlet/JSP, para depois que entender isto, utilizar framework

Caso a duvida não ficou claro, estarei reformulando…rss
Att.

8 Respostas

skalinichenko

Sim!
Mas se você tem as operações do banco centralizadas em uma classe (DAO), pode utilizar uma única classe, que chame métodos da sua classe com as operações centralizadas (DAO) para realizar as tarefas. Com isso, você iria retirar a necessidade da criação de mais links como comentou (é apenas uma ideía):

Ou seja vou ter criar links passando os parametros assim
bussiness=“UsuarioListar” e bussiness=“UsuarioInserir”

Caso não queira seguir dessa forma, teria que ter sim as classes…

… mas poderia ter apenas uma que controlasse o fluxo e direcionamento das requisições (Action, framework… Está chegando! :lol: )
Flw, boa sorte!

A

skalinichenko, na verdade eu não queria ter uma classe para cada ação (incluir, listar, etc)

A minha ideia é ter apenas uma classe controle Usuario, que a mesma acesse o DAO/POJO dependendo que o cliente solicitou.

Mas como eu faria para ter apenas uma classe que atendesse qualquer requisição para o objeto Usuario?
Eu vou passar os parametros como?

assim ??
bussiness=“Usuario”&Acao=“Incluir”

Outro detalhe, estou aprendendo java web agora, ate conheco bem o Java SE !!! porem estou tentando fazer as coisas gradativa, tipo aprender o conceito de JSP/Servlet dentro do MVC, para depois ir para Frameworks, etc !!! A mesma coisa o DAO, depois utilizar um Framework ORM !! Acha que é o caminho? ou posso ir direto para Frameworks etc… !!!

E se for para utilizar algum framework, qual recomendaria, lembrando que estou indo para Web agora. !!!

Att

skalinichenko

Deculpe a demora pra responder, pois estava sem internet…
Respondendo os seus comentarios (mas não tenha só a minha resposta como base, é apenas uma opinião e você com certeza também poderá discordar)

A minha ideia é ter apenas uma classe controle Usuario, que a mesma acesse o DAO/POJO dependendo que o cliente solicitou.

Mas como eu faria para ter apenas uma classe que atendesse qualquer requisição para o objeto Usuario?
Eu vou passar os parametros como?

assim ??
bussiness=“Usuario”&Acao=“Incluir”

Efetuar certas ações, através de parâmetros passados como comentou, não é uma má idéia!
Mas sua classe controladora, iria ficar um monstro com o tempo!
Imagina o cenário: se amanhã você precisar de mais ações, terá que adicionar mais linhas de códigos nessa mesma classe. Não é uma má idéia, pois você centralizou as tarefas em única classe e só seria nela que você iria alterar; mas seria um pouco melhor, se você delegasse as tarefas de acordo com o contexto delas, para classes que controlem as ações separaradamente (uma opinião) tratassem as requisições. É assim que faço!
Fora isso, da forma que você comenta também seria otimo! Vários páginas e códigos na plataforma web que faço manutenção, são parâmetrizados (acredito que a grande maioria deles no protocolo HTTP, sejam assim)

Na minha opinião: perfeita forma de pensar! Muitos se apegam a frameworks, esquecendo conceitos importantes de programação. O “mundo ideal” (acredito), seriam programadores que saibam programar independentes de frameworks, mas lógico utilizando eles com o propósito de tornar a aplicação mais flexível e mais rápida para se fazer manutenções, adições de funcionalidades e etc. Já conheci pessoas que nem conseguem trabalhar com JDBC e nem se preocupam com isso. Porque? “Porque o Hibernate cuida disso pra mim.”

Continue do jeito que está, sem se preocupar muito com eles já que está no ínicio. Depois, pega o Struts ou o JSF (lembrando que o JSF é mais atual e grande parte das aplicações que se iniciam o desenvolvimento hoje, começam com esse framework). Olha um de persistência, como o Hibernate. O VRaptor, também achei muito legal. Existe uma infinidade! Com uma pesquisa no Google (e dependendo do que você quer), irá listar vários.

Flw, boa sorte!

A

Valeu skalinichenko,

Me ajudou bastante, deu para ter uma noção da arquitetura de uma aplicação MVC/Web
Vou fazer uns testes e qualquer coisa posto por aqui… valeu
Att

proteus_adi

Eu sempre usei controladores diferentes.
Um sistema com dois cadastros, dois controladores.
Um controlador cliente pra controlar o cliente, um controlador produto pra controlar o produto e por ai vai.
Sempre foi bom,
Dava pra usar classes abstratas pras CRUD, e era possível reduzir bastante o código…

^^
Dentro do controlador eu tinha as ações.
Ação de inclui, inclui a classe e manda o fluxo pro displayer,
Ação de exclui, exclui a classe e manda o fluxo pro displayer…
E por ai vai…

Esse controlador acessava a classe de Modelo, que era também minha classe de Transporte, e acessava o DAO pra aplicar as tarefas no banco.

Todas as ações, “inclui”, “exclui”, “altera” eram ações nos botões.

Assim aprendi lendo o livro “Core Jsp/Servlet”…
E, aplicava ainda algumas práticas do fusebox… como nomenclaturas dos displayers, nome da ação, etc…

Embora extremamente simples, eu tinha um grande controle sobre as aplicações.
E, não usava framework pra nada.

A

proteus_adi

Mas você passava as ações para o controlador atraves de parametro certo?
Porque o que fiquei em duvida de como é usado as passagem das ações, tipo tenho um controlador para o cliente, assim como você fez!!! Este controlador vai atender toda requisição para oobjeto cliente, neste caso você passa as acoes por parametro?

?objeto=Usuario&Acao=Incluir

Seria assim?
Estou querendo conhecer como é feito isto pelo pessoal, para comecar a desenvolver com uma arquitetura legal e que seja facil de manter… !!!

Valeu pelas respostas pessoal
Att.

proteus_adi

Exemplificando...

Modelo
public class Produto{
    int id_produto;
    String descricao;
    // Get Set
}
Dao
public class ProdutoDao{
   public boolean exclui(Produto pr); // Exclui
   public int salva(Produto pr); // Se tem código, altera, se não tem, inclui
   public Produto carrega(int id); // Carrega o produto
}
Servlet
public ProdutoServlet{
    public doGet(){ doPost(request, response)}
    public doPost(){
       Produto pr = new Produto();
       ProdutoDao dao = new ProdutoDao(); 
      String url = "dsp_produto.jsp";

      String act = request.getParameter("act");
      if ("inclui".equals(act)){
          url = "dsp_produto_mantem.jsp";     
      }else if("altera".equals(act)){
          BeanUtil.populate(pr, request);
          pr = dao.carrega(pr.getId_produto());
          url = "dsp_produto_mantem.jsp";
      }else if ("exclui".equals(act)){
         BeanUtil.populate(pr, request);
          pr = dao.carrega(pr.getId_produto());
          url = "dsp_produto_exclui.jsp";
      }else if ("salva".equals(act)){
         BeanUtil.populate(pr, request);
         dao.salva(pr);
      }else if ("confirma exclusao".equals(act)){
         BeanUtil.populate(pr, request);
         dao.exclui(pr);
      }
         request.setAttribute("produto",pr);
         RequestDispatcher dispatcher = request.getRequestDispatcher(url);
         dispatcher.forward(request,response);
}
}
Utilitário Apache
public class BeanUtil 
{
  public static void populate (Object formBean,
                               HttpServletRequest request){
     populate(formBean, request.getParameterMap());
  }
  
  public static void populate(Object bean,
                              Map propertyMap){
      try{
         BeanUtils.populate(bean, propertyMap);
      }catch(Exception e){
      }                        
   }
}
dsp_produto.jsp
<jsp:useBean id="produto" type="Produto" scope="request"/>
<form> 
<table>
<tr><td>Cod Produto</td><td><input type="text" name="id_produto" value="${produto.id_produto}"/></td></tr>
<tr><td colspan=2>
         <input type=submit value="inclui"/>
         <input type=submit value="exclui"/>
         <input type=submit value="altera"/>
</td></tr>
</table>
</form>
dsp_produto_mantem.jsp
<jsp:useBean id="produto" type="Produto" scope="request"/>
<form> 
<table>
<tr><td>Cod Produto</td><td><input readOnly type="text" name="id_pruduto" value="${produto.id_produto}"/></td></tr>
<tr><td>Nome Produto</td><td><input readOnly type="text" name="descricao" value="${produto.descricao}"/></td></tr>
<tr><td colspan=2>
         <input type=submit value="salva"/>
</td></tr>
</table>
</form>
dsp_produto_exclui.jsp
<jsp:useBean id="produto" type="Produto" scope="request"/>
<form> 
<table>
<tr><td>Cod Produto</td><td><input readOnly type="text" name="id_pruduto" value="${produto.id_produto}"/></td></tr>
<tr><td>Nome Produto</td><td><input readOnly readOnly type="text" name="descricao" value="${produto.descricao}"/></td></tr>
<tr><td colspan=2>
         <input type=submit value="confirma exclusao"/>
</td></tr>
</table>
</form>

ASSIM eu trabalhei antes dos frameworks...
Parte boa: fácil manutenção, fácil entendimento, fácil controle do fluxo, ágil para projetos pequenos afinal não tem q modelar nem configurar nda
Parte ruim: internacionalização? projetos grandes?

mas, enfim...
É um modelo conceitual... alias, só tem conceitos ali... rsrs**
Para projetos pequetitos é a melhor das opções inclusive.

A

Valeu pessoal, já consegui ter uma ideia de como funciona o MVC com JSP/Servlet

Agora é so implementando mesmo !!! assim vou conseguir colocar na pratica alguns conceitos

Valeu

Criado 10 de julho de 2009
Ultima resposta 14 de jul. de 2009
Respostas 8
Participantes 3