Skip to content

11. Aplicação web MVC [personne] – versão 6

11.1. Introduction

Nesta versão, introduzimos a seguinte alteração:

A versão anterior não utilizava a sessão para memorizar elementos entre duas trocas cliente/servidor. Utilizava a técnica dos cookies, que faz com que os elementos a memorizar sejam enviados ao cliente pelo servidor, para que este os reenvie na próxima troca. Nesta nova versão, utilizamos uma técnica semelhante: a dos campos ocultos nos formulários. Existem diferenças entre estas duas técnicas:

Cookies
Campos ocultos
- o servidor coloca os elementos a memorizar no fluxo HTTP, que precede o documento HTML.
- o servidor coloca os elementos a memorizar no documento HTML.
- esta técnica requer que o navegador aceite cookies para que estes sejam reenviados ao servidor durante as suas solicitações GET ou POST.
- A técnica requer que todas as chamadas do cliente ao servidor sejam do tipo POST, para que os campos ocultos sejam enviados ao servidor.
- O utilizador tem acesso aos elementos armazenados ao visualizar os cookies recebidos pelo seu navegador. A maioria dos navegadores disponibiliza esta opção.
- O utilizador tem acesso aos elementos armazenados ao visualizar o código-fonte do documento HTML recebido.

A técnica dos campos ocultos pode ser utilizada neste caso, uma vez que todas as chamadas do cliente são do tipo POST.

11.2. O projeto Eclipse

Para criar o projeto Eclipse [mvc-personne-06] da aplicação web [/personne6], duplicaremos o projeto [mvc-personne-05] seguindo o procedimento descrito no parágrafo 6.2.

11.3. Configuração da aplicação web [personne6]

O ficheiro web.xml da aplicação /personne6 é 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-06</display-name>
...

Este ficheiro é idêntico ao da versão anterior, com exceção de alguns detalhes:

  • linha 6: o nome de exibição da aplicação web mudou para [mvc-personne-06]

A página inicial [index.jsp] é idêntica à da aplicação [/personne5]:


<%@ 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="/do/formulaire"/>

11.4. O código das vistas

Apenas as vistas [réponse, erreurs] mudaram. Passaram a ter campos ocultos nos respetivos formulários, enquanto que na versão anterior esses formulários não enviavam nenhum parâmetro.

[réponse.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>


  • linhas 6-9: o formulário que será enviado para o servidor ao clicar na ligação das linhas 10-12
  • linha 6: o destino do POST será o [/do/retourFormulaire]
  • linhas 7-8: os campos ocultos [nom] e [age] serão enviados. Os seus valores ${nom} e ${age} serão definidos pelo controlador que exibirá [réponse.jsp]. Estes serão os valores introduzidos no formulário.

[erreurs.jsp]:


...
<html>
...
  <body>
...
    <form name="frmPersonne" action="retourFormulaire" method="post">
      <input type="hidden" name="nom" value="${nom}">
      <input type="hidden" name="age" value="${age}">      
    </form>
    <a href="javascript:document.frmPersonne.submit();">
      ${lienRetourFormulaire}
    </a>
  </body>
</html>

As alterações e explicações são as mesmas que para a vista [réponse.jsp]. Note-se que o modelo da vista [erreurs] é enriquecido com dois novos elementos [nom, age], que se juntam aos outros dois já existentes: [erreurs, lienRetourFormulaire].

Convidamos o leitor a testar estas novas vistas de acordo com o princípio apresentado nas versões anteriores.

11.5. O controlador [ServletPersonne]

O controlador [ServletPersonne] da aplicação web [/personne6] é muito semelhante ao da versão anterior. As alterações devem-se ao facto de o modelo da vista [erreurs] ter mudado. É necessário adicionar dois elementos suplementares: [nom, age]. Apenas os métodos que exibem esta vista são afetados. Trata-se dos métodos [doGet] e [doValidationFormulaire].

11.5.1. O método [doGet]

O código de [doGet] é o seguinte:

     // GET
    @SuppressWarnings("unchecked")
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

         // verifica-se como decorreu a inicialização do servlet
        if (erreursInitialisation.size() != 0) {
             // passa-se o controlo para a página de erros
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
             // fim
            return;
        }
...
    }

Na verdade, este código permanece idêntico ao que era. Na versão anterior, os elementos [nom, age] não eram incluídos no modelo da vista [erreurs]. Se continuarmos a não os incluir, as variáveis ${nom} e ${age} de [erreurs.jsp] serão substituídas pela cadeia vazia. Isso convém-nos, pois, neste caso específico, o link [Retour au formulaire] não é apresentado ao utilizador. De facto, também não incluímos o elemento [lienRetourFormulaire] no modelo. A variável ${lienRetourFormulaire} de [erreurs.jsp] será substituída pela cadeia vazia. Não haverá, portanto, qualquer ligação, pelo que não será possível enviar os campos ocultos [nom, age] do formulário [erreurs.jsp]. O valor destes campos pode, assim, ser a cadeia vazia.

11.5.2. O método [doValidationFormulaire]

O seu código é o seguinte:

     // validação do formulário
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
         // recuperam-se os parâmetros
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // prepara-se o modelo das vistas [réponse, erreurs]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
         // verificação dos parâmetros
...

Nas linhas 8 a 10, inserem-se no modelo os elementos [nom, age, lienRetourFormulaire]. Sabe-se que o método apresenta uma das vistas [réponse] ou [erreurs]. Esta última terá, portanto, os elementos [nom,age] no seu modelo.

11.6. Tests

Inicie ou reinicie o Tomcat após ter integrado o projeto Eclipse [personne-mvc-06] e, em seguida, aceda à URL [http://localhost:8080/personne6].