Skip to content

9. Aplicativo 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 arquivo 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 arquivo é idêntico ao da versão anterior, exceto pela linha 6, onde o nome de exibição da aplicação web foi alterado para [mvc-personne-04].

A página inicial [index.jsp] muda 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 a URL [/main], que leva ao controlador [ServletPersonne] do aplicativo [/personne4]. A tag <c:redirect> pertence à biblioteca JSTL / Core. Ela tem a particularidade de completar a URL do seu atributo [url], acrescentando:
  • o prefixo [/contexte], em que [contexte] é o contexto da aplicação, neste caso [personne4].
  • o sufixo [?jsessionid=id_session], caso o navegador que faz 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. Ele depende do servidor web. Neste caso, é o do servidor Tomcat. [id_session] é o próprio token de sessão.

Assim, a URL de redirecionamento real 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]:

Image

A relação entre a tag <c:redirect> e o token de sessão é bastante sutil. Sua análise é prematura neste momento, mas teremos a oportunidade de voltar a esse assunto.

9.3. O código das visualizações

9.3.1. A visualização [formulaire]

Essa visualização não sofreu alterações:

Image

Ela é gerada pela página JSP [formulaire.jsp] a seguir:


<%@ 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 de atributos [nom, age] no modelo da página. Vale lembrar que esses atributos serão buscados sucessivamente na solicitação [request], na sessão [session] e no aplicativo [application] da página JSP. No nosso caso, o controlador os colocará na sessão.
  • Não há mais código Java no início da página JSP para recuperar o modelo da página, devido ao funcionamento descrito anteriormente.

9.3.2. A visualização [reponse]

Essa 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. Não há mais código Java no início da página JSP para recuperar esses atributos.

9.3.3. A visualização [erreurs]

Esta visualização 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 por meio de JSTL
  • não há mais código Java no início da página JSP para recuperar o modelo da mesma.

9.4. Testes das visualizações

Para realizar os testes das visualizações anteriores, duplicamos 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:

[formulaire.jsp]:


...
<%
  // -- teste: cria-se o modelo da página
  session.setAttribute("nom","tintin");
  session.setAttribute("age","30");
%>

<html>
  <head>

As linhas 4 e 5 foram adicionadas para criar o modelo necessário para a página.

[reponse.jsp]:


...
<%
  // -- teste: criamos o modelo da página
  request.setAttribute("nom","milou");
  request.setAttribute("age","10");
  request.setAttribute("lienRetourFormulaire","Retour au formulaire");
%>


<html>
  <head>

...

As linhas 4 a 6 foram adicionadas para criar o modelo necessário para a página.

[erreurs.jsp]:



<%
  // -- teste: criação do 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, caso ainda não tenha feito isso, e, em seguida, solicite as seguintes URLs:

 

Conseguimos, de fato, as visualizações esperadas.

9.5. O controlador [ServletPersonne]

O controlador [ServletPersonne] do aplicativo web [/personne3] processará as seguintes ações:

n.º
solicitação
origem
processamento
1
[GET /personne4/main]
URL digitada pelo usuário
- enviar a visualização [formulaire] vazia
2
[POST /personne4/main]
com parâmetros [txtNom,
txtAge,
action=validationFormulaire]
enviados
ao clicar no botão
[Envoyer] da visualização
[formulaire]
- verificar os valores dos parâmetros [txtNom, txtAge]
- se estiverem incorretos, enviar a visualização [erreurs(erreurs)]
- se estiverem corretos, enviar a visualização [reponse(nom,age)]
3
[POST /personne4/main]
com parâmetros
[action=retourFormulaire]
publicados
clicando no link [Voltar ao
formulário] nas visualizações
[réponse] e [erreurs].
- enviar a visualização [formulaire] pré-preenchida com os últimos valores inseridos

A estrutura do controlador [ServletPersonne] é idêntica à da versão anterior. Analisamos as alterações feitas nos métodos [doInit, doValidationFormulaire, doRetourFormulaire], já 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]. Seu código é o seguinte:

1
2
3
4
5
6
     // exibição do formulário vazio
    void doInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
}

Novidades:

  • linha 3: é exibida a visualização [formulaire]. Ela espera, em seu modelo, os atributos “nome” e “idade”. Ela não os encontrará ali, pois, neste caso, o controlador não os insere. Nesse caso, a biblioteca JSTL irá recuperar ponteiros null para esses atributos. Isso não gera erros, e valores vazios serão exibidos para os elementos ${nom} e ${age} da visualização [formulaire]. Isso nos convém. Assim, evitamos ter que inicializar o modelo da visualização [formulaire].

9.5.2. O método [doValidationFormulaire]

Este método processa a solicitação nº 2, [POST /personne4/main], com [action, txtNom, txtAge] nos elementos enviados. Seu código é o seguinte:

     // validação do formulário
    void doValidationFormulaire(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException{
                 // recuperamos os parâmetros
        String nom = request.getParameter("txtNom");
        String age = request.getParameter("txtAge");
         // que são armazenados na sessão
        HttpSession session = request.getSession(true);        
        session.setAttribute("nom", nom);
        session.setAttribute("age", age);
         // verificação dos parâmetros
...
         // os parâmetros estão corretos — envio da página de resposta
        request.setAttribute("lienRetourFormulaire", (String)params.get("lienRetourFormulaire"));
        getServletContext().getRequestDispatcher((String)params.get("urlReponse")).forward(request,
                response);
        return;
    }

Novidades:

  • linha 15: o método [doValidationFormulaire] envia como resposta a visualização [réponse]. Esta possui, em seu modelo, os elementos [nom, age, lienRetourFormulaire]. [lienRetourFormulaire] é inserido no modelo na linha 14, por meio da consulta. Os elementos [nom,age], por sua vez, são inseridos no modelo nas linhas 8 a 10, por meio da sessão. Na versão anterior, os elementos [nom, age] também eram colocados na consulta ao enviar a visualização [réponse], pois essa visualização os esperava ali. Aqui, com a biblioteca JSTL, sabemos que os diferentes contextos (solicitação, sessão, aplicativo) serão explorados para localizar os elementos do modelo. Portanto, eles serão encontrados na sessão, já que o controlador os colocou lá (linhas 8 a 10).

9.5.3. O método [doRetourFormulaire]

Este método processa a solicitação nº 3 [POST /personne4/main] com [action=retourFormulaire] nos elementos enviados. Seu código é o seguinte:

1
2
3
4
5
6
7
     // exibição do formulário pré-preenchido
    void doRetourFormulaire(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
         // exibição do formulário
        getServletContext().getRequestDispatcher((String)params.get("urlFormulaire")).forward(
                request, response);
        return;
    }

Novidades:

  • linha 4: é exibida a visualização [formulaire]. Ela espera, em seu modelo, os atributos “nome” e “idade”. Ela os encontrará na sessão, pois o método [doValidationFormulaire] os inseriu ali e esse método é necessariamente executado antes do método [doRetourFormulaire]. Portanto, não é necessário inicializar o modelo de [formulaire] antes de sua exibição na linha 4. Assim, os métodos [doInit] e [doRetourFormulaire] são idênticos, e seria possível excluir a ação [retourFormulaire] para substituí-la pela ação [init]. O método [doRetourFormulaire] seria, então, removido.

9.6. Tests

Nesta nova versão, apenas as visualizações mudam. O controlador [ServletPersonne], por sua vez, não sofre alterações. O uso de JSTL simplesmente nos permitiu utilizar de forma mais simples, nas páginas JSP, o modelo construído pelo controlador.

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