Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorialdestruts2 Spigandoeaprendendo Wordpress Com
Tutorialdestruts2 Spigandoeaprendendo Wordpress Com
Apache Struts 2 um framework elegante e extensvel para criao de aplicaes web em java. O
framework projetado para simplificar todo o ciclo de desenvolvimento, desde a construo, implantao,
manuteno de aplicaes ao longo do tempo.
Apache Struts2 foi originalmente conhecido como WebWork 2. Aps trabalhar independentemente por
vrios anos, as comunidades WebWork e Struts juntaram foras para criar o Struts2. Essa nova verso do
Struts mais simples de usar e mais prximo de como o Struts sempre pretendia ser.
Struts 2 um framework pull-MVC. Isto , os dados que so mostrados ao usuro tem que ser puxado da
Action.
Struts2 suporta configuraes baseadas em anotao que mais fcil de criar e mais intuitiva. Classe action
no Struts 2 atua como model na aplicao web. Ao contrrio do Struts, a classe action do Struts 2 so
simples objetos POJO assim slimplificando o teste do cdigo. Struts2 tambm bem com poderosas APIs
para configurar Interceptadores que reduzem muito o acoplamento na aplicao. A parte de view do Struts 2
altamente configurvel e suporta diferentes result-types como Velocity, FreeMarker, JSP e etc.
A
A Arquitetura do Struts 2 baseado no framework WebWork 2. Isto influncia as tecnologias JEE Standard
como Java Filters, JavaBeans, ResourceBundles, Locales, XML etc nesta arquitetura.
Abaixo segue o diagram do framework.
Imagem: struts.apache.org
O ciclo de vida do processamento da requisio do framework Struts2 bastante discutida na sesso acima,
onde vimos a arquitetura do framework Struts 2.
1. A requisio gerada pelo usurio e enviada ao
container.
container invoca o filtro
que por sua vez determina a ao apropriada.
2.
so aplicados ante de chamar a
. Interceptors executam tarefas como
3. Um por um dos
,
,
,
e etc.
4.
executada e o
gerado pela
.
renderizada na view (
, etc) e o resultado retornado ao usurio.
5. A sada da
S
AJAX um termo bem conhecido no desenvolvimento web. Agora possvel escrever aplicaes desktop
como web2.0 usando AJAX. At o Struts 1.x, o desenvolvedor tinha que escrever e manter o cdigo em
javascript para adicionar o suporte AJAX.
Mas agora o Struts 2 lhe d o Ajax for a da caixa. Sem escrever javascript, sem debugar comparando
vrios browsers; apenas configure e vai.
Struts 2 vem com uma biblioteca de tags AJAX altamente configurveis quais podem ser usada diretamente
sem escrever cdigo JavaScrip. Struts 2 tambm suporta biblioteca Dojo. Agora muito fcil adicionar
caractersticas de AJAX habilitado como o Autocomplete a sua aplicao web.
Relacionado: Introduo ao DOJO Toolkit (em ingls)
Antes de ns comearmos com nosso primeiro exemplo Hello World no Struts 2, ns vamos precisar de
algumas ferramentas.
1.
2.
3.
4.
Observe que dependendo da verso utilizada do Struts2, o nmero da verso dos arquivos JAR
acima podem mudar.
N
Nosso objetivo criar uma aplicao bsica de Struts2 com uma pgina de Login. O usurio entrar com a
credencial de login(username e senha) e se for autenticado com sucesso ele ser redirecionado uma pgina
de Bem-Vindo na qual mostrar a mensagem Howdy, <username>!. Se o usurio no autenticar, ele
ser redirecionado de volta para pgina de login.
Digite o nome do projeto. Por exemplo StrutsHelloWorld. Uma vez que fez isso, selecione o target runtime
environment (ex.: Apache Tomcat v6.0). Isso pra rodar o projeto dentro do ambiente do eclipse. Depois
disso clique em Finish.
Uma vez que o projeto est criado, voc pode ver essa estrutura no Project Explorer.
Agora copie todos os arquivos JAR requeridos no pasta WebContent -> WEB-INF -> lib. Crie essa pasta se
ela no existir.
Como discutido no artigo anterior, o ponto de entrada da aplicao Struts2 ser definir o Filter no web.xml.
Daqui ns definiremos uma entrada da classe org.apache.struts2.dispatcher.FilterDispatcher no web.xml.
Abra o arquivo web.xml que est abaixo da pasta WEB-INF e copie e cole o seguinte cdigo.
<?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>Struts2 Application</display-name>
<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>
<welcome-file-list>
<welcome-file>Login.jsp</welcome-file>
</welcome-file-list>
</web-app>
O cdigo acima no web.xml mapear o filtro do Struts2 com a url /*. O mapeamento padro de url para
aplicao struts2 ser /*.action. Tambm observe que ns temos que definir Login.jsp como arquivo de
boas-vindas.
Observao: O filtro FilterDispatcher est depreciado desde a verso 2.1.3 do Struts. Se voc est
utilizando a ltima verso do Struts2 ( > 2.1.3) utilize a classe StrutsPrepareAndExecuteFilter em vez
disso.
<filter>
<filter-name>struts2</filter-name>
<filterclass>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filterclass>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Precisaremos de uma classe Action que ir autenticar nosso usurio e manter o valor do username e da
senha. Para isso vamos criar um pacote net.viralpatel.struts2 na pasta source. Esse pacote conter o
arquivo action.
Crie uma classe chamada LoginAction no pacote net.viralpatel.struts2 com o seguinte conteudo.
package net.viralpatel.struts2;
public class LoginAction {
private String username;
private String password;
public String execute() {
if (this.username.equals("admin")
&& this.password.equals("admin123")) {
return "success";
} else {
return "error";
}
}
Observe que, a classe action acima contm dois campos, username e senha qual manter os valores do
formulrio e tambm contem o mtodo execute() que autenticar o usurio. Neste simples exemplo, ns
vamos checar se o username admin e a senha admin123.
Tambm observe que diferente da classe Action no Struts1, a classe Action do Struts2 uma simples classe
POJO com os atributos necessrios e mtodo.
O mtodo execute() retorna um valor String qual ir determinar a pgina de resultado. Tambm, no Struts2
o nome do mtodo no fixo. Neste exemplo ns devemos definir o mtodo execute(). Voc pode querer
definir um mtodo authenticate() em vez disso.
O
ResourceBundle uma entidade Java muito til que ajuda a colocar o contedo esttico fora do arquivo
fonte. A maioria das aplicaes definem um arquivo resource bundle como ApplicationResources.properties
o qual conter mensagens estticas como Username e Senha e inclui isso com a aplicao.
ResourceBundle se torna til quando ns queremos adicionar suporte a internacionalizao(I18N) a uma
aplicao.
Ns definiremos um arquivo ApplicationResources.properties para nossa aplicao. Esse arquivo de
propriedade deve estar presente na pasta WEB-INF/classes quando a fonte for compilada. Portanto criaremos
uma pasta source chamada resources e colocar esse arquivo ApplicationResources.properties dentro dela.
Para criar uma pasta source, clique com o boto direito no seu projeto no Project Explorer e selecione New > Source Folder.
Ns vamos criar dois arquivos JSP para renderizar a sada ao usurio. Login.jsp ser o ponto de partida da
nossa aplicao, no qual conter um simples formulrio de login com username e senha. Em uma
autenticao bem sucedida, o usurio ser redirecionado Welcome.jsp que ir mostrar uma simples
mensagem de boas vindas.
Crie dois arquivos JSP Login.jsp e Welcome.jsp na pasta WebContent do seu projeto. Copie o seguinte
contedo dentro deles.
L
<body>
<body>
<h2>Howdy, <s:property value="username" />...!</h2>
</body>
</html>
Observe que ns usamos a tag <s:> do Struts 2 para renderizar as caixas de texto e labels. Struts2 vem com
uma ponderosa biblioteca de tags embutida para renderizar elementos UI com mais eficincia.
O Struts2 l a configurao e a definio de classe de um arquivo XML chamado struts.xml. Esse arquivo
carregado do classpath do projeto. Ns definiremos o arquivo struts.xml na pasta resources. Crie o arquivo
struts.xml na pasta resources.
<struts>
<constant name="struts.enable.DynamicMethodInvocation"
value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.custom.i18n.resources"
value="ApplicationResources" />
Observe que no arquivo de configurao acima, ns temos definido a action Login da nossa aplicao. Dois
result paths (caminhos de resultado) esto mapeados com LoginAction dependendo do resultado do mtodo
execute(. Se o mtodo execute() retornar sucesso, o usurio ser redirecionado para Welcome.jsp se
no para Login.jsp.
Tambm observe que uma Constant especificada com o nome struts.custom.i18n.resources. Essa
constante especifica o arquivo resource bundle que ns criamos nos passos acima. Ns apenas precisamos
especificar o nome do arquivo resource bundle sem a extenso (ApplicationResources sem o .properties).
Nosso LoginAction contm o mtodo execute() o qual o mtodo padro sendo chamado pelo Struts2. Se o
nome do mtodo diferente, ex.: authenticate(); ento devemos especificar o nome do mtodo na tag
<action>.
<action name="login" method="authenticate"
class="net.viralpatel.struts2.LoginAction">
A aplicao est quase pronta. Voc talvez queira rodar a aplicao agora e ver o resultado voc mesmo. Eu
presumo que voc j tenha configurado o Tomcat no eclipse. Tudo que voc precisa fazer:
Abrir a view de Server em Windows -> Show View -> Server. Boto direito nesta view e selecionar New ->
Server e adicionar os detalhes do seu servidor.
Para rodar o projeto, boto direito no nome do projeto no Project Explorer e selecione Run as -> Run on
Server (Atalho: Alt+Shift+X, R)
Mas ai tem um pequeno problema. Nossa aplicao roda perfeitamente bem at este ponto. Mas ento o
usurio entra com as credenciais erradas, ela ser redirecionada para pgina de Login. Mas nenhuma
mensagem de erro mostrada. O usurio no sabe oque aconteceu. Uma boa aplicao sempre mostrar
mensagens de erro apropriadas ao usurio. Ento ns devemos mostrar uma mensagem de erro Invalid
Username/Password. Please try again quando a autenticao do usurio falhar.
T
Para adicionar essa funcionalidade, primeiro ns vamos adicionar a mensagem de erro no nosso arquivo
ResourceBundle. Abra o ApplicationResources.properties e adicione uma entrada para error.login. O
ApplicationResources.properties final parecer como:
label.username= Username
label.password= Password
label.login= Login
error.login= Invalid Username/Password. Please try again.
Ns tambm precisamos adicionar lgica no LoginAction para adicionar a mensagem de erro se o usurio
no autenticar. Mas ai ns temos um problema. Nossa mensagem de erro est especificada no arquivo
ApplicationResources.properties. Ns precisamos especificar a chave error.login no LoginAction e a
mensagem dever aparecer na pgina JSP.
Para isso ns precisamos implementar a interface com.opensymphony.xwork2.TextProvider que fornece
o mtodo getText(). Esse mtodo retorna um valor String do arquivo resource bundle. Ns precisamos
apenas passar o valor chave como argumento para o mtodo getText(). A interface TextProvider define
vrios mtodos que ns precisamos implementar a fim de conseguir segurar o mtodo getText(). Mas ns
no queremos estragar o nosso cdigo adicionando todos esses mtodos que no temos a inteno de usar.
Tem um bom jeito de lidar com este problema.
Struts2 vem com uma classe muito til com.opensymphony.xwork2.ActionSupport. Ns precisamos
estender nossa classe LoginAction com esta classe e diretamente usar mtodos como o getText(),
addActionErrors() e etc. Portanto ns iremos estender a classe LoginAction com a classe ActionSupport e
adicionar a lgica para reportar o erro dentro dela. O cdigo final do LoginAction deve se parecer com:
package net.viralpatel.struts2;
import com.opensymphony.xwork2.ActionSupport;
if (this.username.equals("admin")
&& this.password.equals("admin123")) {
return "success";
} else {
addActionError(getText("error.login"));
return "error";
}
}
A action do Struts2 depende de um framework de validao fornecido pela XWork para permitir a aplicao
de regras de validao de entrada para nossa Action antes delas serem executadas. O framework de
validao do Struts2 nos permite separar a lgica de validao do real cdigo Java/JSP, onde isso pode ser
revisado e facilmente modificado depois.
O framework de validao do Struts2 alivia muita das dores de cabea associadas com manipulao de
validao de dado, permitindo voc focar no cdigo de validao e no no mecanismo de captura de dados e
reexibio de dados incompletos ou invlidos.
O framework de validao vem com um conjunto de retinas teis para manipular o formulrio de validao
automaticamente e isso pode tratar o formulrio de validao de ambos os lados, servidor (Server Side) ou
cliente (Client Side). Se determinada validao no est presente, voc pode criar sua prpria lgica de
validao implementando a interface com.opensymphony.xwork2.Validator e plug-la dentro do
framework de validao como um componente reutilizvel.
O validador usa arquivos de configurao XML para determinar quais rotinas de validao devem ser
instaladas e quais delas devem ser aplicadas para uma determinada aplicao.O arquivo validators.xml
contm todas as declaraes dos validadores comuns. Se o arquivo validators.xml no estiver presente no
classpath, um arquivo de validao padro carregado do path
com/opensymphony/xwork2/validator/validators/default.xml.
O primeiro arquivo de configurao, declara as rotinas de validao que devem ser plugadas dentro do
framework e fornece nomes lgicos para cada uma das validaes. O arquivo validator-rules.xml tambm
define o cdigo JavaScript do lado cliente para cada rotina de validao. O validador pode ser configurado
para enviar esse cdigo JavaScript para o navegador ento essas validaes so realizadas tanto do lado
cliente quanto do lado servidor.
E
Field validators, como o nome indica, atua em um nico campo acessvel atravs de uma action. Um
validador, em contrapartida, mais genrico e pode fazer validaes no contexto inteiro da action,
invocando mais de um campo (ou at mesmo nenhum campo) na regra de validao. A maioria das
validaes podem ser definidas em forma de campo. Isso deve ter preferncia sobre validao non-field
sempre que possvel, como mensagens de validao de campo so vinculados ao campo relacionado e ser
apresentado prximo ao elemento de entrada correspondente na view respectiva.
<validators>
<field name="bar">
<field-validator type="required">
<message>You must enter a value for bar.</message>
</field-validator>
</field>
</validators>
Non-field validators apenas adiciona mensagens de nvel de action. Validaes non-field fornecida pela
XWork ExpressionValidator (Validador de Expresso).
<validators>
<validator type="expression">
<param name="expression">foo lt bar</param>
<message>Foo must be greater than Bar.</message>
</validator>
</validators>
Vamos adicionar a lgica de validao na aplicao StrutsHelloWorld que ns criamos no artigo anterior.
Para esse tutorial, vamos criar uma classe Action chamada CustomerAction a qual conter poucos campos.
Crie um arquivo CustomerAction.java no pacote net.viralpatel.struts2.
import com.opensymphony.xwork2.ActionSupport;
Observe que a classe CustomerAction tem os campos name, email, telephone e age. Tambm tem um
mtodo chamado addCustomer() o qual no tem nenhuma lgica, ele apenas retorna SUCCESS.
Agora ns vamos adicionar uma entrada para essa classe action no arquivo struts.xml. Abra o arquivo
struts.xml o qual estar presente abaixo da pasta resources. E adicione o seguinte contedo entre as tags
<package></package>.
<action name="customer"
class="net.viralpatel.struts2.CustomerAction">
<result name="success">SuccessCustomer.jsp</result>
<result name="input">Customer.jsp</result>
</action>
Observe que ns estamos mapeando a classe CustomerAction com o nome customer. Tambm em sucesso o
usurio ser redirecionado a pgina SuccessCustomer.jsp. Repare que tem outra tag de resultado com nome
input. Sempre que a lgica de validao encontra algum erro de validao, redireciona o usurio de volta a
pgina especificada como input. Assim no nosso exemplo, o usurio ser redirecionado de volta para
Customer.jsp no caso de quaisquer erros.
Crie duas novas JSPs Customer.jsp (qual conter o formulrio do Customer) e SuccessCustomer.jsp
(qual ser mostrada em sucesso).
Customer.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Customer Form - Struts2 Demo | ViralPatel.net</title>
</head>
<body>
<h2>Customer Form</h2>
SuccessCustomer.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Customer Page - Struts2 Demo | ViralPatel.net</title>
</head>
<body>
<h2>Customer Added Successfully.</h2>
</body>
</html>
Ns criamos o arquivo Customer.jsp qual ir exibir o formulrio Customer. Mas ns no temos link para
esta pgina na nossa aplicao web. Ento ns criaremos um link para Customer.jsp da pgina Welcome.jsp.
Abra a pgina Welcome.jsp e adicione o seguinte cdigo de link dentro dela.
<s:a href="Customer.jsp">Add Customer</s:a>
Execute o cdigo no Eclipse e veja a saida. Voc ver a pgina de login. Entre com username=admin e a
senha=admin123 e faa o login. Na pgina de boas vindas voc ver um link para pgina Add Customer.
Clique naquele link e voc ver a pgina Customer..
Agora ns terminamos o bsico do formulrio customer no qual ns vamos adicionar a lgica de validao.
Seguem as regras de validaes:
1.
2.
3.
4.
A fim de definir a lgica de validao para um formulrio em particular, primeiro ns devemos criar um
arquivo XML no qual manter esse dado. O Struts2 define uma conveno de nomenclatura especfica na
definio dos arquivos XML de validao. O formato <NomeDaClasseAction>-validation.xml. Ento
para nossa aplicao vamos criar um arquivo CustomerAction-validation.xml. Observe que este arquivo
deve estar presente no mesmo pacote da classe action.
Crie o arquivo CustomerAction-validation.xml no pacote net.viralpatel.struts2. E copie o seguinte contedo
dentro dele.
CustomerAction-validation.xml
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="errors.required" />
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message key="errors.required" />
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">100</param>
<message key="errors.range"/>
</field-validator>
</field>
<field name="email">
<field-validator type="requiredstring">
<message key="errors.required" />
</field-validator>
<field-validator type="email">
<message key="errors.invalid" />
</field-validator>
</field>
<field name="telephone">
<field-validator type="requiredstring">
<message key="errors.required" />
</field-validator>
</field>
</validators>
E isso. Ns apenas adicionamos a lgica de validao ao nosso exemplo. Veja que os arquivos XML de
validao contm diferentes field-validators.
V
muito fcil adicionar a validao do lado cliente ou validao JavaScript a qualquer formulrio em
Struts2. Tudo o que voc precisa fazer adicionar validate=true na tag form no seu arquivo JSP. Por
exemplo abra o Customer.jsp e adicione validate=true na tag form. O Struts2 automaticamente gerar o
cdigo JavaScript para validao do lado cliente do formulrio.
<s:form action="customer.action" method="post" validate="true">
...
</s:form>
A fim de adicionar o suporte Tiles a nossa aplicao Struts2, ns precisaremos de alguns arquivos JARs.
Abaixo segue a lista de JARs do nosso exemplo. Adicione estes JARs na pasta WEB-INF/lib.
Para configurar o Tiles, uma entrada de listener tem que ser criada no web.xml. Abra o web.xml na pasta
WEB-INF e adicione o seguinte cdigo.
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
<context-param>
<param-name>tilesDefinitions</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>
O cdigo acima configure o listener do Tiles no web.xml. Um arquivo de configurao de entrada /WEBINF/tiles.xml passado como argumento. Este arquivo contm a definio do Tiles para sua aplicao
web.
Crie um arquivo tiles.xml na pasta WEB-INF e copie o seguinte cdigo dentro dele.
Aqui no tile.xml ns temos que definir um template baseLayout. Este layout contm atributos como
Header, Title, Body, Menu e Footer. O layout depois estendido, e novas definies para as pginas
Welcome e Customer so definidas. Ns temos que substituir o layout padro e mudar o contedo de Body e
Title.
C
Ns definiremos o template para nossa aplicao web em uma arquivo JSP chamado BaseLayout.jsp. Este
template ir conter diferentes segmentos da pgina (Header, Footer, Menu etc). Crie 4 novos arquivos JSP
BaseLayout.jsp, Header.jsp, Menu.jsp and Footer.jsp e copie o seguinte contedo em cada um deles.
BaseLayout.jsp
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><tiles:insertAttribute name="title" ignore="true" /></title>
</head>
<body>
<table border="1" cellpadding="2" cellspacing="2" align="center">
<tr>
<td height="30" colspan="2"><tiles:insertAttribute name="header" />
</td>
</tr>
<tr>
<td height="250"><tiles:insertAttribute name="menu" /></td>
<td width="350"><tiles:insertAttribute name="body" /></td>
</tr>
<tr>
<td height="30" colspan="2"><tiles:insertAttribute name="footer" />
</td>
</tr>
</table>
</body>
</html>
Header.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<h2>Struts2 Example - ViralPatel.net</h2>
Menu.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<s:a href="customer-form">Customer</s:a>
Footer.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
Copyright © ViralPatel.net Traduo SpigandoEAprendendo.wordpress.com
No struts.xml ns definimos a tag de resultado (result) que mapeia uma ao especfica com uma pgina
JSP. Agora ns modificaremos isso e mapearemos o resultado com Tiles. Abaixo segue o contedo do
arquivo struts.xml.
<?xml version="1.0" encoding="UTF-8" ?>
<struts>
<constant name="struts.enable.DynamicMethodInvocation"
value="false" />
<constant name="struts.devMode" value="false" />
<constant name="struts.custom.i18n.resources"
value="ApplicationResources" />
O struts.xml agora define um novo tipo de Resultado pelo Tiles. Esse tipo de resultado usado na tag
<result> para diferentes aes. Tambm observe que ns vamos definir uma nova ao customer-form.
Esta apenas uma declarao vazia para redirecionar o Usuario para pgina do formulrio Customer quando
ela clica no link Customer no menu.
Compile e execute a aplicao no Eclipse e veja que o header, menu e o footer esto apropriadamente
aplicados.
Pgina de Boas Vindas com Tiles
Clique aqui para fazer o download do cdigo fonte (sem os JARs) (11KB)
F
O Struts2 fornece um mecanismo poderoso para controlar uma requisio usando Interceptadores.
Interceptadores so responsveis pela maior parte do processamento de requisies. Eles so invocados pelo
controller (controlador) antes e depois de invocar uma action, assim eles ficam entre o controller e a action.
Interceptadores executam tarefas como Logging, Validation, File Upload, Double-submit guard e etc.
Portanto os interceptadores do Struts2 removem funes cross cutting como logging de componentes action e
Nossa meta sera criar um interceptador customer MyLoggingInterceptor, o qual ir logar a requisio antes
de qualquer action ser chamada. Ele tambm ir imprimir o nome da classe Action e o tempo de execuo
em milisegundos.
C
package net.viralpatel.struts2.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
return result;
}
Uma vez que ns criamos uma classe interceptadora, tudo o que precisamos fazer configurar ela no
arquivo struts.xml e usa-la com as actions.
Para configurar o interceptador criado h pouco, adicione o seguinte cdigo dentro do struts.xml
<interceptors>
<interceptor name="mylogging"
class="net.viralpatel.struts2.interceptor.MyLoggingInterceptor">
</interceptor>
<interceptor-stack name="loggingStack">
<interceptor-ref name="mylogging" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
Esse cdigo deve ser adicionado depois da tag <result-types > no <package ></package>. Aqui ns
configuramos um novo interceptador mylogging com a tag <interceptor >. Tambm veja que ns definimos
um interceptor-stack com o nome de loggingStack. Isso para ter certeza de que o Struts2 chamar todos
os interceptadores padres assim como chamar o nosso interceptador customizado. Isso muito importante
como por exemplo a lgica de validao no ser chamada na nossa aplicao Struts2 se ns ignorarmos o
stack padro (defaultStack) dos interceptadores.
Ns podemos fazer o novo loggingStack como interceptador padro ou podemos configurar ele em cada
nvel de action. A fim de faze-lo um stack padro, ns devemos adicionar o seguinte no struts.xml
<default-interceptor-ref name="loggingStack"></default-interceptor-ref>
Uma vez que ns adicionamos o cdigo acima no Struts.xml, o logginStack ser aplicado todas as action
daquele pacote.
Tambm ns talvez quisssemos aplicar o interceptador customizado para apenas determinadas actions. Para
fazer isso, ns precisamos adicionar a tag interceptor-ref na action.
<action name="login"
class="net.viralpatel.struts2.LoginAction">
<interceptor-ref name="loggingStack"></interceptor-ref>
<result name="success" type="tiles">/welcome.tiles</result>
<result name="error">Login.jsp</result>
</action>
..
..
Before calling action: net.viralpatel.struts2.LoginAction
..
..
After calling action: net.viralpatel.struts2.LoginAction Time taken: 313 ms
..
..
..
Destroying MyLoggingInterceptor...
Clique aqui para fazer o download do cdigo fonte sem os JARs (17KB)
F
Antes de comear, voc precisa ter certeza que o arquivo commons-io.jar est presente no classpath. Segue
a lista de arquivos JAR necessrios.
A fim de adicionar a funcionalidade de upload de arquivos, ns vamos adicionar uma classe action
FileUploadAction ao nosso projeto. Crie o arquivo FileUploadAction.java no pacote
net.viralpatel.struts2
FileUploadAction.java
package net.viralpatel.struts2;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
FileUtils.copyFile(this.userImage, fileToCreate);
} catch (Exception e) {
e.printStackTrace();
addActionError(e.getMessage());
return INPUT;
}
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest servletRequest) {
this.servletRequest = servletRequest;
}
}
Crie dois arquivos JSP na pasta WebContent. UserImage.jsp ir exibir um formulrio para o usurio carregar
a imagem. Ao submeter, o arquivo ser carregado e salvo no servidor. O usurio ser enviado ao arquivo
SuccessUserImage.jsp aonde ter os detalhes do arquivo sero exibidos. Copie o seguinte cdigo dentro
dele.
UserImage.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Upload User Image</title>
</head>
<body>
<h2>Struts2 File Upload & Save Example</h2>
<s:actionerror />
SuccessUserImage.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Success: Upload User Image</title>
</head>
<body>
<h2>Struts2 File Upload Example</h2>
User Image: <s:property value="userImage"/>
<br/>
Content Type: <s:property value="userImageContentType"/>
<br/>
File Name: <s:property value="userImageFileName"/>
<br/>
Uploaded Image:
<br/>
<img src="<s:property value="userImageFileName"/>"/>
</body>
</html>
<param name="maximumSize">2097152</param>
<param name="allowedTypes">
image/png,image/gif,image/jpeg,image/pjpeg
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">SuccessUserImage.jsp</result>
<result name="input">UserImage.jsp</result>
</action>
Clique aqui para fazer o download do cdigo fonte sem os JARs (20KB)
F
O Struts 2 fornece suporte embutido a Ajax usando a biblioteca Dojo Toolkit. Se voc novo em Dojo,
talvez voc queira passar pela Introduo ao DOJO Toolkit (Em Ingls).
O Struts 2 vem com um poderoso conjunto de APIs de Dojo AJAX que voc pode usar para adicionar
suporte Ajax. A fim de adicionar suporte Ajax, voc precisa adicionar o seguinte arquivo JAR no seu
classpath:
struts2-dojo-plugin.jar
Uma vez que ns adicionamos esse arquivo JAR, ns precisamos adicionar o seguinte fragmento de cdigo
em qualquer arquivo JSP que ns precisamos adicionar o suporte Ajax.
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
Primeiro defina a taglib sx que ns usaremos para adicionar as tags disponveis de AJAX.
<sx:head/>
Adicione essa tag head no seu JSP entre as tags <head> </head>. Essa tag sx:head incluir os arquivos
javascript e css necessrios pra implementar o Ajax.
E
Vamos adicionar um simples suporte AJAX a nossa aplicao web StrutsHelloWorld. Ns usaremos o
cdigo base que ns usamos nos artigos anteriores e adicionar o Ajax no topo dele.
Ns criaremos um drop down (combobox) qual ir autocompletar e sugerir a entrada. Para isso ns iremos
adicionar o suporte Dojo a nossa app web.
P
toda a aplicao, incluindo todos os exemplos das partes anteriores desta srie de tutoriais.
Ns vamos criar uma classe action a qual ir ser chamada pelo nosso exemplo Ajax. Crie um arquivo
AjaxAutocomplete.java no pacote net.viralpatel.struts2 e copie o seguinte contedo dentro dele.
AjaxAutocomplete.java
package net.viralpatel.struts2;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import com.opensymphony.xwork2.ActionSupport;
while (st.hasMoreTokens()) {
countries.add(st.nextToken().trim());
}
return SUCCESS;
}
public String getCountry() {
return this.country;
}
No cdigo acima ns criamos uma simples classe action com os atributos String country e List
countries. A lista de pases ser populada com nomes de pases quando o mtodo execute() chamado.
Aqui por exemplo, ns carregamos dados estticos. Voc pode se sentir livre para mudar isso e adicionar
dados do banco de dados.
P
Crie o arquivo JSP para exibir o Textbox com Autocomplete para nossa action Ajax. Crie AjaxDemo.jsp no
diretrio WebContent.
AjaxDemo.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<html>
<head>
<title>Welcome</title>
<sx:head />
</head>
<body>
<h2>Struts 2 Autocomplete (Drop down) Example!</h2>
Country:
<sx:autocompleter size="1" list="countries" name="country"></sx:autocompleter>
</action>
</body>
</html>
No arquivo JSP acima ns usamos a tag sx:autocompleter para renderizar um drop down com autocomplete
o qual utiliza a classe Ajax para buscar dados internamente. Veja que ns mapeamos o atributo list com
List countries.
P
Observe que ns estamos utilizando Tiles aqui neste exemplo. Voc pode querer usar o AjaxDemo.jsp ao
invs do /ajaxdemo.tiles para renderizar a sada diretamente em JSP.
Clique aqui para fazer o download do cdigo fonte sem os JARs (24KB)
C
O framework Struts2 fornece uma ampla variedade de recursos para criar uma rica aplicao web. Nessa
srie de Struts2 ns vimos diferentes aspectos do Struts2 como introduo ao struts2, aplicao hello world,
framework de validao, plugin tiles, interceptadores do struts2, carga de arquivo e suporte a Ajax.
F