Title: Struts
1Struts Introdução Rápida
- Jobson Ronan jrjs_at_cin.ufpe.br
2O que é?
- Um framework para facilitar a implementação de
uma arquitetura MVC em aplicações web - Oferece
- Um servlet controlador configurável (Front
Controller) através de arquivos XML externos, que
despacham requisições a classe Action (Command)
implementados pelo desenvolvedor - Uma vasta coleção de taglibs JSP
- Classes ajudantes que oferecem suporte a
tratamento de XML, preenchimento de JavaBeans,
validação de formulários e gerenciamento externo
de conteúdo
3Componentes
- Model (M)
- Geralmente um objeto java (JavaBean)
- View (V)
- Geralmente uma página HTML ou JSP. Embora o
Struts seja independente da camada de
apresentação (ex. velstruts) - Controller (C)
- org.apache.struts.action.ActionServlet ou
subclasse
4Componentes
- Classes ajudantes
- FromBean Encapsula dados de um formulário HTML
(M) - ActionError(s) Encapsula dados de Erros (M)
(deprecated 1.2) - ActionMessage(s) Encapsula dados de Mensagens
(M) - Custon tags Encapsulam lógica de apresentação
(V) - Actions implementam lógica comandos (C)
- ActionForward Encapsulam lógica de
redirecionamento (C)
5Como funciona?
- Componentes-chave
- ActionServlet despachante de ações
- Action classe estendida por cada ação (comando)
a ser implementada (Command pattern) - struts-config.xml arquivo onde se definem
mapeamentos entre ações, páginas, beans e dados
Form Bean
JSP
Action Servlet
Action
delega
http
Dados, Dao ou Session Facade
lê
despacha
Bean
prenche
6Como usar?
- struts-blank.war
- Um template básico para um aplicação web já
configurada para usar o struts - web.xml
ltservletgt ltservlet-namegtactionlt/servlet-namegt
ltservlet-classgtorg.apache.struts.action.Actio
nServletlt/servlet-classgt ltinit-paramgt
ltparam-namegtconfiglt/param-namegt
ltparam-valuegt/WEB-INF/struts-config.xmllt/param-val
uegt lt/init-paramgt ... lt/servletgt
7Como usar?
... lt!-- Standard Action Servlet Mapping --gt
ltservlet-mappinggt ltservlet-namegtactionlt/servl
et-namegt lturl-patterngt.dolt/url-patterngt
lt/servlet-mappinggt ... lt!-- Struts Tag
Library Descriptors --gt lttaglibgt
lttaglib-urigt/tags/struts-beanlt/taglib-urigt
lttaglib-locationgt/WEB-INF/struts-bean.tldlt/taglib-
locationgt lt/taglibgt lttaglibgt
lttaglib-urigt/tags/struts-htmllt/taglib-urigt
lttaglib-locationgt/WEB-INF/struts-html.tldlt/taglib-
locationgt lt/taglibgt ...
8Como usar?
lt?xml version"1.0" encoding"ISO-8859-1"
?gt lt!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts
Configuration 1.2//EN"
"http//jakarta.apache.org/struts/dtds/struts-conf
ig_1_2.dtd"gt ltstruts-configgt lt!--
Form Bean Definitions --gt ltform-beansgt
lt/form-beansgt lt!--
Global Exception Definitions --gt
ltglobal-exceptionsgt lt/global-exceptionsgt lt!--
Global
Forward Definitions --gt ltglobal-forwardsgt
ltforward name"welcome" path"/Welcome.do"/gt
lt/global-forwardsgt
9Como usar?
- struts-config.xml (cont.)
... lt!--
Action Mapping Definitions --gt
ltaction-mappingsgt ltaction path"/Welcome
forward"/pages/Welcome.jsp"/gt
lt/action-mappingsgt lt!--
Controller Configuration --gt
ltcontroller processorClass"org.apache.
struts.tiles.TilesRequestProcessor"/gt lt!--
Message
Resources Definitions --gt ltmessage-resources
parameter"MessageResources" /gt ...
10Entendendo...
lt_at_ taglib uri"/tags/struts-logic"
prefix"logic" gt ltlogicredirect
forward"welcome"/gt
11Actions
- Implementando a ação cadastrar novo filme
package pec //imports public class
CadastrarFilmeAction extends Action public
ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest
request, HttpServletResponse
response) throws Exception
//código de efetuar cadastro...
return mapping.findForward("sucesso")
12Actions
lt!--
Action Mapping Definitions --gt
ltaction-mappingsgt ltaction path"/Welcome
forward"/pages/Welcome.jsp"/gt ltaction
path"/cadastrarFilme"
type"pec.CadastrarFilmeAction"/gt
ltforward name"sucesso" path"pages/cadastroS
ucesso.jsp"/gt lt/action-mappingsgt ...
13ActionForm
- Nossa ação precisa de um formulário
- Java bean comum
- As propriedades do bean são populadas de forma
transparente
public class CadastroFilmeForm extends ActionForm
private String idRef private
String nomeOriginal private String
nomeNacional private String numeroCopias
//gets e sets
14ActionForm
- ActionFroms podem ser validados
package pec public class CadastroFilmeForm
extends ActionForm //... public
ActionErrors validate(ActionMapping
mapping, HttpServletRequest response)
ActionErrors validatorErros new
ActionErrors() if (idRef null
idRef.trim().equals(""))
validatorErros.add("idRef", new
ActionMessage( "filme.cadastro.idRef.required"
)) if (nomeOriginal null
nomeOriginal.trim().equals(""))
validatorErros.add("nomeOriginal", new
ActionMessage( "filme.cadastro.nomeOriginal.req
uired")) if (numCopias null
numCopias.trim().equals(""))
validatorErros.add("numCopias", new
ActionMessage( "filme.cadastro.numCopias.requir
ed")) else if (!GenericValidator.isInt(nu
mCopias)) validatorErros.add("numCopia
s", new ActionMessage( "filme.cadastro.numCopia
s.notInt")) return validatorErros
Commons validator
15ActionForm
Formulário (HTML/JSP)
Request recebido pelo controler
Cria ou recicla um ActionForm
Chama reset()
Formulário (HTML/JSP)
Guarda o ActionForm no escopo desejado
Popula ActionForm a partir do request
Com menssagens de erro!
Dá um forward para o input
Chama validate() do ActionForm
Validação falha
Página Sucesso (HTML/JSP)
Validação ok
Chama execute() do Action
Dá um forward para sucesso
16ActionForm
- ActionForm são firewalls dos Actions
- O ActionForms só chegam aos actions caso tenham
sido validados - Cuidado com a definição dos tipos
- Se o usuário digita um valor, torne esta
propriedade uma String
17ActionForm
- Declarando (struts-config.xml)
... ltform-beansgt ltform-bean
name"cadastroFilmeForm" type"pec.CadastrarFilmeF
orm"/gt lt/form-beansgt ... ltaction-mappingsgt ...
ltaction path"/cadastrarFilme"
type"pec.CadastrarFilmeAction"
name"cadastroFilmeForm" input"/cadastrarNo
voFilme.jsp"gt ltforward
name"sucesso" path"/pages/cadastroFilmeSuc.jsp"
/gt lt/actiongt ...
18ActionForm
package pec //imports public class
CadastrarFilmeAction extends Action public
ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest
request, HttpServletResponse
response) throws Exception
CadastroFilmeForm cadastroForm
(CadastroFilmeForm) form //código de
efetuar cadastro... return
mapping.findForward("sucesso")
19ActionForm
lt_at_ taglib uri"/tags/struts-html"
prefix"html"gt lt_at_ taglib uri"/tags/struts-bean"
prefix"bean"gt lthtmlhtml locale"true"gt ltheadgt
lttitlegtCadastrar Filmelt/titlegt lt/headgt ltbodygt lth1gt
Cadastrar Filmelt/h1gt lthtmlerrors
/gt lttablegt lthtmlform action"cadastrarFilme"gt lttr
gt lttdgtltbeanmessage key"filme.cadastro.idRef"
/gtlt/tdgt lttdgtlthtmltext property"idRef"
/gtlt/tdgt lt/trgt lttdgtltbeanmessage
key"filme.cadastro.nomeOriginal"
/gtlt/tdgt lttdgtlthtmltext property"nomeOriginal"
/gtlt/tdgt lttrgt lttdgtltbeanmessage key"filme.cadastro
.nomeNacional" /gtlt/tdgt lttdgtlthtmltext
property"nomeNacional" /gtlt/tdgt lt/trgt ...
20ActionForm
- cadastrarNovoFilme.jsp (cont)
... lttrgt lttdgtltbeanmessage key"filme.cadastro.num
Copias" /gtlt/tdgt lttdgtlthtmltext
property"numCopias" /gtlt/tdgt lt/trgt lttrgt lttd
colspan"2"gt lthtmlsubmit value"Cadastrar"/gt lthtm
lcancel value"Cancelar"/gt lt/tdgt lt/trgt lt/htmlfor
mgt lt/tablegt lt/bodygt lt/htmlhtmlgt
21ActionForm
- MessageResources.properties
-- cadastro filme success -- filme.cadastro.titl
eFilme Cadastrado filme.cadastro.headingSucesso!
filme.cadastro.messageFilme Cadastrado com
sucesso! -- cadastro filme form
-- filme.cadastro.idRefId Ref filme.cadastro.nome
OriginalNome Original filme.cadastro.nomeNacional
NomeNacional filme.cadastro.numCopiasNúmero de
Cópias filme.cadastro.idRef.requiredId Ref
Requerido filme.cadastro.nomeOriginal.requiredNom
e Original Requerido filme.cadastro.numCopias.requ
iredNúmero de Cópias Requerido filme.cadastro.num
Copias.notIntNúmero de Cópias inválido
22ActionForm
- ActionForm também podem ser usados para fornecer
dados
... ltform-beansgt ltform-bean name"filmeForm"
type"pec.FilmeForm"/gt lt/form-beansgt ...
ltaction-mappingsgt ... ltaction
path"/verDadosFilme" type"pec.VerDadosFilm
eAction" name"filmeForm"
scope"request" validate"false"gt
ltforward name"sucesso" path"/pages/filmeFor
m.jsp" /gt lt/actiongt ...
23ActionForm
- Problemas
- Muitos objetos de domÃnio duplicados
- Muito código de cópia de propriedades
- Usar BeanUtils.copyProperties(Object dest, Object
src) - Grande quantidade de Froms com grandes
quantidades de propriedades pode ser difÃcil de
manter - Usar DynaActionForm?
24Exceções
- Struts dá suporte a um tratamento de exceções
declarativo - Suponha que o código de negócio de
VerDadosFilmeAction lance a exceção
pec.FilmeNaoEncontradoException
ltaction path"/verDadosFilme"
type"pec.VerDadosFilmeAction"
name"filmeForm" scope"request"
validate"false"gt ltforward
name"sucesso" path"/pages/filmeForm.jsp" /gt
ltexception key"filmeNaoEncontrado.exception"
type"pec.FilmeNaoEncontradoExcept
ion" path"/pages/exception.jsp"
/gt lt/actiongt ...
25O que mais?
- Outros tipos de actions
- DispatchAction quando tempos um formulário que
terá mais de uma ação associada - Plugins
- Struts-Validator
- Struts-Tiles
26ExercÃcios
- Implementar o ExercÃcio de Mensagens usando Struts