Introducción a MVC con Servlets y JSP

Modelo-Vista-Controlador (MVC) es un patrón usado en ingeniería de software para separar la lógica de aplicación de la interfaz de usuario.

Como el nombre sugiere, el patrón MVC tiene tres capas. El modelo define la capa de negocios de la aplicación, la vista define la capa de presentación, y el controlador maneja el flujo de la aplicación.

Aunque el patrón MVC no es especifico a aplicaciones web, encaja muy bien en este tipo de aplicaciones. En aplicaciones web con Java, el modelo consiste de clases Java simples, la vista consiste de paginas JSP, y el controlador consiste de servlets.

Vamos a usar el ejemplo que hemos estado utilizando en los últimos dos posts. Si deseas crear un nuevo proyecto en NetBeans, necesitaras las dos clases de los últimos dos proyectos que representan la capa de negocios.

La primer clase es ServletSample.Business.Product.

package ServletSample.Business;

public class Product {
    private int id;
    private String name;
    private float price;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }

    public Product(){
        this.id = -1;
        this.name = "";
        this.price = 0f;
    }

    public Product(int id, String name, float price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

}

La segunda clase es ServletSample.Business.ProductService.

package ServletSample.Business;

import java.util.List;
import java.util.ArrayList;

public class ProductService {

    public List<Product> getProducts(){
        List<Product> products = new ArrayList<Product>();
        products.add(new Product(1,"HP Laptop",799f));
        products.add(new Product(2,"IBM Desktop",599f));
        products.add(new Product(3,"Cannon Printer",159f));
        return products;
    }

    public Product getProduct(int id) {
        Product product = null;
        switch(id)
        {
            case 1:
                product = new Product(1,"HP Laptop",799f);
                break;
            case 2:
                product = new Product(2,"IBM Desktop",599f);
                break;
            case 3:
                product = new Product(3,"Cannon Printer",159f);
                break;
        }
        return product;
    }
}

Ahora vamos a agregar un servlet al proyecto. Puedes referirte al post donde muestro como crear un servlet para los pasos correspondientes.

package ServletSample.Web;

import ServletSample.Business.ProductService;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProductServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        ProductService service = new ProductService();
        String value = request.getParameter("id");
        if (value != null) {
            int id = Integer.parseInt(value);
            request.setAttribute("single_product", service.getProduct(id));
        } else {
            request.setAttribute("product_list", service.getProducts());
        }
        getServletConfig().getServletContext().getRequestDispatcher("/product.jsp").forward(request,response);
    }

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

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

}

Este servlet es el controlador de nuestra pequeña aplicación.

Primero trata de leer un parámetro de la solicitud (request). Dependiendo de si el parámetro esta presente o no, obtiene uno o todos los productos del modelo (capa de negocios).

Una vez que obtiene los datos necesarios del modelo, guarda esta información en la solicitud usando el método setAttribute.

Finalmente el controlador redirige la solicitud y la respuesta a una JSP, la vista de la aplicación. Para hacer esto, primero llamamos el método getRequestDispatcher para obtener un objeto RequestDispatcher con la ruta del JSP. Después llamamos el método forward de este objeto.

Si comparas este servlet con el que creamos en nuestro post anterior, notaras cuan mas pequeño y limpio es el nuevo servlet.

Ahora vamos a crear el JSP. Te puedes referir al post donde mostré como crear un JSP para los pasos correspondientes.

<%@ page contentType="text/html" pageEncoding="UTF-8"%>

<%@ page import="ServletSample.Business.Product" %>
<%@ page import="ServletSample.Business.ProductService" %>
<%@ page import="java.text.DecimalFormat" %>
<%@ page import="java.util.List" %>

<!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=UTF-8">
        <title>MVC Sample</title>
    </head>
    <body>
        <%
        if (request.getAttribute("single_product") != null) {
            Product product = (Product)request.getAttribute("single_product");
        %>

        <h1>Product Details</h1>
        <div>ID: <%= product.getId()%></div>
        <div>Name: <%= product.getName()%></div>
        <div>Price: $ <%= new DecimalFormat("#0.00").format(product.getPrice()) %></div>
        <div><a href="product">Go Back</a></div>

        <% } else { %>

        <h1>Product List</h1>
        <table>
            <tr>
                    <td><b>Name</b></td>
                    <td><b>Options</b></td>
            </tr>

            <% for (Product product : (List<Product>)request.getAttribute("product_list")) {%>

            <tr>
                <td><%= product.getName()%></td>
                <td><a href="product?id=<%= product.getId()%>">Details...</a></td>
            </tr>
            <% }
          }%>

        </table>
    </body>
</html>

Este JSP es la vista de la aplicación. Recibe toda la información que necesita desde el controlador. No necesita llamar a la capa de negocio directamente.

Notaras que este JSP tiene menos código Java que el JSP de nuestro post anterior. Pero aun tenemos un poco de código Java en el JSP. Mostrare las herramientas que JSP tiene para deshacernos completamente de ese código en otro post.

Ejecuta el proyecto. Escribe product en la dirección URL. La lista de productos aparecerá.

Lista de Productos con MVC

Observa como escribimos la dirección URL del servlet, nuestro controlador, no la dirección del JSP.

Haz clic en uno de los vínculos.

Detalles de Producto con MVC

Los detalles del producto se muestran. Haz clic en el vinculo para regresar a la lista de productos.

Por favor deja tus comentarios o sugerencias.

Recibir Actualizaciones Gratis
Entradas Relacionadas
Comentarios