Skip to content

3. Processamento do formulário pelo controlador

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

3.1. O arquivo struts-config.xml

O novo arquivo de configuração struts-config.xml do controlador Struts fica da seguinte forma:

<?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>

Destacamos as alterações:

  • aparece uma seção <form-beans>. Ela serve para definir as classes associadas a cada um dos formulários do aplicativo. Deve haver tantas tags <form-bean> quanto formulários diferentes no aplicativo. Aqui, temos apenas um formulário, portanto, uma única seção <form-bean>. Para cada formulário, devemos definir:
    • seu nome (atributo name)
    • o nome da classe derivada de ActionForm responsável por armazenar os valores do formulário (atributo type)

Esses dois atributos não podem ser quaisquer. Eles devem ser idênticos aos utilizados na tag <html:form> do código HTML do formulário. Lembramos que, para o formulário (nome, idade), ela é:

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

O formulário deve ser declarado da mesma forma no arquivo struts-config.html. É isso que é feito aqui:

        <form-bean 
            name="frmPersonne" 
            type="istia.st.struts.personne.FormulaireBean"
        />
  • A configuração da ação /main foi alterada. Ela é responsável por processar os valores do formulário. Portanto, é preciso fornecer as informações necessárias a ela 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 processará um formulário ao qual é necessário atribuir um nome. Esse trabalho é feito pelo atributo name. Esse nome deve fazer referência ao atributo name de uma das seções <form-bean>, neste caso, frmPersonne.

O atributo scope="session" indica que os valores do formulário devem ser armazenados na sessão. Isso nem sempre é necessário. Neste caso, porém, é. De fato, nas visualizações /reponse.do e /erreurs.do, encontramos links que remetem ao formulário. Em ambos os casos, queremos exibir o formulário com os valores inseridos pelo usuário 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. Esse 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 que escrever um método validate na classe **FormulaireBean**. O método validate do formulário é chamado pelo controlador Struts antes que o servlet /main seja chamado. Ele retorna 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 interromperá a execução nesse ponto e enviará como resposta a visualização indicada pelo atributo **input. A visualização receberá na solicitação a lista ActionErrors, que poderá ser exibida com a tag <html:errors>. Acima, afirmamos que, em caso de erros, o servlet /main deve enviar a visualização /erreurs.do. Vale lembrar que essa 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 visualização utiliza corretamente a tag <html:errors>, que permitirá exibir a lista de erros. Nessa lista de erros, não encontramos mensagens de erro, mas identificadores de mensagens presentes no arquivo referenciado pela tag <message-resources> (atenção: “resources” com um único “s”):

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

A tag abaixo indica que o arquivo contendo as mensagens utilizadas pelo aplicativo está localizado no arquivo WEB-INF/classes/ressources/personneressources.properties:

Image

O que há nesse arquivo? Trata-se de um arquivo 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 arquivo de mensagens tem pelo menos duas funções:

  • permite alterar as mensagens do aplicativo sem precisar recompilá-lo
  • permite a internacionalização das aplicações Struts. É possível, de fato, criar vários arquivos de recursos, um por idioma. O Struts utilizará automaticamente o arquivo de mensagens correto, desde que sejam respeitadas certas normas na nomenclatura desses arquivos.
  • Se o método `validate` do formulário retornar uma lista de erros vazia, o controlador Struts chamará o método `execute` do servlet ForwardAction. É importante entender 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 desenvolvedor realmente processa o formulário. É aí que se encontra o núcleo do processamento (lógica de aplicação, uso de classes de negócio e de classes de acesso a dados). Por fim, o método retorna um resultado do tipo ActionForward, que indica ao construtor qual visualização deve ser enviada como resposta ao cliente. Aqui, utilizamos a ação predefinida ForwardAction do Struts. Seu método `execute` limita-se a retornar 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 retornará a visualização /vues/main.html, que já utilizamos anteriormente.

3.2. A nova classe FormulaireBean

Já criamos 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, precisamos fazer isso, pois indicamos no arquivo struts-config.xml que os dados do formulário deveriam ser verificados (validate="true") antes de serem transmitidos para o servlet ForwardAction. O código da classe fica assim:

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));
        // retornamos a lista de erros
      }
    } //if
     // retorna-se a lista de erros
    return erreurs;
  }
}

A novidade está na implementação do método validate**. Esse método é chamado pelo controlador Struts depois que este atribui aos atributos nom e age da classe os valores dos campos do formulário com os mesmos nomes. Ele deve verificar a validade dos atributos nom e age**. O código acima é bastante simples de entender:

  • é criada uma lista de erros (ActionErrors erros) vazia
  • o campo “nome” é verificado. Se estiver vazio, um erro é adicionado à lista de erros por meio 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 retorna 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 houve erros. Ele então executará o método `execute` da classe `Action` associada à ação (type="org.apache.struts.actions.ForwardAction"). Caso contrário, ele retornará a visualização associada ao caso de erros no formulário (input="/erreurs.do").

Adicionamos um erro à lista ActionErrors erros por meio de 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, de maneira semelhante a um dicionário. Ele pode ser qualquer valor. ActionError é um objeto que se associa a uma mensagem de erro por meio de 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 conter até 4 parâmetros opcionais. O identificador cléMessage não é qualquer um. É um dos identificadores encontrados no arquivo indicado pela tag <message-resources> do arquivo struts-config.xml:

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

Vale lembrar que esse arquivo (na verdade, 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 realmente existem no arquivo acima. Utilizamos a tag HTML <li> para cada mensagem de erro, de modo que a tag <html:errors> as exiba como uma lista HTML. Vimos que o objeto ActionError pode ser construído não apenas 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é quatro, no máximo), esses parâmetros ficam acessíveis no texto da mensagem por meio da notação {0} a {3}. Assim, o método validate de FormulaireBean gera um ActionError com a chave personne.formulaire.age.incorrect e o parâmetro adicional param0, que tem o valor:

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

A mensagem associada, no arquivo .properties de 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 gravadas, respectivamente, antes e depois da lista de erros. Aqui, essas duas chaves servirão para incluir as tags HTML <ul> e </ul>, que devem envolver as tags <li>.

3.3. Testes de validade do formulário

Estamos prontos para os testes de validade do formulário. Lembramos a seguir onde devem ser colocados os diferentes componentes do aplicativo:

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

3.3.1. Teste 1

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

Image

Explicações:

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

Se analisarmos o código HTML da página recebida, vemos 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

Vamos usar 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. As seguintes seções do arquivo struts-config.xml foram então utilizadas:
        <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. Ela utiliza o formulário frmPersonne (name="frmPersonne"). O controlador Struts, portanto, instanciou, se necessário, um objeto da classe FormulaireBean (type="istia.st.struts.personne.FormulaireBean" na tag form-bean). Ele preencheu os atributos nome e idade desse objeto com os campos de mesmo nome 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 isso, o controlador Struts chamou o método validate do objeto **FormulaireBean, pois o atributo validate da ação **/main está definido como true no arquivo 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));
        // retorna a lista de erros
      }
    } //se
     // retorna-se a lista de erros
    return erreurs;
  }

Como os campos [nom] e [age] estavam vazios, o método validate acima gerou uma lista com dois erros, que foi enviada de volta ao controlador Struts. Como havia erros, o controlador, por sua vez, enviou de volta ao cliente a visualização associada ao atributo input. Para identificar de qual visualização se tratava, ele utilizou a seguinte seção de seu arquivo de configuração:

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

Portanto, ele acabou enviando a visualização /vues/erreurs.personne.jsp. Ela possui 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 tag <html:errors> simplesmente exibe a lista de mensagens que o controlador Struts lhe enviou. Ela utiliza o arquivo de mensagens indicado pela tag <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

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

Image

Explicações:

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

O controlador Struts utilizou a seguinte seção de seu arquivo de configuração:

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

Portanto, ele retornou a visualização /vues/formulaire.personne.jsp.

3.3.4. Teste 4

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

Image

Recebemos 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 aparece exatamente como o validamos.

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

  • o formulário HTML exibido possui as seguintes tags:
          <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 tags <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, do servidor para o cliente, o código HTML do formulário a ser exibido, os atributos value dos campos de entrada associados às tags <html:text> são inicializados com os valores dos campos de mesmo nome do objeto FormulaireBean.

Estamos aqui diante de duas trocas cliente-servidor diferentes:

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

A única maneira de, na segunda interação, o formulário ser exibido novamente com seus valores originais é que esses valores sejam armazenados na sessão do cliente. Foi isso que foi solicitado na seção de 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"
      />

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

3.3.6. Teste 6

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

Image

Vamos enviar o formulário. Obtemos o seguinte resultado:

Image

Explicações:

  • como o botão [Envoyer] envia os valores do formulário para o URL /strutspersonne/main.do, encontramos as mesmas explicações do teste nº 2 até o retorno ao controlador Struts do resultado ActionErrors do método validate de FormulaireBean. Mas, neste caso, essa 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 dessa classe é executado e deve retornar um objeto do tipo ActionForward, indicando a visualização que o controlador deve enviar como resposta ao cliente. Aqui, o atributo type designa a classe predefinida ForwardAction. O método execute** dessa classe não faz nada e se limita a retornar um objeto **ActionForward que aponta para a visualização definida pelo atributo parameter, neste caso, a visualização **/vues/main.html**. Essa é, de fato, a visualização que o controlador retornou.

3.3.7. Teste 7

Solicitamos novamente a visualização /formulaire.do:

Image

Encontramos o formulário exatamente como o validamos. A explicação já foi dada. Por meio da configuração (scope="session"), solicitamos que o formulário permanecesse na sessão. Seus valores, portanto, são mantidos ao longo das trocas entre cliente e servidor.

Estamos quase terminando. Resta criar uma ação propriamente dita para o caso em que os dados do formulário forem válidos. Por enquanto, utilizamos a ação predefinida ForwardAction para simplificar nossa demonstração.

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

Não alteramos o arquivo de configuração struts-config.xml atual, exceto para modificar sua seção /main da seguinte maneira:

      <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 agora aponta para outra classe chamada **FormulaireAction, que teremos que criar. É o método execute dessa classe que será executado se os dados do formulário **frmPersonne forem válidos. Indicamos que o método **execute fazia o que era necessário e retornava um objeto do tipo **ActionForward, indicando a visualização que o controlador deveria enviar ao cliente. Muitas vezes, há várias visualizações possíveis, dependendo do resultado do processamento do formulário. A lista das diferentes visualizações possíveis está definida nas tags <forward> incluídas na tag <action>. A sintaxe dessa tag é a seguinte:

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

3.5. A classe FormulaireAction

Escrever a classe FormulaireAction consiste essencialmente em escrever 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; portanto, 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>

Assim, a ação tem acesso às chaves associadas às visualizações, que podem ser retornadas ao cliente ao final da ação. O método executado deverá retornar uma dessas chaves.

  1. ActionForm form: o objeto bean no qual se encontram os valores do formulário utilizado pela ação em andamento. Aqui, trata-se do objeto frmPersonne do tipo FormulaireBean. Assim, a ação tem acesso aos valores do formulário.
  2. HttpServletRequest request: a solicitação do cliente, que pode ter sido enriquecida por diferentes servlets. A ação tem, assim, acesso a todos os parâmetros da solicitação inicial (request.getParameter), bem como a todos os atributos adicionados a essa solicitação inicial (request.getAttribute). Em nosso exemplo, o método `execute` enriquece a solicitação adicionando o nome e a idade. Isso é totalmente desnecessário aqui, já que esses dois valores já estão presentes, 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 essa resposta. Aqui, ela não o faz.

Aqui, estamos diante de um caso específico. O método execute praticamente não tem nada a fazer. Ele deve simplesmente indicar que a próxima visualização é a visualização **/reponse.do e especificar na solicitação que essa visualização receberá as informações de nome e idade que deve exibir. Ela faz isso por meio do método findForward da classe ActionMapping, que aceita como parâmetro uma das chaves encontradas nas tags forward** da configuração da ação. Aqui, há apenas uma tag desse tipo:

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

Nosso método, ao ser executado, retorna, portanto, um ActionForward com “resposta” como chave para indicar que a visualização /reponse.do deve ser enviada.

3.6. Testes do FormulaireAction

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

Image

Modificamos a visualização /vues/reponse.personne.jsp:

<%
     // recuperamos 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 visualização recupera as informações de nome e idade nos atributos da solicitação que recebe. Solicitamos o formulário ao URL http://localhost:8080/strutspersonne/formulaire.do e, em seguida, o preenchemos:

Image

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

Image

Explicações:

  • Retomaremos a explicação fornecida para o teste nº 2 no início do processo. Lembramos 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
  • o método validate do objeto frmPersonne foi chamado. Como os dados eram válidos, o método validate retornou uma lista ActionErrors vazia.
  • Um objeto FormulaireAction foi criado ou reciclado e seu método `execute` foi chamado. Este retornou um objeto ActionForward com a chave “resposta”.
  • O controlador enviou então a visualização associada à chave “resposta”, c.a.d. /reponse.do e, portanto, /vues/reponse.personne.jsp.
  • A visualização reponse.personne.jsp foi exibida com os valores inseridos na solicitação pelo método `execute` do objeto FormulaireAction.

3.7. Conclusão

Construímos uma aplicação completa, porém simples. Ao implementá-la de fato com Struts, Tomcat e JBuilder, há inúmeras oportunidades de cometer erros, principalmente nos arquivos de configuração da aplicação, como o XML. À primeira vista, pode parecer mais simples construir essa aplicação sem o Struts, utilizando um servlet e páginas JSP. Para o iniciante, isso provavelmente é verdade. Com o ganho de experiência, torna-se mais simples desenvolver com o Struts. Muitas empresas impõem a metodologia Struts para seus desenvolvimentos web pelas seguintes razões:

  • O Struts segue o modelo MVC
  • quando todos os desenvolvedores trabalham da mesma maneira, a manutenção das aplicações se torna mais simples, pois elas possuem uma arquitetura padrão.