Skip to content

3. Processamento do formulário pelo controlador

Vamos agora centrar-nos no processamento dos valores do formulário pelo controlador quando o utilizador clicar no botão [Envoyer] do formulário.

3.1. O ficheiro struts-config.xml

O novo ficheiro de configuração struts-config.xml do controlador Struts passa a ser o seguinte:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
    <form-beans>
        <form-bean 
            name="frmPersonne" 
            type="istia.st.struts.personne.FormulaireBean"
        />
    </form-beans>

    <action-mappings>
      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/erreurs"
          parameter="/vues/erreurs.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/reponse"
          parameter="/vues/reponse.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />
    </action-mappings>

    <message-resources parameter="ressources.personneressources"/>    
</struts-config>

Destacámos as alterações:

  • surge uma secção <form-beans>. Esta serve para definir as classes associadas a cada um dos formulários da aplicação. Deve haver tantas etiquetas <form-bean> quantos forem os formulários diferentes na aplicação. Aqui, temos apenas um formulário, pelo que existe apenas uma secção <form-bean>. Para cada formulário, temos de definir:
    • o seu nome (atributo name)
    • o nome da classe derivada de ActionForm responsável por armazenar os valores do formulário (atributo type)

Estes dois atributos não podem ser quaisquer. Têm de ser idênticos aos utilizados na baliza <html:form> do código HTML do formulário. Recorde-se que, para o formulário (nome, idade), estes são:

      <html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">

O formulário deve ser declarado da mesma forma no ficheiro struts-config.html. É isso que se faz aqui:

        <form-bean 
            name="frmPersonne" 
            type="istia.st.struts.personne.FormulaireBean"
        />
  • A configuração da ação /main foi alterada. Esta ação é responsável por processar os valores do formulário. Por isso, é necessário fornecer-lhe as informações de que necessita no formulário:
      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

O servlet /main irá processar um formulário ao qual é necessário atribuir um nome. É o atributo name que desempenha essa função. Este nome deve referenciar o atributo name de uma das secções <form-bean>, neste caso frmPersonne.

O atributo scope="session" indica que os valores do formulário devem ser armazenados na sessão. Isto nem sempre é necessário. Neste caso, é. Com efeito, nas vistas /reponse.do e /erreurs.do, encontramos links que remetem para o formulário. Em ambos os casos, pretendemos apresentar o formulário com os valores introduzidos pelo utilizador durante uma troca anterior entre cliente e servidor. Daí a necessidade de armazenar o formulário na sessão.

O atributo «validate» indica se o método «validate» do objeto frmPersonne deve ou não ser chamado. Este método serve para verificar a validade dos dados do formulário. Aqui, indicamos que os dados devem ser verificados, o que implica que teremos de escrever um método «validate» na classe FormulaireBean. O método validate do formulário é chamado pelo controlador Struts antes de o servlet /main ser chamado. Este método devolve como resultado um objeto do tipo ActionErrors, que é análogo a uma lista de erros. Se essa lista existir e não estiver vazia, o controlador Struts irá parar aí e enviará como resposta a vista indicada pelo atributo **input. A vista receberá na solicitação a lista ActionErrors, que poderá exibir com a tag <html:errors>. Acima, indicamos que, em caso de erros, o servlet /main deve enviar a vista /erreurs.do. Recorde-se que esta vista está associada à seguinte vista URL /vues/erreurs.reponse.jsp**:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
        <html:errors/>
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>      
    </body>
</html>

A vista utiliza corretamente a baliza <html:errors>, que permitirá apresentar a lista de erros. Nesta lista de erros, não se encontram mensagens de erro, mas sim identificadores de mensagens presentes no ficheiro referenciado pela baliza <message-resources> (atenção: «resources» com um único «s»):

    <message-resources parameter="ressources.personneressources"/>    

A baliza abaixo indica que o ficheiro que contém as mensagens utilizadas pela aplicação se encontra no ficheiro WEB-INF/classes/ressources/personneressources.properties:

Image

O que se encontra neste ficheiro? Trata-se de um ficheiro de propriedades correspondente à classe Properties do Java, ou seja, um conjunto de linhas do tipo chave=valor:

errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>

Este ficheiro de mensagens tem, pelo menos, duas funções:

  • permite alterar as mensagens da aplicação sem ter de a recompilar
  • permite a internacionalização das aplicações Struts. É possível criar vários ficheiros de recursos, um por idioma. O Struts utilizará automaticamente o ficheiro de mensagens correto, desde que sejam respeitadas determinadas normas na nomenclatura desses ficheiros.
  • Se o método `validate` do formulário devolver uma lista de erros vazia, então o controlador Struts chama o método `execute` do servlet ForwardAction. É importante compreender aqui que, quando o método `execute` do servlet é executado, isso significa que os dados do formulário foram considerados válidos (desde que, claro, tenham sido verificados por `validate="true"`). É no método `execute` do servlet associado à ação que o programador processa efetivamente o formulário. É aí que se encontra o cerne do processamento (lógica de aplicação, utilização de classes de negócio e de classes de acesso aos dados). Por fim, o método devolve um resultado do tipo ActionForward, que indica ao construtor qual a vista que deve ser enviada como resposta ao cliente. Aqui, utilizámos a ação predefinida ForwardAction do Struts. O seu método `execute` limita-se a devolver um ActionForward que aponta para o URL indicado pelo atributo `parameter`:
      <action
          path="/main"
          name="frmPersonne"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

Portanto, se os dados do formulário forem válidos, a ação /main irá devolver a vista /vues/main.html que já utilizámos.

3.2. A nova classe FormulaireBean

Já criámos uma primeira versão da classe FormulaireBean, responsável por armazenar os dados (nome, idade) do formulário formulaire.personne.jsp. Essa versão não verificava a validade dos dados. Agora, temos de o fazer, uma vez que indicámos no ficheiro struts-config.xml que os dados do formulário deviam ser verificados (validate="true") antes de serem transmitidos ao servlet ForwardAction. O código da classe passa a ser o seguinte:

package istia.st.struts.personne;

import javax.servlet.http.*;
import org.apache.struts.action.*;

public class FormulaireBean
  extends ActionForm {
   // nome
  private String nom = null;
  public String getNom() {
    return nom;
  }

  public void setNom(String nom) {
    this.nom = nom;
  }

   // idade
  private String age = null;
  public String getAge() {
    return age;
  }

  public void setAge(String age) {
    this.age = age;
  }

   // validação
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    // gestão de erros
    ActionErrors erreurs = new ActionErrors();
     // o nome não pode estar vazio
    if (nom == null || nom.trim().equals("")) {
      erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
       // a idade deve ser um número inteiro positivo
    }
    if (age == null || age.trim().equals("")) {
      erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
    }
    else {
      // a idade deve ser um número inteiro positivo
      if (!age.matches("^\\s*\\d+\\s*$")) {
        erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
        // apresenta-se a lista de erros
      }
    } //se
     // retorna a lista de erros
    return erreurs;
  }
}

A novidade reside na implementação do método validate**. Este é chamado pelo controlador Struts depois de este ter atribuído aos atributos nom e age da classe os valores dos campos do formulário com os mesmos nomes. Deve verificar a validade dos atributos nom e age**. O código acima é bastante simples de compreender:

  • é criada uma lista de erros (ActionErrors erros) vazia
  • o campo «nome» é verificado. Se estiver vazio, é adicionado um erro à lista de erros através do método ActionErrors.add("chave", ActionError).
  • Faz-se o mesmo se o campo «idade» não for um número inteiro.
  • O método validate devolve ao controlador Struts a lista de erros (ActionErrors erros). Se erros for igual a null ou se erreurs.size() for igual a 0, o controlador considera que não ocorreram erros. Nesse caso, executará o método `execute` da classe `Action` associada à ação (type="org.apache.struts.actions.ForwardAction"). Caso contrário, devolverá a vista associada ao caso de erros no formulário (input="/erreurs.do").

Adiciona-se um erro à lista ActionErrors erros por ActionErrors.add("cléErreur", new ActionError("cléMessage"[,param0, param1, param2, param3])). O primeiro parâmetro «cléErreur» serve para identificar de forma única um elemento ActionError na lista ActionErrors, tal como num dicionário. Pode ser qualquer valor. ActionError é um objeto que se associa a uma mensagem de erro através do seu construtor ActionError(String cléMessage[,String param0, String param1, String param2, String param3]), em que cléMessage é o identificador da mensagem associada ao erro e pode incluir até 4 parâmetros opcionais. O identificador cléMessage não é qualquer um. É um dos identificadores que se encontram no ficheiro indicado pela baliza <message-resources> do ficheiro struts-config.xml:

    <message-resources parameter="ressources.personneressources"/>    

Recorde-se que este ficheiro (na realidade, WEB-INF/classes/ressources/personneressources.properties) contém as seguintes chaves:

errors.header=<ul>
errors.footer=</ul>
personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>

É possível verificar que as chaves de mensagens utilizadas pelo método validate da classe FormulaireBean existem efetivamente no ficheiro acima referido. Utilizou-se a baliza HTML <li> para cada mensagem de erro, para que a baliza <html:errors> as exiba como uma lista HTML. Vimos que o objeto ActionError pode ser construído não só com uma chave de mensagem, mas também com parâmetros adicionais:

public ActionError(String cléMessage[,String param0, String param1, String param2, String param3])

Se um ActionError tiver sido construído com parâmetros adicionais (até um máximo de quatro), estes ficam acessíveis no texto da mensagem através da notação {0} a {3}. Assim, o método «validate» de FormulaireBean cria um ActionError com a chave personne.formulaire.age.incorrect e o parâmetro adicional «param0 age»:

      erreurs.add("age", new ActionError("personne.formulaire.age.incorrect",age));

A mensagem associada, no ficheiro .properties das mensagens, à chave personne.formulaire.age.incorrect é

personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>

O {0} será substituído pelo valor da idade. Por fim, as mensagens com as chaves errors.header e errors.footer serão escritas, respetivamente, antes e depois da lista de erros. Aqui, estas duas chaves servirão para incluir as balizas HTML <ul> e </ul>, que devem envolver as balizas <li>.

3.3. Testes de validade do formulário

Estamos prontos para os testes de validade do formulário. Recordamos abaixo onde devem ser colocados os diferentes componentes da aplicação:

les vues
les fichiers de configuration
le fichier des messages
les classes

3.3.1. Teste 1

Vamos reiniciar o Tomcat para que leia os novos ficheiros de configuração e, em seguida, solicitemos o URL http://localhost:8080/strutspersonne/formulaire.do:

Image

Explicações:

  • no struts-config.html, foi explorada a seguinte secção:
      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

Se analisarmos o código HTML da página recebida, verificamos que a tag <form> da página é a seguinte:

      <form name="frmPersonne" method="post" action="/strutspersonne/main.do">

O botão [Envoyer], que é do tipo «submit», enviará, portanto, os dados do formulário para URL /strutspersonne/main.do.

3.3.2. Teste 2

Utilizemos o botão [Envoyer], deixando os campos de preenchimento em branco. Obtemos a seguinte resposta:

Image

Explicações:

  • conforme indicado acima, os dados do formulário foram enviados para o URL /strutspersonne/main.do. Foram então utilizadas as seguintes secções do ficheiro struts-config.xml:
        <form-bean 
            name="frmPersonne" 
            type="istia.st.struts.personne.FormulaireBean"
            scope="session"
        />
....
      <action
          path="/main"
          name="frmPersonne"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

A ação /main foi acionada. Esta utiliza o formulário frmPersonne (name="frmPersonne"). O controlador Struts instanciou, portanto, se necessário, um objeto da classe FormulaireBean (type="istia.st.struts.personne.FormulaireBean" na tag form-bean). Preencheu os atributos «nome» e «idade» desse objeto com os campos com os mesmos nomes do formulário HTML:

          <table>
            <tr>
              <td>Nom</td>
            <td><html:text property="nom" size="20"/></td>
          </tr>
          <tr>
              <td>Age</td>
            <td><html:text property="age" size="3"/></td>
          </tr>
            <tr>
        </table>

Feito isto, o controlador Struts chamou o método validate do objeto FormulaireBean, porque o atributo validate da ação **/main está definido como true** no ficheiro de configuração:

      <action
          path="/main"
          name="frmPersonne"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

O método «validate» da classe FormulaireBean é o seguinte:

  // validação
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    // gestão de erros
    ActionErrors erreurs = new ActionErrors();
     // o nome não pode estar vazio
    if (nom == null || nom.trim().equals("")) {
      erreurs.add("nomvide", new ActionError("personne.formulaire.nom.vide"));
       // a idade deve ser um número inteiro positivo
    }
    if (age == null || age.trim().equals("")) {
      erreurs.add("agevide", new ActionError("personne.formulaire.age.vide"));
    }
    else {
      // a idade deve ser um número inteiro positivo
      if (!age.matches("^\\s*\\d+\\s*$")) {
        erreurs.add("ageincorrect", new ActionError("personne.formulaire.age.incorrect", age));
        // apresenta-se a lista de erros
      }
    } //se
     // retorna-se a lista de erros
    return erreurs;
  }

Uma vez que os campos [nom] e [age] estavam vazios, o método validate acima gerou uma lista de dois erros que devolveu ao controlador Struts. Como havia erros, o controlador devolveu então ao cliente a vista associada ao atributo input. Para determinar de que vista se tratava, utilizou a seguinte secção do seu ficheiro de configuração:

      <action
          path="/erreurs"
          parameter="/vues/erreurs.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

Por fim, enviou a vista /vistas/erreurs.personne.jsp. Esta tem o seguinte código:

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>
        <html:errors/>
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

A baliza <html:errors> apresenta simplesmente a lista de mensagens que o controlador Struts lhe enviou. Utiliza o ficheiro de mensagens indicado pela baliza <message-resources>:

    <message-resources parameter="ressources.personneressources"/>

Nele encontram-se as seguintes chaves e mensagens:

personne.formulaire.nom.vide=<li>Vous devez indiquer un nom</li>
personne.formulaire.age.vide=<li>Vous devez indiquer un age</li>
personne.formulaire.age.incorrect=<li>L'âge [{0}] est incorrect</li>
errors.header=<ul>
errors.footer=</ul>
  • a mensagem associada à chave errors.header é gravada
  • as mensagens associadas às diferentes chaves da lista ActionErrors recebida são gravadas
  • a mensagem associada à chave errors.footer é gravada

3.3.3. Teste 3

Utilizemos o link [Retour au formulaire] da página de erros. Obtemos a seguinte página:

Image

Explicações:

  • o link [Retour au formulaire] tem o seguinte código: HTML:
    <a href="/strutspersonne/formulaire.do">Retour au formulaire</a>

O controlador Struts utilizou a seguinte secção do seu ficheiro de configuração:

      <action
          path="/formulaire"
          parameter="/vues/formulaire.personne.jsp"
          type="org.apache.struts.actions.ForwardAction"
      />

Assim, devolveu a vista /vistas/formulaire.personne.jsp.

3.3.4. Teste 4

Preenchemos o seguinte formulário e, em seguida, utilizamos o botão [Envoyer]:

Image

Obtemos a seguinte resposta:

Image

Explicações: são as mesmas do teste n.º 2.

3.3.5. Teste 5

Utilizamos o link [Retour au formulaire] acima. Obtemos a seguinte página:

Image

Constatamos que o formulário se encontra no estado em que o validámos.

Explicações: são as do teste n.º 3, com uma informação adicional:

  • o formulário HTML apresentado contém as seguintes balizas:
          <table>
            <tr>
              <td>Nom</td>
            <td><html:text property="nom" size="20"/></td>
          </tr>
          <tr>
              <td>Age</td>
            <td><html:text property="age" size="3"/></td>
          </tr>
            <tr>
        </table>

As etiquetas <html:text> têm duas funções:

  • ao enviar os valores do formulário do cliente para o servidor, os valores dos campos de entrada do formulário são atribuídos aos campos com o mesmo nome do objeto FormulaireBean
  • ao enviar o código HTML do formulário a apresentar do servidor para o cliente, os atributos «value» dos campos de entrada associados às balizas <html:text> são inicializados com os valores dos campos com o mesmo nome do objeto FormulaireBean.

Estamos aqui perante duas trocas cliente-servidor diferentes:

  • no primeiro, o utilizador preencheu o formulário e enviou-o para o servidor
  • no segundo, o utilizador utilizou o link [Retour au formulaire] para regressar ao formulário.

A única forma de, na segunda interação, o formulário poder ser exibido novamente com os seus valores originais é que estes sejam colocados na sessão do cliente. Foi isso que foi solicitado na secção que configura a ação /main:

      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

Se tivéssemos definido scope="request", os dados do formulário não teriam sido armazenados na sessão e, por isso, não teríamos recuperado os seus valores na segunda troca de dados.

3.3.6. Teste 6

Voltemos ao formulário para introduzir, desta vez, dados válidos:

Image

Enviemos o formulário. Obtemos o seguinte resultado:

Image

Explicações:

  • uma vez que o botão [Envoyer] envia os valores do formulário para o URL /strutspersonne/main.do, encontramos as mesmas explicações que no teste n.º 2 até ao regresso ao controlador Struts do resultado ActionErrors do método validate de FormulaireBean. Mas, neste caso, esta lista está vazia. O controlador utiliza então uma nova parte da configuração da ação /main:
      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          parameter="/vues/main.html"
          type="org.apache.struts.actions.ForwardAction"
      />

O controlador Struts cria, se necessário, um objeto do tipo indicado pelo atributo type. O método execute desta classe é executado e deve devolver um objeto do tipo ActionForward, indicando a vista que o controlador deve enviar como resposta ao cliente. Aqui, o atributo type refere-se à classe predefinida ForwardAction. O método execute** desta classe não faz nada e limita-se a devolver um objeto **ActionForward que aponta para a vista definida pelo atributo parameter, neste caso a vista **/vues/main.html**. Esta é, de facto, a vista que o controlador devolveu.

3.3.7. Teste 7

Solicitamos novamente a vista /formulaire.do:

Image

Encontramos o formulário tal como o validámos. A explicação já foi dada. Por configuração (scope="session"), solicitámos que o formulário permanecesse na sessão. Os seus valores são, portanto, conservados ao longo das trocas cliente-servidor.

Estamos quase a terminar. Resta-nos criar uma ação propriamente dita para o caso de os dados do formulário serem válidos. Por enquanto, utilizámos a ação predefinida ForwardAction para simplificar a nossa demonstração.

3.4. Nova configuração da ação /main

Não alteramos o ficheiro de configuração struts-config.xml atual, exceto para modificar a sua secção /main da seguinte forma:

      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          type="istia.st.struts.personne.FormulaireAction"
      >
            <forward name="reponse" path="/reponse.do"/>
        </action>

O atributo «type» refere-se agora a outra classe chamada FormulaireAction, que teremos de criar. É o método «execute» desta classe que será executado se os dados do formulário frmPersonne forem válidos. Indicámos que o método **execute fazia o que tinha de fazer e devolvia um objeto do tipo **ActionForward, indicando a vista que o controlador deveria devolver ao cliente. Muitas vezes, existem várias vistas possíveis, dependendo do resultado do processamento do formulário. A lista das diferentes vistas possíveis é apresentada nas balizas <forward> incluídas na baliza <action>. A sintaxe dessa baliza é a seguinte:

            <forward name="clé" path="/vue" />
clé
qualquer nome que identifique uma vista de forma única
vue
URL da vista associada à chave

3.5. A classe FormulaireAction

Escrever a classe FormulaireAction consiste essencialmente em escrever o seu método execute:

package istia.st.struts.personne;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.ServletException;

public class FormulaireAction extends Action {

  public ActionForward execute(ActionMapping mapping, ActionForm form,
                               HttpServletRequest request, HttpServletResponse response)
                                         throws IOException,ServletException {

     // temos um formulário válido; caso contrário, não teríamos chegado até aqui
    FormulaireBean formulaire=(FormulaireBean)form;
    request.setAttribute("nom",formulaire.getNom());
    request.setAttribute("age",formulaire.getAge());
    return mapping.findForward("reponse");
  }//executar
}

O método «execute» recebe quatro parâmetros:

  1. Mapeamento ActionMapping: um objeto «imagem» da configuração da ação em execução; neste caso, uma imagem da seguinte configuração:
      <action
          path="/main"
          name="frmPersonne"
            validate="true"
            input="/erreurs.do"
          type="istia.st.struts.personne.FormulaireAction"
      >
            <forward name="reponse" path="/reponse.do"/>
        </action>

Desta forma, a ação tem acesso às chaves associadas às vistas, que podem ser devolvidas ao cliente no final da ação. O método executado deverá devolver uma dessas chaves.

  1. ActionForm form: o objeto bean no qual se encontram os valores do formulário utilizado pela ação em curso. Neste caso, trata-se do objeto frmPersonne do tipo FormulaireBean. Assim, a ação tem acesso aos valores do formulário.
  2. HttpServletRequest request: o pedido do cliente que pode ter sido enriquecido por diferentes servlets. A ação tem, assim, acesso a todos os parâmetros do pedido inicial (request.getParameter), bem como a todos os atributos adicionados a esse pedido inicial (request.getAttribute). No nosso exemplo, o método `execute` enriquece a solicitação, adicionando-lhe o nome e a idade. Isto é totalmente desnecessário aqui, uma vez que estes dois valores já se encontram na solicitação, mas como parâmetros e não como atributos. O código está aqui apenas a título de exemplo.
  3. Resposta HttpServletResponse: a resposta que será enviada ao cliente. A ação poderia enriquecer esta resposta. Aqui, não o faz.

Aqui, estamos perante um caso específico. O método **execute quase não tem nada para fazer. Deve simplesmente indicar que a vista seguinte é a vista **/reponse.do e especificar na requisição que essa vista receberá as informações «nome» e «idade» que deve apresentar. Faz-o através do método findForward da classe ActionMapping, que aceita como parâmetro uma das chaves encontradas nas balizas «forward» da configuração da ação. Aqui, existe apenas uma baliza desse tipo:

            <forward name="reponse" path="/reponse.do"/>

O nosso método executa, portanto, um ActionForward com «resposta» como chave para indicar que a vista /reponse.do deve ser enviada.

3.6. Testes do FormulaireAction

Compilamos a classe anterior com o JBuilder e colocamos o ficheiro .class gerado em WEB-INF/classes:

Image

Alteramos a vista /vues/reponse.personne.jsp:

<%
     // recuperam-se os dados nome e idade
  String nom=(String)request.getAttribute("nom");
  String age=(String)request.getAttribute("age"); 
%>

<html>
    <head>
      <title>Personne</title>
  </head>
  <body>
      <h2>Personne - réponse</h2>
    <hr>
    <table>
        <tr>
          <td>Nom</td>
        <td><%= nom %>
      </tr>
        <tr>
          <td>Age</td>
        <td><%= age %>
      </tr>
    </table>      
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

A vista recupera as informações «nome» e «idade» nos atributos do pedido que recebe. Solicitamos o formulário ao URL http://localhost:8080/strutspersonne/formulaire.do e, em seguida, preenchemo-lo:

Image

Utilizamos o botão [Envoyer] e obtemos a seguinte resposta:

Image

Explicações:

  • Vamos retomar a explicação dada para o teste n.º 2 no início do processo. Recorde-se a configuração da ação /main:
      <action
          path="/main"
          name="frmPersonne"
            scope="session"
            validate="true"
            input="/erreurs.do"
          type="istia.st.struts.personne.FormulaireAction"
      >
            <forward name="reponse" path="/reponse.do"/>
        </action>
  • Após o envio do formulário ao controlador no URL /main.do, este criou ou reutilizou um objeto frmPersonne do tipo FormulaireBean e inseriu nele os valores do formulário
  • foi chamado o método validate do objeto frmPersonne. Como os dados eram válidos, o método validate devolveu uma lista ActionErrors vazia.
  • Foi criado ou reciclado um objeto FormulaireAction e o seu método `execute` foi chamado. Este devolveu um objeto ActionForward com a chave «resposta».
  • O controlador enviou então a vista associada à chave «resposta», c.a.d. /reponse.do e, consequentemente, /vues/reponse.personne.jsp.
  • A vista reponse.personne.jsp foi apresentada com os valores inseridos na solicitação pelo método execute do objeto FormulaireAction.

3.7. Conclusão

Construímos uma aplicação completa, mas simples. Ao implementá-la efetivamente com Struts, Tomcat e JBuilder, surgem inúmeras oportunidades para cometer erros, nomeadamente nos ficheiros de configuração da aplicação, como o XML. À primeira vista, pode parecer mais simples construir esta aplicação sem o Struts, utilizando um servlet e páginas JSP. Para um principiante, isso é provavelmente verdade. À medida que se ganha experiência, torna-se mais simples desenvolver com o Struts. Muitas empresas impõem a metodologia Struts para os seus desenvolvimentos web pelas seguintes razões:

  • O Struts respeita o modelo MVC
  • quando todos os programadores trabalham da mesma forma, a manutenção das aplicações torna-se mais simples, uma vez que estas têm uma arquitetura padrão.