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.

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.

Ejemplo variables sesión

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Login</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">

<!-- jQuery library -->
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<!-- Popper JS -->
<script
	src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

<!-- Latest compiled JavaScript -->
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<!-- Recuperar el nombre y la contraseña. Si es admin admin ir a otra página -->

<%
String nombre=request.getParameter("nombre");
String pwd=request.getParameter("pwd");



if (nombre!=null && pwd!=null && nombre.equals("admin") && pwd.equals("admin")){
	// Estas variables son accesibles desde cualquier página
	session.setAttribute("nombre", nombre);
	session.setAttribute("saludo", "hola que tal");
	session.setAttribute("intentos", 5);
	response.sendRedirect("panel.jsp");
}
%>

 <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="pwd">
  </div>
  
  <button type="submit" class="btn btn-primary">Enviar</button>
</form> 
	
</body>
</html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Tabla de multiplicar</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">

<!-- jQuery library -->
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<!-- Popper JS -->
<script
	src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

<!-- Latest compiled JavaScript -->
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="zstyle.css">
</head>
<body>
<%
String numero=request.getParameter("numero");

String nombre=(String) session.getAttribute("nombre");
Integer intentos=(Integer)session.getAttribute("intentos");

if(nombre==null){
	response.sendRedirect("login.jsp");
}
%>
<h1>Hola <%=nombre %> tienes <%=intentos %> intentos</h1>
 <form>
  <div class="form-group">
    <label for="numero">Número:</label>
    <input type="number" class="form-control" placeholder="Introduce el número" name="numero"
    value="<%=numero!=null?numero:"" %>" >
  </div>
  <button type="submit" class="btn btn-primary">Enviar</button>
</form> 
	
<%

if (numero!=null && !numero.equals("") && numero.chars().allMatch(Character::isDigit)){
	int num=Integer.parseInt(numero);
	for(int i=1;i<=10;i++){
	//	out.println("<p>"+i+" x "+num+" = "+(i*num)+"</p>");
		%>
		<p><%=i%> x <%=num %> = <%=(i*num) %></p>
		<%
	}
}

%>
</body>
</html>

Ejemplo JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Tirar Monedas</title>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet"
	href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">

<!-- jQuery library -->
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<!-- Popper JS -->
<script
	src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

<!-- Latest compiled JavaScript -->
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="zstyle.css">
</head>
<body>

	
	<%
	int num1 = (int) Math.floor(Math.random() * 2) + 1;
	int num2 = (int) Math.floor(Math.random() * 2) + 1;

	String moneda1 = num1 == 1 ? "cara" : "cruz";
	String moneda2 = num2 == 1 ? "cara" : "cruz";
	%>
	<h1>
		Juego de las monedas <img src="img/cara.png" />
	</h1>
	<h1>¡Lanza la monedas!</h1>
	<p>
		<%
		if (num1 == 1) {
		%>
		<img src="img/cara.png">
		<%
		} else {
		%>
		<img src="img/cruz.png">
		<%
		}
		%>
		<img src="img/<%=moneda2%>.png">
	</p>
	<%
	if (num1 == num2) {
	%>
	<h2>Has ganado</h2>
	<%
	} else {
	%>
	<h2>Has perdido ¡looser!</h2>
	<%
	}
	%>
	<a href="index.jsp" class="btn btn-primary">Volver a tirar</a>
<script src="js/codigo.js"></script>
</body>
</html>