Mostrando entradas con la etiqueta @Override. Mostrar todas las entradas
Mostrando entradas con la etiqueta @Override. Mostrar todas las entradas

viernes, 22 de mayo de 2020

Interfaces

Es un tipo de referencia que está estrechamente relacionado con una clase al tener múltiples similitudes con estas.

Definir una interfaz es muy parecido a definir una clase abstracta:

 
/* se usa la palabra reservada "interface" */
public interface InterfazDeJava{

}


Cuando define una interfaz se crea una referencia similar a una clase con la principal diferencia en que no define ninguna implementación de sus métodos. Además, presenta las siguientes características o restricciones.

  • Una interfaz no puede ser instanciada, por lo que no se define un constructor.
  • Los únicos campos permitidos en una definición de interfaz son constantes que se declaran tanto estáticas como finales.
  • Una interfaz define una API pública. Todos los métodos de una interfaz son implícitamente públicos, incluso si se omite el modificador público. Es un error definir un método protegido o privado en una interfaz.
  • Una interfaz no contiene implementación alguna. Todos los métodos de una interfaz son implícitamente abstractos, incluso si se omite el modificador abstracto.
  • Las interfaces pueden heredar de otras interfaces y pueden soportar herencia múltiple.
  • Son las clases que al implementar una interfaz mediante la palabra reservada "implements" implementan el código de los métodos declarados en una interfaz.
  • Una interfaz puede ser implementada en múltiples clases y una clase puede implementar múltiples interfaces.

Ejemplo de interfaz y su implementación en código

Código de la interfaz:

 public interface Calculadora {

 Float sumar(Float a, Float b);

 Float restar(Float a, Float b);

 Float multiplicar(Float a, Float b);

 Float dividir(Float a, Float b);

 String getMensaje();
}



Código de la clase:

 public class CalculadoraDecimal implements Calculadora {

 private String mensaje;

 public CalculadoraDecimal() {
 }

 @Override
 public Float sumar(Float a, Float b) {
  mensaje = null;
  return a + b;
 }

 @Override
 public Float restar(Float a, Float b) {
  mensaje = null;
  return a + b;
 }

 @Override
 public Float multiplicar(Float a, Float b) {
  mensaje = null;
  return a + b;
 }

 @Override
 public Float dividir(Float a, Float b) {
  if (b == 0) {
   mensaje = "No se puede dividir entre cero";
   return null;
  } else {
   mensaje = null;
   return a / b;
  }
 }

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

}

Herencia en interfaces

Como se ha mencionado, las interfaces pueden heredar de otras interfaces sus métodos y constantes. Aquí las superinterfaces (similar a las superclases) deben colocarse luego de la palabra reservada "extends"

Herencia simple:


 
/* se usa la palabra reservada "extends " */
public interface InterfazHija extends InterfazPadre{

}

Herencia múltiple:


 
/* se usa la palabra reservada "extends " */
public interface InterfazHija extends InterfazPadre1, InterfazPadre2{

}


Fuentes:

  • Flanagan, D. (2002). JAVA IN A NUTSHELL Desktop Quick Reference (4a ed.). England: Pearson Education.


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