Vous êtes sur la page 1sur 31

Struts 2

O framework Apache Struts 2 uma estrutura elegante e extensvel para


a criao de aplicaes Web em Java. A estrutura foi projetada visando
otimizar o ciclo completo de desenvolvimento, desde construo a
implantao e manuteno das aplicaes. Foi originalmente conhecido
como WebWork 2. Depois de trabalhar de forma independente durante
vrios anos, as comunidades Struts e WebWork juntaram foras para
criar Struts 2. Esta nova verso mais simples de usar e se aproxima da
ideia da qual o Struts foi concebido para ser.

Verso 1.0
Apostila destinada ao curso com carga horria de 20 (vinte) horas

Curso Struts 2

Sumrio
1. Struts 2...................................................................................................................................3
Caractersticas do Struts 2.....................................................................................................3
Projeto Simplificado...........................................................................................................3
Classes de Aes Simplificadas........................................................................................3
No existem mais os ActionForms....................................................................................3
Padres inteligentes..........................................................................................................3
Melhores caractersticas das Tag......................................................................................4
Novos Detalhes..................................................................................................................4
Criando um Hello World em Struts 2.....................................................................................4
Criao de estrutura de diretrios para o projeto..............................................................4
2. Configuraes........................................................................................................................5
Arquivo web.xml.....................................................................................................................5
Arquivo struts.xml...................................................................................................................6
Arquivo struts-config.xml:.......................................................................................................7
Arquivo struts.properties........................................................................................................8
3. Actions....................................................................................................................................9
Camada Action.......................................................................................................................9
Camada Viso......................................................................................................................10
4. Templates.............................................................................................................................12
5. Ajax com Struts....................................................................................................................14
Implementao de Janela de Login com o Ajax (DOJO).....................................................14
6. Validao e Converso........................................................................................................17
Validao..............................................................................................................................17
Converso............................................................................................................................20
7. Struts e Spring......................................................................................................................25
8. Formulrio Master/Detail......................................................................................................28

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

2 de 31

Curso Struts 2

1. Struts 2
Um framework responsvel por automatizar as tarefas mais comuns e fornecer uma
plataforma na qual os usurios criam rapidamente seus aplicativos. Struts 2 foi baseado no
framework OpenSymphony WebWork. Implementa o padro de projeto Modelo Viso
Controle (MVC Model-View-Control).
Em Struts 2 o modelo de exibio, e o controlador so implementadas pelo resultado da
ao de um FilterDispatcher (que realiza o trabalho do controlador). O trabalho do
Controlador mapear a solicitao do usurio e tomar as medidas cabveis. A camada de
Modelo contm os dados e a lgica de negcios que implementado pelo componente de
ao. A camada de viso o componente de apresentao que comumente implementado
usando os padres JSP, Velocity Template, Freemaker ou qualquer outra tecnologia de
apresentao.

Caractersticas do Struts 2
Projeto Simplificado
Programao das classes abstratas em vez de interfaces era um problema do projeto do
Struts 1 que foi resolvido no Struts 2. A maioria das classes agora so baseadas em
interfaces e na maioria, essas interfaces so o ncleo independente de HTTP. As classes
Actions do Struts 2 so uma estrutura independente e simplificada para o uso com POJOs
simples.

Classes de Aes Simplificadas


As classes Actions agora so simples POJOs. Qualquer classe Java que possua o mtodo
execute() pode ser usada como uma classe no modelo Action. No necessita implementar
qualquer interface. A Inverso de Controle (IoC) agora automaticamente introduzida
durante o desenvolvimento das classes Actions.

No existem mais os ActionForms


A caracterstica dos ActionForms no mais reconhecida para o Struts 2. Sendo
substitudas por simples JavaBean que so utilizados para colocar as propriedades
diretamente. No preciso usar todas as propriedades.

Padres inteligentes
Os elementos de configurao possuem um valor padro que pode ser definido de acordo
com a necessidade. Ainda existem arquivos baseados em padro XML de configurao que
pode ser substitudo de acordo com a necessidade. Ao contrrio dos ActionForwards, os
Results fornecem uma maior flexibilidade para criar mltiplos tipos de sadas.

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

3 de 31

Curso Struts 2

Melhores caractersticas das Tag


Agora as tags permitem adicionar capacidades de estilo sheet-driven, para que possamos
criar pginas mais consistentes e com menos cdigo. As tags so mais capazes e orientada
para resultados. Podem ser ser alteradas para uma folha de estilo subjacente. A marcao
individual da tag pode ser alterada editando um modelo FreeMarker.

Novos Detalhes
Utilizao de anotaes Java 5 como uma alternativa para XML e configurao de
propriedades Java. O componente Checkbox no necessita mais de um tratamento especial
para os valores falsos. Muitas mudanas podem ser feitas na hora, sem a necessidade de
reiniciar o continer web.

Criando um Hello World em Struts 2


Vamos desenvolver a aplicao tipo Ol Mundo usando o framework Struts 2. Nossa
aplicao ser o primeiro passo para que possamos compreender as modificaes que
ocorreram com este framework.

Criao de estrutura de diretrios para o projeto


Realizar o download do Struts 2 e cpiar o arquivo struts2-blank-2.0.6.war para o diretrio
webapps do Tomcat. Renomear o arquivo struts2-blank-2.0.6.war para struts2tutorial.rar
e descompact-lo. Agora inicie o Tomcat e acesse o endereo:
http://localhost:8080/struts2tutorial/

No seu navegador mostrar:

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

4 de 31

Curso Struts 2

2. Configuraes
A Configurao bsica necessria para o framework Struts 2 depende da configurao dos
seguintes arquivos: struts.xml, web.xml, struts-config.xml e struts.properties.

Arquivo web.xml
O arquivo de configurao web.xml um arquivo de configurao Java EE que determina
como os elementos da solicitao HTTP so processados pelo servlet container. No
estritamente um arquivo de configurao do Struts 2, mas um arquivo que precisa ser
configurado para que o Struts 2 possa trabalhar corretamente.
Este arquivo fornece um ponto de entrada para qualquer aplicao Web. O ponto de entrada
de uma aplicao Struts 2 ser um filtro definido no descritor de deployment. Desta forma,
vamos definir uma entrada de classe FilterDispatcher no arquivo web.xml. O arquivo
web.xml deve ser criada sob a pasta WebContent/WEB-INF. Vejamos um exemplo do
arquivo web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Struts 2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

Para mapear o filtro do Struts 2, usamos /*, e no /*.action o que significa que todas as urls
sero analisadas pelo filtro do Struts.

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

5 de 31

Curso Struts 2

Arquivo struts.xml
O arquivo struts.xml contm as informaes de configurao que devemos modificar como
as aes que so desenvolvidas. Este arquivo pode ser usado para substituir as
configuraes padres de um aplicativo, por exemplo
struts.devMode = false

E outras configuraes que so definidas no arquivo de propriedades. Este arquivo pode ser
criado na pasta WEB-INF/classes. Vejamos um exemplo do arquivo struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello"
class="com.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
<-- more actions can be listed here -->
</package>
<-- more packages can be listed here -->
</struts>

A primeira coisa a notar o elemento DOCTYPE. Todo o arquivo XML necessita ter um
elemento doctype correto, conforme mostrado no cdigo. <struts> a tag raiz, no qual
podemos declarar diferentes pacotes usando a tag <package>, isso permite a separao e
a modularizao da configurao. O que vem a ser muito til quando temos um grande
projeto dividido em diferentes partes.
Digamos que, seu projeto possua trs domnios: Negocio, Cliente e Pessoal, ento podemos
criar trs pacotes e armazenar as aes associadas no pacote apropriado. A tag <package>
possui os seguintes atributos:
Atributo

Descrio

name (obrigatrio)

O identificador exclusivo para o pacote

extends

Nome do pacote herdado. Por padro, usamos struts-default, como o


pacote base

abstract

Se marcado como true, o pacote no est disponvel para o usurio


final

namespace

Nome nico para as aes

A tag <constant> juntamente com os atributos nome e valor so usados para substituir
qualquer uma das seguintes propriedades definidas no default.properties, como acabamos
de definir na propriedade struts.devMode. Definir esta propriedade permite ver as

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

6 de 31

Curso Struts 2

mensagens de depurao no arquivo de log.


Definimos as tags <action> correspondete a cada URL que desejamos acessar e definimos
uma classe com mtodo execute() que acessado ao acessarmos a URL correspondente.
A tag <result> determina o que retornado para o navegador aps uma ao for executada.
A ao retorna um objeto do tipo String que contm o nome de um resultado. Essas tags so
configuradas por ao ou como um resultado "global", disponvel para cada ao em um
pacote. Os resultados tm nome opcional e atributos de tipo. Usamos a String "sucess"
como o nome de valor padro .
O arquivo struts.xml pode ficar muito grande ao longo do tempo, ento possvel quebr-lo
por pacotes, o que uma forma de modularizar, mas a Struts 2 oferece uma nova maneira
de modularizar o arquivo struts.xml. possvel dividi-lo em vrios arquivos XML e importlos da seguinte forma:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="my-struts1.xml"/>
<include file="my-struts2.xml"/>
</struts>

Arquivo struts-config.xml:
O arquivo de configurao struts-config.xml a ligao entre a Viso e os componentes do
modelo no Cliente Web. Contm os seguinte elementos principais:
Interceptor

Descrio

struts-config

N raiz do arquivo de configurao.

form-bean

Local para mapear sua subclasse ActionForm. Pode-se usar este nome
como um alias para a ActionForm todo o resto do arquivo strutsconfig.xml, e at mesmo nas pginas JSP.

global forwards

Esta seo mapeia uma pgina em seu webapp para um nome. Pode-se
usar este nome para se referir pgina real. Isso evita codificar URLs
em suas pginas Web.

action-mappings

Declarao do manipuladores de formulrios e onde tambm so


conhecidos como mapeamentos de ao.

controller

Esta seo configura as internas do Struts e raramente usada em


situaes prticas.

plug-in

Esta seo informa ao Struts onde encontrar seus arquivos de


propriedades, que contm instrues e mensagens de erro

Vejamos um exemplo do arquivo struts-config.xml:


S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

7 de 31

Curso Struts 2

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


<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<!-- ========== Form Bean Definitions ============ -->
<form-beans>
<form-bean name="login" type="test.struts.LoginForm" />
</form-beans>
<!-- ========== Global Forward Definitions ========= -->
<global-forwards>
</global-forwards>
<!-- ========== Action Mapping Definitions ======== -->
<action-mappings>
<action path="/login"
type="test.struts.LoginAction" >
<forward name="valid" path="/jsp/MainMenu.jsp" />
<forward name="invalid" path="/jsp/LoginView.jsp" />
</action>
</action-mappings>
<!-- ========== Controller Definitions ======== -->
<controller contentType="text/html;charset=UTF-8"
debug="3"
maxFileSize="1.618M"
locale="true"
nocache="true"/>
</struts-config>

Arquivo struts.properties
Este arquivo de configurao fornece um mecanismo para alterar o comportamento padro
do framework. Todas propriedades contidas neste arquivo tambm podem ser configuradas
no web.xml usando o param-init, bem como usando a tag <constant> no arquivo
struts.xml. Para manter os detalhes separados e um suporte mais especfico, podemos
criar este arquivo na pasta WEB-INF/classes.
Os valores configurados neste arquivo substituem os valores padres configurados em
default.properties que esto contidos na distribuio struts2-core-x.y.z.jar. Existem
propriedades que podem ser modificadas usando o arquivo struts.properties:
### Ao ser definido como verdadeiro, mostra as mensagens padres
struts.devMode = true
### Permite a releitura dos arquivos de internacionalizao
struts.i18n.reload = true
### Permite a releitura dos arquivos de configurao XML
struts.configuration.xml.reload = true
### Define a porta que o servidor executado
struts.url.http.port = 8080

A linha iniciada com com o caracter #, ser assumida como um comentrio e ignorada pelo
Struts 2.
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

8 de 31

Curso Struts 2

3. Actions
Actions so o ponto central do framework Struts 2, bem como para qualquer framework
modelo MVC (Model View Controller). Cada URL mapeada para uma action especfica,
que fornece a lgica de processamento necessria para atender solicitao do usurio.
Actions possuem duas outras capacidades importantes. Primeiro, uma action desempenha
um papel importante na transferncia de dados a partir do pedido atravs do ponto de vista,
se o seu tipo um JSP ou outro resultado. Em segundo lugar, o recurso deve ajudar o quadro
para determinar qual resultado deve tornar a viso de que ser devolvido na resposta ao
pedido.

Camada Action
O nico requisito para as actions em Struts 2 que deve haver um mtodo sem argumento
que retorna um objeto String ou um elemento Result e deve ser um POJO. Se o mtodo
no-argumento no for especificado, o comportamento padro usar o mtodo execute().
Opcionalmente, pode-se estender a classe ActionSupport que implementa seis interfaces,
incluindo a interface Action. Esta interface mostrada como se segue:
public interface Action {
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
public String execute() throws Exception;
}

Vamos dar uma olhada no mtodo de ao para um exemplo "Hello World":


package x25.com.tutorial;
public class HelloWorldAction{
private String name;
public String execute() throws Exception {
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

Para ilustrar o ponto que o mtodo da action controla a viso, faremos a seguinte alterao
no mtodo execute() e estender a classe ActionSupport como segue:

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

9 de 31

Curso Struts 2

package x25.com.tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport{
private String nome;
public String execute() throws Exception {
if ("SECRET".equals(nome)) {
return SUCCESS;
} else {
return ERROR;
}
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}

Neste exemplo, temos a seguinte lgica para o mtodo execute() de modo a visualizar o
atributo nome. Se este atributo for igual a "SECRET", retornamos SUCESS como o
resultado, caso contrrio retornamos um ERROR como o resultado. Porque estendemos
ActionSupport, para isso usamos as constantes SUCESS e ERROR. Agora, vamos
modificar nosso arquivo struts.xml como segue:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="helloworld" extends="struts-default">
<action name="hello" class="x25.com.tutorial.HelloAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
<result name="error">/AccessDenied.jsp</result>
</action>
</package>
</struts>

Camada Viso
Criamos o arquivo chamado HelloWorld.jsp na pasta raiz do seu projeto. Este arquivo ser
chamado em caso do retorno ter como resultado "SUCESS", tal como definido na interface
Action:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

10 de 31

Curso Struts 2

<title>Hello World</title>
</head>
<body>
Ol Mundo, <s:property value="name"/>
</body>
</html>

Este outro arquivo ser chamado pelo framework no caso que o resultado da Action seja
ERROR. A seguir o contedo de AccessDenied.jsp:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Acesso Bloqueado</title>
</head>
<body>
Voc no est autorizado a ver esta pgina.
</body>
</html>

Tambm precisamos criar o arquivo index.jsp na pasta raiz. Este arquivo ser utilizado
como ao inicial onde o usurio informa o nome e submete o formulrio chamando o
mtodo da classe HelloAction e tornar a viso HelloWorld.jsp.
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World com Struts 2</h1>
<form action="hello">
<label for="nome">Por favor entre com seu nome</label><br/>
<input type="text" name="nome"/>
<input type="submit" value="Diga Hello"/>
</form>
</body>
</html>

No existe qualquer mudana necessria no arquivo web.xml. Execute o aplicativo atravs


do endereo http://localhost:8080/struts2tutorial.

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

11 de 31

Curso Struts 2

4. Templates
Templates so carregadas prioritariamente, pesquisando a aplicao e depois por procurar
o classpath. Se uma Template precisa de ser substituda, uma cpia editada e pode ser
colocada na aplicao, de modo que seja encontrada.
Em muitas reas o Struts 2 permaneceu praticamente inalterado depois de sua juno com
o Webwork. possvel ter uma Template para o controle da aparncia de suas tags em um
nvel de granulao fina ou em nvel de aplicativo. Supondo o suporte a boas prticas e cada
tag <input> possua uma tag <label>, conforme a seguinte codificao:
<label for="nome">Nome</label>
<input type="text" name="nome" id="nome"/>

Embora possamos escrever uma tag <label> para cada tag <input> manualmente para
conseguir essa boa prtica, podemos especificar uma Template para renderizar as tags
<s:textfield> de modo a reduzir a codificao escrita na JSP.
Criar uma Template chamada text.ftl no pasta template/mySimpleTheme e certifique-se
que est na classpath. Codificao text.ftl:
<label
<#if parameters.id?exists>
for="${parameters.id?html}" <#t/>
</#if>
>${parameters.label?html}</label>
<#include "/${parameters.templateDir}/simple/text.ftl" />

O arquivo de incluso est apontando para um modelo bare-bones disponibilizado com o


Struts que torna um simples <input type="text"/> com todos seus atributos. Tudo o que
estamos fazendo no cdigo adicional uma verificao da existncia de um id sendo
passado atravs da tag <textfield> e mostr-lo em uma tag <label> juntamente com seu
valor que est sendo passado. Agora temos tem uma Template para trabalhar, tudo o que
resta a fazer utiliz-la. Esta uma maneira que pode aplic-la a um nico campo de texto:
<s:textfield id="nome" name="nome" theme="mySimpleTheme" label="Nome"/>

A declarao do tema "mySimpleTheme" est informando ao Struts procurar uma Template


no diretrio mySimpleTheme sob o diretrio padro de Templates. Para este modelo
processar todos as tags <TextField> em vez de especificar theme="mySimpleTheme" todas
as vezes, devemos modificar as propriedades struts.ui.theme e struts.ui.templateDir no
arquivo struts.properties que possuem como valores padres de xhtml e template,
respectivamente.
O tema padro do Struts xhtml que renderiza as tags <td> e <tr> e tudo o mais que
indesejvel na marcao. Para desativar essa renderizao e os atributos de tag, podemos
utilizar o tema "simple" como a seguinte codificao:
<s:textfield id="nome" name="nome" theme="simple" label="Nome"/>

Alternativamente, podemos definir o atributo struts.ui.theme para simple no arquivo


struts.properties. Tambm podemos definir o atributo template de cada controle para
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

12 de 31

Curso Struts 2

apontar para um outro diretrio.


Resumidamente, o Struts fornece templates padres no arquivo struts-core.jar deve
atender s necessidades de muitas aplicaes. No entanto, se uma template precisa ser
modificada, fcil conectar uma nova verso. Para extrair uma template necessria
mudar a partir do struts-core.jar, faa as modificaes e salve uma cpia atualizada na
pasta template/$theme/$template.ftl. Se estiver utilizando o tema XHMTL e precisa mudar
a forma como as tags selecionem e renderizam, editar esse modelo e salve-o em
/template/xhtml/select.ftl.
O mecanismo global para controlar a aparncia completamente diferente do Struts 1.x
sendo um pouco mais complexa do que pode ser necessrio para muitos projetos. Porm
permite uma maior liberdade para ajustar as templates de modo a atender qualquer caso.
Este um mtodo de baixo nvel para controlar a aparncia de um controle CSS. Struts usa
arquivos CSS na renderizao de sua construo. Temas como xhtml so modificados para
xhtml_css, embora essa renomeao possa no ser um bom padro. Por exemplo, ao usar
o seu tema xhtml_css e <s:textfield>, necessrio escrever classes CSS chamadas
wwgrp e wwlbl para controlar a exibio das tags <label> e <input>.

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

13 de 31

Curso Struts 2

5. Ajax com Struts


Desenvolvedores do Ajax sabem que as tabelas podem fazer muito mais do que a exibio
esttica informaes em um formato organizado, legvel. Ao sincronizar-se as linhas da
tabela com um banco de dados do lado do servidor, possvel criar tabelas dinmicas desse
tipo, filtrar dados e realizar paginao.
Diversas solues Ajax possuem a vantagem de simplificar a programao, convertendo o
cdigo do servidor Java em JavaScript, normalmente custa da flexibilidade. A maioria dos
desenvolvedores no querem ter o modelo de programao restringido pelo nmero limitado
de componentes que essas estruturas fornecem. Neste quisito, criar contedo personalizado
com Struts 2 e Ajax realmente a melhor escolha, pois Struts 2 integra poderosos aliados
para fazer o desenvolvimento Ajax tornar-se prazer.

Implementao de Janela de Login com o Ajax (DOJO)


Vejamos como desenvolver uma aplicao de Login usando o Ajax. Nesta aplicao
mostrado um formulrio para autenticar um usurio, solitando o nome e a senha (O nome de
login e senha "admin"). Exibe uma pgina de boas vindas, quando ambos os campos
forem corretamente preenchidos pelo usurio. Caso contrrio, mostra uma mensagem de
erro e debug (nome de usurio e senha invlidos Por favor, tente novamente e DEBUG:
widget ID collision on ID: ajaxLogin_0).
Inicialmente, criamos um mapeamento de ao no arquivo struts.xml. Aqui est o cdigo
para ser adicionado neste arquivo:
<action name="showAjaxLoginForm">
<result>/pages/ajaxlogin.jsp</result>
</action>
<action name="ajaxLogin" class="net.roseindia.Login">
<result name="input">/pages/ajaxlogin.jsp</result>
<result name="error">/pages/ajaxlogin.jsp</result>
<result>/pages/ajaxloginsuccess.jsp</result>
</action>

A interface grfica do aplicativo consiste em um formulrio de login (ajaxlogin.jsp), que


exibe a pgina de login para o usurio. Esta pgina usa a tag <s:div> que cria uma rea de
contedo para carregar o contedo utilizando tags do Ajax. Aqui tambm usamos a tag
<s:submit> para atualizar o(s) elemento(s) ou que apresente uma mensagem de ajuda.
Sempre que ocorre um erro as tags <s:actionerror> e <s:fielderror> exibem uma
mensagem no formulrio de login.
Pgina: ajaxlogin.jsp
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<s:head theme="ajax" debug="true"/>
</script>

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

14 de 31

Curso Struts 2

</head>
<body>
<s:div id="loginDiv" theme="ajax">
<div style="width: 300px;border-style: solid">
<s:form action="ajaxLogin" validate="true">
<tr>
<td colspan="2">Entrada no Sistema</td>
</tr>
<tr>
<td colspan="2"><s:actionerror /><s:fielderror /></td>
</tr>
<s:textfield name="username" label="Nome"/>
<s:password name="password" label="Senha"/>
<s:submit theme="ajax" targets="loginDiv" notifyTopics="/ajaxLogin"/>
</s:form>
</div>
</s:div>
</body>
</html>

Devemos agora, desenvolver uma classe de ao que trata a solicitao de login e verifica a
autenticao do usurio. Se o nome do usurio e senha for "Admin", ento retorna SUCESS
caso contrrio o objeto ERROR.
Bean de Ao: Login.java
package x25.com.tutorial;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Date;
public class Login extends ActionSupport {
private String username = null;
private String password = null;
public String execute() throws Exception {
System.out.println("Validando o Login...");
if ("Admin".equals(getUsername()) && "Admin".equals(getPassword()) {
return SUCCESS;
}
addActionError("Usurio ou senha invlida! Tente novamente!");
return ERROR;
}
public String getUsername() {
return username;
}
public void setUsername(String value) {
username = value;
}
public String getPassword() {
return password;

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

15 de 31

Curso Struts 2

}
public void setPassword(String value) {
password = value;
}
}

A pgina ajaxloginsuccess.jsp exibe a mensagem de sucesso do Login (Bem Vindo


Admin) quando o usurio autenticado com xito.
Pgina: ajaxloginsuccess.jsp
<html>
<head>
<title>Login com Sucesso</title>
</head>
<body>
<p align="center">
<font color="#000080" size="5">Login realizado com sucesso !</font>
</p>
<h1> Bem Vindo <%=request.getParameter("username")%> </h1>
</body>
</html>

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

16 de 31

Curso Struts 2

6. Validao e Converso
Um Validador (validator) verifica automaticamente se um erro de converso ocorreu para
um determinado campo. Uma converso de tipo no framework transparente. Geralmente,
tudo o que necessrio fazer garantir as entradas HTML possuem nomes que podem ser
usados em expresses OGNL.

Validao
Neste exemplo, veremos como podemos validar uma pgina de login usando as validaes
do Struts 2. Para criarmos a pgina de login, as tags da interface do Struts. A tag <s:head>
deve ser colocada na seo head da pgina HTML, esta tag gera automaticamente links
para as bibliotecas de CSS e Javascript que so necessrios para processar os elementos
do formulrio.
A tag <s:form> contm os elementos do formulrio. O atributo action contm o nome da
ao que deve ser executada quando o formulrio for submetido. Este nome da ao deve
ser igual ao especificado no arquivo de configurao struts.xml.
O tag <s:textfield> usada para criar uma caixa de texto. O atributo label dessa tag contm
o nome a ser exibido na pgina e o atributo name contm o nome da propriedade na classe
da ao a ser mapeado. A tag <s:password> idntica a tag <s:textfield> excepto que o
valor de entrada mascarado. A tag <s:submit> usada para criar um boto de submisso
(envio do formulrio).
Pgina: login.jsp
<%@taglib uri="/struts-tags" prefix="s" %>
<head>
<title>Pgina Login</title>
<s:head />
</head>
<body>
<s:form action="Login">
<s:textfield name="userName" label="Usurio" />
<s:password name="password" label="Senha" />
<s:submit value="Entrar" />
</s:form>
</body>

Quando o usurio clicar no boto Entrar o pedido ser encaminhado para a ao Login.
Devemos realizar o mapeamento desta ao no arquivo struts.xml.
<package name="default" extends="struts-default">
<action name="Login" class="x25.com.tutorial.Login">
<result name="input">/login.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>

Aqui o nosso pacote "padro" estende o pacote "struts-default". Ao estender o "strutsS G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F


C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

17 de 31

Curso Struts 2

default" o pacote herda o conjunto de interceptores definido no defaultstack. O pacote


"struts-default" definido no arquivo struts-default.xml. Todas as tarefas comuns so
realizadas pelas aes e separadas e colocadas em interceptores diferentes. Pode-se definir
um interceptador para cada ao. Os interceptores mais comuns so utilizados agrupados
em uma pilha defaultstack do pacote struts-default. O defaultstack ser suficiente na
maioria dos casos. Os interceptores sero disparados na ordem em que so declarados na
pilha, tanto antes como aps a aco executada.
Aqui, a ao "Login" mapeado para a classe "Login" do pacote x25.com.tutorial. Os
resultados so definidos usando o elemento "<result>". Se algum erro de validao ocorrer
o usurio ser encaminhado para a pgina login.jsp. Se o login for bem sucedido, ento o
usurio ser encaminhado para a pgina sucesso.jsp.
O defaultstack contm os seguintes interceptores:
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
</interceptor-stack>

A classe de ao Login estende ActionSupport. Estender a classe ActionSupport fornece


a implementao padro para a maioria das tarefas comuns.
public class Login extends ActionSupport {
private String userName;
private String password;
public Login() { }
public String execute() {

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

18 de 31

Curso Struts 2

return SUCCESS;

public void validate() {


if (getUserName().length() == 0) {
addFieldError("userName", "Nome obrigatrio");
} else if (!getUserName().equals("Admin")) {
addFieldError("userName", "Usurio Invlido");
}
if (getPassword().length() == 0) {
addFieldError("password", getText("password.required"));
}
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

A classe implementa a interface ActionSupport que expe o mtodo execute(). As


seguintes constantes so declarados na interface de ao que podem ser usadas como
valores de retorno do mtodo execute().
public
public
public
public
public

static
static
static
static
static

final
final
final
final
final

String
String
String
String
String

ERROR = "error"
INPUT = "input"
LOGIN = "login"
NONE = "none"
SUCCESS = "success"

So os seguintes valores:

ERROR devolvido quando a execuo da ao falha

INPUT devolvido quando a ao exige a entrada do usurio.

LOGIN devolvido quando o usurio no estiver logado no sistema.

NONE devolvido quando a execuo da ao for bem sucedida e no existem vises


para mostrar.

SUCCESS devolvido quando a ao for executada com xito e o resultado


correspondente exibido para o usurio.

Agora vamos ver os papis desempenhados pelos diferentes interceptores.

O interceptor params ajuda em transferir os dados da solicitao para o objeto da


S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

19 de 31

Curso Struts 2

ao.

O interceptor workflow controla o fluxo de controle. Verifica se a ao implementa a


interface Validateable, se isso acontecer, esse interceptor chamar o mtodo
validate() da classe Action.

No mtodo validate() valida o usurio e a senha. Se a validao falhar um erro adicionado


usando o mtodo addFiledError(). O mtodo validate() no retorna nenhum erro, em vez
disso, armazena todos os erros com a ajuda da interface ValidationAware. Agora, o
interceptor workflow verifica os erros de validao ocorridos. Se algum erro ocorreu no
interceptor o processamento do pedido ser interrompido e o controle transferido para a
pgina de entrada com as mensagens de erro apropriadas.
Para cada campo, as mensagens de erro podem ser adicionadas usando o mtodo
addFieldError(). As mensagens de erro pode ser adicionadas diretamente ou pode ser
especificado em um arquivo de propriedades separado.
Os arquivos de propriedades deve possuir o mesmo nome da classe Action. Neste caso o
nome do arquivo de propriedades "Login.properties" j que o nome da ao
"Login.java". Este arquivo deve conter a seguinte entrada:
password.required = Senha obrigatria.

O mtodo getText() fornecido pela interface TextProvider e pode ser usado para retornar
as mensagens de erro.

Converso
Converso de tipo ideal para as situaes na qual precisamos transformar uma String em
um objeto mais complexo. Porque para a Web tudo uma sequncia em HTTP, Uma das
principais caractersticas do WebWork era uma converso de tipo muito teis. Por exemplo,
se o usurio estivesse acessando as coordenadas na forma de uma String (como "3, 22"),
podemos necessitar da converso tanto de String para ponto como de ponto a String.
Usando este exemplo, se sua ao (ou outro objeto composto no qual est definindo em
propriedades) possui um arquivo ClassName-conversion.properties, Os conversores de
tipo configurados para converso de e para strings. Transformar "3, 22" para o ponto (3, 22)
direcionamos a seguinte entrada para o arquivo de propriedades:
ponto = x25.com.converter.PontoConverter

Um exemplo de converso de tipo mostrado abaixo, usamos a converso de data e


moeda, ao clicar no boto Enviar esses valores sero convertidos.
Pgina: Submit.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<head>
<title>Formulrio de Submisso</title>
<style type="text/css">@import url(css/main.css);</style>
<style>
.errorMessage { color:green; }
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

20 de 31

Curso Struts 2

</style>
<body>
<h2>Entre com os Dados</h2>
<s:form action="viewReport">
<s:textfield name="rollNo" label="Nmero"/>
<s:textfield name="name" label="Nome"/>
<s:textfield name="submissionDate" label="Data"/>
<s:textfield name="amount" label="Valor"/>
<s:submit/>
</s:form>
</body>

Pgina: Show.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<head>
<title>Formulrio de Submisso</title>
</head>
<body bgcolor="#9E9EE8">
<center>
<h2><u>Dados Inseridos</u></h2>
<table border="0" colspacing="5" colspading="15">
<tr>
<td>Nmero:</td>
<td><s:property value="rollNo"/></td>
</tr><tr>
<td>Nome:</td>
<td><s:property value="name"/></td>
</tr><tr>
<td>Valor:</td>
<td><s:property value="amount"/></td>
</tr><tr>
<td>Data:</td>
<td><s:date name="submissionDate" format="dd MMM yyyy"/></td>
</tr>
</table>
</center>
</body>

Classe de Ao: TypeConversionExample.java


package x25.com;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class TypeConversionExample extends ActionSupport{
private
private
private
private
private

String name;
int rollNo;
double amount;
Date submissionDate;
String datePattern="yyyy-mm-dd";

public String getDatePattern() {

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

21 de 31

Curso Struts 2

return datePattern;
}
public void setDatePattern(String datePattern) {
this.datePattern = datePattern;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRollNo() {
return rollNo;
}
public void setRollNo(int rollNo) {
this.rollNo = rollNo;
}
public double getAmount() {
return amount;
}
public void setAmount(double amount) {
this.amount = amount;
}
public Date getSubmissionDate() {
return submissionDate;
}
public void setSubmissionDate(Date submissionDate) {
this.submissionDate = submissionDate;
}
@Override
public String execute() throws Exception {
System.out.println(getSubmissionDate());
System.out.println(submissionDate);
return SUCCESS;
}
}

Depois de escrever uma classe de ao. Devemos passar os valores para o arquivo de
propriedades como:
Arquivo de Propriedade: TypeConversionExample-conversion.properties
submissionDate=x25.com.converter.DateConverterClaz
amount=x25.com.converter.CurrencyConverterClaz

Podemos criar no arquivo de propriedades as mensagem de erro apropriadas. Lembrando


que este arquivo deve ser do mesmo nome do arquivo de ao.
Arquivo de Propriedade: TypeConversionExample.properties
invalid.fieldvalue.amount=Favor entrar com o valor correto
invalid.fieldvalue.submissionDate=Favor entrar com a da no formato yyyy-mm-dd

Agora vamos codificar as classes que convertem os tipos.

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

22 de 31

Curso Struts 2

Classe de Converso: DataConverterClaz.java


package x25.com.converter;
import
import
import
import
import
import
import

java.text.DateFormat;
java.text.ParseException;
java.text.SimpleDateFormat;
java.util.Date;
java.util.Map;
ognl.DefaultTypeConverter;
com.opensymphony.xwork2.conversion.TypeConversionException;

public class DateConverterClaz extends DefaultTypeConverter {


private Date convertedDate;
public Date convertValue(Map context, Object object, Class type) {
if (type == Date.class) {
String datePattern = "yyyy-MM-dd";
DateFormat format = new SimpleDateFormat(datePattern);
format.setLenient(false);
try {
String[] dateString = (String[]) object;
convertedDate = format.parse(dateString[0]);
return convertedDate;
} catch (Exception e) {
e.toString();
throw new TypeConversionException("Data invlida");
}
}
return null;
}
}

Classe de Converso: CurrencyConverterClaz.java


package x25.com.converter;
import
import
import
import
import

java.lang.reflect.Member;
java.text.DecimalFormat;
java.text.NumberFormat;
java.util.Map;
com.opensymphony.xwork2.conversion.TypeConverter;

public class CurrencyConverterClaz implements TypeConverter{


privateStringBuilder stringBuilder;
public String replace(String string, char character, String convert) {
if (string == null)
return null;
int length = string.length();
stringBuilder= new StringBuilder(string.length() * 2);
for (int i = 0; i < length; i++) {
char char2 = string.charAt(i);
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

23 de 31

Curso Struts 2

if (char2 == character) {
stringBuilder.append(convert);
} else {
stringBuilder.append(char2);
}

}
return stringBuilder.toString();

@Override
public Object convertValue(Map<String, Object> arg0, Object arg1,
Member arg2, String arg3, Object value, Class type) {
if (value == null) {
return null;
}
else if (type == String.class) {
NumberFormat newCurrency = new DecimalFormat("#,##0.00");
String formatedCurrency=newCurrency.format((Double) value);
return formatedCurrency;
} else if (type == Double.TYPE || type == Double.class) {
String[] strings = (String[]) value;
String doubleValue = strings[0];
return Double.parseDouble(replace(doubleValue, ',', ""));
}
return null;
}
}

Por fim o arquivo de mapeamento.


Arquivo de Configurao: struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="x25" namespace="/" extends="struts-default">
<action name="showForm">
<result>/jsp/Submit.jsp</result>
</action>
<action name="viewReport" class="x25.com.TypeConversionExample">
<result name="input">/jsp/Submit.jsp</result>
<result name="success">/jsp/Show.jsp</result>
</action>
</package>
</struts>

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

24 de 31

Curso Struts 2

7. Struts e Spring
No mtodo de execuo onde muitas classes ActionSupport do Struts 2 so declaraes e
criam objetos e depois temos de executar esses objetos e os mtodos que executam as
tarefas necessrias. Sempre que uma classe cria um objeto de outra classe apresenta uma
dependncia entre as duas classes. O framework Spring torna mais fcil para o
desenvolvedor de aplicativos gerenciar essas dependncias e ajuda a tornar a aplicao
mais flexvel e de fcil manuteno.
Vamos criar um exemplo para mostrar como funciona a integrao Spring e Struts 2,
utilizando o struts2-spring-plugin. Ao fazer isso podemos utilizar o recurso de Injeo do
Spring.
Arquivo de Configurao: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Struts2Example14</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Por padro o arquivo applicationContext.xml ser utilizado para fazer a configurao do


bean Spring.
Arquivo de Configurao: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

25 de 31

Curso Struts 2

<beans>
<bean id="helloWorldClass" class="x25.com.HelloWorld" >
<property name="message" value="Ol Mundo!" />
</bean>
</beans>

Registramos a classe HelloWorld e injetamos a mensagem "Ol Mundo!" para o atributo


message usando o mtodo de injeo.
Arquivo de Propriedade: struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration
2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="helloWorld" class="helloWorldClass">
<result name="SUCCESS">/success.jsp</result>
</action>
</package>
</struts>

A nica mudana que em vez de se referir a classe x25.com.HelloWorld diretamente,


relacionamos a ela usando o nome do bean definido no arquivo de configurao do Spring
Bean. A classe HelloWorld mostrada abaixo. No mtodo execute() que simplesmente
retorna "SUCESS" e o atributo message definido usando a injeo.
Classe POJO: HelloWorld.java
package x25.com;
public class HelloWorld {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute() {
return "SUCCESS";
}

}
Na pgina index.jsp encaminhamos o pedido para a ao helloWorld.
Pgina: index.jsp
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=helloWorld.action">

Depois de invocar o mtodo execute() o usurio ser direcionado para a pgina success.jsp.
Nesta pgina mostramos valor da mensagem. necessrio ter os seguintes arquivos JAR
no diretrio WEB-INF/lib para que este exemplo seja executado corretamente:
commons-fileupload-1.2.1
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

26 de 31

Curso Struts 2

commons-io-1.3.2
commons-logging-1.1
freemarker-2.3.13
junit-3.8.1
ognl-2.6.11
struts2-convention-plugin-2.1.6
struts2-core-2.1.6
xwork-2.1.2
struts2-spring-plugin-2.1.6
antlr-runtime-3.0
org.springframework.asm-3.0.0.M3
org.springframework.beans-3.0.0.M3
org.springframework.context-3.0.0.M3
org.springframework.core-3.0.0.M3
org.springframework.expression-3.0.0.M3
org.springframework.web-3.0.0.M3
org.springframework.web.servlet-3.0.0.M3

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

27 de 31

Curso Struts 2

8. Formulrio Master/Detail
Este um simples exemplo Master-Detail. Uma lista de dados mestre mantido em uma
lista e exibidos em uma tabela. Quando uma linha for selecionada com a viso de ligao de
um detalhe da tela JSP aberta e o item selecionado exibido. A lista usada pela tabela
mestre carregado com a ao no incio da aplicao.
Arquivo de Configurao: web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts Blank</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

Pgina: index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=ars/setList.action">
</head>
<body>
<p>Lendo...</p>
</body>
</html>

Arquivo de Configurao: struts.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="ars" namespace="/ars" extends="struts-default">

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

28 de 31

Curso Struts 2

<action name="setList" class="ars.SetListAction">


<result name="success">/listProcess.jsp</result>
</action>
<action name="viewDetail" class="ars.ViewDetailAction">
<result name="success">/viewDetailProcess.jsp</result>
</action>
</package>
</struts>

Bean de Ao: SetListAction.java


package x25.com;
import
import
import
import
import
import
import
import
import

com.opensymphony.xwork2.ActionContext;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
com.opensymphony.xwork2.ActionSupport;
java.util.*;
javax.servlet.http.HttpSession;
org.apache.struts2.ServletActionContext;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;

public final class SetListAction extends ActionSupport implements


ServletRequestAware,ServletResponseAware {
private HttpServletRequest request;
private HttpServletResponse response;
private List list;
public SetListAction() {
request = getServletRequest();
}
public String execute() throws Exception {
HttpSession session = request.getSession();
list = new ArrayList();
list.add("Frutas");
list.add("Ma");
list.add("Manga");
list.add("Laranja");
list.add("Tomate");
session.setAttribute("baseList",list);
return SUCCESS ;
}
public List getList(){
return list;
}
public void setServletRequest(HttpServletRequest request){
this.request = request;
}
public HttpServletRequest getServletRequest(){
return request;
}
public void setServletResponse(HttpServletResponse response){
S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

29 de 31

Curso Struts 2

this.response = response;
}
public HttpServletResponse getServletResponse(){
return response;
}

Pgina: listProcess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Iterator</title>
</head>
<body>
<table border="2px" bgcolor="#CCCC99" cellspacing="1">
<s:iterator value="#session.baseList" id="iteratorItem">
<tr>
<td>Valor do Item:</td>
<td><s:property value="iteratorItem"/></td>
<td>
<s:url var="url" action="/viewDetail">
<s:param name="iteratorItem" value="iteratorItem"/>
</s:url>
<s:a href="%{url}">Detalhes</s:a>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>

Bean de Ao: ViewDetailAction.java


package x25.com;
import
import
import
import
import
import

javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
com.opensymphony.xwork2.ActionSupport;
javax.servlet.http.HttpSession;
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;

public final class ViewDetailAction extends ActionSupport implements


ServletRequestAware, ServletResponseAware {
private HttpServletRequest request;
private HttpServletResponse response;
public ViewDetailAction() {
request = getServletRequest();
}
public String execute() throws Exception {

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

30 de 31

Curso Struts 2

HttpSession session = request.getSession();


String detailInfo = request.getParameter("iteratorItem");
session.setAttribute("baseDetail", detailInfo);
return SUCCESS;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public HttpServletRequest getServletRequest() {
return request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public HttpServletResponse getServletResponse() {
return response;
}

Pgina: viewDetailProcess.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Detalhes</title>
</head>
<body>
<s:text name="#session.baseDetail" />
</body>
</html>

S G A S 9 1 0 , B l o c o D , sa l a s , 2 3 7 a 2 4 3 , M i x Pa r k S u l A s a S u l , B ra s l i a / D F
C E P : 7 0 . 3 9 0 - 1 0 0 Fo n e / Fa x : ( 6 1 ) 3 2 4 4 - 2 5 1 0 3 2 4 2 - 4 3 3 9

31 de 31

Vous aimerez peut-être aussi