Skip to content

9. Aplicação Web MVC [person] – 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] para a aplicação Web [/personne4], duplique o projeto [mvc-personne-03] seguindo o procedimento descrito na secção 6.2, na página 78.

9.2. Configurar a aplicação web [personne4]

O ficheiro web.xml para a 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:


<%@ 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 leva ao controlador [ServletPersonne] da aplicação [/personne4]. A tag <c:redirect> pertence à biblioteca JSTL / Core. Tem a particularidade de completar o URL do seu atributo [url] adicionando:
  • o prefixo [/context], onde [context] é o contexto da aplicação, neste caso [personne4].
  • o sufixo [?jsessionid=id_session] se o navegador que efetua o pedido não tiver enviado um cookie de sessão. O identificador [jsessionid] refere-se ao identificador do token de sessão enviado pelo servidor web aos seus clientes. Depende do servidor web. Aqui, é o do servidor Tomcat. [id_session] é o próprio token de sessão.

Assim, o URL de redirecionamento efetivo na linha 5 de [index.jsp] é o URL [/person4/main?jsessionid=XX], onde XX é o token de sessão. Isto é mostrado na página abaixo, obtida após solicitar inicialmente o URL [http://localhost:8080/personne4]:

Image

A relação entre a tag <c:redirect> e o token de sessão é bastante subtil. É demasiado cedo para aprofundar o assunto aqui, mas teremos oportunidade de voltar a abordá-lo mais tarde.

9.3. O código da vista

9.3.1. A vista [form]

Esta vista não sofreu alterações:

Image

É gerada pela seguinte página 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, 25: Recuperação dos atributos [name, age] do modelo da página. Note-se que estes atributos serão procurados sucessivamente na solicitação, na sessão e na aplicação da página JSP. No nosso caso, o controlador irá colocá-los na sessão.
  • Já não existe qualquer código Java no início da página JSP para recuperar o modelo da página, devido à implementação anterior.

9.3.2. A vista [resposta]

Esta vista não sofreu alterações:

A nova página JSP [response.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 dos atributos [name, age, formSubmitLink] no modelo da página. Já não existe qualquer código Java no topo da página JSP para recuperar estes atributos.

9.3.3. A vista [errors]

Esta vista não sofreu alterações:

A nova página JSP [errors.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 qualquer código Java no topo da página JSP para recuperar o seu modelo.

9.4. Teste das vistas

Para testar as visualizações anteriores, duplicamos as suas páginas JSP na pasta /WebContent/JSP do projeto Eclipse:

Image

Em seguida, na pasta JSP, as páginas são modificadas da seguinte forma:

[form.jsp]:


...
<%
  // -- test : on crée le modèle de la page
  session.setAttribute("nom","tintin");
  session.setAttribute("age","30");
%>
 
<html>
  <head>
 

As linhas 4–5 foram adicionadas para criar o modelo exigido pela página.

[response.jsp]:


...
<%
  // -- test : on crée le modèle de la page
  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 exigido pela página.

[errors.jsp]:


 
<%
  // -- test : on crée le modèle de la page
  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–8 foram adicionadas para criar o modelo exigido pela página.

Inicie o Tomcat, caso ainda não o tenha feito, e, em seguida, solicite os seguintes URLs:

 

Recebemos as visualizações esperadas.

9.5. O controlador [ServletPersonne]

O controlador [ServletPersonne] da aplicação web [/personne3] irá tratar das seguintes ações:

N.º
pedido
origem
processamento
1
[GET /person4/main]
URL introduzida pelo utilizador
- enviar a vista [form] vazia
2
[POST /person4/hand]
com os parâmetros [txtName,
txtAge,
action=validateForm]
enviado
clique no
[Submit] no
[formulário]
- verifique os valores dos parâmetros [txtName, txtAge]
- se estiverem incorretos, envie a vista [errors(errors)]
- se estiverem corretos, envie a visualização [response(name,age)]
3
[POST /person4/main]
com os parâmetros
[action=returnForm]
enviado
clique no [Voltar ao
formulário] a partir da
[resposta] e [erros].
- enviar a vista [formulário] pré-preenchida com os valores introduzidos mais recentemente

A estrutura do controlador [ServletPersonne] é idêntica à da versão anterior. Iremos rever as alterações feitas nos métodos [doInit, doValidationFormulaire, doRetourFormulaire]; os métodos [init, doGet, doPost] permanecem inalterados.

9.5.1. O método [doInit]

Este método trata do pedido n.º 1 [GET /personne4/main]. O seu código é o seguinte:

1
2
3
4
5
6
    // empty form display
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

Novidades:

  • Linha 3: A vista [form] é renderizada. Esta vista espera os atributos "name" e "age" no seu modelo. Não os encontrará lá porque o controlador não os fornece. Neste caso, a biblioteca JSTL irá recuperar ponteiros nulos para estes atributos. Isto não causa quaisquer erros, e serão apresentados valores vazios para os elementos ${name} e ${age} da vista [form]. Isto funciona para nós. Assim, evitamos ter de inicializar o modelo da vista [form].

9.5.2. O método [doValidationFormulaire]

Este método trata do pedido n.º 2 [POST /person4/main] com [action, txtName, txtAge] nos elementos enviados. O seu código é o seguinte:

    // form validation
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                // parameters are retrieved
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
        // stored in the session
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
        // parameter verification
...
        // parameters are correct - send response page
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

Novidades:

  • Linha 15: O método [doValidationFormulaire] devolve a vista [response]. Esta vista tem os elementos [name, age, formReturnLink] no seu modelo. [formReturnLink] é adicionado ao modelo na linha 14 através do pedido. Os elementos [name, age] são colocados no modelo nas linhas 8–10 através da sessão. Na versão anterior, também tínhamos colocado os elementos [name, age] na solicitação ao enviar a vista [response], porque essa vista esperava encontrá-los lá. Aqui, com a biblioteca JSTL, sabemos que os vários contextos (solicitação, sessão, aplicação) serão pesquisados para encontrar os elementos do modelo. Eles 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 /person4/main] com [action=retourFormulaire] nos elementos enviados. O seu código é o seguinte:

1
2
3
4
5
6
7
    // display pre-filled form
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // the form is displayed
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

Novidades:

  • linha 4: a vista [form] é apresentada. Esta vista espera os atributos «name» e «age» no seu modelo. Encontrá-los-á na sessão, uma vez que o método [doValidationForm] os colocou lá e esse método é necessariamente executado antes do método [doReturnForm]. Portanto, não há necessidade de inicializar o modelo [form] antes de o apresentar na linha 4. Como resultado, os métodos [doInit] e [doReturnForm] são idênticos, e poderíamos remover a ação [returnForm] e substituí-la pela ação [init]. O método [doReturnForm] desapareceria então.

9.6. Testes

Nesta nova versão, apenas as vistas foram alteradas. O controlador [ServletPersonne] permanece inalterado. A utilização do JSTL permitiu-nos simplesmente utilizar mais facilmente o modelo construído pelo controlador nas páginas JSP.

Inicie ou reinicie o Tomcat após integrar o projeto Eclipse [personne-mvc-04]. Aceda ao URL [http://localhost:8080/personne4].