9. Aplicação web MVC [personne] – versão 4
Esta versão utiliza a biblioteca de tags JSTL apresentada anteriormente.
9.1. O projeto Eclipse
Para criar o projeto Eclipse [mvc-personne-04] da aplicação web [/personne4], duplicaremos o projeto [mvc-personne-03], seguindo o procedimento descrito no parágrafo 6.2, página 78.
![]() | ![]() |
9.2. Configuração da aplicação web [personne4]
O ficheiro web.xml da aplicação /personne4 é o seguinte:
<?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 ficheiro é idêntico ao da versão anterior, exceto na linha 6, onde o nome de exibição da aplicação web mudou para [mvc-personne-04].
A página inicial [index.jsp] altera-se para:
<%@ 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"/>
- linha 5: a página [index.jsp] redireciona o cliente para o URL [/main], que conduz ao controlador [ServletPersonne] da aplicação [/personne4]. A baliza <c:redirect> pertence à biblioteca JSTL / Core. Tem a particularidade de completar a URL do seu atributo [url], adicionando-lhe:
- o prefixo [/contexte], em que [contexte] é o contexto da aplicação, neste caso [personne4].
- o sufixo [?jsessionid=id_session], caso o navegador que efetua a solicitação não tenha enviado um cookie de sessão. O identificador [jsessionid] designa o identificador do token de sessão enviado pelo servidor web aos seus clientes. Depende do servidor web. Neste caso, é o do servidor Tomcat. [id_session] é o próprio token de sessão.
Assim, a verdadeira URL de redirecionamento da linha 5 de [index.jsp] é a URL [/personne4/main?jsessionid=XX], em que XX é o token de sessão. É isso que mostra a página abaixo, obtida após ter solicitado inicialmente a URL [http://localhost:8080/personne4]:

A relação entre a baliza <c:redirect> e o token de sessão é bastante subtil. A sua análise é, neste momento, prematura, mas teremos oportunidade de voltar a este assunto.
9.3. O código das vistas
9.3.1. A vista [formulaire]
Esta vista não sofreu alterações:

É gerada pela página seguinte: 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>
Novidades:
- linha 4: declaração da biblioteca de tags JSTL / Core
- linhas 21 e 25: recuperação de atributos [nom, age] no modelo da página. Recorde-se que estes atributos serão procurados sucessivamente na requisição [request], na sessão [session] e na aplicação [application] da página JSP. No nosso caso, o controlador irá colocá-los na sessão.
- Já não existe código Java no início da página JSP para recuperar o modelo da página, devido ao funcionamento anterior.
9.3.2. A vista [reponse]
Esta vista não sofreu alterações:
![]() | ![]() |
A nova página JSP [reponse.jsp] é a seguinte:
<%@ 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>
Novidades:
- linha 4: declaração da biblioteca de tags JSTL / Core
- linhas 16, 20, 28: recuperação de atributos [nom, age, lienRetourFormulaire] no modelo da página. Já não existe código Java no início da página JSP para recuperar esses atributos.
9.3.3. A vista [erreurs]
Esta vista não sofreu alterações:
![]() | ![]() |
A nova página JSP [erreurs.jsp] é a seguinte:
<%@ 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>
Novidades:
- linha 4: declaração da biblioteca de tags JSTL / Core
- linhas 13-15: exibição da lista de erros utilizando JSTL
- já não existe código Java no início da página JSP para recuperar o modelo da mesma.
9.4. Testes das vistas
Para realizar os testes das vistas anteriores, duplicamos as respetivas páginas JSP na pasta /WebContent/JSP do projeto Eclipse:

Em seguida, na pasta JSP, as páginas são alteradas da seguinte forma:
[formulaire.jsp]:
...
<%
// -- teste: cria-se o modelo da página
session.setAttribute("nom","tintin");
session.setAttribute("age","30");
%>
<html>
<head>
As linhas 4-5 foram adicionadas para criar o modelo necessário à página.
[reponse.jsp]:
...
<%
// -- teste: cria-se o modelo da página
request.setAttribute("nom","milou");
request.setAttribute("age","10");
request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>
<html>
<head>
...
As linhas 4-6 foram adicionadas para criar o modelo necessário à página.
[erreurs.jsp]:
<%
// -- teste: cria-se o modelo da 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>
As linhas 4 a 8 foram adicionadas para criar o modelo necessário para a página.
Inicie o Tomcat, se ainda não o tiver feito, e, em seguida, solicite os seguintes URLs:
![]() | ![]() |
![]() |
Conseguimos, de facto, as visualizações esperadas.
9.5. O controlador [ServletPersonne]
O controlador [ServletPersonne] da aplicação web [/personne3] irá processar as seguintes ações:
n.º | pedido | origem | processamento |
1 | [GET /personne4/main] | URL introduzida pelo utilizador | - enviar a vista [formulaire] vazia |
2 | [POST /personne4/main] com parâmetros [txtNom, txtAge, action=validationFormulaire] enviados | clique no botão [Envoyer] da vista [formulaire] | - verificar os valores dos parâmetros [txtNom, txtAge] - se estiverem incorretos, enviar a vista [erreurs(erreurs)] - se estiverem corretos, enviar a vista [reponse(nom,age)] |
3 | [POST /personne4/main] com parâmetros [action=retourFormulaire] publicados | clicando na ligação [Voltar ao formulário] nas visualizações [réponse] e [erreurs]. | - enviar a vista [formulaire] pré-preenchida com os últimos valores introduzidos |
A estrutura do controlador [ServletPersonne] é idêntica à da versão anterior. Analisamos as alterações introduzidas nos métodos [doInit, doValidationFormulaire, doRetourFormulaire], uma vez que os métodos [init, doGet, doPost] não sofreram alterações.
9.5.1. O método [doInit]
Este método processa a solicitação n.º 1 [GET /personne4/main]. O seu código é o seguinte:
Novidades:
- linha 3: é apresentada a vista [formulaire]. Esta espera, no seu modelo, os atributos «nome» e «idade». Não os irá encontrar, uma vez que, neste caso, o controlador não os insere no modelo. Neste caso, a biblioteca JSTL irá recuperar ponteiros null para esses atributos. Isto não provoca erros e serão exibidos valores vazios para os elementos ${nom} e ${age} da vista [formulaire]. Isto é o que pretendemos. Desta forma, evitamos ter de inicializar o modelo da vista [formulaire].
9.5.2. O método [doValidationFormulaire]
Este método processa o pedido n.º 2, [POST /personne4/main], com [action, txtNom, txtAge] nos elementos enviados. O seu código é o seguinte:
Novidades:
- linha 15: o método [doValidationFormulaire] envia como resposta a vista [réponse]. Esta tem no seu modelo os elementos [nom, age, lienRetourFormulaire]. O [lienRetourFormulaire] é inserido no modelo na linha 14, através da consulta. Os elementos [nom,age] são, por sua vez, inseridos no modelo nas linhas 8 a 10, através da sessão. Na versão anterior, os elementos [nom, age] também eram colocados na consulta ao enviar a vista [réponse], uma vez que essa vista os esperava nesse local. Aqui, com a biblioteca JSTL, sabemos que os diferentes contextos (pedido, sessão, aplicação) serão explorados para encontrar os elementos do modelo. Serão, portanto, encontrados na sessão, uma vez que o controlador os colocou lá (linhas 8-10).
9.5.3. O método [doRetourFormulaire]
Este método processa o pedido n.º 3 [POST /personne4/main] com [action=retourFormulaire] nos elementos enviados. O seu código é o seguinte:
Novidades:
- linha 4: é apresentada a vista [formulaire]. Esta espera, no seu modelo, os atributos «nome» e «idade». Encontrá-los-á na sessão, uma vez que o método [doValidationFormulaire] os colocou lá e que este método é necessariamente executado antes do método [doRetourFormulaire]. Não é, portanto, necessário inicializar o modelo de [formulaire] antes da sua exibição na linha 4. Consequentemente, os métodos [doInit] e [doRetourFormulaire] são idênticos e seria possível eliminar a ação [retourFormulaire] para a substituir pela ação [init]. O método [doRetourFormulaire] deixaria então de existir.
9.6. Tests
Nesta nova versão, apenas as vistas sofrem alterações. O controlador [ServletPersonne], por sua vez, não sofre alterações. A utilização de JSTL permitiu-nos simplesmente explorar de forma mais simples, nas páginas JSP, o modelo construído pelo controlador.
Inicie ou reinicie o Tomcat após ter integrado o projeto Eclipse [personne-mvc-04]. Aceda à URL [http://localhost:8080/personne4].








