La arquitectura Model 2 para el diseño de páginas JSP, es en realidad una arquietectura Modelo-Vista-Controlador (MVC), aplicado a las aplicaciones web.

Se separa la salida que muestra el contenido, de la lógica usada para obtener y manipular el contenido.

  1. El Servlet controlador gestiona la petición recibida desde el cliente.
  2. Es posbile el Servlet controlador utilice otras clases ayudantes que se encarguen de realizar otras operaciones de manipulación de los datos.
  3. Se obtienen los datos necesarios desde la base de datos.
  4. Los datos se manipulan utilizando un JavaBean con el modelo de datos.
  5. El Servlet controlador obtiene los datos en forma de objetos del JavaBean.
  6. Se envían los datos al JSP que formará la vista.
  7. El JSP generado se envía al cliente.

 Java Model 2

Estructura y datos de ejemplo de la base de datos

{code}

CREATE TABLE `agenda` (
`nombre` varchar(20) NOT NULL,
`apellidos` varchar(50) NOT NULL,
`telefono` varchar(15) NOT NULL,
`correo` varchar(30) NOT NULL,
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

INSERT INTO `agenda` VALUES ('AMADOR', 'OSSORIO MUÑOZ', '684402588', 'amaoss53 @ hotmail.com', 1);
INSERT INTO `agenda` VALUES ('BALTASAR', 'LORENTE FERNANDEZ', '675435350', 'ballor65 @ hotmail.com', 2);
INSERT INTO `agenda` VALUES ('JESUS', 'PEDRO IGLESIAS ', '611932600', 'jesped87 @ hotmail.com', 3);
INSERT INTO `agenda` VALUES ('MARIA DOLORES', 'SAHELICES DOMINGUEZ', '675378525', 'marsah68 @ hotmail.com', 4);
INSERT INTO `agenda` VALUES ('ILUMINADA', 'LEON VICENTE', '614367425', 'iluleo71 @ yahoo.com', 5);

{/code}

Página de inicio con formulario para hacer la petición

{code class="brush:html"}

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form method="get" action="/agenda/consulta">
        Id. Registro: <input type="text" name="id">
        <input type="submit" value="Enviar">
    </form>
</body>
</html>

{/code}

Controller (Servlet)

{code}

package com.ejemplo.agenda;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/consulta")
public class consulta extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Recoger parámetros GET
        String idContacto = request.getParameter("id");
        String formato = request.getParameter("formato");
        
        // Contectar con la base de datos
        if(BDContactos.conectarBDContactos()) {
            // Obtener un registro de la base de datos
            Contacto contacto = BDContactos.getContacto(idContacto);
            
            if(contacto!=null) {
                // Enviar el objeto creado como atributo de la petición
                request.setAttribute("contacto", contacto);
                
                // Realizar la petición de la página JSP según el tipo de formato solicitado
                if(formato!=null && formato.equalsIgnoreCase("XML")) {
                    RequestDispatcher dispatcher = request.getRequestDispatcher("/contacto_xml.jsp");
                    dispatcher.forward(request, response);
                } else {
                    RequestDispatcher dispatcher = request.getRequestDispatcher("/mostrar_contacto.jsp");
                    dispatcher.forward(request, response);
                }
            } else { // No se ha encontrado ningún contacto con ese ID
                PrintWriter out = response.getWriter();
                out.println("No hay ningún contacto con el identificador "+idContacto);
            }
        }
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

{/code}

Controller Helper

{code}

package com.ejemplo.agenda;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BDContactos {
    
    private static Connection conexion;
    
    protected static boolean conectarBDContactos() {
        try {
            // Declarar driver y conectar con la base de datos
            Class.forName("com.mysql.jdbc.Driver");
            conexion = DriverManager.getConnection(
                    "jdbc:mysql://localhost/agenda_db", "root", "root");
            return true;
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch(SQLException e) {
            e.printStackTrace();
            return false;
        }
    }
    
    protected static Contacto getContacto(String id) {
        if(conexion!=null) {
            try {
                // Crear la consulta SQL
                Statement st = conexion.createStatement();
                ResultSet rs = st.executeQuery("select * from agenda where id=" + id);
                
                // Comprobar si se ha obtenido algún resultado en la consulta
                if (rs.next()) {
                    // Crear un objeto a partir de los datos obtenidos en la consulta
                    Contacto contacto = new Contacto(rs.getString("nombre"),
                            rs.getString("apellidos"), rs.getString("telefono"),
                            rs.getString("correo"), rs.getInt("id") );
                    return contacto;
                }
            } catch(SQLException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

{/code}

JavaBean

{code}

package com.ejemplo.agenda;

public class Contacto {
    private String nombre;
    private String apellidos;
    private String telefono;
    private String correo;
    private int id;
    
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getApellidos() {
        return apellidos;
    }

    public void setApellidos(String apellidos) {
        this.apellidos = apellidos;
    }

    public String getTelefono() {
        return telefono;
    }

    public void setTelefono(String telefono) {
        this.telefono = telefono;
    }

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    
    public Contacto(String nombre, String apellidos, String telefono,
            String correo, int id) {
        super();
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.telefono = telefono;
        this.correo = correo;
        this.id = id;
    }
    
    public Contacto() {
        
    }
    
}

{/code}

View (HTML) - mostrar_contacto.jsp

{code class="brush:html"}

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Datos del contacto</title>
</head>
<body>
<h1>Datos del contacto</h1>
<jsp:useBean id="contacto" class="com.ejemplo.agenda.Contacto" scope="request" />
<b>Nombre:</b> <jsp:getProperty name="contacto" property="nombre" /> <br/>
<!-- También valdría con ${contacto.nombre} -->
<b>Apellidos:</b> <jsp:getProperty name="contacto" property="apellidos" /> <br/>
<b>Teléfono:</b> <jsp:getProperty name="contacto" property="telefono" /> <br/>
<b>Correo:</b> <jsp:getProperty name="contacto" property="correo" /> <br/>
</body>
</html>

{/code}

View (XML) - contacto_xml.jsp

{code class="brush:xml"}

<?xml version="1.0" encoding="UTF-8"?>
<%@ page language="java" contentType="text/xml; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1" %>
<jsp:useBean id="contacto" class="com.ejemplo.agenda.Contacto" scope="request" />
<contacto>
    <nombre><jsp:getProperty name="contacto" property="nombre" /></nombre>
    <apellidos><jsp:getProperty name="contacto" property="apellidos" /></apellidos>
    <telefono><jsp:getProperty name="contacto" property="telefono" /></telefono>
    <correo><jsp:getProperty name="contacto" property="correo" /></correo>
</contacto>

{/code}