Por que usar um controlador MVC é uma ótima opção!

1 resposta
J113

Eu fui um dos alunos que se esforçaram muito para manter uma ótima média e realmente aprender, no meu projeto final percebi que a faculdade havia me enganado! Quem já foi corajoso o bastante para fazer um projeto com Servlet e Jdbc em MCV entende o que estou falando. Graças a um amigo que me cantou a pedra, eu parei de fazer o meu projeto da maneira que a faculdade ensinou, e acreditem, tive tempo de aprender Vraptor e Hibernate enquanto fazia o projeto. Cara essas ferramentas facilitam tanto que deu tempo para aprender e terminar meu projeto em menos de quatro meses!
Eu criei este tópico mas gostaria que só fosse comentado quando eu postasse a última mensagem, este tópico será como um artigo, e sempre vou atualizando até chegar a resolver nosso mini projeto da maneira ideal.

Como será:
Este material tem o objetivo de ajudar na compreensão da plataforma, melhor dizendo, especificação JEE. Vamos ao seguinte cenário, precisamos criar um sistema para manter um cadastro de alunos, usaremos primeiro Servlet e JDBC, depois vamos melhorando até utilizar um framework MVC e Hibernate para a persistência.
Vamos ver como um controle deve se parecer, vamos chegar num ponto em que vamos desconectar da plataforma web, o nosso controle ficará parecido com uma classe Java ordinária.

NOSSA CLASSE ALUNO
package modelo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Aluno implements Serializable{
	private long id;
	private String nome;
	private String matricula;
... Vou omitir os getters and setters, mas você deve criá-los.
NOSSO SERVLET
package servlet;

import ...

@SuppressWarnings("serial")
public class AlunoServlet extends HttpServlet {
	private DaoFactory dao; 
	private AlunoDao alunoDao;

 
	
Algumas pessoas vão imediatamente criticar o fato de eu instanciar o dao no método init, mas logo vou apresentar uma opção mais aconselhável. Não vou ensinar a criar o dao, use seu próprio dao, mas vou disponibilizar todos os arquivos no meu site, use meu dao se você quiser.

	public void init() throws ServletException {
		dao = DaoFactory.getBanco(1);

Olha que bela oportunidade de explicar o que é wrapper, muita gente nunca ouviu falar disso! O método init  lança ServletException e estamos presos à sua assinatura, não podemos mudar, mas meu dao lança ClassNotFoundException, SQLException, e agora? Fácil vamos "embrulhar" a exceção dentro de ServletException e lançar! Obs.: tratei as duas como Exception para facilitar o entendimento.


		try {
			alunoDao = dao.getAlunoDao();
		} catch (Exception e) {			
			 // Fácil né, até eu sei fazer isso rsrsrsrs		 
			throw new ServletException(e);
			
		}
	}
	public void destroy() {		super.destroy();	}
	public String getServletInfo() { return "Servlet Aluno";	}
	
	Omiti a assinatura completa do doGet para melhorar a visibilidade
public void doGet(...  {
		Aluno aluno = new Aluno();

Logo veremos que encher Pojos é muito chato, mas não precisa ser assim existem maneiras de se automatizar essa tarefa chata (imagine 50 atributos).
		aluno.setNome(request.getParameter("nome"));
		aluno.setMatricula(request.getParameter("nome"));
		
		try {
			alunoDao.adiciona(aluno);
		} catch (Exception e) {
			throw new ServletException(e);			
		}
		
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>Aluno</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    Aluno: "+aluno.getNome()+"<br>");
		out.print("    Matrícula: "+aluno.getMatricula()+"<br>");
		out.print("    Salvo com sucesso! ");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	
	public void doPost(... {

		doGet(request,response);
	}

}

NOSSO WEB.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app >
  <servlet>
    <servlet-name>AlunoServlet</servlet-name>
    <servlet-class>servlet.AlunoServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AlunoServlet</servlet-name>
    <url-pattern>/AlunoServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

Agora é só criar nosso formulário e rodar nossa aplicação, mas lembrando que se analisarmos bem, algumas responsabilidades estão misturadas, nosso servlet está agindo como controle e view, isso está errado. Deveríamos utilizar servlet para controle, jsp para view e uma camada independente para persistência. Mas sempre tenha na sua cabeça, jsp é um servlet!

[color=red]CONTIUA... espere o final para comentários e respostas![/color]

Site:http://www.jorgeluis.eti.br
Blog:http://blog.jorgeluis.eti.br
E-mail:[email removido]

1 Resposta

J113

[color=red]Segunda parte...[/color]

Muito interessante nosso projeto, não é? Mas vamos melhorar alguns pontos.
Vamos ao segundo exemplo:

NOSSA CLASSE ALUNO
package modelo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Aluno implements Serializable{
	private long id;
	private String nome;
	private String matricula;
... Vou omitir os getters and setters, mas você deve criá-los.

Vamos criar uma classe de controle e delegá-la o controle sobre as transações de aluno.

NOSSA CLASSE CONTROLE
package controle;


import ...

public class AlunoControle {
	private HttpServletRequest request;
	private HttpServletResponse response;
	
	private DaoFactory dao; 
	private AlunoDao alunoDao; 
	
	public AlunoControle(HttpServletRequest request, HttpServletResponse response) throws ClassNotFoundException, SQLException {
		this.request = request;
		this.response = response;
		dao = DaoFactory.getBanco(1);
		alunoDao = dao.getAlunoDao();
		
	}
	
	
	public void adiciona() throws Exception{		
		alunoDao.adiciona((Aluno) request.getAttribute("aluno"));

		//isso é uma péssima estratégia, serve apenas para exemplo!
		response.sendRedirect(request.getContextPath()+"/aluno/mensagem.jsp?msg=Salvo+com+sucesso!");
		
	}
}

NOSSO WEB.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app >
  <servlet>
    <servlet-name>AlunoServlet</servlet-name>
    <servlet-class>servlet.AlunoServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AlunoServlet</servlet-name>
    <url-pattern>/AlunoServlet</url-pattern>
  </servlet-mapping>
  
</web-app>
Veja como o código começa a ficar mais legível, isso em um projeto final de faculdade já seria bem interessante, pois seria fácil a apresentação do código. Vamos falar das classes abaixo:
private HttpServletRequest request;
private HttpServletResponse response;

Acesso direto a HttpServletRequest e HttpServletResponse não é muito legal, pois é baixo nível, o desenvolvedor de alto nível deve se preocupar com o domínio do problema, a idéia é, analisar o problema proposto e superá-lo de maneira elegante. Um framework muito usado no mercado de trabalho que expõe essas classes (HttpServletRequest e HttpServletResponse) é o Struts, mas gera alguns problemas!
Estamos caminhando para um desenvolvimento mais legível e menos verboso, nós analistas devemos sempre manter essa idéia. Portanto nosso controle ainda não é o ideal, mas logo vamos resolver mais esse problema!

Nosso servlet será substituído por esse jsp, mas entenda jsp sempre é traduzido para servlet.

<%@page import="controle.AlunoControle" %>

<jsp:useBean id="aluno" class="modelo.Aluno" scope="request" />
<jsp:setProperty name="aluno" property="*" />


<%
   request.setAttribute("aluno",aluno);   
	new AlunoControle(request,response).adiciona();
%>

//Lembra que eu disse que é muito chato encher classes pojo, pois é, veja a linha abaixo:

<jsp:setProperty name="aluno" property="*" />
<jsp:setProperty name="aluno" property="*" />
Com apenas essa linha acima eu digo ao web container para encher todos os atributos da minha pojo. Outra coisa interessante, apenas cinco linhas de código ao invés daquele servlet imenso! Umas das maneiras usadas para se avaliar o trabalho de um desenvolvedor é a quantidade de linhas de código usado para resolver um determinado problema, é claro que esse método é muito discutível, mas nem vou entrar nesse mérito senão vou acabar falando muito. Vamos usar o jsp abaixo para ser nossa view, com ele o usuário recebe a mensagem de sucesso.
<%@ page language="java"  contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>
<html>
  <head>
   
    
    <title>Aluno</title>    
	

  </head>
  

  <body >
//Aqui aproveito para introduzir a Expression Language
	${param['msg']}
   
  </body>
</html>
${param['msg']}
isso equivale a
<%=request.getParameter("msg") %>
ou pior
<% 
  	String mensagem  = request.getParameter("msg");
  	out.println(mensagem);
  %>

Você percebe que pode diminuir consideravelmente as linhas de código e o esforço no desenvolvimento, somente usando as técnicas certas, evite ao máximo o uso de scriptlet dentro de jsps, isso está caindo em desuso e não é uma boa prática.

[color=red]CONTIUA... espere o final para comentários e respostas![/color]

Site:http://www.jorgeluis.eti.br
Blog:http://blog.jorgeluis.eti.br
E-mail:[email removido]

Criado 10 de outubro de 2009
Ultima resposta 13 de out. de 2009
Respostas 1
Participantes 1