-
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
Sumrio1. Struts
2...................................................................................................................................3
Caractersticas do Struts
2.....................................................................................................3Projeto
Simplificado...........................................................................................................3Classes
de Aes
Simplificadas........................................................................................3No
existem mais os
ActionForms....................................................................................3Padres
inteligentes..........................................................................................................3Melhores
caractersticas das
Tag......................................................................................4Novos
Detalhes..................................................................................................................4
Criando um Hello World em Struts
2.....................................................................................4Criao
de estrutura de diretrios para o
projeto..............................................................4
2.
Configuraes........................................................................................................................5Arquivo
web.xml.....................................................................................................................5Arquivo
struts.xml...................................................................................................................6Arquivo
struts-config.xml:.......................................................................................................7Arquivo
struts.properties........................................................................................................8
3.
Actions....................................................................................................................................9Camada
Action.......................................................................................................................9Camada
Viso......................................................................................................................10
4.
Templates.............................................................................................................................125.
Ajax com
Struts....................................................................................................................14
Implementao de Janela de Login com o Ajax
(DOJO).....................................................146.
Validao e
Converso........................................................................................................17
Validao..............................................................................................................................17Converso............................................................................................................................20
7. Struts e
Spring......................................................................................................................258.
Formulrio
Master/Detail......................................................................................................28
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 2
de 31
-
Curso Struts 2
1. Struts 2Um 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 SimplificadoProgramao 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 SimplificadasAs 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 ActionFormsA 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 inteligentesOs 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.
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 3
de 31
-
Curso Struts 2
Melhores caractersticas das TagAgora 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 DetalhesUtilizao 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 2Vamos 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 projetoRealizar 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:
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 4
de 31
-
Curso Struts 2
2. ConfiguraesA 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.xmlO 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:
Struts 2
index.jsp
struts2 org.apache.struts2.dispatcher.FilterDispatcher
struts2 /*
Para mapear o filtro do Struts 2, usamos /*, e no /*.action o
que significa que todas as urls sero analisadas pelo filtro do
Struts.
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 5
de 31
-
Curso Struts 2
Arquivo struts.xmlO 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 = falseE 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:
/HelloWorld.jsp
A primeira coisa a notar o elemento DOCTYPE. Todo o arquivo XML
necessita ter um elemento doctype correto, conforme mostrado no
cdigo. a tag raiz, no qual podemos declarar diferentes pacotes
usando a tag , 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 possui os seguintes atributos:
Atributo Descrioname (obrigatrio) O identificador exclusivo para
o pacoteextends Nome do pacote herdado. Por padro, usamos
struts-default, como o
pacote baseabstract Se marcado como true, o pacote no est
disponvel para o usurio
finalnamespace Nome nico para as aes
A tag 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
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 6
de 31
-
Curso Struts 2
mensagens de depurao no arquivo de log.Definimos as tags
correspondete a cada URL que desejamos acessar e definimos uma
classe com mtodo execute() que acessado ao acessarmos a URL
correspondente.A tag 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 import-los da seguinte forma:
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 Descriostruts-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
struts-config.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:
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 7
de 31
-
Curso Struts 2
Arquivo struts.propertiesEste 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 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 padresstruts.devMode = true###
Permite a releitura dos arquivos de
internacionalizaostruts.i18n.reload = true### Permite a releitura
dos arquivos de configurao XMLstruts.configuration.xml.reload =
true### Define a porta que o servidor executadostruts.url.http.port
= 8080A linha iniciada com com o caracter #, ser assumida como um
comentrio e ignorada pelo Struts 2.
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 8
de 31
-
Curso Struts 2
3. ActionsActions 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 ActionO 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:
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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:
/HelloWorld.jsp /AccessDenied.jsp
Camada VisoCriamos 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:
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 10
de 31
-
Curso Struts 2
Hello World Ol Mundo,
Este outro arquivo ser chamado pelo framework no caso que o
resultado da Action seja ERROR. A seguir o contedo de
AccessDenied.jsp:
Acesso Bloqueado Voc no est autorizado a ver esta pgina.
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.
Hello World Hello World com Struts 2 Por favor entre com seu
nome
No existe qualquer mudana necessria no arquivo web.xml. Execute
o aplicativo atravs do endereo
http://localhost:8080/struts2tutorial.
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 11
de 31
-
Curso Struts 2
4. TemplatesTemplates 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 possua uma tag ,
conforme a seguinte codificao:Nome
Embora possamos escrever uma tag para cada tag manualmente para
conseguir essa boa prtica, podemos especificar uma Template para
renderizar as tags 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:${parameters.label?html}
O arquivo de incluso est apontando para um modelo bare-bones
disponibilizado com o Struts que torna um simples com todos seus
atributos. Tudo o que estamos fazendo no cdigo adicional uma
verificao da existncia de um id sendo passado atravs da tag e
mostr-lo em uma tag 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:
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 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 e 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:
Alternativamente, podemos definir o atributo struts.ui.theme
para simple no arquivo struts.properties. Tambm podemos definir o
atributo template de cada controle para
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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 , necessrio
escrever classes CSS chamadas wwgrp e wwlbl para controlar a exibio
das tags e .
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 13
de 31
-
Curso Struts 2
5. Ajax com StrutsDesenvolvedores 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:
/pages/ajaxlogin.jsp
/pages/ajaxlogin.jsp /pages/ajaxlogin.jsp
/pages/ajaxloginsuccess.jsp
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 que cria uma rea de contedo para carregar o
contedo utilizando tags do Ajax. Aqui tambm usamos a tag para
atualizar o(s) elemento(s) ou que apresente uma mensagem de
ajuda.Sempre que ocorre um erro as tags e exibem uma mensagem no
formulrio de login.Pgina: ajaxlogin.jsp
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 14
de 31
-
Curso Struts 2
Entrada no Sistema
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.javapackage 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;
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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
Login com Sucesso Login realizado com sucesso ! Bem Vindo
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 16
de 31
-
Curso Struts 2
6. Validao e ConversoUm 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.
ValidaoNeste 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 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 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 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 idntica a tag excepto que o
valor de entrada mascarado. A tag usada para criar um boto de
submisso (envio do formulrio).Pgina: login.jsp
Pgina Login
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.
/login.jsp /success.jsp
Aqui o nosso pacote "padro" estende o pacote "struts-default".
Ao estender o "struts-
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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 "". 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:
dojo\..*,^struts\..* input,back,cancel,browse
input,back,cancel,browse
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() {
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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 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"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
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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.
ConversoConverso 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.PontoConverterUm 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
Formulrio de Submisso @import url(css/main.css); .errorMessage {
color:green; }
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 20
de 31
-
Curso Struts 2
Entre com os Dados
Pgina: Show.jsp
Formulrio de Submisso
Dados Inseridos Nmero: Nome: Valor: Data:
Classe de Ao: TypeConversionExample.javapackage x25.com;
import java.util.Date;import
com.opensymphony.xwork2.ActionSupport;
public class TypeConversionExample extends ActionSupport{
private String name; private int rollNo; private double amount;
private Date submissionDate; private String
datePattern="yyyy-mm-dd"; public String getDatePattern() {
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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.propertiessubmissionDate=x25.com.converter.DateConverterClazamount=x25.com.converter.CurrencyConverterClazPodemos
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.propertiesinvalid.fieldvalue.amount=Favor
entrar com o valor corretoinvalid.fieldvalue.submissionDate=Favor
entrar com a da no formato yyyy-mm-ddAgora vamos codificar as
classes que convertem os tipos.
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 22
de 31
-
Curso Struts 2
Classe de Converso: DataConverterClaz.javapackage
x25.com.converter;
import java.text.DateFormat;import
java.text.ParseException;import java.text.SimpleDateFormat;import
java.util.Date;import java.util.Map;import
ognl.DefaultTypeConverter;import
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.javapackage
x25.com.converter;
import java.lang.reflect.Member;import
java.text.DecimalFormat;import java.text.NumberFormat;import
java.util.Map;import
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);
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 23
de 31
-
Curso Struts 2
if (char2 == character) { stringBuilder.append(convert); } else
{ stringBuilder.append(char2); } } return stringBuilder.toString();
}
@Override public Object convertValue(Map 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
/jsp/Submit.jsp /jsp/Submit.jsp /jsp/Show.jsp
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 24
de 31
-
Curso Struts 2
7. Struts e SpringNo 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
Struts2Example14 struts2
org.apache.struts2.dispatcher.ng.filter.
StrutsPrepareAndExecuteFilter
org.springframework.web.context.ContextLoaderListener struts2 /*
index.jsp
Por padro o arquivo applicationContext.xml ser utilizado para
fazer a configurao do bean Spring.Arquivo de Configurao:
applicationContext.xml
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 25
de 31
-
Curso Struts 2
Registramos a classe HelloWorld e injetamos a mensagem "Ol
Mundo!" para o atributo message usando o mtodo de injeo.Arquivo de
Propriedade: struts.xml
/success.jsp
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.javapackage 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
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
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 26
de 31
-
Curso Struts 2
commons-io-1.3.2commons-logging-1.1freemarker-2.3.13junit-3.8.1ognl-2.6.11struts2-convention-plugin-2.1.6struts2-core-2.1.6xwork-2.1.2struts2-spring-plugin-2.1.6antlr-runtime-3.0org.springframework.asm-3.0.0.M3org.springframework.beans-3.0.0.M3org.springframework.context-3.0.0.M3org.springframework.core-3.0.0.M3org.springframework.expression-3.0.0.M3org.springframework.web-3.0.0.M3org.springframework.web.servlet-3.0.0.M3
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 27
de 31
-
Curso Struts 2
8. Formulrio Master/DetailEste 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
Struts Blank struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2 /* index.html
Pgina: index.html
Lendo...
Arquivo de Configurao: struts.xml
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 28
de 31
-
Curso Struts 2
/listProcess.jsp /viewDetailProcess.jsp
Bean de Ao: SetListAction.javapackage x25.com;
import com.opensymphony.xwork2.ActionContext;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
com.opensymphony.xwork2.ActionSupport;import java.util.*;import
javax.servlet.http.HttpSession;import
org.apache.struts2.ServletActionContext;import
org.apache.struts2.interceptor.ServletRequestAware;import
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){
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 29
de 31
-
Curso Struts 2
this.response = response; } public HttpServletResponse
getServletResponse(){ return response; }}Pgina: listProcess.jsp
Iterator Valor do Item: Detalhes
Bean de Ao: ViewDetailAction.javapackage x25.com;
import javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
com.opensymphony.xwork2.ActionSupport;import
javax.servlet.http.HttpSession;import
org.apache.struts2.interceptor.ServletRequestAware;import
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 {
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 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
Detalhes
SGAS 910, B loco D, sa las, 237 a 243, Mix Park Sul Asa Sul ,
Bras l ia /DFCEP: 70.390-100 Fone/Fax: (61) 3244-2510 3242-4339 31
de 31
1. Struts 2Caractersticas do Struts 2Projeto SimplificadoClasses
de Aes SimplificadasNo existem mais os ActionFormsPadres
inteligentesMelhores caractersticas das TagNovos Detalhes
Criando um Hello World em Struts 2Criao de estrutura de
diretrios para o projeto
2. ConfiguraesArquivo web.xmlArquivo struts.xmlArquivo
struts-config.xml:Arquivo struts.properties
3. ActionsCamada ActionCamada Viso
4. Templates5. Ajax com StrutsImplementao de Janela de Login com
o Ajax (DOJO)
6. Validao e ConversoValidaoConverso
7. Struts e Spring8. Formulrio Master/Detail