0% acharam este documento útil (0 voto)
322 visualizações167 páginas

Tutorial Struts 2

Uploaded from Google Docs

Enviado por

Andre Vitalino
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
322 visualizações167 páginas

Tutorial Struts 2

Uploaded from Google Docs

Enviado por

Andre Vitalino
Direitos autorais
© Attribution Non-Commercial (BY-NC)
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Desenvolvimento de Aplicaes 2 Web com Struts

Aprenda Struts em 15 passos


Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries.

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

Desenvolvimento de Aplicaes Web com Struts2

Sobre o autor Vtor Souza


Formao:
Graduao em Cincia da Computao, mestrado em Engenharia de Software, pela UFES.

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

Desenvolvimento de Aplicaes Web com Struts2

Servidor de pginas estticas


GET /index.html HTTP/1.0 Host: www.site.com [...]

1.Procura arquivo /index.html; 2.Arquivo existe OK (200); 3.Monta resposta HTTP com contedo do arquivo. Cabealho

Requisio HTTP

Resposta HTTP 200 OK

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

Servidor de pginas dinmicas


GET /index.asp HTTP/1.0 Host: www.site.com [...]

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).

Resposta HTTP 200 OK

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

Evoluo de Java para a Web


1) L a configurao. GET /servlets/helloWorld
Requisio Resposta
Sun Jul 24 15:53:20 GMT-03:00 2005

Container Servlet

web.xml

Navegador

3) Envia uma resposta, que pode ser uma pgina, um redirecionamento, etc.

2) Instancia um Servlet e delega a ele a requisio.

Servlet Apropriado

Servlets
Agosto 2007

Lgica de Negcio

7
Desenvolvimento de Aplicaes Web com Struts2

Servlets devem ser registrados


<?xml version="1.0" encoding="UTF-8"?> <web-app > <filter> ... </filter> <listener> ... </listener> <servlet> <servlet-name>helloWorld</servlet-name> <servlet-class>web.HelloWorldServlet</servletclass> </servlet> <servlet-mapping> <servlet-name>helloWorld</servlet-name> <url-pattern>/servlets/helloWorld</url-pattern> </servlet-mapping> </web-app> 8
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

No adequado para escrever HTML


public class HelloWorldServlet extends HttpServlet { public void init() throws ServletException { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Date now = new Date(System.currentTimeMillis()); out.write("<html><head><title>"); out.write("Hello World</title>"); out.write("</head><body>" + now); out.write("</body></html>"); out.close();

} }

9
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Evoluo de Java para a Web


1) Procura arquivo helloWorld.jsp. GET /helloWorld.jsp
Requisio Resposta
Sun Jul 24 15:53:20 GMT-03:00 2005

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

Inadequado para lgica de negcio


<html>[...] <% Connection conn; PreparedStatement stmt; conn = BancoDados.conectar(); stmt = conn.prepareStatement("SQL"); ResultSet rs = stmt.executeQuery(); // [...] Lgica de negcio. stmt = conn.prepareStatement("SQL"); stmt.executeUpdate(); %> [...]</html>
12
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Evoluo de Java para a Web


GET helloWorld.action
Requisio Resposta

Container Servlet

1) L a configurao.

Navegador

Delega *.action para o controlador

Configurao
Controlador (Servlet) 2) Executa uma ao, que acessa a lgica de negcio.

3) Delega a viso a uma pgina (JSP, HTML, etc.) ou redireciona.

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

JavaServer Faces JSR 127 padro oficial (27/05/2004);


Vrias implementaes; Garantia de continuidade.

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

Informaes gerais Website:


http://struts.apache.org/ Clique em Documentation / Struts 2.x.

Verso atual (agosto/2007): 2.0.9; Licena:


Apache Software License.

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.

Tag Library (e macros Velocity); Configurao flexvel;


20
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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

Evoluo de Java para a Web


GET helloWorld.action
Requisio Resposta

Container Servlet

1) L a configurao.

Navegador

Delega *.action para o controlador

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

Primeiros passos: instalao

25
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Download http://struts.apache.org/download.cgi#struts209 Full Distribution: struts-2.0.9-all.zip (86mb); Contedo:


apps: aplicaes prontas de exemplo (showcase); docs: documentao; lib: o framework e suas dependncias; src: cdigo-fonte.

26
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Instalao Instalar um framework Web saber:


Quais as bibliotecas necessrias para escrever o cdigo (incluso no CLASSPATH); Quais as bibliotecas necessrias para rodar uma aplicao Web que utilize o framework (incluso em WEB-INF/lib); Como configurar a aplicao Web para usar o framework (passo 2).

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

Bibliotecas necessrias Copiadas do diretrio lib do pacote Struts2:


Ncleo: struts2-core, xwork, freemarker, commonslogging, ognl; Opcionalmente: dwr, sitemesh, spring, etc.

Pode-se usar um gerenciador de dependncias:


Ex.: Ivy (atualmente na Incubadora da Apache); Repositrio LabES: http://labes.inf.ufes.br/ivy-rep/.

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

Configurao bsica e primeira ao

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

Estrutura da aplicao em branco WEB-INF


classes
log4j.properties struts.properties struts.xml

Raiz do src.

pages
home.jsp

Pginas e modelos ficam escondidos. Arquivos de configurao da aplicao Web.

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

Primeira ao: Hello Struts2! Responder requisio a:


helloStruts2.action;

Construir uma mensagem:


Hello, 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

Classe de Ao Aes devem implementar:


com.opensymphony.xwork2.Action;

Herdar da classe de suporte melhor:


com.opensymphony.xwork2.ActionSupport; Vrios atalhos disponveis;

Mtodo executado quando a ao chamada:


public String execute() throws Exception { }

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

Construir nossa primeira ao: HelloStruts2

47
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Tutorial Passo 3

Entendendo melhor as aes

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

Troca de dados Controle Viso:


Mtodos getXyz() na classe de ao; Tags <s:property value="xyz" /> no JSP; Hello Struts2!

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

Troca de dados dirigida a modelo


<s:textfield name="func.nome" /> <s:textfield name="func.dataNasc" /> <s:textfield name="func.salario" /> <s:textfield name="func.tempoEmpresa" /> <s:checkbox name="func.gerente" />

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>

Chama o mtodo executePasso02() ao invs de execute().


54
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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>

Aes do pacote respondero requisies /pac1/*.action. Ex.: /pac1/acao.action.


56
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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

Entendendo melhor os resultados

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

<xwork> [...] <action [...]> <result> helloStruts2.jsp </result> </action> </xwork>

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

Tipos de resultado existentes


dispatcher redirect chain velocity freemarker xslt jasper httpheader Despacha a requisio para uma URL. Redireciona o navegador para uma URL. Encadeia uma ao em outra. Processa um template Velocity e retorna o resultado. Processa um template FreeMarker e retorna o resultado. Transforma um XML usando XSLT e retorna o resultado. Retorna um relatrio do JasperReports. Adiciona informaes vindas da ao ao header HTTP.
61
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

A biblioteca de tags do Struts

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

Tags do Struts2 General tags:


Controle de fluxo; Manipulao de dados na value stack; Internacionalizao.

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.

Templates so escritos em FreeMarker (recomendado), Velocity ou JSP.


68
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Personalizando Voc pode escolher outro tema:


Para todo o formulrio ou tag por tag; Propriedade theme="meutema".

Voc pode criar seus prprios temas:


/template/meutema na WebApp ou no Classpath.

Voc pode sobrescrever um componente:


Copia /template/xhtml/componente.ftl para seu projeto e altera o que quiser.

Voc pode criar um componente novo:


Tag genrica <s:component />.
69
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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

Demonstrar uma pgina com diversas tags.

74
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Tutorial Passo 6

Trocando JSP por FreeMarker

75
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

O que o FreeMarker? Template Engine:


Separa os dados da forma que so apresentados; Idia do MVC: programadores focados na lgica, designers focados no visual; No exclusivo para pginas Web.

Site: www.freemarker.org; Licena similar BSD (open source).

76
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Template Engine
Modelo de dados Documento Mesclado
cliente

Coleo
itens[]

nome contato [...]

Cliente

produtosEmPromocao

Ol ${cliente.nome}! Confira as promoes: <#list produtosEmPromocao as produto> - ${produto.nome}: R$ ${produto.preco}!!! </#list>


77
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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 Tags FTL so iguais a XML:


<#diretiva chave="valor" [...]> ... </#diretiva>; <#diretiva chave="valor" [...] />;

Devem ser aninhadas direito.

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

Diretivas do FreeMarker Atribuio de variveis:


<#assign cliente = "Fulano" />

Condicionais:
<#if c1> ... <#elseif c2> ...<#else> ... </#if>

Loops:
<#list colecao as item> ${item} </#list>

82
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Diretivas criadas pelo usurio Definio de macros:


<#macro ola p>Ol ${p}!</#macro>

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

Expresses Recuperando variveis:


Simples: usuario; Em um mapa: usuario.nome, usuario["nome"], usuario[prop]; Em uma sequncia: produtos[5]; Variveis especiais (definidas pelo engine, uso avanado): .nome.

Operaes com String:


Concatenao: "Ol ${usuario}", "Free" + "Marker"; Substrings: nome[0..2].
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

85

Expresses Operaes com seqncias:


Concatenao: usuarios + ["guest"]; Subseqncia: produtos[10..15], produtos[5..].

Operaes com hashs:


Concatenao: senhas + {"fulano" : "segredo"}.

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).

Built-ins (funes internas):


nome?upper_case, texto?html, valor?exists, dt?date("dd/MM/yyyy").

Chamada de mtodo:
repetir("FreeMarker", 3).
87
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Uso de expresses Em interpolaes (imprime o resultado no documento):


${loc.datas[4]?date("dd/MM/yyyy")}.

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

Confira a lista de built-ins!

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

Uso de tags JSP


<html> <body> <@s.form method="post" action="acao"> <@s.select label="L" name="lst" list="%{l}" /> <@s.textfield label="Texto" name="texto" /> <@s.submit value="Enviar" /> </@s.form> </body> </html>

91
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Uso de tags JSP necessrio adicionar um Servlet no web.xml:


<servlet> <servlet-name>JspSupportServlet</servlet-name> <servlet-class> org.apache.struts2.views.JspSupportServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>

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

Nos bastidores, interceptadores

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

AOP com interceptadores


Mesmo trecho de cdigo espalhado por vrias classes
AplicacaoA.metodoNegocio1() Iniciar a transao Acessar banco de dados 1 Commit | Rollback AplicacaoB.metodoNegocio3() Iniciar a transao Acessar banco de dados 3 Commit | Rollback AplicacaoA.metodoNegocio2() Iniciar a transao Acessar banco de dados 2 Commit | Rollback

96
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

AOP com interceptadores


Aspectos so separados e implementados uma nica vez.

AplicacaoA.metodoNegocio1() Acessar banco de dados 1

AplicacaoA.metodoNegocio2() Acessar banco de dados 2 Iniciar a transao Commit | Rollback

AplicacaoB.metodoNegocio3() Acessar banco de dados 3

97
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

AOP com interceptadores


Interceptador cuida para que aspectos sejam executados.
Commit | Rollback

Iniciar a transao

AOP Interceptor AplicacaoA

Cliente

metodoNegocio1()

98
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Alguns interceptadores do Struts2


alias chain Converte nomes de parmetros de uma ao para outra. Transporta valores de parmetros de uma ao para outra, quando so encadeadas.

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

Alguns interceptadores do Struts2


i18n logger model-driven params prepare scope servlet-config Altera dinamicamente o locale e lembra dele a cada requisio. Efetua o log do incio e fim da ao. Se a ao implementa ModelDriven, facilita o acesso a elementos do modelo. Chama mtodos setXyz() na ao para atribuir valores da requisio. Se a ao implementa Preparable, chama seu mtodo prepare(). Armazena e recupera valores da sesso. D acesso ao HttpServletRequest e ao HttpServletResponse (cuidado!).
100
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Alguns interceptadores do Struts2


static-params timer token token-session validation workflow Atribui parmetros configurados em struts.xml ao. Cronometra o tempo de execuo da ao. Previne submisso duplicada de formulrios. O mesmo que acima, porm usando a sesso. Faz validao de formulrios (passo 8). Complementa validation, retornando INPUT no caso de erros de validao.

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

Ao montar pilhas customizadas, observe a ordem definida no defaultStack!


104
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Criando seu prprio interceptador 1: Escrever uma classe que implemente


com.opensymphony.xwork2.interceptor.Interceptor

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

Validando dados automaticamente

107
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Framework de validao Validao automtica de campos de formulrio mediante configurao; Participantes:


Interceptors validation e workflow (pilha validationWorkflowStack); Classe de ao qualquer: Acao.java; Configurao: Acao-validation.xml; Validadores; Tags JSP na pgina de formulrio.

108
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Fluxo de validao
Pgina envia dados do formulrio

validationWorkflow Intercepta L Configurao Acao-validation.xml

Dados Sim Executa ao vlidos? normalmente No Anexa mensagens de erro aos campos

JSP Tags no formulrio imprimem os erros

struts.xml mapeia input para a pgina do formulrio

Interrompe a requisio e retorna INPUT

109
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Configurao Validadores disponveis:


Arquivo validators.xml; Struts2 prov uma configurao padro.

Validadores utilizados em uma ao:


ClasseAcao-validation.xml; ClasseAcao-NomeAcao-validation.xml; Configuraes de validao so herdadas por subclasses de aes; Para cada campo, especifique as validaes a serem feitas e as mensagens de erro.
110
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Alguns validadores do Struts2


required requiredstring int date expression email url No pode ser nulo. String no nula nem vazia. Nmero inteiro em uma determinada faixa de valores. Data em um determinado perodo. Uma expresso qualquer verdadeira. String um endereo de e-mail. String um endereo URL.
111
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

fieldexpression Idem, porm relacionado a um campo.

Alguns validadores do Struts2


Delega a validao a um objeto de domnio, que possui suas prprias configuraes de validao. Verifica erros de converso. String possui tamanho entre uma faixa de valores. String encaixa-se numa expresso regular.

visitor conversion stringlength regex

Alm disso, erros de converso so automaticamente anexados aos campos.


112
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).

O framework de validao usa estes mtodos.

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

Validao client-side AJAX Precisa de alteraes no web.xml:


<servlet> <servlet-name>dwr</servlet-name> <servlet-class> uk.ltd.getahead.dwr.DWRServlet </servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>

Precisa do arquivo de configurao dwr.xml.


116
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

Invertendo o controle: IoC/DI

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;

J configuramos o Spring para funcionar no primeiro passo do tutorial:


Filtro e listener no web.xml; WEB-INF/applicationContext.xml.
<!-- Para determinar os arqs. de config., adicione (web.xml): --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-*.xml</param-value> </context-param>

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.

Formas de ligao (wiring):


Automtica por nome (default); Automtica por tipo; Manual.
121
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Componentes injetveis Passos para criao:


1: Escreva a classe do componente; 2: Coloque um atributo desta classe (ou interface) na classe que depende dele, juntamente com um mtodo setter; 3: Registre o componente na configurao do Spring, com o mesmo nome do atributo (no esquea do escopo!); 4: Use seu componente, confiando que o framework injetar as dependncias pra voc.

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

L os parmetros da 1 ao (chamando os mtodos getXyz())

Atribui os valores dos parmetros da 1 ao nos atributos de mesmo nome da 2 (chamando os mtodos setXyz()).
127

Agosto 2007

Desenvolvimento de Aplicaes Web com Struts2

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.

necessrio incluir a biblioteca adequada:


lib/fileupload/*.jar e commons-io (download separado); lib/fileupload-cos/*.jar; lib/fileupload-pell/*.jar.
130
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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

Ao com upload Se o campo do formulrio chama-se arquivo:


setArquivo(File f) atribui o arquivo; setArquivoFileName(String s) atribui o nome do arquivo; setArquivoContentType(String s) atribui o tipo de arquivo.
public class UploadAction extends ActionSupport { private File arquivo; private String arquivoFileName; private String arquivoContentType; /* Getters & setters. */ }
132
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

Interfaces internacionais: i18n

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.

O framework escolhe o bundle apropriado de acordo com informaes de localizao (locale).


135
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

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

Tags de formulrio com i18n


<@s.form action="calcular.action" method="post"> <@s.textfield label="%{getText('form.nome')}" name="nome" required="true" /> <@s.textfield label="%{getText('form.data')}" name="login" required="true" /> <@s.submit value="%{getText('form.submit')}" /> </@s.form>

138
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Tags especficas de i18n


<@s.i18n name="meupacote.AcaoCadastrar" />

Carrega o resource bundle de uma classe de ao


<@s.text name="texto.resposta"> <@s.param value="nome" /> <@s.param value="idade" /> </@s.text>

Imprime na pgina uma mensagem vinda de um resource bundle carregado.


139
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

I18n no framework de validao


<validators> <field name="nome"> <field-validator type="requiredstring"> <message key="erro.nome.vazio" /> </field-validator> </field> </validators>

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

Usando o resultado Stream

143
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Resultado stream Usado para retornar qualquer formato no-texto:


imagens, vdeos, PDF, etc.

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

Parmetros Configuraes em struts.xml:


contentType: o tipo MIME que ser informado ao navegador (default: text/plain); contentLength: tamanho do arquivo, para que o navegador mostre indicador de progresso; contentDisposition: inline ou filename="nome.ext" (default: inline); inputName: nome do InputStream de onde vm os dados (default: inputStream); bufferSize: tamanho do buffer de cpia (default: 1024)
145
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. */ }

Nome default da fonte de dados.


146
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Resultado chart Existe um plugin para JFreeChart:


Adicionar struts2-jfreechart-plugin-2.0.9.jar.

Mais informaes sobre seu uso na documentao do Struts2:


Getting Started > Guides > Bundled Plugins.

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

Relatrios com JasperReports

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

Parmetros Configuraes em struts.xml:


location: localizao do relatrio compilado; dataSource: expresso OGNL que indica onde a fonte de dados se encontra; format: formato de relatrio a ser gerado (CSV, HTML, PDF, XLS ou XML default: PDF); contentDisposition: idem stream; documentName: nome do documento gerado (o navegador j salva com o nome dado); delimiter: delimitador usado no formato CSV (default: ,).
151
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

Construo do relatrio Propriedades dos objetos do dataSource so acessveis via $F{}:


Ex.: se a lista contm objetos Funcionario, podemos acessar seus dados com $F{nome}, $F{login}, etc.

Atributos da classe de ao so lidos via $P{}:


Ex.: $P{parametro} est disponvel no relatrio.

necessrio ter o mtodo getXyz() apropriado.

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

Integrao com SiteMesh

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

Isso s o bsico... SiteMesh tem muitas outras funcionalidades:


A pgina pode escolher um decorador; A pgina pode definir valores de parmetros que so acessveis no decorador (ex.: indicar se deve mostrar ou no um determinado menu); SiteMesh tem suas prprias tags; Etc.

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

O que este tutorial no cobre...

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

Ferramentas Plugins para IDEs:


EclipseWork; WebWork IDEA plugin.

SiteGraph:
Monta um grafo com as aes e resultados.

167
Agosto 2007 Desenvolvimento de Aplicaes Web com Struts2

Você também pode gostar