Mostrando entradas con la etiqueta MVC. Mostrar todas las entradas
Mostrando entradas con la etiqueta MVC. Mostrar todas las entradas

sábado, 16 de mayo de 2020

Patrón de diseño de Software MVC

El patrón Modelo Vista Controlador

El patrón MVC nos permite separar:
  • La lógica de control (las funcionalidades del proyecto)
  • La lógica de negocio (como se llevarán a cabo esas funcionalidades)
  • La lógica de presentación (cómo interactúa el usuario con el proyecto)

Utilizando patrón de separación en capas es posible conseguir:
  • Mayor calidad en el producto a desarrollar.
  • Un mantenimiento más sencillo y por ende menos costoso (recordemos que es la etapa del ciclo de vida más costosa).
  • Partir de un modelo base. 
  • Normalizar y estandarizar el desarrollo de Software.

Esto es gracias a que:
  • Existe una bien marcada separación entre los componentes (capas) de un programa; lo cual permite implementar estos por separado.
  • Existen varios Frameworks como JSF, Spring MVC, etc. que permiten reemplazar el modelo, la vista o el controlador, sin demasiada dificultad. Incluso sin un Framework es relativamente sencillo cambiar uno de los componentes del MVC sin afectar a los demás.
  • La conexión entre la capa de modelo y la capa que contiene las vistas es dinámica, pues se produce en tiempo de ejecución, no de compilación.

Ejemplo de aplicación con JAVA Web

En el lenguaje Java, específicamente un proyecto web dinámico tendríamos las siguientes consideraciones.
  • Model: el lenguaje SQL impera sobre el java.
  • Controller: el lenguaje java impera
  • View: el lenguaje HTML impera


La capa de la vista: La capa de persistencia (modelo) La capa de control

 
 


Adicionalmente tenemos:
Bibliotecas externas Bibliotecas internas Clases o entidades

 
 

miércoles, 23 de octubre de 2019

Creando JSP con una vista de una base de datos

Trabajaremos con las siguientes tablas:


Además, le vamos a crear una vista a la tabla "pagos" (para saber como crear este código paso a paso has clic aquí):

CREATE VIEW pagos_view AS
SELECT 
  pagos.idpagos id,
  inquilinos.dni dni,
  CONCAT_WS(" ", inquilinos.nombres, inquilinos.paterno, inquilinos.materno) datos,
  pagos.monto monto,
  DATE(pagos.fecha) fecha,
  TIME(pagos.fecha) hora
FROM pagos INNER JOIN inquilinos 
  ON pagos.inquilino = inquilinos.idinquilinos


Creando el DTO, DAO y su implementación

DTO

¿Cómo crear un DTO desde una tabla de una base de datos? Dale clic

package dto;

import java.time.LocalDateTime;

public class Pagos {
    private Integer idpagos;
    private Integer inquilino;
    private Double monto;
    private LocalDateTime fecha;

    public Pagos() {
    }

    public Integer getIdpagos() {
        return idpagos;
    }
    public void setIdpagos(Integer idpagos) {
        this.idpagos = idpagos;
    }
    public Integer getInquilino() {
        return inquilino;
    }
    public void setInquilino(Integer inquilino) {
        this.inquilino = inquilino;
    }
    public Double getMonto() {
        return monto;
    }
    public void setMonto(Double monto) {
        this.monto = monto;
    }
    public LocalDateTime getFecha() {
        return fecha;
    }
    public void setFecha(LocalDateTime fecha) {
        this.fecha = fecha;
    }
        
}

DAO

¿Cómo crear un DAO para una tabla de una base de datos? Dale clic

package dao;
import java.util.List;

public interface DaoPagos {
    public List<Object[]> pagosSel();
    public String getMessage();
}

Implementación

¿Cómo crear la implementación de un DAO? Dale clic

package dao.impl;

import biblioteca.ConectaBD;
import dao.DaoPagos;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class DaoPagosImpl implements DaoPagos {

    private final ConectaBD conectaDb;
    private String mensaje;

    public DaoPagosImpl() {
        this.conectaDb = new ConectaBD();
    }

    @Override
    public List<Object[]> pagosSel() {
        List<Object[]> list = null;
        StringBuilder sql = new StringBuilder();
        sql.append("SELECT ")
                .append("id,")
                .append("dni,")
                .append("datos,")
                .append("monto,")
                .append("fecha,")
                .append("hora")
                .append(" FROM pagos_view");
        try (Connection cn = conectaDb.conexionDB()) {
            PreparedStatement ps = cn.prepareStatement(sql.toString());
            ResultSet rs = ps.executeQuery();
            list = new ArrayList<>();
            while (rs.next()) {
                Object[] pago = new Object[6];
                pago[0] = rs.getInt(1);
                pago[1] = rs.getString(2);
                pago[2] = rs.getString(3);
                pago[3] = rs.getDouble(4);
                pago[4] = rs.getString(5);
                pago[5] = rs.getString(6);
                list.add(pago);
            }
        } catch (SQLException e) {
            mensaje = e.getMessage();
        }
        return list;
    }

    @Override
    public String getMessage() {
        return mensaje;
    }
}


Se puede apreciar que la función "pagosSel" devuelve un "List" pero no de "Pagos" sino tipo "Object[]", esto porque la vista no devuelve los mismo elementos ni tipos que hace la tabla. Es muy importante recordar que a la vista solo se le hace consultas de tipo "SELECT", no debemos intentar actualizar o eliminar, pues nos dará error.

Servlet y Validator

¿Cómo crear un validator y Servlet para una tabla de una base de datos? Dale clic

Validator

package web.validator;

import dao.DaoPagos;
import dao.impl.DaoPagosImpl;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

public class PagosValidator {

    private final HttpServletRequest request;
    private final DaoPagos daoPagos;

    public PagosValidator(HttpServletRequest request) {
        this.request = request;
        this.daoPagos = new DaoPagosImpl();
    }

    public String pagosSel() {
        String result = null;
        List<Object[]> list = daoPagos.pagosSel();
        if (list != null) {
            request.setAttribute("list", list);
        } else {
            result = daoPagos.getMessage();
        }
        return result;
    }
}

Servlet

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.PagosValidator;

@WebServlet(name = "PagosServlet", urlPatterns = {"/Pagos"})
public class PagosServlet 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 = "pagosSel.jsp";

        PagosValidator validator = new PagosValidator(request);

        switch (accion) {
            case "SEL":
                result = validator.pagosSel();
                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";
    }

}

Los JSP con la vista

¿Cómo crear un JSP para una tabla de una base de datos? Dale clic

El JSP que realiza la llamada al Servlet: pagos.jsp
 
<%response.sendRedirect("Pagos?accion=SEL");%>
 

El JSP que recibe los datos del Servlet: pagosSel.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>Reporte de pagos</title>
        <script src="jq/jquery-3.3.1.min.js" type="text/javascript"></script>
        <script src="js/pagos.js" type="text/javascript"></script>
    </head>
    <body>
        <a href="index.html">Regresar</a><br/>
        <c:if test="${message != null}">
            <div>${message}</div>
        </c:if>
        <table border="1">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>DNI</th>
                    <th>NOMBRES Y APELLIDOS</th>
                    <th>MONTO PAGADO</th>
                    <th>FECHA</th>
                    <th>HORA</th>
                </tr>
            </thead>
            <tbody>
            <c:forEach var="f" items="${list}">                
                <tr>
                    <td>${f[0]}</td>
                    <td>${f[1]}</td>
                    <td>${f[2]}</td>
                    <td>${f[3]}</td>
                    <td>${f[4]}</td>
                    <td>${f[5]}</td>
                </tr>
            </c:forEach> 
        </tbody>
    </table>
</body>
</html>

El resultado sería:
ID DNI NOMBRES Y APELLIDOS MONTO PAGADO FECHA HORA
1 31378082 LUISA PAUCAR NARRO 400.0 2019-10-21 21:34:35
2 43331042 AUGUSTO SOTOMAYOR NARVAJO 300.0 2019-10-18 18:30:00

Estructura