9. Aplicación web MVC [personne] – versión 4
Esta versión utiliza la biblioteca de etiquetas JSTL presentada anteriormente.
9.1. El proyecto de Eclipse
Para crear el proyecto de Eclipse [mvc-personne-04] de la aplicación web [/personne4], duplicaremos el proyecto [mvc-personne-03] siguiendo el procedimiento descrito en el apartado 6.2, página 78.
![]() | ![]() |
9.2. Configuración de la aplicación web [personne4]
El archivo web.xml de la aplicación /personne4 es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>mvc-personne-04</display-name>
...
Este archivo es idéntico al de la versión anterior, salvo en la línea 6, donde el nombre de visualización de la aplicación web ha cambiado a [mvc-personne-04].
La página de inicio [index.jsp] cambia a:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<c:redirect url="/main"/>
- línea 5: la página [index.jsp] redirige al cliente a la URL [/main], que conduce al controlador [ServletPersonne] de la aplicación [/personne4]. La etiqueta <c:redirect> pertenece a la biblioteca JSTL / Core. Tiene la particularidad de completar la URL de su atributo [url] añadiéndole:
- el prefijo [/contexte], donde [contexte] es el contexto de la aplicación, en este caso [personne4].
- el sufijo [?jsessionid=id_session] si el navegador que realiza la solicitud no ha enviado ninguna cookie de sesión. El identificador [jsessionid] designa el identificador del token de sesión enviado por el servidor web a sus clientes. Depende del servidor web. En este caso, es el del servidor Tomcat. [id_session] es el propio token de sesión.
Por lo tanto, la URL de redirección real de la línea 5 de [index.jsp] es la URL [/personne4/main?jsessionid=XX], donde XX es el token de sesión. Esto es lo que muestra la página que aparece a continuación, obtenida tras solicitar inicialmente la URL [http://localhost:8080/personne4]:

La relación entre la etiqueta <c:redirect> y el token de sesión es bastante sutil. Analizarla aquí sería prematuro, pero tendremos ocasión de volver sobre ella más adelante.
9.3. El código de las vistas
9.3.1. La vista [formulaire]
Esta vista no ha cambiado:

Se genera a partir de la página siguiente: JSP [formulaire.jsp]:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne - formulaire</title>
<script language="javascript">
...
</script>
</head>
<body>
<center>
<h2>Personne - formulaire</h2>
<hr>
<form name="frmPersonne" method="post">
<table>
<tr>
<td>Nom</td>
<td><input name="txtNom" value="${nom}" type="text" size="20"></td>
</tr>
<tr>
<td>Age</td>
<td><input name="txtAge" value="${age}" type="text" size="3"></td>
</tr>
<tr>
</table>
<table>
<tr>
<td><input type="submit" value="Submit"></td>
<td><input type="button" value="[Envoyer]" onclick="envoyer()"></td>
<td><input type="reset" value="Rétablir"></td>
<td><input type="button" value="[Effacer]" onclick="effacer()"></td>
</tr>
</table>
<input type="hidden" name="action" value="validationFormulaire">
</form>
</center>
</body>
</html>
Novedades:
- línea 4: declaración de la biblioteca de etiquetas JSTL / Core
- líneas 21 y 25: recuperación de atributos [nom, age] en la plantilla de la página. Recordemos que estos atributos se buscarán sucesivamente en la consulta [request], la sesión [session] y la aplicación [application] de la página JSP. En nuestro caso, el controlador los colocará en la sesión.
- Ya no hay código Java al principio de la página JSP para recuperar la plantilla de la página debido al funcionamiento anterior.
9.3.2. La vista [reponse]
Esta vista no ha cambiado:
![]() | ![]() |
La nueva página JSP [reponse.jsp] es la siguiente:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Personne - réponse</h2>
<hr>
<table>
<tr>
<td>Nom</td>
<td>${nom}</td>
</tr>
<tr>
<td>Age</td>
<td>${age}</td>
</tr>
</table>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
Novedades:
- línea 4: declaración de la biblioteca de etiquetas JSTL / Core
- líneas 16, 20 y 28: recuperación de atributos [nom, age, lienRetourFormulaire] en la plantilla de la página. Ya no hay código Java al principio de la página JSP para recuperarlos.
9.3.3. La vista [erreurs]
Esta vista no ha cambiado:
![]() | ![]() |
La nueva página JSP [erreurs.jsp] es la siguiente:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@ taglib uri="/WEB-INF/c.tld" prefix="c" %>
<html>
<head>
<title>Personne</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<c:forEach var="erreur" items="${erreurs}">
<li>${erreur}</li>
</c:forEach>
</ul>
<br>
<form name="frmPersonne" method="post">
<input type="hidden" name="action" value="retourFormulaire">
</form>
<a href="javascript:document.frmPersonne.submit();">
${lienRetourFormulaire}
</a>
</body>
</html>
Novedades:
- línea 4: declaración de la biblioteca de etiquetas JSTL / Core
- líneas 13-15: visualización de la lista de errores mediante JSTL
- ya no hay código Java al principio de la página JSP para recuperar la plantilla de la misma.
9.4. Pruebas de las vistas
Para realizar las pruebas de las vistas anteriores, duplicamos sus páginas JSP en la carpeta /WebContent/JSP del proyecto Eclipse:

A continuación, en la carpeta JSP, se modifican las páginas de la siguiente manera:
[formulaire.jsp]:
...
<%
// -- prueba: se crea el modelo de la página
session.setAttribute("nom","tintin");
session.setAttribute("age","30");
%>
<html>
<head>
Se han añadido las líneas 4 y 5 para crear la plantilla que necesita la página.
[reponse.jsp]:
...
<%
// -- prueba: se crea el modelo de la página
request.setAttribute("nom","milou");
request.setAttribute("age","10");
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<html>
<head>
...
Se han añadido las líneas 4-6 para crear la plantilla que necesita la página.
[erreurs.jsp]:
<%
// -- prueba: se crea la plantilla de la página
ArrayList<String> erreurs1=new ArrayList<String>();
erreurs1.add("erreur1");
erreurs1.add("erreur2");
request.setAttribute("erreurs",erreurs1);
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<html>
<head>
Se han añadido las líneas 4-8 para crear la plantilla que necesita la página.
Inicia Tomcat, si aún no lo has hecho, y a continuación solicita las siguientes URL:
![]() | ![]() |
![]() |
Efectivamente, obtenemos las vistas esperadas.
9.5. El controlador [ServletPersonne]
El controlador [ServletPersonne] de la aplicación web [/personne3] gestionará las siguientes acciones:
n.º | solicitud | origen | tratamiento |
1 | [GET /personne4/main] | URL introducida por el usuario | - enviar la vista [formulaire] vacía |
2 | [POST /personne4/main] con parámetros [txtNom, txtAge, action=validationFormulaire] publicados | al hacer clic en el botón [Envoyer] de la vista [formulaire] | - comprobar los valores de los parámetros [txtNom, txtAge] - si son incorrectos, enviar la vista [erreurs(erreurs)] - si son correctos, enviar la vista [reponse(nom,age)] |
3 | [POST /personne4/main] con parámetros [action=retourFormulaire] publicados | al hacer clic en el enlace [Volver al formulario] de las vistas [réponse] y [erreurs]. | - Enviar la vista [formulaire] prellenada con los últimos valores introducidos |
La estructura del controlador [ServletPersonne] es idéntica a la de la versión anterior. Repasamos los cambios introducidos en los métodos [doInit, doValidationFormulaire, doRetourFormulaire], ya que los métodos [init, doGet, doPost] no han variado.
9.5.1. El método [doInit]
Este método procesa la solicitud n.º 1 [GET /personne4/main]. Su código es el siguiente:
Novedades:
- Línea 3: se muestra la vista [formulaire]. Esta espera en su modelo los atributos «nombre» y «edad». No los encontrará allí, ya que en este caso el controlador no los incluye. En este caso, la biblioteca JSTL recuperará punteros null para estos atributos. Esto no provoca errores y se mostrarán valores vacíos para los elementos ${nom} y ${age} de la vista [formulaire]. Esto nos viene bien. De este modo, evitamos tener que inicializar el modelo de la vista [formulaire].
9.5.2. El método [doValidationFormulaire]
Este método procesa la solicitud n.º 2 [POST /personne4/main] con [action, txtNom, txtAge] en los elementos enviados. Su código es el siguiente:
Novedades:
- línea 15: el método [doValidationFormulaire] envía como respuesta la vista [réponse]. Esta tiene en su modelo los elementos [nom, age, lienRetourFormulaire]. [lienRetourFormulaire] se incluye en la plantilla de la línea 14, a través de la consulta. Los elementos [nom,age], por su parte, se insertan en el modelo en las líneas 8-10, a través de la sesión. En la versión anterior, también se habían colocado los elementos [nom, age] en la consulta al enviar la vista [réponse], ya que dicha vista los esperaba allí. En este caso, con la biblioteca JSTL, sabemos que se explorarán los distintos contextos (solicitud, sesión, aplicación) para encontrar los elementos del modelo. Por lo tanto, se encontrarán en la sesión, ya que el controlador los ha colocado allí (líneas 8-10).
9.5.3. El método [doRetourFormulaire]
Este método procesa la solicitud n.º 3 [POST /personne4/main] con [action=retourFormulaire] en los elementos enviados. Su código es el siguiente:
Novedades:
- línea 4: se muestra la vista [formulaire]. Esta espera en su modelo los atributos «nombre» y «edad». Los encontrará en la sesión, ya que el método [doValidationFormulaire] los ha introducido allí y dicho método se ejecuta necesariamente antes que el método [doRetourFormulaire]. Por lo tanto, no es necesario inicializar el modelo de [formulaire] antes de su visualización en la línea 4. Por lo tanto, los métodos [doInit] y [doRetourFormulaire] son idénticos y se podría eliminar la acción [retourFormulaire] para sustituirla por la acción [init]. El método [doRetourFormulaire] desaparecería entonces.
9.6. Pruebas
En esta nueva versión, solo cambian las vistas. El controlador [ServletPersonne], por su parte, no cambia. El uso de JSTL simplemente nos ha permitido aprovechar de forma más sencilla en las páginas JSP el modelo creado por el controlador.
Inicia o reinicia Tomcat tras haber integrado en él el proyecto Eclipse [personne-mvc-04]. Accede a la URL [http://localhost:8080/personne4].








