https://veerasundar.com/blog/2010/12/changing-eclipse-default-encoding-to-utf-8-for-jsp-files/
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>
€
</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.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.
Servlets
MVC páginas y ejemplos
Ejercicio variables de sesion
Vamos a cambiar el login para que nos acepte cualquier usuario siempre que ponga un nombre y la contraseña sea ‘admin’.
El nombre del usuario lo vamos a guardar en una variable de sesión y lo vamos a mostrar en todas las páginas.
Si no hay nombre cuando accedo a una página, me redirige al login.
Vamos a añadir la variable de sesión ‘intentos’ con un valor de 10 y cada vez que hagamos algo (ver el número mayor, tabla de multiplicar o palindromo) le restamos uno. Si llegamos a cero que nos redirija a la página de login.