jueves, 17 de octubre de 2019

Servlets

¿Qué es un Servlet?

Se le llama así a una de las tecnologías proporcionadas por Java que generan componentes independientes que serán empleados en aplicaciones web, estos tienen acceso completo a las API de Java y las bibliotecas de HTTP. Los servlets están intimanente ligados a la plataforma y el servidor.

¿Cómo crear un Servlet en NetBeans?

Seguir los pasos:


¿Qué debemos modificar?

Cambiar el nombre de acuerdo a la función que hará o tabla que dará mantenimiento, colocarlo por preferencia en un paquete que contendrá a los servlets, en algunos casos podemos llamarlos controllers haciendo referencia al patrón MVC.

Modificar el alias del Servlet a uno que no incluya la terminación servlet y finalizar.


Código de ejemplo

Teniendo como base a la tabla "Inquilinos"(clic aquí para ver el DTO) a la que le realizaremos un mantenimiento (CRUD) teniendo como DAO a "DaoInquilinos" y su correspondiente implementación (clic aquí para ver el DAO).Además, las pruebas a las funciones declaradas en el DAO (clic aquí para ver el DAO).

Crearemos dos paquetes dentro del paquete web que serán "servlet" y "validator", dentro crearemos respectivamente el servlet llamado "InquilinosServlet" y una clase de apoyo llamada "InquilinosValidator", esta untima clase nos sirve para reducir la cantidad de código en el Servlet y poder tener mejor mantenimiento de este, por lo tanto es opcional.

Tendríamos el código de "InquilinosValidator" considerando las funciones que declaramos en el DAO, de la siguiente forma:
package web.validator;

import biblioteca.DeString;
import dao.DaoInquilinos;
import dao.impl.DaoInquilinosImpl;
import dto.Inquilinos;
import java.time.LocalDate;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

public class InquilinosValidator {

    private final HttpServletRequest request;
    private final DaoInquilinos daoInquilinos;

    public InquilinosValidator(HttpServletRequest request) {
        this.request = request;
        this.daoInquilinos = new DaoInquilinosImpl();
    }

    public String inquilinosSel() {
        String result = null;
        List<Inquilinos> list = daoInquilinos.inquilinosSel();
        if (list != null) {
            request.setAttribute("list", list);
        } else {
            result = daoInquilinos.getMessage();
        }
        return result;
    }

    public String inquilinosGet() {
        String result = null;
        Integer idinquilino = DeString.aInteger(request.getParameter("idinquilino"));
        Inquilinos inquilino = daoInquilinos.inquilinosGet(idinquilino);
        if (inquilino != null) {
            request.setAttribute("inquilino", inquilino);

        } else {
            result = daoInquilinos.getMessage();
        }
        return result;
    }

    public String inquilinosInsUpd(boolean upd) {
        StringBuilder result = new StringBuilder("<ul>");
        Integer idinquilino = DeString.aInteger(request.getParameter("idinquilinos"));
        String dni = request.getParameter("dni");
        String nombres = request.getParameter("nombres");
        String paterno = request.getParameter("paterno");
        String materno = request.getParameter("materno");
        String telefono = request.getParameter("telefono");
        LocalDate fecha_ingreso = LocalDate.parse(request.getParameter("fecha_ingreso"));
        String correo = request.getParameter("correo");
        Double deuda = DeString.aDouble(request.getParameter("deuda"));
        if (upd && idinquilino == null) {
            result.append("<li>Id requerido</li>");
        }
        if (nombres == null || nombres.trim().length() == 0) {
            result.append("<li>Nombre requerido</li>");
        } else if (nombres.trim().length() < 3 || nombres.trim().length() > 50) {
            result.append("<li>La dimensión del nombre debe estar entre")
                    .append("3 a 50 caracteres</li>");
        }
        if (paterno == null || paterno.trim().length() == 0) {
            result.append("<li>Apellido paterno requerido</li>");
        } else if (paterno.trim().length() < 3 || paterno.trim().length() > 50) {
            result.append("<li>La dimensión del apellido paterno debe estar entre")
                    .append("3 a 50 caracteres</li>");
        }
        if (materno == null || materno.trim().length() == 0) {
            result.append("<li>Apellido materno requerido</li>");
        } else if (materno.trim().length() < 3 || materno.trim().length() > 50) {
            result.append("<li>La dimensión del apellido materno debe estar entre")
                    .append("3 a 50 caracteres</li>");
        }
        if (fecha_ingreso == null) {
            result.append("<li>Fecha requerida</li>");
        }
        if (deuda < 0d) {
            result.append("<li>La deuda no puede ser negativa</li>");
        }
        Inquilinos inquilino = new Inquilinos();
        inquilino.setIdinquilinos(idinquilino);
        inquilino.setDni(dni);
        inquilino.setNombres(nombres);
        inquilino.setPaterno(paterno);
        inquilino.setMaterno(materno);
        inquilino.setFecha_ingreso(fecha_ingreso);
        inquilino.setTelefono(telefono);
        inquilino.setDeuda(deuda);
        inquilino.setCorreo(correo);
        if (result.length() == 4) {
            String msg = upd
                    ? daoInquilinos.inquilinosUpd(inquilino)
                    : daoInquilinos.inquilinosIns(inquilino);
            if (msg != null) {
                result.append("<li>").append(msg).append("</li>");
            }
        }
        if (result.length() > 4) {
            request.setAttribute("inquilino", inquilino);
        }
        return result.length() == 4 ? null : result.append("</ul>").toString();
    }

    public String inquilinosDel() {
        List<Integer> ids = DeString.ids(request.getParameter("ids"));
        String result = (ids != null)
                ? daoInquilinos.inquilinosDel(ids)
                : "IDs incorrectos";
        return result;
    }
}

Mientras el código del Servlet sería:

package web.servlet;

import java.io.IOException;
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;
import web.validator.InquilinosValidator;

@WebServlet(name = "InquilinosServlet", urlPatterns = {"/Inquilinos"})
public class InquilinosServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String accion = request.getParameter("accion");
        accion = (accion == null) ? "" : accion;
        String result;
        String target = "inquilinosSel.jsp";

        InquilinosValidator validator = new InquilinosValidator(request);

        switch (accion) {
            case "SEL":
                result = validator.inquilinosSel();
                break;
            case "INS":
                result = validator.inquilinosInsUpd(false);
                target = result == null ? "inquilinos.jsp" : "inquilinosIns.jsp";
                break;
            case "DEL":
                result = validator.inquilinosDel();
                target = "inquilinos.jsp";
                break;
            case "GET":
                result = validator.inquilinosGet();
                target = "inquilinosUpd.jsp";
                break;
            case "UPD":
                result = validator.inquilinosInsUpd(true);
                target = result == null ? "inquilinos.jsp" : "inquilinosUpd.jsp";
                break;
            case "":
                result = "Solicitud requerida";
                break;
            default:
                result = "Solicitud no reconocida";
        }

        if (result != null) {
            request.setAttribute("message", result);
        }

        RequestDispatcher dispatcher = request.getRequestDispatcher(target);
        dispatcher.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);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}

La estructura de carpetas resultaría en:

La clase DeString es una librería interna. (clic aquí para ver el código), esta permite convertir String a Integer y Double, incluso en colecciones tipo List.

No hay comentarios:

Publicar un comentario