JSP. 26 Ejemplo MVC simple

Creamos un proyecto nuevo. Por motivos de seguridad colocaremos las páginas dentro de la carpeta WEB-INF. Todas las páginas serán *.jsp, pero en la navegación de la aplicación (URL) trabajaremos con *.htm. Esto lo indicaremos en el archivo web.xml, podemos crear el archivo web.xml individualmente o cuando creemos el Servlet Controlador indicando en el campo URL Pattern: *.htm.

Al crear el servlet con el asistente de Netbeans indicamos que añada la información al archivo web.xml e indicamos en su URL Patter: *htm. Esto hará que las peticiones que a nosotros nos interesan (todas las acabadas en *.htm) pasen todas por Servlet.

El archivo web.xml quedará
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>Controlador</servlet-name>
        <servlet-class>com.me.jsp.servlet.Controlador</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Controlador</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>redirect.jsp</welcome-file>
    </welcome-file-list>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/WEB-INF/error.jsp</location>
    </error-page>
</web-app>

Código del servlet Controlador.java:
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 Controlador extends HttpServlet {
    private final String  folder = "/WEB-INF";

    /**
     * Processes requests for both HTTP
     * GET and
     * POST methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getServletPath();
        
        // Control de las acciones a realizar según el *.htm
        if(action.equals("/index.htm")){
            // Guardar un atributo en la petición
            request.setAttribute("saludo", "Bienvenido a JSP");
            // Mostrar index.jsp
            request.getRequestDispatcher(folder+"/index.jsp").
                    forward(request, response);
            
        }else if(action.equals("/prepareUser.htm")){
            request.getRequestDispatcher(folder+"/usuario.jsp").
                    forward(request, response);
            
        }else if(action.equals("/nuevoUsuario.htm")){
            int valida = 0;
            // Obtener campos de la página
            String user = request.getParameter("user");
            String pass = request.getParameter("pass");
            String activo = request.getParameter("activo");
            
            // Validación
            if(user== null || user.equals("")){
                request.setAttribute("errorUser", "Campo requerido");
                valida++;
                
            }
            if(pass==null || pass.equals("")){
                request.setAttribute("errorPass", "Campo requerido");
                valida++;
                
            }
            if(valida == 0){// Todo OK
                // Hacer uso de clases Java, guardar el usuario
                // en la BD, etc...
                request.setAttribute("mensaje", "Usuario Creado correctamente");
                request.setAttribute("user", "");
                request.setAttribute("pass", "");
                request.setAttribute("activo", "");
                
            }else{// ERROR
                request.setAttribute("user", user);
                request.setAttribute("pass", "");
                request.setAttribute("activo", activo);
            }
            
            request.getRequestDispatcher(folder+"/usuario.jsp").
                    forward(request, response);
            
        }else{
            request.getRequestDispatcher(folder+"/error.jsp").
                    forward(request, response);
        }
    }
…
// métodos doGet y doPost llaman a processRequest

Este controlador lee la última parte de la dirección, *.htm y realiza la acción que se indica.

Creamos la página Web Pages/redirect.jsp, es la única página que no estará dentro de WEB-INF. Se encarga de redireccionar la primera llamada para que esta pase por el controlador.
Código de la página redirect.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("index.htm"); %>

Código de la página WEB-INF/index.jsp, mostrará un saludo y un menú:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!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>JSP Page</title>
    </head>
    <body>
        <h3>${saludo}</h3>
        
        <h3>Menú</h3>
        <form action="prepareUser.htm" method="post">
            <input type="submit" value="Nuevo Usuario" />
        </form>
        
    </body>
</html>

Una página para dar de alta un usuario, muestra los errores en rojo en cada campo y un mensaje general en azul, WEB-INF/usuario.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Usuario</title>
    </head>
    <body>
        <h3>Nuevo Usuario</h3>

        <form action="nuevoUsuario.htm" method="post">
            <label for="user">Usuario</label>
            <input id="user" name="user" type="text" value="${user}" />
            <span style="color: red">${errorUser}</span>
            <br />
            
            <label for="pass">Contraseña</label>
            <input id="pass" name="pass" type="password" value="${pass}" />
            <span style="color: red">${errorPass}</span>
            <br />
            
            <label for="activo">Activo</label>
            <input id="activo" name="activo" type="checkbox" value="true" 
                   <c:if test="${activo=='true'}">
                       checked
                   </c:if>
                   />
            <br />
            
            <input type="submit" value="Crear Usuario" />
            <br />
            <span style="color: blue">${mensaje}</span>

        </form>
    </body>
</html>

Una página para mostrar los errores, WEB-INF/error.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>ERROR</h1>
        
        <%
            if(exception != null){
                out.println(exception.getMessage());
                StackTraceElement[] sts = exception.getStackTrace();
                for(StackTraceElement st : sts){
                    out.println(st);
                }
            }
        %>
        
    </body>
</html>

El Servlet Controlador puede mejorarse mucho, por simplicidad se ha colocado la lógica de negocio en el.
Para mejorar el controlador se podría declarar la navegación en un archivo xml y según la acción a realizar ejecutar una determinada clase que gestione la acción, o que el controlador principal según la acción a realizar delegue en controladores más específicos, pero hoy en día ya existen muchos frameworks que ayudan en el proceso de creación de páginas web en Java haciendo uso del patrón de diseño MVC, algunos de estos son: JavaServer Faces, Spring, Struts2.

Descargar Proyecto creado en Netbeans.

Comentarios

Entradas populares de este blog

Java. Texto de colores en la consola

javax.swing.JPasswordField

javax.swing.JList