2. A aplicação Struts «pessoa»
Tratámos, através do método clássico — servlet e páginas JSP —, uma aplicação de gestão de pessoas. Propomos introduzir o Struts com esta mesma aplicação.
2.1. O funcionamento da aplicação
Recordemos aqui o funcionamento da aplicação «pessoa» que desenvolvemos. É composta por:
- de um servlet principal. É este que assegura 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. É acessível através do URL http://localhost:8080/personne/main. Nesta URL, obtém-se um formulário fornecido pela página formulaire.personne.jsp:

O utilizador 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 repõe o documento no estado em que foi recebido. O botão [Effacer] é do tipo «button». O utilizador deve fornecer um nome e uma idade válidos. Caso contrário, é-lhe enviada uma página de erros através da página JSP erreurs.personne.jsp. Seguem-se alguns exemplos:
Intercâmbio n.º 1
![]() | ![]() |
Se seguirmos o link [Retour au formulaire], encontramos este no estado em que o deixámos:
Intercâmbio n.º 2
![]() | ![]() |
Se o utilizador enviar dados corretos, a aplicação envia-lhe uma resposta através da página JSP reponse.personne.jsp.
Intercâmbio n.º 1
![]() | ![]() |
Se seguirmos o link [Retour au formulaire], encontramos este no estado em que o deixámos:
Intercâmbio n.º 2
![]() | ![]() |
2.2. A arquitetura Struts da aplicação
Vamos adotar a seguinte arquitetura Struts:
![]() |
- Haverá três vistas
- o controlador será o fornecido pelo Struts
- FormulaireBean é a classe responsável por armazenar os valores do formulário apresentado pela vista formulaire.personne.jsp
- FormulaireAction é a classe responsável por processar os valores de FormulaireBean e indicar a página de resposta a enviar:
- a vista erreurs.personne.jsp, se os dados do formulário estiverem incorretos
- a vista reponse.personne.jsp, caso contrário
Para o programador, o trabalho consiste em escrever o código:
- das três vistas
- 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. Este programa funciona com um JDK no qual não se encontram as classes necessárias às aplicações Struts. Podemos configurar o JBuilder da seguinte forma:
- opção Tools (Ferramentas) / Configure JDKs (Configurar o JDK)

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

É possível adicionar ao JBuilder todos os ficheiros .jar acima referidos. Já vimos que o Tomcat também precisa de ter acesso aos arquivos do Struts. Para o Tomcat 4.x, pode-se colocar os ficheiros .jar do Struts em <tomcat4>\common\lib. Para o Tomcat 5.x, pode-se colocá-los em <tomcat5>\shared\lib. Pode-se, em seguida, definir que o JBuilder encontre os ficheiros .jar do Struts no mesmo local que o Tomcat. Foi isso que foi feito na captura de ecrã apresentada um pouco mais acima, que mostra os ficheiros .jar do JBuilder. Estes 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 ortografia da classe
- os ficheiros .jar utilizados pelo JBuilder. Todos os ficheiros .jar do Struts devem estar incluídos.
2.4. As vistas da aplicação strutspersonne
As três vistas da aplicação são as seguintes:
- formulaire.personne.jsp: apresenta o formulário para introduzir o nome e a idade de uma pessoa
- reponse.personne.jsp: apresenta os valores introduzidos, caso sejam válidos
- erreurs.personne.jsp: apresenta os erros, caso existam
2.4.1. A vista erreurs.personne.jsp
Esta vista, que apresenta 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>
Existem duas novidades neste código:
- a presença de tags <html:XX/>, que não são tags HTML. É possível, de facto, criar bibliotecas de tags JSP que, durante a transformação da página JSP num servlet, são convertidas em código Java.
- A página JSP deve declarar as bibliotecas de tags que utiliza. Faz-o aqui com a linha
Esta linha fornece duas informações:
- uri: a localização do ficheiro que define as regras de utilização da biblioteca. O ficheiro struts-html.tld é fornecido na distribuição do Struts. No exemplo acima, deve ser colocado na pasta WEB-INF.
- prefix: o identificador utilizado no código para prefixar as tags da biblioteca. Isto permite evitar conflitos de nomes que possam surgir durante a utilização simultânea 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> apresenta 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 baliza
irá gerar o seguinte código HTML:
onde C é o contexto da aplicação
2.4.2. Teste da vista erreurs.personne.jsp
- o ficheiro erreurs.personne.jsp é colocado na pasta «vues» da aplicação strutspersonne:

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

- o ficheiro struts-config.xml é alterado 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 ficheiro de configuração uma nova entrada URL /erros destinada a ser processada pelo controlador Struts. O URL /erreurs.do será redirecionado para a vista /vistas/erreurs.personne.jsp. O ficheiro struts-config.xml é colocado na pasta WEB-INF.
- Reiniciamos o Tomcat para que o novo ficheiro struts-config.xml seja tido em conta e, em seguida, acedemos à URL http://localhost:8080/strutspersonne/erreurs.do:

A baliza <html:errors/> não produziu qualquer resultado. Isto é normal, uma vez que a ação ForwardAction não gerou a lista de erros esperada pela baliza. No entanto, a resposta acima mostra que a nossa vista 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 (Ver/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>
Note-se o link gerado pela baliza <html:link>. O contexto /strutspersonne foi automaticamente incluído no link. Isto permite transferir a aplicação de um contexto para outro (por exemplo, mudança de computador) sem ter de alterar os links gerados pela baliza <html:link>.
2.4.3. A vista reponse.personne.jsp
Esta vista, que confirma os valores introduzidos 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 apresenta duas informações, [nom] e [age], que lhe serão passadas 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]. Por isso, inicializamos estas duas informações com valores arbitrários. Além disso, também aqui o link de retorno para o formulário é gerado por uma baliza <html:link>.
2.4.4. Teste da vista reponse.personne.jsp
- O ficheiro reponse.personne.jsp é colocado na pasta «vues» da aplicação strutspersonne:

- O ficheiro struts-config.xml é alterado 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 ficheiro de configuração uma nova resposta URL destinada a ser processada pelo controlador Struts. O URL /reponse.do será redirecionado para a vista /vues/reponse.personne.jsp. O ficheiro struts-config.xml é colocado na pasta WEB-INF.
- Reiniciamos o Tomcat para que o novo ficheiro struts-config.xml seja reconhecido e, em seguida, acedemos à URL http://localhost:8080/strutspersonne/erreurs.do:

O resultado obtido corresponde ao esperado.
2.4.5. A vista formulaire.personne.jsp
Esta vista apresenta o formulário para introdução do nome e da idade do utilizador. O 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 vista de erros. Surgem novas tags:
serve tanto para gerar a tag HTML <form> como para fornecer informações ao controlador que terá de processar este formulário:
Note-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, é utilizado por predefinição o método POST. | |||||||
serve para gerar a baliza <input type="text" value="...">:
| |||||||
serve para gerar a baliza HTML <input type="submit"...> | |||||||
serve para gerar a tag HTML <input type="reset"...> | |||||||
serve para gerar a tag HTML <input type="button"...> |
2.4.6. O bean associado ao formulário formulaire.personne.jsp
- Com o Struts, qualquer formulário deve estar associado a um bean responsável por memorizar os valores do formulário e mantê-los na sessão atual. Um bean é uma classe Java que deve respeitar uma sintaxe específica. O bean associado a um formulário deve derivar da classe ActionForm definida nas bibliotecas do Struts:
- 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 denominados «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;
}
}
Estas classes serão compiladas com o JBuilder.
2.4.7. Teste da vista formulaire.personne.jsp
O ficheiro formulaire.personne.jsp é colocado na pasta «vues» da aplicação strutspersonne:

- O ficheiro struts-config.xml é alterado 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 ficheiro de configuração um novo formulário URL destinado a ser processado pelo controlador Struts. O URL /formulaire.do será redirecionado para a vista /vues/formulaire.personne.jsp. O ficheiro struts-config.xml é colocado na pasta WEB-INF.
- Colocamos a classe FormulaireBean em WEB-INF/classes:

- Reiniciamos o Tomcat para que o novo ficheiro struts-config.xml seja reconhecido e, em seguida, acedemos à URL http://localhost:8080/strutspersonne/formulaire.do:

O formulário é apresentado corretamente. Podemos ficar curiosos em ver como foram «traduzidas» as balizas <html:XX> que pontuavam o 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 ficheiro web.xml da aplicação, o controlador Struts irá tratá-la. De acordo com o ficheiro struts-config.html, o controlador deve redirecionar o pedido para a vista /vues/main.html. Vamos experimentar:

Tudo corre como esperado. Resta-nos agora processar efetivamente os valores do formulário, c.a.d. Escrever a classe do tipo Action que irá receber os dados do formulário num objeto FormulaireBean.








