Mantenimiento web (I) Modelo

POJO categorías:

package com.mantenimiento.dao;

import java.sql.Date;


//Esto es un POJO que representa a los registros de la tabla category
public class Categoria {

	// Los campos los llamamos igual que en la base de datos
	private int category_id;
	private String name;
	private Date last_update;
	
	// Creamos un constructor para crear fácilmente objetos
	public Categoria(int category_id, String name) {
		super();
		this.category_id = category_id;
		this.name = name;
	}
	public Categoria(int category_id, String name, Date last_update) {
		this(category_id,name);
		this.last_update= last_update;
	}
	// Getters y setters que son imprescindibles
	/**
	 * @return the category_id
	 */
	public int getCategory_id() {
		return category_id;
	}
	/**
	 * @param category_id the category_id to set
	 */
	public void setCategory_id(int category_id) {
		this.category_id = category_id;
	}
	/**
	 * @return the name
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name the name to set
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return the last_update
	 */
	public Date getLast_update() {
		return last_update;
	}
	/**
	 * @param last_update the last_update to set
	 */
	public void setLast_update(Date last_update) {
		this.last_update = last_update;
	}

	@Override
	public String toString() {
		return "Categoria [category_id=" + category_id + ", name=" + name + ", last_update=" + last_update + "]";
	}
	
	
	
}

Acceso a datos (DAO):

package com.mantenimiento.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class CategoriaDAO {

	// Tengo que crear una conexión a la base de datos
	private Connection con;
	private int max_records = 1000;

	public CategoriaDAO() {
		try {
			// Me conecto a la base de datos. Si no da error todo OK
			Class.forName("com.mysql.cj.jdbc.Driver");
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sakila", "root", "");

		} catch (Exception ex) {
			System.out.println(ex);
		}
	}

	// Tengo que implementar todas las opciones del CRUD

	// Obtener una categoría
	public Categoria getCategoria(int id) {
		try {
			String sql = "select * from category where category_id=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);
			
			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				Categoria categoria=new Categoria(rs.getInt("category_id"),rs.getString("name"),rs.getDate("last_update"));
				return categoria;
			}else {
				return null;
			}
			
		} catch (Exception ex) {
			System.out.println(ex);
			return null;
		}
	}

	// Obtener todas las categorías
	public List<Categoria> getCategorias() {
		try {
			// Consulta sql para obtener todas las categorías
			String sql = "select * from category limit ?";
			PreparedStatement stmt = con.prepareStatement(sql);
			// Con la salvedad de que ponemos un límite de 1000 registros por si acaso
			stmt.setInt(1, max_records);
			
			// Obtenemos el puntero a los resultados
			ResultSet rs = stmt.executeQuery();
			
			// Yo necesito almacenar todos los registros que voy obteniendo
			// ¿Dónde? En un ArrayList del tipo Categoria
			List<Categoria> categorias=new ArrayList<Categoria>();
			
			// MIentras haya registros en la base de datos
			while (rs.next()) {
				// Creame un objeto categoría con los datos de la base de datos
				Categoria categoria=new Categoria(rs.getInt("category_id"),rs.getString("name"),rs.getDate("last_update"));
				// Lo añadimos al arraylist
				categorias.add(categoria);
			}
			// Devolvemos la lista con todas las categorías que hemos creado
			// A partir de los registros de la base de datos
			return categorias;
		} catch (Exception ex) {
			System.out.println(ex);
			return null;
		}
	}
	// Crear una categoría
	public int addCategoria(Categoria categoria) {
		return addCategoria(categoria.getName());
	}

	// Crear una categoría
	public int addCategoria(String name) {
		try {
			String sql = "insert into category (name) values (?)";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setString(1, name);

			int res = stmt.executeUpdate();
			return res;
		} catch (Exception ex) {
			System.out.println(ex);
			return -1;
		}
	}

	// Eliminar categoría
	public int deleteCategoria(Categoria categoria) {
		return deleteCategoria(categoria.getCategory_id());

	}

	// Eliminar categoría
	public int deleteCategoria(int id) {
		try {
			String sql = "delete from category where category_id=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setInt(1, id);

			int res = stmt.executeUpdate();
			return res;

		} catch (Exception ex) {
			System.out.println(ex);
			return -1;
		}
	}

	// Modificar categoría
	public int updateCategoria(Categoria categoria) {
		try {
			String sql = "update category set name=? where category_id=?";
			PreparedStatement stmt = con.prepareStatement(sql);

			stmt.setString(1, categoria.getName());
			stmt.setInt(2, categoria.getCategory_id());

			int res = stmt.executeUpdate();
			return res;
		} catch (Exception ex) {
			System.out.println(ex);
			return -1;
		}
	}
}

Por si lo queremos probar:


package com.mantenimiento.dao;

import java.util.List;

public class TestDao {

	public static void main(String[] args) {
		Categoria drama=new Categoria(1,"Terrorífica");
		System.out.println(drama);
		System.out.println(drama.getName());
		
		CategoriaDAO modelo=new CategoriaDAO();
		
		System.out.println(modelo.getCategorias());
		List<Categoria> categorias=modelo.getCategorias();
		for(Categoria categoria:categorias) {
			System.out.println(categoria.getName());
		}
	}

}

Ejercicio JSTL

Vamos a crear un servlet que nos muestre datos de una factura (lo podemos llamar Factura).

Se pasan a la página los siguientes datos:

nombre: Nombre del cliente: ‘Supermercados Pérez’
fecha: Fecha de hoy
productos: Una lista con los siguientes productos: ‘pera’,’higo’,’patata’
precio: Una lista con los siguientes precios: 10,30,5

Esto lo envía todo a una página factura.jsp que nos mostrará una factura lo más bonita posible en la que se muestren los datos. En el ejemplo sería:

Factura a Supermercados Pérez
Fecha: 22/4/2021

Producto Precio
pera 10
higo 30
patata 5
total: 45
iva: 9,45

Ejemplo con POJO

package ejercicioJstl;

 

import java.io.IOException;

import java.time.LocalDate;

 

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;

 

/**

* Servlet implementation class Factura

*/

@WebServlet("/factura")

public class Factura extends HttpServlet {

           private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public Factura() {

        super();

        // TODO Auto-generated constructor stub

    }

 

           /**

           * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

           */

           protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       Pojo_factura Perez = new Pojo_factura("Supermercados Perez",LocalDate.now());

                      

                       Perez.agregar("pera",10);

                       Perez.agregar("higo",30);

                       Perez.agregar("patata",5);

                      

                       request.setAttribute("perez", Perez);

                       RequestDispatcher dispatcher = request.getRequestDispatcher("factura.jsp");

        dispatcher.forward(request, response);

           }

 

           /**

           * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

           */

           protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

                       // TODO Auto-generated method stub

                       doGet(request, response);

           }

 

}
<%@ page language="java" contentType="text/html; charset=utf-8"

           pageEncoding="utf-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="ISO-8859-1">

<title>Insert title here</title>

<link rel="stylesheet"

           href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"

           integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"

           crossorigin="anonymous">

</head>

 

<body>

           <c:forEach var="producto" items="${perez.productos}">

                       <c:set value="${res=res+producto.value}" var="sumaProductos" />

           </c:forEach>

 

 

           <c:set value="${sumaProductos*.21 }" var="iva" />

 

           <div class="container">

                       <div class="row">

                                  <div class="col-md-6">

                                             <img alt="" src="">

                                             <h2>

                                                         <c:out value="${perez.nombre}" />

                                             </h2>

                                  </div>

                                  <div class="col-md-6 text-right">

                                             <h2>FACTURA</h2>

                                             <h3>Factura #001</h3>

                                             <p>

                                                         <c:out value="${perez.fecha}" />

                                             </p>

                                  </div>

 

 

                       </div>

 

                       <div class="row justify-content-center">

                                  <div class="col-md-10 ">

                                             <div class="border-bottom border-dark">

                                                         <h5>Listado productos</h5>

                                             </div>

                                             <div class="mb-2">

                                                         <c:forEach var="producto" items="${perez.productos}">

                                                                    <c:out value="${producto.key}" />

                                                                    <c:out value="${producto.value}" />

                                                                    <br>

                                                         </c:forEach>

                                             </div>

                                             <div>

                                                         <p>

                                                                    Total:

                                                                    <c:out value="${sumaProductos}"></c:out>

                                                                    €

                                                         </p>

                                                         <p>

                                                                    IVA:

                                                                    <c:out value="${iva}"></c:out>

                                                                    &#8364

                                                         </p>

                                             </div>

                                  </div>

                       </div>

 

 

           </div>

</body>

 

</html>
package ejercicioJstl;

import java.time.LocalDate;

import java.util.*;

public class Pojo_factura {

private String nombre;

private LocalDate fecha;

private Map<String, Integer> productos;

 

 

public Pojo_factura(String nombre, LocalDate fecha) {

           super();

           this.nombre = nombre;

           this.fecha = fecha;

           productos =  new HashMap<String, Integer>();

          

}

 

 

public String getNombre() {

           return nombre;

}

 

 

public void setNombre(String nombre) {

           this.nombre = nombre;

}

 

 

public LocalDate getFecha() {

           return fecha;

}

 

 

public void setFecha(LocalDate fecha) {

           this.fecha = fecha;

}

 

 

public Map<String, Integer> getProductos() {

           return productos;

}

 

 

public void setProductos(Map<String, Integer> productos) {

           this.productos = productos;

}

 

public void agregar(String nombre, int precio) {

           productos.put(nombre,precio);

}

}

JSTL Más ejemplos

package com.trifulcas.dao;

// POJO: Plain Old Java Object
public class Autor {
	private String nombre;
	private String apellido;

	public Autor(String nombre, String apellido) {
		super();
		this.nombre = nombre;
		this.apellido = apellido;
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @return the apellido
	 */
	public String getApellido() {
		return apellido;
	}

	/**
	 * @param apellido the apellido to set
	 */
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("importe", 500);
		request.setAttribute("cantidad", 7);
		request.setAttribute("cantidad", 17);
		request.setAttribute("producto", "Madalenas (muy buenas)");
		// Pasamos una lista
		List<String> alumnos=new ArrayList<String>();
		alumnos.add("Eva");
		alumnos.add("Ana");
		alumnos.add("Juan");
		request.setAttribute("alumnos", alumnos);
		
		//Pasamos un array
		int[] notas= {1,4,2,7};
		request.setAttribute("notas", notas);
		
		//Pasamos un objeto
		Autor pepe=new Autor("Pepe","Pi");
		request.setAttribute("autor", pepe);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("jstl.jsp");
		dispatcher.forward(request, response);
	}

	<c:out value="hola que tal" />
	<!-- importe es un atributo que viene del servlet -->

	<c:out value="${importe}" />
	<c:out value="${cantidad}" />
	<c:out value="${producto}" />


	<!-- String nomobre="Eva pi" -->
	<c:set value="Eva pi" var="nombre" />
	<!-- nombre="Juan" -->
	<c:set value="Juan" var="nombre" />

	<c:out value="${nombre}" />

	<!-- int iva=importe*.21 -->
	<c:set value="${importe*.21}" var="iva" />

	<c:out value="${iva}" />

	<c:if test="${iva > 100}">
		<p>¡Que caro!</p>
	</c:if>

	<c:choose>
		<c:when test="${iva < 100}">
			<c:out value="${iva} menor de 100" />
		</c:when>
		<c:when test="${iva < 200}">
			<c:out value="${iva} menor de 200" />
		</c:when>
		<c:otherwise>
			<c:out value="${iva} mayor de 200" />
		</c:otherwise>
	</c:choose>


	<c:forEach var="i" items="1,4,5,6,7,8,9">
    Item <c:out value="Nº ${i}" />
		<p>
	</c:forEach>

	<c:forEach var="alumno" items="${alumnos}">
		<p>
			Alumno
			<c:out value="${alumno}" />
		</p>
	</c:forEach>

	<c:forEach var="i" items="${notas }">
		<p>
			Notas
			<c:out value="${i}" />
		</p>
	</c:forEach>
	<c:out value="${autor}" />
	<!-- Al acceder a la propiedad nombre la librería busca si ese objeto tiene un método
	getNombre si lo tiene bien y si no error
	 -->
	<c:out value="${autor.nombre}" />
	<c:out value="${autor.apellido}" />

JSTL

Descargar la librería y situarla en webapp/WEB_INF/lib:

https://github.com/juanpablofuentes/JavaNetmind/tree/main/webHolaMundo/src/main/webapp/WEB-INF/lib

https://github.com/juanpablofuentes/JavaNetmind/blob/main/jakarta.servlet.jsp.jstl-2.0.0.jar

https://help.hcltechsw.com/commerce/9.1.0/admin/refs/rsdjspbpjstl_dup.html

http://www.jtech.ua.es/j2ee/restringido/cw/sesion08-apuntes.html

https://www.baeldung.com/jstl

https://www.javatpoint.com/jstl

Para utilizar esta librería en mis jsp añado la siguiente línea a la cabecera:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

o esta:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

Ejemplos:

Esto va en el servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setAttribute("importe", 500);
		RequestDispatcher dispatcher = request.getRequestDispatcher("jstl.jsp");
		dispatcher.forward(request, response);
	}
<c:out value="hola que tal" />
	<!-- importe es un atributo que viene del servlet -->

	<c:out value="${importe}" />

	<c:set value="Eva pi" var="nombre" />

	<c:out value="${nombre}" />

	<!-- int iva=importe*.21 -->
	<c:set value="${importe*.21}" var="iva" />

	<c:out value="${iva}" />

	<c:if test="${iva > 100}">
		<p>¡Que caro!</p>
	</c:if>

	<c:choose>
		<c:when test="${iva < 100}">
			<c:out value="${iva} menor de 100" />
		</c:when>
		<c:when test="${iva < 200}">
			<c:out value="${iva} menor de 200" />
		</c:when>
		<c:otherwise>
			<c:out value="${iva} mayor de 200" />
		</c:otherwise>
	</c:choose>


	<c:forEach var="i" items="1,4,5,6,7,8,9">
    Item <c:out value="Nº ${i}" />
		<p>
	</c:forEach>

Login con servlet

Vamos a hacer un proyecto nuevo. En el construiremos un Servlet cuya url será la raíz.

En el doGet vamos a comprobar si tenemos como parámetros un nombre y un password. Si no los tenemos, cargamos la página login.jsp
Si los tenemos crearemos una función validar a la que le pasamos el nombre y la contraseña y nos devuelve true si es un usuario válido y false en caso contrario.
En esa función tenemos una lista de usuarios que es la siguiente:
‘eva’,’1234′
‘ana’,’5678′
‘juan’,’0123′
Os dejo a vuestro libre albedrío (si es que tal cosa existe) la manera de almacenar esta información.
Si el usuario y la pass que nos han pasado está en la lsita devolvemos true y en caso contrario devolvemos false

Si en el doGet nos han pasado un nombre y una contraseña llamamos a la función validar. Si nos devuelve false volvemos a cargar la página login.jsp. Si nos devuelve true cargamos una página ‘panel.jsp’ que, de momento, tenga unas palabras de bienvenida y nada más.

 <form  method="post">
  <div class="form-group">
    <label for="nombre">Nombre:</label>
    <input type="text" class="form-control" placeholder="Introduce nombre" name="nombre" id="nombre">
  </div>
  <div class="form-group">
    <label for="pwd">Password:</label>
    <input type="password" class="form-control" placeholder="Introduce contraseña" name="password">
  </div>
  
  <button type="submit" class="btn btn-primary">Enviar</button>
</form> 
package com.trifulcas.controlador;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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;

/**
 * Servlet implementation class Login
 */
@WebServlet("/")
public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public Login() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("GET");
		String nombre = request.getParameter("nombre");
		String password = request.getParameter("password");
		if (nombre == null || password == null || !validar(nombre, password)) {
			RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
			dispatcher.forward(request, response);
		} else {
// Ponemos la variable de sesión nombre
			// para ello recuperamos la sesión con el método getSession de request
			HttpSession sesion=request.getSession();
			sesion.setAttribute("nombre", nombre);
			RequestDispatcher dispatcher = request.getRequestDispatcher("panel.jsp");
			dispatcher.forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		System.out.println("POST");
		doGet(request, response);
	}

	boolean validar(String nombre, String password) {
		Map<String, String> usuarios = new HashMap<String, String>();
		usuarios.put("eva", "1234");
		usuarios.put("ana", "5678");
		usuarios.put("juan", "0123");
		return usuarios.containsKey(nombre) && usuarios.get(nombre).equals(password);

	}

}

Ejemplos Servlet

package com.trifulcas.controlador;

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 com.trifulcas.utils.Sucesiones;

/**
 * Servlet implementation class Fibonacci
 */
@WebServlet("/fibonacci")
public class Fibonacci extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public Fibonacci() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String terminos = request.getParameter("terminos");
		int term=0;
		if (terminos != null && terminos.chars().allMatch(Character::isDigit)) {
			term=Integer.parseInt(terminos);
		} else {
			term = 20;
		}
		request.setAttribute("sucesion", Sucesiones.fibonacci(term));
		request.setAttribute("terminos", term);
		RequestDispatcher dispatcher = request.getRequestDispatcher("fibonacci.jsp");
		dispatcher.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

	

}


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Fibonacci</title>
</head>
<body>
	<h1>Sucesión de fibonacci</h1>
	<p>
		Aquí vas a ver los
		<%=request.getAttribute("terminos")%>
		primeros términos de la sucesión de fibonacci
	</p>

	<h2><%=request.getAttribute("sucesion")%></h2>

	<form action="./fibonacci">
		<p>¿Cuantos términos quieres?</p>
		<input type="text" name="terminos"> <input type="submit">
	</form>
	
</body>
</html>

Ejercicio Servlet

Vamos a capturar la url ‘/ofertas’. Esto nos llevará a un Servlet que nos cargará directamente en dos atributos lo siguiente:

‘ofertones’: ‘<h3>Memoria ram 12€</h3><h3>Placa base 14€</h3>’
‘outlet’:'<h3>Dell 16Gb 540€</h3><h3>Pavillion 270€</h3>’

Pasará esos atributos a una página que tendrá bootstrap, una imagen de cabecera y dos secciones ‘ofertones’ y ‘outlet’ que nos mostrarán los atributos que nos pasan desde el servlet.

Añadiremos estilo de sombra al H3 de los textos de las ofertas.