quarta-feira, 12 de fevereiro de 2014

MVC com Servlets e JavaServer Pages

Quando as aplicações misturam códigos de apresentação, de acesso a dados e de lógica ou regra de negócios, tornam-se difíceis de manter. Primeiro por que a interdependência dos componentes faz com que alterações no código se propaguem como ondas; segundo, por que o forte acomplamento torna difícil ou impossivel a reutilização das classes; terceiro, por que a adição de novas views requer reimplementação ou CTRL+C e CTRL+V de lógica de negócios, o que também acontece com o código de acesso aos dados. A solução? Separá-los em "camadas".

E separar códigos em camada é a motivação da arquitetura Model-View-Controller (MVC). Como conseqüências de sua aplicação, temos maior reúso de componentes e suporte a novos clientes (HTML, WML, JFC/Swing, Web service). Entrentanto, aumenta a complexidade do projeto.
Em primeiro lugar criaremos noss JSP que atuara como VIEW (INPUT):
 
<!—índex.jsp à
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" ageEncoding="ISO-8859-1"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Exemplo MVC</title>
    </head>
    <body>
        <h1>Model-View-Controller</h1>
        <h3>Informe os dados solicitados:</h3>
        <form action="ServletController">
            Nome<input type="text" name="nome" /><br />
            Sobrenome<input type="text" name="sobrenome" /><br />
            <input type="submit" value="Enviar" />
            < type="reset" value="Limpar" />
        </form>
    </body>
</html>
 
E nosso JSP (VIEW) de exibição (OUTPUT).
<!—saudacao.jsp à
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Exemplo MVC</title>
    </head>
    <body>
        <h1>Model-View-Controller</h1>
        <jsp:useBean id="pessoa" type="br.pro.passos.model.Pessoa" scope="session"/>
        Hello,
<jsp:getProperty name="pessoa" property="nome"/> <jsp:getProperty name="pessoa" property="sobrenome"/>

    </body>
</html>



Apos isto criaremos o servlet que recebera as requisições da JSP e atuará como CONTROLLER, que instanciara os beans. (criamos assim o pacote  br.pro.passos.controller)
 
 
package br.pro.passos.controller; 
 
import java.io.IOException;   
import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession;   
import br.pro.passos.model.Pessoa; 
 
 public class ServletController extends javax.servlet.http.HttpServlet 
implements javax.servlet.Servlet { 
static final long serialVersionUID = 1L;    
 
public ServletController()  { 
super(); 
 }     
 
 protected void doGet(HttpServletRequest request,                                    HttpServletResponse response) throws ServletException, IOException   { 
 
  String nome                = request.getParameter("nome"); 
  String sobrenome        = request.getParameter("sobrenome"); 
 
  Pessoa p        new Pessoa(); 
  p.setNome(nome); 
  p.setSobrenome(sobrenome); 
 
  HttpSession sessao    = request.getSession(); 
  sessao.setAttribute("pessoa", p); 
 
  String url = "saudacao.jsp"
  RequestDispatcher dispatcher = request.getRequestDispatcher(url); 
  dispatcher.forward(request, response); 
 } 
 
 protected void doPost(HttpServletRequest request, 
                       HttpServletResponse response) throws ServletException, IOException  { 
             doGet(request, response); 
 }   


Criamos a camada MODEL agora que representara os dados (pacote br.pro.passos.model).
 
package br.pro.passos.model; 
 
public class Pessoa { 
private String nome; 
            private String sobrenome; 
 
 public Pessoa()   { 
            super(); 
 } 
 public Pessoa(String nome, String sobrenome)   { 
  super(); 
  this.setNome(nome); 
  this.setSobrenome(sobrenome); 
 }  
 public void setNome(String nome)   { 
  this.nome = nome; 
 } 
 public String getNome()   { 
  return nome; 
 } 
 public void setSobrenome(String sobrenome)   { 
  this.sobrenome = sobrenome; 
 } 
 public String getSobrenome()   { 
  return sobrenome; 
 } 
 
 
Representação gráfica do projeto: