Skip to content

2. A aplicação strutspersonne

Trabalhamos com o método clássico, servlet e páginas JSP, em um aplicativo de gerenciamento de pessoas. Propomos introduzir o Struts com esse mesmo aplicativo.

2.1. O funcionamento da aplicação

Vamos relembrar aqui o funcionamento da aplicação “pessoa” que desenvolvemos. Ela é composta por:

  • de um servlet principal. É ele que garante toda a lógica da aplicação.
  • três páginas JSP: formulaire.personne.jsp, reponse.personne.jsp, erreurs.personne.jsp

O funcionamento da aplicação é o seguinte. Ela pode ser acessada por meio da URL http://localhost:8080/personne/main. Nessa URL, é exibido um formulário fornecido pela página formulaire.personne.jsp:

Image

O usuário preenche o formulário e clica no botão [Envoyer] do tipo “submit”. O botão [Rétablir] é do tipo “reset”, c.a.d, que reverte o documento ao estado em que foi recebido. O botão [Effacer] é do tipo “button”. O usuário deve fornecer um nome e uma idade válidos. Caso contrário, uma página de erros é exibida por meio da página JSP erreurs.personne.jsp. Veja alguns exemplos:

Intercâmbio nº 1

demande
réponse

Se seguirmos o link [Retour au formulaire], encontraremos este no mesmo estado em que o deixamos:

Troca n.º 2

demande
réponse

Se o usuário enviar dados corretos, o aplicativo enviará uma resposta por meio da página JSP reponse.personne.jsp.

Intercâmbio nº 1

demande
réponse

Se seguirmos o link [Retour au formulaire], encontraremos este no mesmo estado em que o deixamos:

Troca n.º 2

demande
réponse

2.2. A arquitetura Struts do aplicativo

Adotaremos a seguinte arquitetura Struts:

  • Haverá três visualizações
  • o controlador será o fornecido pelo Struts
  • FormulaireBean é a classe responsável por armazenar os valores do formulário apresentado pela visualização formulaire.personne.jsp
  • FormulaireAction é a classe responsável por processar os valores de FormulaireBean e indicar a página de resposta a ser enviada:
    • a visualização erreurs.personne.jsp, caso os dados do formulário estejam incorretos
    • a vista reponse.personne.jsp, caso contrário

Para o desenvolvedor, o trabalho consiste em escrever o código:

  • das três visualizações
  • do bean FormulaireBean associado ao formulário
  • da classe FormulaireAction responsável pelo processamento do formulário

2.3. Compilar as classes necessárias para a aplicação Struts

Para compilar as classes necessárias à nossa aplicação, utilizaremos o JBuilder. Ele trabalha com um JDK no qual não estão presentes as classes necessárias para as aplicações Struts. Podemos configurar o JBuilder da seguinte maneira:

  • opção Tools (Ferramentas) / Configure JDKs (Configurar o JDK)

Image

  • use o botão [Add/Ajouter] para adicionar aos arquivos de classes do JBuilder os arquivos .jar fornecidos pelo Struts. Se o arquivo compactado do Struts tiver sido descompactado no disco, será possível adicionar ao JBuilder todos os arquivos .jar da pasta <struts>/lib:

Image

É possível adicionar ao arquivo do JBuilder todos os arquivos .jar acima. Já vimos que o Tomcat também precisa ter acesso aos arquivos do Struts. Para o Tomcat 4.x, é possível colocar os arquivos .jar do Struts em <tomcat4>\common\lib. Para o Tomcat 5.x, é possível colocá-los em <tomcat5>\shared\lib. Em seguida, pode-se definir que o JBuilder encontre os arquivos .jar do Struts no mesmo local que o Tomcat. Foi isso que foi feito na captura de tela mostrada um pouco acima, que exibe os arquivos .jar do JBuilder. Eles foram obtidos em <tomcat5>\shared\lib.

Portanto, se, durante a compilação de uma classe, o JBuilder indicar que não consegue encontrar uma classe do Struts, verifique duas coisas:

  • a grafia da classe
  • os arquivos .jar utilizados pelo JBuilder. Todos os arquivos .jar do Struts devem estar incluídos.

2.4. As visualizações do aplicativo strutspersonne

As três visualizações da aplicação são as seguintes:

  • formulaire.personne.jsp: exibe o formulário para inserção do nome e da idade de uma pessoa
  • reponse.personne.jsp: exibe os valores inseridos, caso sejam válidos
  • erreurs.personne.jsp: exibe os erros, caso haja

2.4.1. A visualização erreurs.personne.jsp

Essa visualização, que exibe uma lista de erros, será definida da seguinte forma:

<%@ 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>

Há duas novidades neste código:

  1. a presença de tags <html:XX/>, que não são tags HTML. De fato, é possível criar bibliotecas de tags JSP que, durante a transformação da página JSP em servlet, são convertidas em código Java.
  2. A página JSP deve declarar as bibliotecas de tags que utiliza. Ela faz isso aqui com a linha
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

Essa linha fornece duas informações:

  • uri: o local do arquivo que define as regras de uso da biblioteca. O arquivo struts-html.tld é fornecido na distribuição do Struts. No exemplo acima, ele será colocado na pasta WEB-INF.
  • prefix: o identificador usado no código para prefixar as tags da biblioteca. Isso permite evitar conflitos de nomes que poderiam ocorrer durante o uso simultâneo de várias bibliotecas de tags. Seria possível encontrar duas tags com o mesmo nome em duas bibliotecas diferentes. Ao atribuir um prefixo diferente a cada biblioteca, elimina-se qualquer ambiguidade.
  • A tag <html:errors> exibe a lista de erros que o controlador Struts lhe transmite.
  • A tag <html:link> gera um link que aponta para /C/page, onde
    • C é o contexto da aplicação
    • page é o URL indicado no atributo page da tag

A tag

    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>

gerará o seguinte código HTML:

<a href="/C/formulaire.do">Retour au formulaire</a>

onde C é o contexto da aplicação

2.4.2. Teste da visualização erreurs.personne.jsp

  • o arquivo erreurs.personne.jsp é colocado na pasta “vues” do aplicativo strutspersonne:

Image

  • o arquivo struts-html.tld é obtido da distribuição do Struts (<struts>/lib) e colocado em WEB-INF:

Image

  • o arquivo struts-config.xml é modificado 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>
    <action-mappings>
      <action
          path="/main"
          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-mappings>
</struts-config>

Criamos no arquivo de configuração uma nova entrada URL /erros destinada a ser processada pelo controlador Struts. O URL /erreurs.do será redirecionado para a visualização /vues/erreurs.personne.jsp. O arquivo struts-config.xml é colocado na pasta WEB-INF.

  • Reiniciamos o Tomcat para que o novo arquivo struts-config.xml seja reconhecido e, em seguida, acessamos a URL http://localhost:8080/strutspersonne/erreurs.do:

Image

A tag <html:errors/> não produziu nada. Isso é normal, pois a ação ForwardAction não gerou a lista de erros esperada pela tag. No entanto, a resposta acima mostra que nossa visualização JSP está, pelo menos, sintaticamente correta; caso contrário, teríamos obtido uma página de erros. Verifiquemos o código HTML recebido pelo navegador (Exibir/Fonte):

<html>
    <head>
      <title>Personne - erreurs</title>
  </head>
  <body>
      <h2>Les erreurs suivantes se sont produites</h2>        
    <a href="/strutspersonne/formulaire.do">Retour au formulaire</a>    
  </body>
</html>

Observe o link gerado pela tag <html:link>. O contexto /strutspersonne foi automaticamente incluído no link. Isso permite transferir o aplicativo de um contexto para outro (por exemplo, ao trocar de máquina) sem precisar alterar os links gerados pela tag <html:link>.

2.4.3. A visualização reponse.personne.jsp

Esta visualização, que confirma os valores inseridos no formulário, é a seguinte:

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

<%
     // recuperamos os dados nome e idade
  //String nome = (String)request.getAttribute("nome");
  String nom="jean";

   //String idade = (String)request.getAttribute("idade"); 
  String age="24"; 
%>

<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>      
    <br>
    <html:link page="/formulaire.do">
            Retour au formulaire
        </html:link>    
  </body>
</html>

A página exibe duas informações, [nom] e [age], que serão passadas a ela pelo controlador no objeto predefinido request. Aqui, realizamos um teste em que o controlador não terá a oportunidade de definir os valores de [nom] e [age]. Portanto, inicializamos essas duas informações com valores arbitrários. Além disso, também aqui o link de retorno para o formulário é gerado por uma tag <html:link>.

2.4.4. Teste da visualização reponse.personne.jsp

  • O arquivo reponse.personne.jsp está localizado na pasta “vues” do aplicativo strutspersonne:

Image

  • o arquivo struts-config.xml é modificado 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>
    <action-mappings>
      <action
          path="/main"
          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-mappings>
</struts-config>

Criamos no arquivo de configuração uma nova resposta URL destinada a ser processada pelo controlador Struts. O URL /reponse.do será redirecionado para a visualização /vues/reponse.personne.jsp. O arquivo struts-config.xml é colocado na pasta WEB-INF.

  • Reiniciamos o Tomcat para que o novo arquivo struts-config.xml seja reconhecido e, em seguida, acessamos a URL http://localhost:8080/strutspersonne/erreurs.do:

Image

O resultado obtido corresponde ao esperado.

2.4.5. A visualização formulaire.personne.jsp

Essa visualização apresenta o formulário para inserção do nome e da idade do usuário. Seu código JSP é o seguinte:

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

<html>
    <meta http-equiv="pragma" content="no-cache"> 
    <head>
      <title>Personne - formulaire</title>
    <script language="javascript">
        function effacer(){
          with(document.frmPersonne){
            nom.value="";
          age.value="";
        }
      }
    </script>
  </head>

  <body>
      <center>
        <h2>Personne - formulaire</h2>
      <hr>
      <html:form action="/main" name="frmPersonne" type="istia.st.struts.personne.FormulaireBean">
          <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>
        <table>
            <tr>
              <td><html:submit value="Envoyer"/></td>
            <td><html:reset value="Rétablir"/></td>
            <td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
          </tr>
        </table>
      </html:form>
    </center>
  </body>
</html>

Encontramos novamente a biblioteca de tags struts-html.tld utilizada na visualização de erros. Surgem novas tags:

html:form
serve tanto para gerar a tag HTML <form> quanto para fornecer informações ao controlador que deverá processar esse formulário:
action
URL para onde serão enviados os valores do formulário
name
nome do formulário HTML. É também o nome do bean que armazenará os valores do formulário
type
nome da classe que deverá ser instanciada para obter o bean de armazenamento do formulário
Observe-se que o método de envio dos parâmetros do formulário (GET/POST) para o controlador não está especificado. Isso poderia ser feito com o atributo method. Na ausência deste, o método POST é utilizado por padrão.
html:text
serve para gerar a tag <input type="text" value="...">:
property
nome do campo do bean do formulário que será associado ao campo de entrada. Ao enviar o formulário para o servidor (cliente → servidor), o campo do bean assumirá o valor do campo de entrada. Ao exibir o formulário (servidor → cliente), o valor contido no campo do bean é exibido no campo de entrada.
html:submit
serve para gerar a tag HTML <input type="submit"...>
html:reset
serve para gerar a tag HTML <input type="reset"...>
html:button
serve para gerar a tag HTML <input type="button"...>

2.4.6. O bean associado ao formulário formulaire.personne.jsp

  • Com o Struts, todo formulário deve estar associado a um bean responsável por armazenar os valores do formulário e mantê-los na sessão atual. Um bean é uma classe Java que deve seguir uma sintaxe específica. O bean associado a um formulário deve ser derivado da classe ActionForm definida nas bibliotecas do Struts:
public class FormulaireBean extends ActionForm {
  • os nomes dos atributos do bean devem corresponder aos campos do formulário (atributos `property` das tags `html:text` do formulário). De acordo com o código do formulário anterior, o bean deve, portanto, ter dois campos chamados `nom` e `age`.
  • Para cada campo XX do formulário, o bean deve definir dois métodos:
    • public void setXX(Type valor): para atribuir um valor ao atributo XX
    • Type getXX(): para obter o valor do campo XX

O bean associado ao formulário anterior poderia ser o seguinte:

package istia.st.struts.personne;

import org.apache.struts.action.ActionForm;

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;
  }
}

Essas classes serão compiladas com o JBuilder.

2.4.7. Teste da visualização formulaire.personne.jsp

O arquivo formulaire.personne.jsp está localizado na pasta “vues” do aplicativo strutspersonne:

Image

  • O arquivo struts-config.xml é modificado 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>
    <action-mappings>
      <action
          path="/main"
          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>
</struts-config>

Criamos no arquivo de configuração um novo formulário URL destinado a ser processado pelo controlador Struts. O URL /formulaire.do será redirecionado para a visualização /vues/formulaire.personne.jsp. O arquivo struts-config.xml é colocado na pasta WEB-INF.

  • Colocamos a classe FormulaireBean em WEB-INF/classes:

Image

  • Reiniciamos o Tomcat para que o novo arquivo struts-config.xml seja reconhecido e, em seguida, acessamos a URL http://localhost:8080/strutspersonne/formulaire.do:

Image

O formulário é exibido corretamente. Podemos ficar curiosos para ver como foram “traduzidas” as tags <html:XX> que apareciam no código JSP do formulário:

<html>
    <meta http-equiv="pragma" content="no-cache"> 
    <head>
      <title>Personne - formulaire</title>
    <script language="javascript">
        function effacer(){
          with(document.frmPersonne){
            nom.value="";
          age.value="";
        }
      }
    </script>
  </head>

  <body>
      <center>

        <h2>Personne - formulaire</h2>
      <hr>
      <form name="frmPersonne" method="post" action="/strutspersonne/main.do">
          <table>
            <tr>
              <td>Nom</td>
            <td><input type="text" name="nom" size="20" value=""></td>
          </tr>

          <tr>
              <td>Age</td>
            <td><input type="text" name="age" size="3" value=""></td>
          </tr>
            <tr>
        </table>
        <table>
            <tr>

              <td><input type="submit" value="Envoyer"></td>
            <td><input type="reset" value="Rétablir"></td>
            <td><input type="button" name="btnEffacer" value="Effacer" onclick="effacer()"></td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>

No formulário obtido, os botões [Restaurar] e [Effacer] funcionam. O botão [Envoyer], do tipo submit, redireciona para a página URL /strutspersonne/main.do. De acordo com o arquivo web.xml do aplicativo, o controlador Struts irá processá-la. De acordo com o arquivo struts-config.html, o controlador deve redirecionar a solicitação para a visualização /vues/main.html. Vamos tentar:

Image

Tudo ocorre conforme o esperado. Resta-nos processar efetivamente os valores do formulário, c.a.d. Escreveremos a classe do tipo Action que receberá os dados do formulário em um objeto FormulaireBean.