Material (incompleto) das aulas de Struts 2.x ministradas no curso de especialização em Sistemas Orientados a Objetos da Universidade Católica de Brasília.
Explore the UiPath Community and ways you can benefit on your journey to auto...
Struts 2.x
1. Lato Sensu em
Sistemas Orientados a Objetos
Módulo 4.2
Struts 2
Friday, May 22, 2009
2. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
3. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
4
1.
2 x
k
x
or
2.
x
0.
.2
1.
W
s
2.
ts
t
ts
eb
k
W u
ru
or
ru
bW
r
W
St
St
St
e
2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
Friday, May 22, 2009
4. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
5. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts 2
objetivo
simplificar o
desenvolvimento
web
Friday, May 22, 2009
6. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts 2
objetivo
Redução do XML
convenção sobre configuração
anotações
Actions são POJOs
melhor testabilidade
bind automático de parâmetros HTTP
Friday, May 22, 2009
7. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts 2
novidades
Interceptadores
pré e pós-processamento
Extensibilidade
plugins
Result Types
JSP, Velocity, Freemarker
Injeção de dependências
Spring, Plexus, PicoContainer
Friday, May 22, 2009
8. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
In a nutshell
Friday, May 22, 2009
9. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
Friday, May 22, 2009
10. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
struts.xml
Friday, May 22, 2009
11. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
ActionTeste.java
Friday, May 22, 2009
12. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
ok.jsp
Friday, May 22, 2009
13. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
14. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
15. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
XML mapeia POJO
comum
Friday, May 22, 2009
16. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
método execute()
obrigatório qdo
nenhuma configuração
é feita no XML
Friday, May 22, 2009
17. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
o retorno do método
execute() revela o
resultado da Action
Friday, May 22, 2009
18. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Action
e
struts.xml
libs
web.xml
*.html
*.jsp
Friday, May 22, 2009
19. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
At a glance
Friday, May 22, 2009
20. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
Friday, May 22, 2009
21. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/
app/
action
?
Friday, May 22, 2009
22. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts 1.x
Friday, May 22, 2009
23. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts 1.x
?
Friday, May 22, 2009
24. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
http://
servidor/ FrontController!
app/
action
Friday, May 22, 2009
25. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
web.xml
<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>
Friday, May 22, 2009
26. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Friday, May 22, 2009
27. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
http://localhost:8080/app/entrar
LoginAction.execute()
Friday, May 22, 2009
28. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
http://localhost:8080/app/entrar
LoginAction.execute()
Friday, May 22, 2009
29. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
http://localhost:8080/app/entrar
LoginAction.execute()
<action name=quot;entrarquot; class=quot;xpto.LoginActionquot;/>
Friday, May 22, 2009
30. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
http://localhost:8080/app/entrar
ControleDeAcessoAction.login()
<action name=quot;entrarquot; method=quot;loginquot; class=quot;xpto.ControleDeAcessoActionquot;/>
Friday, May 22, 2009
31. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
http://localhost:8080/app/entrar
ControleDeAcessoAction.login()
<action name=quot;entrarquot; method=quot;loginquot; class=quot;xpto.ControleDeAcessoActionquot;/>
Friday, May 22, 2009
32. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/acesso_login
ControleDeAcessoAction.login()
Friday, May 22, 2009
33. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/acesso_login
ControleDeAcessoAction.login()
Friday, May 22, 2009
34. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/acesso_login
ControleDeAcessoAction.login()
Friday, May 22, 2009
35. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/acesso_login
ControleDeAcessoAction.login()
<action name=quot;acesso_ *quot; method=quot; {1}quot; class=quot;xpto.ControleDeAcessoActionquot;/>
Friday, May 22, 2009
36. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
37. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
38. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/Usuario/edit
UsuarioAction.edit()
Friday, May 22, 2009
39. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/Usuario/edit
UsuarioAction.edit()
Friday, May 22, 2009
40. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/Usuario/edit
UsuarioAction.edit()
Friday, May 22, 2009
41. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Estratégia de
Mapeamento de Actions
Patterns Matching
http://localhost:8080/app/Usuario/edit
UsuarioAction.edit()
<action name=quot; */*quot; method=quot; {2}quot; class=quot;xpto. {1}Actionquot;/>
Friday, May 22, 2009
42. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Binding
Friday, May 22, 2009
43. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Dados de Requisição
usuario=alegomes
senha=123456
Friday, May 22, 2009
44. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Nada de ActionForms!
bind automático
Friday, May 22, 2009
51. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Testabilidade
Como Actions são POJOS, nenhuma
infra-estrutura mágica é necessária para
implementação de testes unitários.
Friday, May 22, 2009
52. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
53. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Tags
Friday, May 22, 2009
69. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Results
implementação da
Camada View
Resposta da Action
Friday, May 22, 2009
70. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Results
login.jsp menu.jsp
Velocity Freemarker XSTL
Action
Friday, May 22, 2009
71. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Result Types
Velocity Freemarker XSTL
<action name=quot;qqcoisa*quot; method=quot;{1}quot; class=quot;br.ucb.soo.wa.struts2.lab3.QQActionquot;>
<result name=quot;result1quot;>menu.jsp</result>
<result name=quot;result1quot; type=”dispatcher”>some.jsp</result>
<result name=quot;result2quot; type=”freemarker”>login.ftl</result>
<result name=quot;result3quot; type=”velocity”>page.vt</result>
</action>
Friday, May 22, 2009
72. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Result Types
customizados
public interface Result extends Serializable {
public void execute(ActionInvocation invocation)
throws Exception;
}
<result-types>
<result-type name=quot;dispatcherquot;
default=quot;truequot;
class=quot;seu.pacote.SuaClassequot;/>
</result-types>
Friday, May 22, 2009
73. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Dependency Injection
Friday, May 22, 2009
74. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Interceptors
Friday, May 22, 2009
76. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Revisão
Intercepting Filters
Friday, May 22, 2009
77. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Revisão
Intercepting Filters
interceptors action interceptors
Friday, May 22, 2009
78. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Interceptors
pra quê?
Tratamento de exceção
Evitar submit duplo
Upload de arquivo
Ciclo de vida
Validações
http://struts.apache.org/2.1.6/docs/interceptors.html
Friday, May 22, 2009
79. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Interceptors
<package name=quot;defaultquot; extends=quot;struts-defaultquot;>
<interceptors>
<interceptor name=quot;timerquot; class=quot;...quot;/>
<interceptor name=quot;loggerquot; class=quot;...quot;/>
</interceptors>
<action name=quot;loginquot; class=quot;tutorial.Loginquot;>
<interceptor-ref name=quot;timerquot;/>
<interceptor-ref name=quot;loggerquot;/>
<result name=quot;inputquot;>login.jsp</result>
<result name=quot;successquot; type=quot;redirectActionquot;>/secure/home</result>
</action>
</package>
Friday, May 22, 2009
80. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Pacotes de Interceptors
<package name=quot;defaultquot; extends=quot;struts-defaultquot;>
<interceptors>
<interceptor name=quot;timerquot; class=quot;..quot;/>
<interceptor name=quot;loggerquot; class=quot;..quot;/>
<interceptor-stack name=quot;myStackquot;>
<interceptor-ref name=quot;timerquot;/>
<interceptor-ref name=quot;loggerquot;/>
</interceptor-stack>
</interceptors>
<action name=quot;loginquot; class=quot;tutuorial.Loginquot;>
<interceptor-ref name=quot;myStackquot;/>
<result name=quot;inputquot;>login.jsp</result>
<result name=quot;successquot; type=quot;redirectActionquot;>/secure/home</result>
</action>
</package>
Friday, May 22, 2009
82. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Exemplo
<action name=quot;login_*quot; method=quot;{1}quot; class=quot;br.ucb.soo.wa.struts2.lab3.LoginActionquot;>
<interceptor-ref name=quot;loggerquot;/>
<result name=quot;loginOKquot;>menu.jsp</result>
<result name=quot;loginNOKquot;>login.jsp</result>
</action>
May 15, 2009 11:39:22 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Starting execution stack for action //login_autenticar
May 15, 2009 11:39:22 AM com.opensymphony.xwork2.util.logging.commons.CommonsLogger info
INFO: Finishing execution stack for action //login_autenticar
Friday, May 22, 2009
83. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Interceptors
coisas muito mais complexas
podem ser feitas...
Friday, May 22, 2009
84. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Interceptors
coisas muito mais complexas
podem ser feitas...
...e precisam ser testadas!
Friday, May 22, 2009
85. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Testes
Direto na Action
:-/
Friday, May 22, 2009
86. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
87. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
88. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Testes
Action Proxied
:-)
Friday, May 22, 2009
93. // create action context for my action, feed
// into the action context all request parameters
Map requestParameters = new HashMap();
requestParameters.put(quot;param1quot;, quot;param1-valuequot;);
requestParameters.put(quot;param2quot;, quot;param2-valuequot;);
Map actionContext = StrutsTestCaseSupport.getInstance().buildActionContext(
quot;my.hostname.comquot;, quot;getquot;, quot;/myActionNamespace/myActionNamequot;, requestParameters);
// create the proxy for the action, this encapsulates all
// the interception stack up to the real action
ActionProxy proxy = StrutsTestCaseSupport.getInstance().createActionProxy(
quot;myActionNamequot;, quot;myActionNameSpacequot;,actionContext);
// inject parameters as required
// let the full stack run
String result = proxy.execute();
// confirm result
assert result.equals(quot;myTestResponseStringquot;);
// look into mock HttpServletResponse, do whatever
// tests I need to do: returned HTML, returned headers,
// cookies, etc...
String responseXml = ((MockHttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE)).getContentAsString();
assert responseXml.indexOf(quot;successquot;) != -1;
http://fassisrosa.blogspot.com/2006/11/unit-testing-struts-20.html
Friday, May 22, 2009
94. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Struts2
testes
org.apache.struts2.util.StrutsTestCaseHelper
Generic test setup methods to be used with any unit testing framework.
com.opensymphony.xwork2.TestNGXWorkTestCase
Base test class for TestNG unit tests. Provides common XWork variables and
performs XWork setup and teardown processes
com.opensymphony.xwork2.XWorkTestCase
Base JUnit TestCase to extend for XWork specific JUnit tests. Uses the generic
test setup for logic.
com.opensymphony.xwork2.util.XWorkTestCaseHelper
Generic test setup methods to be used with any unit testing framework.
Friday, May 22, 2009
95. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Include
Mecanismo para modularização
das configurações.
Friday, May 22, 2009
96. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Include
<struts>
<include file=quot;billing-config.xmlquot; />
<include file=quot;admin-config.xmlquot; />
<include file=quot;reports-config.xmlquot; />
...
</struts>
struts-default.xml e struts-plugin.xml são incluídos
implicitamente em todo struts.xml
Friday, May 22, 2009
97. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Packages
Mecanismo para organização lógica e
reaproveitamento de configurações
Friday, May 22, 2009
98. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Packages
<struts>
<package name=quot;exemploquot; extends=quot;struts-defaultquot;>
<action name=quot;login_*quot; method=quot;{1}quot; class=quot;br.ucb.soo.wa.struts2.lab3.LoginActionquot;>
<interceptor-ref name=quot;loggerquot;/>
<result name=quot;loginOKquot;>menu.jsp</result>
<result name=quot;loginNOKquot;>login.jsp</result>
</action>
<action name=quot;logout/*quot; class=quot;br.ucb.soo.wa.struts2.lab3.LogoutActionquot;>
<result>{1}.jsp</result>
</action>
</package>
</struts>
Friday, May 22, 2009
99. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Validators
Verificação declarativa de campos
Friday, May 22, 2009
100. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Bundled Validators
conversion validator
date validator
double validator
email validator
expression validator
fieldexpression validator
int validator
regex validator
required validator
requiredstring validator
stringlength validator
url validator
visitor validator
http://struts.apache.org/2.1.6/docs/validation.html
Friday, May 22, 2009
101. <interceptor name=quot;validationquot;
class=quot;org.apache.struts2.interceptor.validation.AnnotationValidationInterceptorquot;/>
struts.xml
Friday, May 22, 2009
111. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Friday, May 22, 2009
112. Friday, May 22, 2009
http://cwiki.apache.org/confluence/display/WW/Big+Picture
113. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Afinal, por que Struts2?
• Baseado em Actions
• Configurações
- XML e Annotations
• Actions POJO
- alta testabilidade
• Integrável
- Spring, SiteMesh e Tiles
• Opções de View
- JSP, Freemarker, Velocity e XSLT
Friday, May 22, 2009
• Plugável
114. Lato Sensu em Sistemas Orientados a Objetos
Desenvolvimento de Aplicaões Web Avançado - 1°/2009
Labs
“The Bootstap tutorials starts from the very
beginning and steps through creating a
simple application.”
http://struts.apache.org/2.x/docs/bootstrap.html
Friday, May 22, 2009
115. Lato Sensu em
Sistemas Orientados a Objetos
Q&A MSc. Alexandre Gomes
alegomes@gmail.com
Friday, May 22, 2009