Tutorial Struts 2
Tutorial Struts 2
Licena para uso e distribuio Este material est disponvel para uso nocomercial e pode ser derivado e/ou distribudo, desde que utilizando uma licena equivalente.
Atribuio-Uso No-ComercialCompatilhamento pela mesma licena, verso 2.5 http://creativecommons.org/licenses/by-nc-sa/2.5/deed.pt
Voc pode copiar, distribuir, exibir e executar a obra, alm de criar obras derivadas, sob as seguintes condies: (a) voc deve dar crdito ao autor original, da forma especificada pelo autor ou licenciante; (b) voc no pode utilizar esta obra com finalidades comerciais; (c) Se voc alterar, transformar, ou criar outra obra com base nesta, voc somente poder distribuir a obra resultante sob uma licena idntica a esta.
Agosto 2007
Java:
Desenvolvedor Java desde 1999; Especialista em desenvolvimento Web; Coordenador do ESJUG.
Profissional:
Professor substituto no DI / UFES; Engenho de Software Consultoria e Desenvolvimento.
Contato: [email protected]
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Sobre o tutorial Apresentao do Struts2; Passo a passo do uso do framework; Demonstraes; Contedo:
Instalao Configurao bsica Aes Resultados Biblioteca de tags Freemarker Interceptadores Validao de dados
Agosto 2007
Inverso de controle Internacionalizao Enviando arquivos O resultado stream Relatrios JasperReports Aes encadeadas Integrao com SiteMesh Integrao com Spring
1.Procura arquivo /index.html; 2.Arquivo existe OK (200); 3.Monta resposta HTTP com contedo do arquivo. Cabealho
Requisio HTTP
HTTP/1.1 200 OK Cabealho + Contedo Date: Fri, 15 Apr 2005 22:12:30 GMT Server: Apache/1.3.26 [...] www.site.com Last-Modified: Wed, 23 Mar 2005 00:43:22 GMT Content-Length: 11379 Content-Type: text/html [...]
5
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
1. Procura arquivo /index.asp; 2. Interpreta script do arquivo; 3. Arquivo existe e no houve erros OK (200); Cabealho 4. Monta resposta HTTP mesclando contedo esttico e dinmico Requisio HTTP (gerado pelo script).
HTTP/1.1 200 OK Cabealho + Contedo Date: Fri, 15 Apr 2005 22:12:30 GMT Server: Apache/1.3.26 [...] www.site.com Last-Modified: Wed, 23 Mar 2005 00:43:22 GMT Content-Length: 11379 Content-Type: text/html [...]
6
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Container Servlet
web.xml
Navegador
3) Envia uma resposta, que pode ser uma pgina, um redirecionamento, etc.
Servlet Apropriado
Servlets
Agosto 2007
Lgica de Negcio
7
Desenvolvimento de Aplicaes Web com Struts2
} }
9
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Container Servlet
Pginas Web
2) Transforma o JSP num Servlet e delega a requisio
Navegador
3) Envia uma resposta, que pode ser uma pgina, um redirecionamento, etc.
Servlet Transformado
JavaServer Pages
Agosto 2007
Lgica de Negcio
10
Desenvolvimento de Aplicaes Web com Struts2
Menos mapeamento, mais HTML <html> <head> <title>Hello World</title> </head> <body> <%= new java.util.Date() %> </body> </html>
11
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Container Servlet
1) L a configurao.
Navegador
Configurao
Controlador (Servlet) 2) Executa uma ao, que acessa a lgica de negcio.
Model 2 ou MVC
Agosto 2007
Ao Lgica de Negcio
Pginas Web
13
Desenvolvimento de Aplicaes Web com Struts2
Separao de interesses Pginas web (JSP, HTML, etc.) cuidam da parte visual; Servlet central faz o controle mediante configurao; Aes manipulam classes de lgica de negcio (modelo).
14
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Nascem os frameworks MVC O nome correto seria Front Controller; A lgica do MVC altamente generalizvel; Podemos listar mais de 50 frameworks diferentes:
Action Framework, Barracuda, Bento, Bishop, Cameleon, Canyamo, Cassandra, Chiba, Cocoon, Dinamica, Dovetail, Echo, Expresso, Folium, Genie, Helma, Jacquard, Jaffa, Japple, JATO, JBanana, Jeenius, JFormular, JPublish, jStatemachine, Jucas, JWAA, JWarp, jZonic, Macaw, Maverick, Melati, Mentawai, Millstone, MyFaces, Nacho, Niggle, OpenEmcee, OXF, RIFE, Scope, Shocks, Smile, SOFIA, Spring MVC, Struts, Tapestry, TeaServlet, Turbine, Verge, VRaptor, Warfare, WebOnSwing, WebWork, wingS, Xoplon
Fonte: http://www.manageability.org/blog/stuff/how-many-java-web-frameworks
15
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Destaques Struts 1:
Padro de facto, mais antigo e usado no mercado, tambm mais odiado.
VRaptor2:
Projeto brasileiro, uso de anotaes para diminuir a quantidade de configurao XML.
Spring MVC:
Parte do Spring Framework.
WebWork / Struts 2:
Juno dos projetos Struts com WebWork, bastante aceito pela comunidade.
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
16
Orientado a componentes e eventos: abordagem do Swing na Web; Concorrente indireto dos frameworks MVC, por se tratar de uma outra abordagem; JBoss Seam.
17
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Struts2 Framework MVC para Web, juno dos projetos Struts (Apache) e WebWork (Opensymphony); Baseado no XWork2, implementao do padro de projeto Command, independente da Web; Projeto da Apache Software Foundation.
18
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
19
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Funcionalidades Dispatcher (controlador) que recebe e delega requisies; Tipos de resultado, com suporte a diversas tecnologias de viso:
JSP; FreeMarker / Velocity; JasperReports; XML.
Funcionalidades Converso automtica de tipos; Framework de validao automtica; Expression Language OGNL (www.ognl.org); Templates para gerao de componentes; Extensvel por meio de interceptadores; Suporte a internacionalizao (i18n); Suporte a pacotes e espaos de nomes; Fcil integrao com outros frameworks; Em especial, integrao com o Spring.
21
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Container Servlet
1) L a configurao.
Navegador
struts.xml
Filtro Struts2 2) Instancia a ao configurada e executa.
3) Ao retorna um resultado, que verificado na configurao. Pode ser um redirecionamento, um JSP, FreeMarker, JasperReports, etc.
Ao
Struts2
Agosto 2007
Lgica de Negcio
Pginas Web
Desenvolvimento de Aplicaes Web com Struts2
22
Vantagens e desvantagens Torna o desenvolvimento Web muito mais simples, com cdigo mais organizado; Grande comunidade de usurios:
Projeto da Apache; Excelente suporte voluntrio pelo frum.
Bem documentado; Atualizado em relao s tecnologias Web; No implementao de um padro do JCP (ex.: JSF).
23
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Integrao com Spring Framework Spring utilizado como framework de injeo de dependncias; Por causa disso, falaremos um pouco sobre Spring; No entanto, para conhecer bem o Spring necessrio um curso inteiro sobre ele...
24
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 1
25
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
26
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
27
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Preparao da infra-estrutura Servidor Web: Apache Tomcat 5.5; IDE: Eclipse Europa com ferramentas Java EE; Processo:
Instalao de ambas as ferramentas; Configurao de um servidor Tomcat dentro do Eclipse (Preferences / Server / Installed Runtimes); Criao de um Dynamic Web Project; Adio do projeto no servidor dentro do Eclipse; Execuo e depurao dentro da IDE.
28
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
29
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
ivy.xml
<ivy-module version="1.0"> <info organisation="labes-ufes" module="portallabes" /> <dependencies> <dependency org="apache" name="struts2core" rev="2.0" /> </dependencies> </ivy-module>
30
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Alvo no build.xml
<target name="deps"> <echo message="Obtendo dependencias..." /> <ivy:configure url="http://labes.inf.ufes.br/ivyrep/ivyconf.xml" /> <ivy:retrieve /> </target>
31
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 2
32
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Aplicao em branco Pacote Struts2 / apps / struts2-blank: contm a configurao mnima; Utilizaremos nossas prprias configuraes mnimas:
applicationContext: configurao do Spring; web.xml: configurao da WebApp, onde indicaremos o uso do Struts2; log4j.properties; struts.properties; struts.xml.
33
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Raiz do src.
pages
home.jsp
applicationContext.xml web.xml
index.jsp
Agosto 2007
34
Desenvolvimento de Aplicaes Web com Struts2
struts.properties
# Localizao. struts.locale = pt_BR # Modo de desenvolvimento: recarrega # alteraes e reporta erros que poderiam ser # ignorados. struts.devMode = true # Tamanho mximo para upload (10 MB). struts.multipart.maxSize = 10485760 # Configurar o Spring como DI Container. struts.objectFactory = spring
35
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
struts.xml
<!DOCTYPE struts [...]> <struts> <!-- Inclui as configuraes default. --> <include file="struts-default.xml" /> <!-- Define um pacote de classes. --> <package name="default" extends="struts-default"> <!-- Ao padro do pacote. --> <default-action-ref name="home" /> <!-- Definio da ao. --> <action name="home"> <result>/WEB-INF/pages/home.jsp</result> </action> <!-- Adicione suas aes aqui. --> </package> </struts>
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
36
web.xml
<!-- Configurao da WebApp. --> <web-app [...]> <!-- Nome da WebApp. --> <display-name>TutorialStruts</display-name> <!-- Filtros. --> <filter> <filter-name>springFilter</filter-name> <filter-class> org.springframework.web.filter. RequestContextFilter </filter-class> </filter>
37
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
web.xml
<filter> <filter-name>strutsFilter</filter-name> <filter-class> org.apache.struts2.dispatcher .FilterDispatcher </filter-class> </filter> <!-- Mapeamento dos filtros. --> <filter-mapping> <filter-name>springFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
38
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
web.xml
<filter-mapping> <filter-name>strutsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Listeners. --> <listener> <listener-class> org.springframework.web.context .ContextLoaderListener </listener-class> </listener> </web-app>
39
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
index.jsp
<% response.sendRedirect(request .getContextPath() + "/home.action"); %>
40
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Disponibilizar esta informao para a pgina (camada de viso) que ser exibida ao visitante.
41
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Passos para construo de uma ao 1: Criar a classe de ao (se j no existe); 2: Adicionar parmetros de I/O na classe; 3: Implementar o mtodo que responde pelas evocaes da ao; 4: Configura a ao no framework (xwork.xml); 5: Chamar a ao por sua URL.
42
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
43
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
HelloStruts2Action
package net.java.dev.esjug.tutorialstruts2.controller; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; public class HelloStruts2Action extends ActionSupport { private String mensagem = "Hello, Struts2! (" + new Date() + ")"; public String getMensagem() { return mensagem; } }
44
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Configurao no struts.xml
<package name="default" [...]> [...] <action name="helloStruts2" class="net.java. dev.esjug.tutorialstruts2. controller.HelloStruts2Action"> <result>/WEB-INF/pages/hello.jsp</result> </action> </package>
45
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
hello.jsp
<%@ taglib prefix="s" uri="/struts-tags" %> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Tutorial Struts2</title> </head> <body> <h1>Tutorial Struts2</h1> <p><s:property value="mensagem" /></p> </body> </html>
46
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
47
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 3
48
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Ao Unidade bsica de execuo ( o C do MVC); Responde uma requisio determinada em struts.xml; Execuo de uma ao:
1: feita uma requisio pela URL da ao; 2: O framework verifica qual a classe que implementa a ao daquela URL e cria uma instncia dela; 3: O framework verifica qual mtodo implementa a ao e chama-o, aguardando seu resultado; 4: A partir do resultado, o framework verifica o que deve ser feito (geralmente processar uma pgina).
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
49
Viso Controle:
Mtodos setXyz() na classe de ao; Envio de dados por formulrios via POST ou GET (usa interceptadores veremos adiante); H tags para construo do formulrio (v. adiante).
50
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Pilha de Valores (Value Stack) A Value Stack onde o Struts2 coloca os dados da ao; A instncia da classe de ao fica na Value Stack e a tag <s:property /> obtm dados l; Outros objetos, como a requisio e a resposta HTTP, tambm esto disponveis; Referncias para objetos na pilha so escritas em OGNL; Outras tags manipulam esta pilha. No entraremos em detalhes.
51
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Converso automtica Struts2 converte automaticamente de String para o tipo apropriado e vice-versa; Basta declarar a propriedade como do tipo que se quer converter: Long, Float, Double, Boolean, Date, ...; Obedecem configurao de Locale da aplicao (se no for configurado, usa a do SO); possvel implementar seu prprio conversor para tipos especficos.
52
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
public class AcaoCadastroFuncionario { private Funcionario func; public Funcionario getFunc() { ... } } public void setFunc(Funcionario func) { ... }
53
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Mltiplos mtodos de ao Uma classe de ao pode responder por vrias URLs, bastando ter diferentes mtodos de ao:
<action name="acao" class="pacote.ClasseAcao"> <result>pagina1.jsp</result> </action> <action name="acao02" class="pacote.ClasseAcao" method="executePasso02"> <result>pagina2.jsp</result> </action>
Mltiplos mtodos pela URL Uma mesma ao pode ser chamada com mtodos diferentes; Basta colocar !mtodo no meio da URL:
<action name="cadastro" class="pacote.AcaoCad"> <result name="input">form.jsp</result> <result>resultado.jsp</result> </action> <a href="cadastro!input.action">Cadastrar</a>
Struts2 executar o mtodo input() na ao; O mtodo deve ser pblico, sem parmetros e retornar String (assim como execute()).
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
55
Espaos de nome Pacotes podem ter namespaces; Pode haver aes com mesmo nome em espaos de nome diferentes.
<package name="pac1" extends="default" namespace="/pac1"> <action name="acao" class="pacote.ClasseAcao"> <result>pagina.jsp</result> </action> </package>
Demonstrao
Desenvolver uma ao que receba o nome e a data de nascimento de uma pessoa, calcule sua idade e responda: Caro(a) Fulano, voc tem X ano(s).
57
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 4
58
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Resultado Uma ao retorna um resultado (String) que determina (no struts.xml) o que Struts2 deve fazer:
class HelloStruts2Action extends ActionSupport { public String execute() throws Exception { return SUCCESS; } }
success o default
59
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tipos de resultado So classes que implementam aes que o Struts2 realizar; Para criar seu prprio, implemente com.opensymphony.xwork2.Result; Existem vrios tipos prontos; A interface Action j define 5 constantes de resultado: SUCCESS, NONE, ERROR, INPUT e LOGIN.
60
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
struts-default.xml Em nosso struts.xml, importamos o arquivo struts-default.xml; Um dos diversos motivos porque nele se encontram as declaraes dos tipos de resultado pr-definidos pelo Struts2; Podemos us-lo como base para aprender como definir nossos prprios tipos de resultado, se houver necessidade.
62
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Configurao Um resultado pode ser local ou global; O resultado default success; O tipo de resultado default dispatcher.
<!-- Resultado success, tipo dispatcher. --> <result>home.jsp</result> <!-- Resultado error, tipo dispatcher. --> <result name="error">erro.jsp</result> <!-- Resultado logout, tipo redirect. --> <result name="logout" type="redirect"> index.html </result>
63
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Construir um formulrio de login. Se a senha estiver incorreta, retornar para o formulrio. Se estiver OK, verificar o tipo de funcionrio (desenvolvedor, gerente ou diretor) e direcionar para a pgina adequada.
64
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 5
65
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tags JSP Classes que so evocadas por tags especficas na pgina JSP:
Manipulam seus parmetros e contedo; Imprimem o resultado na pgina final.
<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %> <c:if test='${param.p == "someValue"}'> 'p' igual a "someValue". </c:if> <c:else> 'p' no igual a "someValue". </c:else>
66
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
HTML tags:
Exibio de dados nas pginas; Montagem de formulrios HTML; Montagem de outras estruturas HTML.
67
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Templates e temas Componentes HTML so baseados em templates; Conjunto de templates formam um tema; Struts2 vem com quatro temas:
simple: o mais simples possvel, bom para extenso; xhtml: formulrio em tabelas (padro); css_xhtml: reimplementao de xhtml com CSS; ajax: baseado no xhtml, com recursos AJAX.
Transformao
<s:textfield label="Login" name="login" />
struts2-core.jar :: template/xhtml/text.ftl
<tr> <td class="tdLabel"><label for="login.action_login" class="label">Login:</label></td> <td> <input type="text" name="login" value="" id="login.action_login"/> </td> </tr>
70
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Avaliao de expresses Sempre que queremos obter dados da ao e us-los nas tags, colocamos entre %{ }; No exemplo abaixo, getLabelLogin() chamado e seu resultado usado como parmetro label:
<s:textfield label="%{labelLogin}" name="login" />
O nome dos campos do formulrio pode fazer referncia a alguma propriedade da ao;
Neste caso, o campo preenchido com seu valor.
71
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Outras Tags
<s:text />, <s:i18n /> <s:property /> <s:push /> <s:set /> <s:url /> <s:action /> <s:bean /> Internacionalizao (passo 10) Mostra dados vindos da ao (value stack) Coloca valores na value stack Armazena valores em variveis Constri URLs nas codificaes adequadas Chama uma ao de dentro da pgina. Instancia um objeto qualquer.
72
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Outras Tags
<s:include /> <s:if />, <s:elsif>, <s:else> <s:iterator> <s:generator />, <s:append />, <s:subset />, <s:merge />, <s:sort /> Inclui uma outra pgina ou ao Controle de fluxo Itera sobre alguma coleo Outras tags de iterao (criar um iterador, juntar iteradores, ordenar o conjunto, etc.)
73
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
74
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 6
75
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
76
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Template Engine
Modelo de dados Documento Mesclado
cliente
Coleo
itens[]
Cliente
produtosEmPromocao
FreeMarker Template Language (FTL) Texto impresso ipsis-litteris; Interpolaes representam um valor que calculado e impresso - ${ }; Tags FTL (diretivas) so instrues processadas. Seu contedo pode gerar impresso de dados; Comentrios so ignorados.
78
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Exemplo em HTML
<html> <head><title>Produtos</title></head> <body> <#-- Cumprimenta o usurio pelo nome. --> <h1>Ol ${usuario}, seja bem-vindo(a)!</h1> <#-- Lista os produtos. --> <p>Produtos disponveis:</p> <ul> <#list produtos as p> <li>${p.nome} R$ ${p.preco}</li> </#list> </ul> </body> </html>
79
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Regras gerais Case-sensitive; Interpolaes s ocorrem no meio de texto ou em literais string; Tags FTL no podem ser colocadas dentro da definio de outra tag; FreeMarker ignora espao em branco suprfluo (exceto no texto).
80
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Diretivas definidas pelo usurio: <@nomeDiretiva [...] />; Pode ser configurado para no usar o #, apesar de no recomendado.
81
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Condicionais:
<#if c1> ... <#elseif c2> ...<#else> ... </#if>
Loops:
<#list colecao as item> ${item} </#list>
82
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Uso de macros:
<@ola p="Joo" />
83
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Expresses Literais:
Strings: "foo", 'bar', "Usa \"apas\""; Nmeros: 100, -123.45, 0.11; Booleanos: true, false; Sequncias: ["foo", "bar", 123.45], 1..10; Mapas (hash): {"nome": "teclado", "preco": 19.9}.
84
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
85
Clculos aritmticos:
(x * 1.5 + 10) / 2 - y % 100.
86
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Expresses Comparao:
x==y, x!=y, x<y, x>=y, xgty, etc.
Operaes lgicas:
(! registrado) && (efetuandoCompra || enviandoMensagem).
Chamada de mtodo:
repetir("FreeMarker", 3).
87
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Em diretivas:
<#if (x > 10) && (! registrado)> ... </#if>.
88
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Outras funcionalidades switch-case; break; include/import; function; escape; etc. http://www.freemarker.org/docs/index.html http://www.freemarker.org/docs/ref_builtins.html
89
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Integrao com Struts2 Escreva o template em FTL; Use o resultado freemarker; Dados disponveis aos templates:
${req}: HttpServletRequest atual; ${res}: HttpServletResponse atual; ${stack}: a pilha de valores; ${ognl}: instncia de OgnlTool; ${action}: ao que acabou de executar; ${propriedade}: chama getPropriedade().
90
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
91
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
92
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Repetir a demonstrao do passo 03 (clculo da idade), agora utilizando FreeMarker. Utilizaremos FreeMarker daqui em diante no Tutorial.
93
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 7
94
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
O que so interceptadores? Idia semelhante aos padres de projeto Decorator e Chain of Responsibility do GoF; Interceptam uma requisio e podem executar cdigo antes e/ou depois.
I1 I2 . . . In
Requisio Resposta
Ao Struts2
Navegador
95
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
96
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
97
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Iniciar a transao
Cliente
metodoNegocio1()
98
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Anexa erros de converso aos campos dos conversionError formulrios (validao, passo 8). createSession execAndWait
Agosto 2007
Cria uma sesso HTTP automaticamente. Executa uma ao em background e envia o usurio para uma pgina intermediria.
99
Desenvolvimento de Aplicaes Web com Struts2
101
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Configurao Podem ser organizados em pilhas (ordem importante!); Cada ao pode definir seus prprios interceptadores; Pacotes podem definir o default; struts-default.xml:
Interceptors configurados; Vrias pilhas prontas.
102
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Exemplo de configurao
<struts> <include file="struts-default.xml" /> <package name="default" extends="struts-default"> <!-- Define a pilha padro do pacote. --> <default-interceptor-ref name="basicStack" /> <action name="nomeAcao" class="pac.ClasseAcao"> <!-- Define outra pilha para esta ao. --> <interceptor-ref name="defaultStack" /> <result>pagina.jsp</result> </action> </package> </struts> 103
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Pilhas do struts-default
basicStack exception, servlet-config, prepare, staticparams, params, conversionError
validationWorkfl basicStack, validation, workflow owStack fileUploadStack fileUpload, basicStack ... ... exception, alias, servlet-config, prepare, i18n, chain, model-driven, fileUpload, static-params, params, conversionError, validation, workflow
defaultStack
2: Registrar o interceptador no struts.xml; 3: Opcionalmente, coloc-lo em alguma pilha; 4: Configurar alguma classe que o utilize ou utilize a pilha que o contm.
105
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Criar um interceptador que determine, pela hora do dia, se o visitante deve receber Bom dia, Boa tarde ou Boa noite e colocar este cumprimento na sesso.
106
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 8
107
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
108
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Fluxo de validao
Pgina envia dados do formulrio
Dados Sim Executa ao vlidos? normalmente No Anexa mensagens de erro aos campos
109
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Adicionando erros manualmente A classe ActionSupport (da qual normalmente herdamos) possui mtodos para isso:
addActionError(String mensagem); addActionMessage(String mensagem); addFieldError(String campo, String msg).
113
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Validao client-side A validao dos campos pode tambm ser feita no browser, via JavaScript; Os templates xhtml e css_xhtml provem estes scripts automaticamente; Somente alguns validadores funcionam do lado do cliente.
<html><head><s:head /></head><body> <s:form action="acao" validate="true" method="post"> <s:textfield label="Nome" name="nome" /> <s:textfield label="Idade" name="idade" /> <s:submit/> </s:form> 114
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Validao client-side AJAX Outra opo de validao no cliente usa AJAX (Asynchronous JavaScript and XML); A medida que os campos so preenchidos eles so validados no servidor; Validao AJAX no servidor:
Todos os validadores funcionam; Validao codificada apenas uma vez.
<s:head theme="ajax" /> <s:form action="acao" validate="true" theme="ajax"> 115
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Criar um formulrio com: nome (no-vazio), tipo (A, B ou C), percentual de comisso (0 a 100), data de nascimento (data passada), e-mail (validar e-mail) e pgina pessoal (opcional). Mostrar os trs tipos de validao (bsica, cliente e AJAX).
117
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 9
118
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Injeo de dependncias Dependency Injection, conhecida tambm como Inverso de Controle (Inversion of Control IoC); Maneira de administrar dependncias entre objetos:
Dont call us, well call you; Se o objeto A depende de um objeto B, antes que A execute, B injetado em A; Algum deve realizar as injees (DI Container Spring).
119
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Spring A partir do WebWork 2.2: recomendao do Spring como IoC (portanto, Struts2 idem);
H um container IoC interno, deprecated;
120
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Componentes injetveis Objetos que so automaticamente injetados nas classes que dependem deles; Escopo (visibilidade e tempo de vida):
De aplicao (singleton); De sesso; De requisio.
122
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Exemplos de configurao
<beans [...]> <bean id="componenteDeAplicacao" class="pacote.Classe1" /> <bean id="componenteDeSessao" class="pacote.Classe2" scope="session" /> <bean id="componenteDeRequisicao" class="pacote.Classe3" singleton="false" /> </beans>
123
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Criar um carrinho de compras (sesso) e uma classe de aplicao que implemente um caso de uso de adicionar um item ao carrinho. Criar uma ao que d acesso a este caso de uso, usando DI para injetar os dois componentes nela.
124
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 10
Aes encadeadas
125
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
O resultado chain Permite que voc defina uma ao como resultado de outra:
Promove o reuso de aes ao invs da repetio de cdigo; Necessita do interceptador chain; As propriedades de todas as aes encadeadas esto disponveis no final da cadeia.
126
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Funcionamento
Resultado Primeira Ao Executada C H A I N Interceptador Segunda Ao Executada
chain
Atribui os valores dos parmetros da 1 ao nos atributos de mesmo nome da 2 (chamando os mtodos setXyz()).
127
Agosto 2007
Demonstrao
Construir uma ao de cadastro de funcionrio encadeada com uma ao de exibio de dados de funcionrio.
128
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 11
Enviando arquivos
129
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Integrao com ferramentas externas Struts2 integra-se com ferramentas externas de upload:
Jakarta Commons FileUpload (default); O'Reilly COS Multipart; PELL Multipart.
Formulrio com upload Incluso do parmetro enctype="multipart/form-data"; JSP tag <s:file />.
<@s.form action="upload" method="post" enctype="multipart/form-data"> <@s.file label="Arquivo" name="arquivo" /> <@s.submit value="Enviar" /> </@s.form>
131
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Criar uma ao que receba um arquivo e imprima o tipo do arquivo, o nome e o tamanho em Bytes, KiloBytes e MegaBytes.
133
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 12
134
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Internacionalizao (i18n) Capacidade de escolher a linguagem do sistema; Mensagens so extenalizadas em resource bundles;
Arquivos .properties; Formato chave = valor; Padro de nome (v. API ResourceBundle): nome_lngua_pas.properties.
Suporte do Struts2 i18n Tags de formulrio podem obter seus labels de resource bundles; H tags especficas para imprimir mensagens internacionalizadas; Framework de validao tambm suporta i18n; Troca rpida de locale:
<p>Idioma: <a href="?request_locale=en_US">Ingls</a> | <a href="?request_locale=pt_BR">Portugus</a> </p>
136
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Resource bundles
# AcaoCadastrar_pt_BR.properties form.nome = Nome form.dataNasc = Data de Nascimento form.submit = Enviar texto.resposta = Caro {0} voc tem {1} ano(s). erro.nome.vazio = Por favor, preencha seu nome. # AcaoCadastrar_en.properties form.nome = Name form.dataNasc = Birthdate form.submit = Submit texto.resposta = {0}, you are {1} year(s) old. erro.nome.vazio = Please, fill in your name.
137
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
138
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
140
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Bundles carregados pelo Struts2 1: ClasseAcao.properties; 2: SuperClasse.properties (toda a hierarquia); 3: Interface.properties (todas implementadas); 4: Arquivo .properties da classe de modelo (repetindo passos 1, 2 e 3), para ModelDriven; 5: package.properties (toda a hierarquia); 6: Arquivo .properties global (configurado em struts.properties).
141
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Repetir a demonstrao do passo 06 (clculo da idade com FreeMarker), adicionando validao e com toda a aplicao internacionalizada. Permitir exibio em ingls ou portugus.
142
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 13
143
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
til quando:
O arquivo gerado dinamicamente ou recuperado de um banco de dados; Quer proteger determinados arquivos atrs de uma lgica de negcio (ex.: verificao de acesso).
144
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Exemplo
<result type="stream"> <param name="contentType">%{contentType}</param> </result>
public class Acao extends ActionSupport { private String contentType = "image/jpeg"; private InputStream inputStream; /* Getters & setters. */ }
147
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Usando a biblioteca JFreeChart, obter dados sobre utilizao de frameworks Web em projetos e exibir um grfico do tipo pizza.
148
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 14
149
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Resultado jasper Necessita struts2-jasperreports-plugin-2.0.9.jar; Usado para gerar e exibir relatrios com JasperReports:
Suporta todos os formatos que o JasperReports suporta; Ao deve disponibilizar o datasource (fonte de dados para o relatrio); Localizao do relatrio (*.jasper) e formato so especificados no struts.xml.
150
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Exemplo
<result name="success" type="jasper"> <param name="location"> WEB-INF/reports/meurelatorio.jasper </param> <param name="dataSource">dataSource</param> <param name="documentName">Relatorio</param> </result> public class Acao extends ActionSupport { private List dataSource = new ArrayList(); private String parametro; /* Getters & setters. */ }
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
152
153
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Em cima do exemplo anterior, exibir as informaes passadas agora em forma tabular num relatrio em PDF. Exibir, tambm, o grfico do JFreeChart logo abaixo da tabela.
154
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tutorial Passo 15
155
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
SiteMesh Framework open-source para decorao de pginas Web (similar ao Tiles, da Apache):
Ajuda a manter a consistncia de layout em sites com muitas pginas; Intercepta a requisio e aplica a decorao antes da resposta ao cliente (padro Decorator do GoF); Tambm pode montar uma pgina a partir de vrios paineis (semelhante a portais, padro Composite do GoF).
156
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Integrao com o Struts2 Qualquer aplicao Web integra-se facilmente com SiteMesh:
157
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Caractersticas Necessita struts2-sitemesh-plugin-2.0.9.jar e sitemesh-2.2.jar; Podemos usar as JSP Tags do Struts2 em nossas pginas de layout (decoradores); Podemos escrever decoradores em HTML, JSP ou FreeMarker; Precisamos configurar o SiteMesh:
WEB-INF/web.xml; WEB-INF/decorators.xml.
158
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
web.xml
<!-- Entre o filtro do Spring e do Struts2. --> <filter> <filter-name>strutsCleanup</filter-name> <filter-class> org.apache.struts2. dispatcher.ActionContextCleanUp </filter-class> </filter> <filter> <filter-name>sitemesh</filter-name> <filter-class> org.apache.struts2. sitemesh.FreeMarkerPageFilter </filter-class> </filter>
159
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
web.xml
<!-- Entre o filtro do Spring e do Struts2. --> <filter-mapping> <filter-name>strutsCleanup</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>sitemesh</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
160
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
decorators.xml
<decorators defaultdir="/WEB-INF/decorators"> <decorator name="main" page="main.ftl"> <pattern>/*</pattern> </decorator> </decorators>
161
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
meutemplate.ftl
<html> Ttulo definido na pgina <head> <title>${title}</title> <link rel="stylesheet" type="text/css" href="${base}/main.css" /> </head> Diretrio raiz da WebApp <body> <!-- Algum cabealho. --> Corpo da pgina ${body} <!-- Algum rodap. --> </body> </html>
162
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
163
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Demonstrao
Integrar todo o tutorial com o SiteMesh, automaticamente aplicando um mesmo layout a todas as pginas.
164
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tpicos Avanados
165
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
Tpicos avanados Criao de tipos de resultado, conversores de dados e validadores customizados; Continuations; Criao do seu prprio ActionMapper; Uso avanado de tags JSP; Criao de componentes visuais e temas; Uso avanado de OGNL; Suporte anotaes (Java 5); Portlets.
166
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2
SiteGraph:
Monta um grafo com as aes e resultados.
167
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2