Você está na página 1de 27

Struts

 Framework para o desenvolvimento de aplicações WEB


 Como framework oferece funcionalidades comuns a aplicações WEB a
fim de facilitar o processo de criação da aplicação
 Mantido pela Fundação Apache
 Baseado no modelo MVC (Model View Controller) também conhecido
como Model 2
 Existem atualmente duas versões do Struts.
 A versão 1.x que compreende a versão original do projeto Struts. A última
versão disponível é a 1.3.10
 A versão 2.x, chamada Struts 2 é resultado de uma fusão entre o projeto
WebWork
W bW k e o projeto
j t Struts.
St t A última
últi versão
ã disponível
di í l é a 2.2.3.1
2231
 O Struts 2 é baseado em uma nova arquitetura, desta forma seu
funcionamento é totalmente diferente do Struts 1

Programação para Internet 205


Flávio de Oliveira Silva, M.Sc.

Struts 2
Principais Componentes
 Controller
 FilterDispatcher (Filtro baseado em Servlet)
 Utilização padrão de projeto FrontController
 R
Recebeb requisições
i i õ e iinvoca a ação
ã correspondente
d t
 Necessário mapear URLs em ações
 Ação é invocada pelo framework (Struts 2)
 Model
 Contém as Ações (Action) que serão executadas
 Realiza a interface com o restante da aplicação (Regras de Negócio,
Persistência e Integrações)
 Encaminha
E i h resultado
lt d para VIEW
 View
 Responsável pela produção da resposta à requisição
 Traduz o estado da aplicação para uma representação onde é possível a
interação do usuário

Programação para Internet 206


Flávio de Oliveira Silva, M.Sc.
Struts 2
 Implementação MVC (Model – View – Controller)

Programação para Internet 207


Flávio de Oliveira Silva, M.Sc.

Struts 2
Componentes
 FilterDispatcher
 Interceptors
 ValueStack
 Action
 Result
 ActionContext
 OGNL

Programação para Internet 208


Flávio de Oliveira Silva, M.Sc.
Struts 2
Componentes
 Interação entres os Componentes

Programação para Internet 209


Flávio de Oliveira Silva, M.Sc.

Struts 2
Componentes - Interceptors
 São invocados tanto antes, quanto depois o processamento
da ação
 pré-processamento
Utilizados no pré processamento do request e pós-
pós
processamento do response
 Uma pilha dos mesmos está associada a cada ação
 Realizam atividades complementares à ação, sem a
necessidade de acoplá-las à ação
 Exemplo de uso
 Logging
L i
 Não é parte da ação, mas um requisito da aplicação
 Conversão de Tipos
 File Upload

Programação para Internet 210


Flávio de Oliveira Silva, M.Sc.
Struts 2
Componentes - ValueStack
 Área de armazenamento que mantém todos os dados
associados com o processamento do pedido
 Desta forma não é necessário passar os dados de forma
invididual entre os vários componentes (classes) que estão
envolvidos neste processamento
 Antes do processamento do pedido dados são gravados na
ValueStack
 Durante a execução da ação estes dados podem ser
manipulados
 Durante o processamento do resposta este dados são lidos a
fim de serem traduzidos para o contexto da reposta

Programação para Internet 211


Flávio de Oliveira Silva, M.Sc.

Struts 2
Componentes - OGNL
 Object-Graph Navigation Language
 Linguagem de expressões que permite obter (get) e atualizar
(set) propriedades em objetos Java
 Permite a manipulação de propriedades existentes na
ValueStack
 Pode ser utilizada para associar dados de um formulário
HTML com Objetos existentes na ValueStack
 Permite obter dados da ValueStack e rendizar os mesmos
em páginas JSP ou outros tipos de objetos Result

Programação para Internet 212


Flávio de Oliveira Silva, M.Sc.
Struts 2
Componentes - ActionContext
 Representa o contexto de execução de uma ação
 Contém todos os dados (objetos) relacionados com a ação e
com uso interno pelo framework
 ValueStack
 Mapas da API Servlet
 Application
 Session
 Request
 Acesso é feito através da OGNL
 Utiliza o padrão Thread Local
 Dados podem ser acessados em qualquer parte de um mesmo thread
de execução, visto que estão associados ao mesmo
 Semelhante a variáveis locais em um procedimento
 Processamento de cada ação é feito por um único Thread
Programação para Internet 213
Flávio de Oliveira Silva, M.Sc.

Struts
Componentes
 Basicamente a
construção de uma
aplicação consiste em:
 Configurar Framework
(Struts.xml)
 Criar Ações (Action)
 Preparar a maneira que
a resposta será exibida
(Template)

Programação para Internet 214


Flávio de Oliveira Silva, M.Sc.
Struts 2
Setup Aplicação – Versão 2.1.8.1
 Pastas e Arquivos
 /AppName/META-INF/
 /AppName/WEB-INF/
 /AppName/WEB-INF/classes/struts.xml
 /AppName/WEB-INF/lib/ Struts2 JARs + dependências
 /AppName/WEB-INF/web.xml
 Struts 2 Jars
ARQUIVO DESCRIÇÃO
struts2‐core‐2.18.1.jar  Componente básico do Struts 2
XWork 2 é uma biblioteca utilizada pelo Struts2  (a partir da versão 2.0). Implementa um 
xwork‐core‐2.1.6.jar
pattern baseado em um pattern de comandos
Implementação da Object Graph Navigation Language (OGNL). A linguagem de expressão 
ognl‐2.7.3.jar
utilizada pelo framework
utilizada pelo framework
freemarker‐2.3.15.jar Responsável por todas as tags utilizada na camada de apresentação do Struts2
Utilizado de forma transparente pelo Struts2 para prover um mecanismo de logging que 
commons‐logging‐1.0.4.jar
pode ser tanto o Log4J quanto o próprio JDK 1.4+
Biblioteca que permite adicionar a servlets e aplicações web capacidade de upload de 
commons‐fileupload‐1.2.1.jar 
arquivos.
commons‐io‐1.3.2.jar Biblioteca com várias funções utilitárias para o desenvolvimento de funcionalidades de IO

Programação para Internet 215


Flávio de Oliveira Silva, M.Sc.

Struts 2
Setup Aplicação – Versão 2.2.3
 Pastas e Arquivos
 /AppName/META-INF/
 /AppName/WEB-INF/
 /AppName/WEB-INF/classes/struts.xml
 /AppName/WEB-INF/lib/ Struts2 JARs + dependências
 /AppName/WEB-INF/web.xml
 Struts 2 Jars
ARQUIVO DESCRIÇÃO
struts2‐core‐2.2.3.1.jar Componente básico do Struts 2
XWork 2 é uma biblioteca utilizada pelo Struts2  (a partir da versão 2.0). Implementa um pattern baseado 
xwork‐core‐2.2.3.1.jar
em um pattern de comandos
Implementação da Object Graph Navigation Language (OGNL). A linguagem de expressão utilizada pelo 
ognl‐3.0.1.jar
framework
freemarker‐2.3.16.jar Responsável por todas as tags utilizada na camada de apresentação do Struts2
Utilizado de forma transparente pelo Struts2 para prover um mecanismo de logging que pode ser tanto o 
commons‐logging‐1.1.1.jar
Log4J quanto o próprio JDK 1.4+
commons‐fileupload‐1.2.2.jar Biblioteca que permite adicionar a servlets e aplicações web capacidade de upload de arquivos.
commons‐io‐2.0.1.jar Biblioteca com várias funções utilitárias para o desenvolvimento de funcionalidades de IO
Biblioteca com funcionalidades adicionais para class no pacote java.lang principalmente relacionadas com 
commons‐lang‐2.5.jar
manipulação de Strings entre outros
javassist‐3.11.0.GA.jar Javassist (Java Programming Assistant) permite a manipulação de bytecodes em tempo de execução

Programação para Internet 216


Flávio de Oliveira Silva, M.Sc.
Struts 2
Web.xml
 Mapeamento das requisições para o FilterDispatch
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java
xmlns= sun com/xml/ns/javaee"
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>Struts2Hello</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>
</web-app> Programação para Internet 217
Flávio de Oliveira Silva, M.Sc.

Struts 2
Struts.xml
 Arquivo de Configuração Básica
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
http://struts.apache.org/dtds/struts 2.0.dtd >

<struts><!-- Configuration for the default package. !-->


<package name="default" extends="struts-default">
...
</package>
</struts>

Programação para Internet 218


Flávio de Oliveira Silva, M.Sc.
Struts 2
Struts.xml
 Definindo Ações
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
http://struts.apache.org/dtds/struts 2.0.dtd >

<struts><!-- Configuration for the default package. !-->


<package name="default" extends="struts-default">
<action name="teste" class="br.com.company.action.TesteStruts">
<result name="SUCCESS">success.jsp</result>
<result name="FAIL">fail.jsp</result>
</action>
</package>
</struts>

Programação para Internet 219


Flávio de Oliveira Silva, M.Sc.

Struts 2
Struts XML
 Arquivo básico de configuração do framework
 Deve residir no classpath da aplicação web. Normalmente em /WEB-
INF/classes
 Estrutura
<struts>
<bean>
<constant>
<include>
<package>
<action>
<result>
</struts>

Programação para Internet 220


Flávio de Oliveira Silva, M.Sc.
Struts 2
Struts XML - Constant
 Constantes de configuração do framework
 Permitem ajustar o comportamento do Struts 2 e de plugins, sobrepondo valores
default e qual implementação de um determinado Bean será utlizado
 <constant name="struts devMode" value
name struts.devMode value="true"
true />
 <constant name="struts.objectFactory" value="spring" />
 Configuração padrão
 default.properties – localizado no pacote “org.apache.struts2” do arquivo struts2-core
(struts2-core-2.1.8.1.jar)
 Valores de constantes são procurados na seguinte ordem:
1. struts-default.xml
2. struts-plugin.xml
3.
3 struts.xml
t t l
4. struts.properties
5. web.xml
 Arquivo struts.properties é utilizado a fim de manter compatibilidade com o
WebWork

Programação para Internet 221


Flávio de Oliveira Silva, M.Sc.

Struts 2
Struts XML - Constant
Exemplos de definição de constantes
 Struts.xml
<struts>
/
<constant name="struts.devMode" value="true" />
</struts>
 struts.properties
struts.devMode = true
 web.xml
<web-app id="WebApp_9" version="2.4"
<filter>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
</web-app>
Programação para Internet 222
Flávio de Oliveira Silva, M.Sc.
Struts 2
Struts XML - include
 Permite a inclusão de um outro arquivo de configuração dentro do
arquivo struts.xml, modularizando a configuração
 Desta forma é possível quebrar o arquivo em diferentes partes
 Arquivo incluído deve possuir o mesmo formato do arquivo struts.xml,
inclusive com o elemento DOCTYPE
 Arquivos podem estar em qualquer local do classpath e são
referenciados pelo atributo "file"
 Exemplo
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
"htt // t t h /dtd / t t 2 0 dtd">
<struts>
<include file="Simple.xml"/>
<include file="/util/POJO.xml"/>
<include file="/com/initech/admin/admin-struts.xml"/>
</struts>
Programação para Internet 223
Flávio de Oliveira Silva, M.Sc.

Struts 2
Struts.xml - Package
 O elemento package permite agrupar configurações que compartilham
atributos comuns como uma pilha de Interceptors ou mesmo um
namespace
 extends="struts default">
<package name="default" extends="struts-default">
 Atributos
 name – nome único do pacote
 extends – nome do do pacote que este pacote estenderá. Desta
forma todas as configurações estarão disponíveis para o pacote
 No geral o deve estender o pacote "struts-default"
 namespace – realiza um mapeamento da URL para o pacote
(namespace = "package1")
 "/WebAppName/package1/actionName.action
 abstract – Neste caso o pacote é apenas para efeito de configuração
não sendo possível acessar suas ações
<package name="struts-default" abstract="true">
</package name>
Programação para Internet 224
Flávio de Oliveira Silva, M.Sc.
Struts 2
Struts.xml - Package
 O atributo name (nome do pacote) permite realizar uma organização
lógica da aplicação, dividindo as ações
 Exemplo
 bli – área
public á úbli d
pública it
do site
 secure – área secura do site
 O atributo namespace permite também organizar as ações, porém seu
nome interfere na URL mapeada para cada ação
 Caso uma ação não seja encontrada em um namespace o nome da
mesma será procurado no pacote “default”
 Nome no pacote na URL de uma ação

Programação para Internet 225


Flávio de Oliveira Silva, M.Sc.

Struts 2
Struts.xml - Action
 Define acão
<action name = "a" class = "className" method="">
<result name="resultName" type="resultType">
</result>
</action>
 Exemplo
<action name="teste" class="br.com.company.action.TesteStruts">
<result name="SUCCESS">success.jsp</result>
<result name="FAIL">fail.jsp</result>
</action>
 name – nome único de uma ação
ação. Será associado à URL
 class – classe java responsável pelo comportamento associado à ação
 method – método desta classe que será invocado pelo Struts2. Caso o
método não seja informado o Struts2 invocará o método:
 public String execute()
 String de retorno deste método será utilizada para selecionar o <result> adequado
Programação para Internet 226
Flávio de Oliveira Silva, M.Sc.
Action
Utilizando Wildcards
 Permite a reutilização de ações baseados em caracteres
curinga
 Nome da Ação contém caracteres curinga
 Caracteres na ordem que são encontrados são substituídos dentro da
configuração .
 Acesso é feito utilizando um par de chaves
<action name="*/*" method="{2}"
class="br.struts.app.actions.{1}Action">
<result type="redirect">/{1}/view.action</result>
<result name="view">/{1}/view.jsp</result>
<result name="input">/{1}/edit.jsp</result>
<result name="home">/{1}/home.jsp</result>
</action>

Programação para Internet 227


Flávio de Oliveira Silva, M.Sc.

Result
 Após a execução de uma ação, um resultado é selecionado.
 O elemento <result> indica como será realizada a seleção de resultados
para uma determinada ação
 Uma ação deve retornar uma String que será então utilizada para
selecionar o respectivo resultado
 Atributos
 name – indica o nome do resultado. Este valor deve ser retornado pelo
método invocado na classe Action a fim de que o resultado seja selecionado
 type – indica o tipo de resultado que será utilizado. No geral o resultado
padrão é encaminhar o request para a página de template que será
responsável pela VIEW
 No arquivo struts-default.xml, dentro do elemento <result-types> são definidos
vários <result-type> indicando a classe do Struts2 responsável pela associação
sendo que o default (true) é para o “dispatcher” que encaminha normalmente para
uma página JSP
 Existem outros tipos que permitem diferentes comportamentos
 O conteúdo do elemento indica a localização da página de resultado
Programação para Internet 228
Flávio de Oliveira Silva, M.Sc.
Result
Resultados Dinâmicos
 Nem sempre o resultado de uma ação é conhecido em tempo de
configuração
 Neste caso é possível utilizar o type “redirectAction” que permite
encaminhar uma ação para outra ação
 Exemplo
<action name="wizard" class="br.ufu.facom.Wizard">
<result name="next" type="redirectAction">${nextAction}</result>
</action>
 No exemplo o conteúdo do atributo “nextAction” da classe Wizard, que é
ajustado em tempo de execução é selecionado para o nome da ação
 O atributo
t ib t é acessado
d através
t é da d OGNL

Programação para Internet 229


Flávio de Oliveira Silva, M.Sc.

Result
RedirectAction – Outro Exemplo
 Redirecionamento para outra ação com passagem de parâmetros
<action name="Login" class="br.package.LoginAction">
<result type="redirectAction">
<
<param " ti N "> tA ti </ >
name="actionName">nextAction</param>
<param name="namespace">/module/secure</param>
<param name="user">hardCodedValue</param>
<param name="passwd">${testProperty}</param>
</result>
</action>
 Elementos <param> são responsáveis pela passagem de parâmetros
entre
t ações,
õ sendo
d possível
í l o uso d
da OGNL
 "actionname" – nome da próxima ação que será chamada
 "namespace" – namespace associado, à ação caso exista
 Outros parâmetros podem ser informados no elemento <param> sendo que o
atributo é o nome do parâmetro a ser encaminhado e o valor é passado via
OGNL (${ForwardParamValue})
Programação para Internet 230
Flávio de Oliveira Silva, M.Sc.
Result
Redirect
 Permite o redirecionamento para uma URL
<action name="SendToSearchEngine" class="br.package.MyAction">
<result type='redirect'>http://www.google.com</result>
</action>

Programação para Internet 231


Flávio de Oliveira Silva, M.Sc.

Actions
 Representa o comportamento que será executado a fim de responder um
determinado pedido
 Realizam a transferência de dados entre o pedido e a VIEW
 Representam o MODEL no MVC, visto que contém os dados a serem
exibidos na resposta
 Realizam a conexão com outras camadas da aplicação (Serviços,
Persistência, Integração)
 No Struts2 a o código da ação pode estar relacionado apenas com a
lógica da mesma
 Uma estratégia comum é injetar um componente relacionado com esta
lógica de negócio e utilizá-lo dentro da ação
 A cada request uma nova instância da ação relacionada é criada

Programação para Internet 232


Flávio de Oliveira Silva, M.Sc.
Action - Transferência de Dados
Injeção de parâmetros
 View (JSP)
<form action=“login" method="post">
<p>Usuário <input type="text" name="user" />
<p>Senha <input type="password" name="password" />
/
<input type="submit" value="Login" />
</form>
 Action
public class LoginAction {
private String user;
private String password;
public String getXXX(){
return XXX;
}
public void setXXX(String xxx){
this.xxx = xxx;
}
public String execute(){
if (user.equals("a") && password.equals("123")
return "SUCCESS";
else return "FAIL";
} Programação para Internet 233
Flávio de Oliveira Silva, M.Sc.

Actions
 As ações podem ser um simples POJO com um método que contém a
lógica da ação. Este método deve retornar uma string
 public String actionMethod() throws Exception
 public String execute()
 Uma ação pode implementar a interface Action
(com.opensymphony.xwork2.Action) que basicamente:
 Define o método execute()
 String execute() throws Exception
 Define a strings de retorno que podem ser utilizadas para selecionar o
resultado
 public static final String ERROR "error"
 public static final String INPUT "input"
 public static final String LOGIN "login"
 public static final String NONE "none"
 public static final String SUCCESS "success"

Programação para Internet 234


Flávio de Oliveira Silva, M.Sc.
Action - ActionSupport
 O Struts 2 possui uma classe ActionSupport
(com.opensymphony.xwork2.ActionSupport) que possui uma
implementação para a Interface Action e outras úteis interfaces
 public class ActionSupport extends Object implements
Action, Validateable, ValidationAware, TextProvider,
LocaleProvider, Serializable
 Desta forma é possível agregar a uma ação comportamentos
relacionados, por exemplo, com: Validação de Dados e Localização de
Mensagens de erros
 As ações não precisam necessariamente estender esta classe, porém o
g ç com o S
uso deste recurso facilita a integração Struts 2

Programação para Internet 235


Flávio de Oliveira Silva, M.Sc.

Action
Transferência de Dados
 A Action contém os dados que são obtidos a partir da VIEW e que podem
ser modificados durante o processamento para posterior apresentação
na mesma VIEW
 Basicamente existem três formas de representar os dados na Action
 Propriedades
 Informações que estão no formulário de entrada e/ou saída são propriedades da
Classe Action
 Classe Action é um POJO com os getters e setters para cada uma destas
propriedades
 Objeto
 Todas as informações que estão no formulário de entrada e/ou saída estão
encapsuladas
l d em um ú único
i objeto
bj t
 Classe Action contém um método getter e outro setter para este objeto
 Interface ModelDriven
 Informações estão encapsuladas em um único Objeto
 Objeto é instanciado pela Action e obtido pelo Método getModel()
 Necessário que a Action implemente a interface ModelDriven
Programação para Internet 236
Flávio de Oliveira Silva, M.Sc.
Action - Transferência de Dados
Propriedades
 Interceptor "params", presente da "defaulStack" é
responsável por realizar um setXXX para cada propriedade
 Valores informados no request são associados a cada
propriedade e obtidos no request
 Neste processo a conversão de String para o tipo da
propriedade é feito de forma transparente
 Associação é feita pelo nome da propriedade utilizada tanto
na VIEW como na ACTION
 Na VIEW os métodos getXXX são utilizados

Programação para Internet 237


Flávio de Oliveira Silva, M.Sc.

Action - Transferência de Dados


Propriedades - Exemplo
 View (JSP)
<form action=“login" method="post">
<p>Usuário <input type="text" name="user" />
<p>Senha <input type="password" name="password" />
/
<input type="submit" value="Login" />
</form>
 Action
public class LoginAction {
private String user;
private String password;
public String getXXX(){
return XXX;
}
public void setXXX(String xxx){
this.xxx = xxx;
}
public String execute(){
if (name.equals(“a”) && password.equals(“123”)
return “SUCCESS”;
else return “FAIL”;
} Programação para Internet 238
Flávio de Oliveira Silva, M.Sc.
Action - Transferência de Dados
Objeto
 Interceptor "params", presente da "defaulStack" é
responsável por associar realizar o setXXX para o objeto
 Valores informados no request são associados ao objeto e
posteriormente são obtidos para exibição na VIEW
 Associação é feita pelo nome tanto pelo nome do objeto,
quanto pelo nome de sua propriedade
 Nome do objeto deve ser o mesmo tanto na VIEW quanto na
ACTION
 No caso de um objeto com muitas propriedades o código da
Action será mais sucinto, pois um POJO para o objeto será
criado

Programação para Internet 239


Flávio de Oliveira Silva, M.Sc.

Action - Transferência de Dados


Objeto - Exemplo
 View (JSP)
<s:form action="/login" method="post">
<s:textfield name="user.name" label="Usuario"></s:textfield>
<
<s:passwordd name="user.password"
" d" l b l "S h "></
label="Senha"></s:password> d>
<s:submit value="Login"></s:submit>
</s:form> public class User {
 Action private String name;
class LoginAction private String password;
extends ActionSupport{ public String
private User user; getXXX(){return xxx;
public User getUser(){ }
return user; public void
setXXX(String xxx){
}
this.xxx = xxx;
public void setUser(User user){
}
this.user = user;
}
}
Programação para Internet 240
} Flávio de Oliveira Silva, M.Sc.
Action - Transferência de Dados
Interface ModelDriven
 Interceptor "params", presente da "defaulStack" é responsável por
associar realizar um setXXX e um getXXX para a um objeto
 Além disso é utilizado outro interceptor "modelDriven" também presente
na "defaultStack"
 Neste caso a Action
 Precisa implementar a interface ModelDriven
 public Object getModel()
 Criar uma instância do objeto que representa o MODEL
 Valores informados no request são associados ao objeto e e obtidos no
request para exibição na VIEW
 Associação é feita pelo nome da propriedade do objeto não sendo
necessário referenciar mais de um nível na VIEW (objeto.propriedade)

Programação para Internet 241


Flávio de Oliveira Silva, M.Sc.

Action - Transferência de Dados


Interface ModelDriven - Exemplo
 View (JSP)
<s:form action="/login" method="post">
<s:textfield name="name" label="Usuario"></s:textfield>
< d name="password"
<s:password " d" l b l "S h "></
label="Senha"></s:password> d>
<s:submit value="Login"></s:submit>
</s:form> public class User {
 Action private String name;
class LoginAction extends private String password;
ActionSupport implements public String
ModelDriven { getXXX(){return xxx;
private User user = new User(); }
public Object getModel() { public void
return user; setXXX(String xxx){
} this.xxx = xxx;
... }
} }
Programação para Internet 242
Flávio de Oliveira Silva, M.Sc.
Struts 2
Validação - Conceito
 No Struts 2 o processo de validação foi fatorado e extraído da lógica de
execução da ação
 Isto é feito através dos Interceptors e de interfaces
 No geral um Interceptor, que é executado a cada par request/response
invoca métodos que são expostos pela ação.
 Estes métodos são definidos pelas interfaces, que neste caso são
implementadas pela ação
 A classe ActionSuport Possui implementação para o seguinte método de
validação
 public void validate()
 O interceptor padrão que é utilizado para validação chama-se:
DefaultWorkflowInterceptor
 Este interceptor é parte da pilha "defaultStack"
 Ambos estão definidos no arquivo struts-default.xml

Programação para Internet 243


Flávio de Oliveira Silva, M.Sc.

Struts 2
Validação – struts-default.xml
 No arquivo struts-default.xml o seguinte interceptor é definido
<interceptor name="workflow"
class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
 Além disso a seguinte pilha de interceptors também é definida
<interceptor-stack name="defaultStack">
...
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*
</param>
</interceptor-ref>
...
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse
</param>
</interceptor-ref>
</interceptor-stack>
Programação para Internet 244
Flávio de Oliveira Silva, M.Sc.
Struts 2
Validação – struts-default.xml
 A pilha de interceptors default é definida da seguinte forma:
 <default-interceptor-ref name="defaultStack"/>
 Desta forma, quando uma ação é invocada, de maneira padrão ocorre as
i t operações:
seguintes õ
 Interceptor "params", é responsável por transferir os parâmetros enviados no
request para a ação. Transferência pode ser feita através de métodos setXXX
existentes na ação
 Em um momento posterior interceptor "workflow" é invocado e o mesmo
chama o método validate() existente na ação
 Método possui uma implementação padrão na classe ActionSupport
 Este método é sobrecarregado na ação a fim de validar de forma específica os
dados
 Em caso de erro o método informará o erro ocorrido
 Caso ocorra algum erro durante a validação o interceptor "workflow" fará uma
alteração no fluxo do pedido enviando a requisição de volta para o formulário
de entrada de dados

Programação para Internet 245


Flávio de Oliveira Silva, M.Sc.

Validação - Action
public class LoginAction extends ActionSupport {
...
@Override
public void validate() {
if ( getNewUser().getPassword().length() == 0 ){
addFieldError("password", "Password is required.");
}
if ( getNewUser().getName().length() == 0 ){
addFieldError( "name", "Username is required." );
}
}}
 Definição da Ação Struts.xml – Necessário incluir o result "input"
</action>
<action name="login" class="br.course.contacts.web.LoginAction">
<result name="error">/errorContacts.jsp</result>
<result name="input">/index.jsp</result>
</action> Programação para Internet 246
Flávio de Oliveira Silva, M.Sc.
Validação – Action
Utilizando Resource Bundle
public class LoginAction extends ActionSupport {
...
@Override
public void validate() {
if ( getNewUser().getPassword().length() == 0 ){
addFieldError("password", getText("password.empty"));
}
if ( getNewUser().getName().length() == 0 ){
addFieldError( "name", getText("name.empty"));
}
}
}
 Necessário arquivo NomeClasseAcao.properties (LoginAction.properties)
password.empty = Password is required.
name.empty=Username is required.

Programação para Internet 247


Flávio de Oliveira Silva, M.Sc.

Struts 2
Interceptors
 Struts 2 contém uma série de interceptadores padrão já configurados
 A configuração padrão está configurada na basicStack

Programação para Internet 248


Flávio de Oliveira Silva, M.Sc.
Struts 2
Interceptors - basicStack
 Define um conjunto de interceptadores, executados na
seguinte ordem:
1. exception 10. fileUpload
2. alias 11. checkbox
3. servletConfig 12. multiselect
4. i18n 13. staticParams
5. prepare 14. actionMappingParams
6. chain 15. params
7. debugging 16. conversionError
8.
8 scopedModelDriven 17.
17 validation
9. modelDriven 18. workflow

Programação para Internet 249


Flávio de Oliveira Silva, M.Sc.

Struts 2
Interceptors
 Exception
 O primeiro a ser invocado no request e o último a ser invocado
durante o response
 Permite capturar exceções e mapeá-las para páginas de erro
previamente definidas
 Possível configurar mapeamentos Exceção x Resultado na
configuração
<global-results>
<result name="error">/Error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception"
result="error"/>
</global-exception-mappings>

Programação para Internet 250


Flávio de Oliveira Silva, M.Sc.
Struts 2
Interceptors - servletConfig
 Permite a injeção de vários objetos relacionados com a API Servlets
dentro das ações
 Utiliza métodos setters que são expostos por interfaces que devem ser
implementadas pela ação
 ServletContextAware - ServletContext
 ServletRequestAware - HttpServletRequest
 ServletResponseAware - HttpServletResponse
 ParameterAware – Mapa com os parâmetros do request
 RequestAware – Mapa com os atributos do request
 SessionAware – Mapa com os atributos da sessão
 ApplicationAware – Mapa com propriedade no escopo da aplicação
 PrincipalAware – Representa uma entidade (principal) autenticada
 Cada uma das interfaces contém um método setter que injeta o objeto na
ação

Programação para Internet 251


Flávio de Oliveira Silva, M.Sc.

Struts 2
Interceptors ServletConfig
 Armazenamento de objetos na sessão pode ser feito com a interface
SessionAware em conjunto com o intercetor servletConfig
 Ação deve implementar interface SessionAware
bli class
public l L i extends
Login t d A ti S
ActionSupportt
implements SessionAware {
//...
private Map session;
public void setSession(Map session) {
this.session = session;
}
}
 Interceptor é responsável por invocar o método setSession e então
passar o mapa de objetos para a ação
 Alterações no objeto são refletidas na sessão pois o objeto é uma
referência para a mesma
Programação para Internet 252
Flávio de Oliveira Silva, M.Sc.
Struts 2
Interceptors - Mapeamento
 Mapeamento em uma Ação
<action name="Action" class="org.comp.actions.MyAction">
<interceptor-ref name="timer"/>
<interceptor-ref
<interceptor ref name="logger"/>
name logger />
<result>Success.jsp</result>
</action>
 Apenas os dois interceptadores serão chamados
 Mapamento em uma Ação utilizando uma pilha já definida
<action name="Action" class="org.comp.actions.MyAction">
<interceptor-ref name="timer"/>
<interceptor-ref name="logger"/>
<interceptor-ref name="defaultStack"/>
<result>Success.jsp</result>
</action>
 Inicialmente os interceptores serão invocados e depois a pilha defaultStack

Programação para Internet 253


Flávio de Oliveira Silva, M.Sc.

Struts2
Integração com Hibernate
 Existem várias estratégias para integração do Hibernate com o Strutus
 No geral o problema reside em como obter uma sessão (Session) do
Hibernate
 Algumas Estratégias
 Extender o FilterDispatcher para que crie a sessão com o Hibernate
 Utilizar Spring para criação dos objetos
 Obter a sessão na classe responsável pelo DAO
 O método mais simples é obter a sessão dentro da classe DAO
 Classe que contém uma única instância da SessionFactory e é responsável
por devolver a sessão
 Classe HibernateSessionFactory
 DAO
 Será criado utilizando objetos do Hibernate
 Utilizará a classe HibernateSessionFactory
 Action
 Conterá uma instância da classe DAO baseada no Hibernate
Programação para Internet 254
Flávio de Oliveira Silva, M.Sc.
Hibernate Session Factory
package br.ufu.facom.model.util;
import org.hibernate.cfg.Configuration;
import org.hibernate.SessionFactory;
import
p org.hibernate.Session;
g
public class HibernateSessionFactory{
private static final SessionFactory sessionFac = buildSessionFactory();
private static SessionFactory buildSessionFactory()
try {
sessionFac = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) {
System.err.println("Failed to create SessionFactory. " + ex);
throw new Exception(ex);
}
}
public static Session getSession() {
return sessionFac.openSession();
}
}
Programação para Internet 255
Flávio de Oliveira Silva, M.Sc.

DAO basedo no Hibernate


import org.hibernate.HibernateException;
import org.hibernate.Session;
public class UserDAO {
public User findByEmail(User
p y user) throws DAOException
p {
User userRegistered = null;
Session sesson = null;
Session session = HibernateUtil.getSession();
if (session == null) {
throw new DAOException("UserDAO: Session Not Found");
}
try {
//hibernate code

} catch (HibernateException ex) {


throw new DAOException(ex.getMessage());
} finally { }
return userRegistered;
}
} Programação para Internet 256
Flávio de Oliveira Silva, M.Sc.
Action Incluindo o DAO
class LoginAction extends ActionSupport implements
ModelDriven {
private User user = new User();
()
private userDao = new UserDAO();
public Object getModel() {
return user;
}
...
}

Programação para Internet 257


Flávio de Oliveira Silva, M.Sc.

ActionContextCleanUp
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</filter mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Programação para Internet 258


Flávio de Oliveira Silva, M.Sc.

Você também pode gostar