Skip to content

11. Aplicação Web MVC [person] – Versão 6

11.1. Introdução

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

A versão anterior não utilizava sessões para armazenar dados entre as trocas cliente/servidor. Utilizava cookies, o que significa que os dados a armazenar são enviados ao cliente pelo servidor para que o cliente os possa reenviar durante a troca seguinte. Nesta nova versão, utilizamos uma técnica semelhante: campos ocultos em formulários. Existem diferenças entre estas duas técnicas:

Cookies
Campos ocultos
- O servidor coloca os itens a serem armazenados no fluxo HTTP que precede o documento HTML.
- O servidor coloca os elementos a serem armazenados dentro do documento HTML.
- A técnica requer que o navegador aceite cookies para que os possa reenviar ao servidor durante os seus pedidos GET ou POST.
- Esta técnica requer que todas as solicitações do cliente ao servidor sejam solicitações POST, para que os campos ocultos sejam enviados ao servidor.
- O utilizador pode aceder aos itens armazenados visualizando os cookies recebidos pelo seu navegador. A maioria dos navegadores oferece esta opção.
- O utilizador pode aceder aos dados armazenados visualizando o código-fonte do documento HTML recebido.

A técnica do campo oculto pode ser utilizada aqui porque todas as solicitações do cliente são solicitações POST.

11.2. O projeto Eclipse

Para criar o projeto Eclipse [mvc-personne-06] para a aplicação web [/personne6], duplique o projeto [mvc-personne-05] seguindo o procedimento descrito na secção 6.2.

11.3. Configurar a aplicação web [personne6]

O ficheiro web.xml para a 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, exceto por 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 da vista

Apenas as vistas [response, errors] foram alteradas. Agora incluem campos ocultos nos respetivos formulários, enquanto que na versão anterior estes formulários não enviavam quaisquer parâmetros.

[response.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 ao servidor quando o link nas linhas 10–12 for clicado
  • linha 6: o destino do POST será [/do/retourFormulaire]
  • linhas 7–8: os campos ocultos [name] e [age] serão enviados. Os seus valores ${name} e ${age} serão definidos pelo controlador que exibe [response.jsp]. Estes serão os valores introduzidos no formulário.

[errors.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 [response.jsp]. Note-se que o modelo da vista [errors] foi expandido com dois novos elementos [name, age], que foram adicionados aos dois já existentes: [errors, returnToFormLink].

Convidamos os leitores a testarem estas novas vistas seguindo a abordagem utilizada nas versões anteriores.

11.5. O controlador [ServletPersonne]

O controlador [ServletPersonne] para a aplicação web [/personne6] é muito semelhante ao da versão anterior. As alterações decorrem do facto de o modelo da vista [errors] ter mudado. Devem ser adicionados dois elementos adicionais: [name, age]. Apenas os métodos que apresentam esta vista são afetados. Estes são os métodos [doGet] e [doValidateForm].

11.5.1. O método [doGet]

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

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

        // check how the servlet was initialized
        if (erreursInitialisation.size() != 0) {
            // we hand over to the error page
            request.setAttribute("erreurs", erreursInitialisation);
            getServletContext().getRequestDispatcher(urlErreurs).forward(
                    request, response);
            // end
            return;
        }
...
    }

Na verdade, este código permanece idêntico ao que era. Na versão anterior, os elementos [name, age] não estavam incluídos no modelo de visualização [errors]. Se continuarmos a excluí-los, as variáveis ${name} e ${age} em [errors.jsp] serão substituídas por uma cadeia vazia. Isto funciona para nós, porque, neste caso específico, o link [Voltar ao formulário] não é apresentado ao utilizador. Na verdade, também não incluímos o elemento [formBackLink] no modelo. A variável ${lienRetourFormulaire} em [erreurs.jsp] será substituída pela string vazia. Portanto, não haverá nenhum link e, consequentemente, nenhuma forma de enviar os campos ocultos [name, age] do formulário em [erreurs.jsp]. O valor destes campos pode, portanto, ser a string vazia.

11.5.2. O método [doValidationFormulaire]

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");
        // prepare the view model [response, errors]
        request.setAttribute("nom",nom);
        request.setAttribute("age",age);        
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        // parameter verification
...

Linhas 8–10: Passamos os elementos [name, age, formReturnLink] para o modelo. Sabemos que o método apresenta uma das vistas [response] ou [errors]. A última terá, portanto, os elementos [name, age] no seu modelo.

11.6. Testes

Inicie ou reinicie o Tomcat após integrar o projeto Eclipse [person-mvc-06] nele e, em seguida, solicite a URL [http://localhost:8080/personne6].