Download - Conhecendo o Struts 2 - Java Tech Day 2007
Conhecendo o Struts 2
Jaime Schettini
Agenda de apresentação
Histórico
Arquitetura
Dependências
Estrutura do projeto
Configuração
Como utilizar?
Criando um projeto
Conclusão
Histórico
Struts é um framework baseado na arquitetura MVC
Novos frameworks: Spring, Stripes and Tapestry
União do Struts com o WebWork – arquitetura semelhante
Muitas funcionalidades do WebWork 2.2
Struts 2: extensível e de fácil integração com Ajax
Arquitetura
Dependências
Servlet API 2.4
JSP API 2.0
Java 5
Estrutura da aplicação
Arquivos de configuração
WEB-INF/web.xml
WEB-INF/classes/struts.xml
Configuração
web.xml
Define informações que um servidor precisa saber sobre a aplicação
Nele é configurado o dispatcher
Dispatcher
Recebe todas as requisições da aplicação e faz a ligação entre essas requisições e uma determinada action
Configurando o web.xml
<web-app> <display-name>Struts 2 - Exemplo</display-name> <filter> <filter-name>struts</filter-name> <filter-class>
org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter>
<filter-mapping> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping></web-app>
Página de boas vindas
web.xml<welcome-file-list> <welcome-file>index.html</welcome-file></welcome-file-list>
index.html<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <META HTTP-EQUIV="Refresh" CONTENT="0;URL=boas- vindas.action"></head><body> <p>Carregando...</p></body></html>
Struts.xml e actions
Action: contém código que nós queremos que seja executado antes de uma página renderizar a resposta
As actions são definidas em arquivos de configuração
Ao carregar a aplicação, o arquivo struts.xml é lido para que o framework possa mapear a requisição para uma determinada página em uma determinada action.
Configurando o struts.xml<struts> <include file="struts-default.xml"/>
<package name="default" extends="struts-default">
<action name="boas-vindas“ class="br.com.versatiliti.BoasVindasAction"> <result>/jsp/boas-vindas.jsp</result> </action>
<action name="usuario!*" method="{1}" class="br.com.versatiliti.UsuarioAction"> <result name="form">/jsp/usuario/form.jsp</result> <result name="cancel" type="redirect-action"> boas-vindas </result> <result>/jsp/usuario/list.jsp</result> </action>
<global-results> <result name="error">/jsp/Error.jsp</result> </global-results> </package></struts>
A propriedade result
URL='boas-vindas.action'
Action:<action name="boas-vindas" class="br.com.versatiliti.BoasVindasAction"> <result>/jsp/boas-vindas.jsp</result></action>
Método:public String execute() throws Exception { return SUCCESS;}
Action e parâmetros
Action sem parâmetro:
boas-vindas.action
Método:public String execute() throws Exception { return SUCCESS;}
Action com parâmetro
boas-vindas!sair.action
Método:
public String sair() { return CANCEL;}
Tipos de resultado
Os tipos de resultado são sempre uma String, normalmente uma constante. Vários tipos de resultado já estão definidos na interface Action, como ERROR, SUCCESS, LOGIN, NONE e INPUT. Esses tipos podem ser usados na aplicação, ou pode-se criar outros.
Observação
O result name 'success' é o result padrão, podendo ser omitido na configuração da action
Action:<action name="boas-vindas"
class="br.com.versatiliti.BoasVindasAction"> <result>/jsp/boas-vindas.jsp</result></action>
é a mesma coisa que:<action name="boas-vindas"
class="br.com.versatiliti.BoasVindasAction"> <result
name=”success”>/jsp/boas-vindas.jsp</result></action>
Results globais
Nesse caso, o result 'error' está definido em um escopo global. Podem ocorrer problemas com qualquer outra action, e elas podem usar o result global quando ela quiser.
<global-results> <result name="error">/jsp/Error.jsp</result></global-results>
Se uma action definir um result chamado 'error' dentro do seu escopo, é esse result que será usado em caso de erro ao invés do result global.
Fluxo de uma requisição
Action com vários métodosstruts.xml<action name="usuario!*" method="{1}" class="br.com.versatiliti.UsuarioAction"> <result name="form">/jsp/usuario/form.jsp</result> <result name="list">/jsp/usuario/list.jsp</result> <result name="success">/jsp/usuario/list.jsp</result></action>
public String execute() { return SUCCESS;}
public String list() { usuarioService.findAll(); return "list";}
public String input() { Usuario usuario = new Usuario(); return “form”;}
public String save() { usuarioService.insert(usuario); return SUCCESS;}
_______________________________________________________________
UsuarioAction.java
Redirecionando actions
<action name="usuario!*" method="{1}" class="br.com.versatiliti.UsuarioAction"> <result name="form">/usuario/form.jsp</result> <result name="list">/usuario/list.jsp</result> <result name="success">/usuario/listar.jsp</result> <result name="cancel" type="redirect-action"> boas-vindas </result></action>
<action name="boas-vindas" class="br.com.versatiliti.BoasVindasAction"> <result>/jsp/boas-vindas.jsp</result></action>
Observação
Para permitir o uso de símbolos diferentes do '!' é preciso desabilitar uma opção nas propriedades do struts:
struts.propertiesstruts.enable.DynamicMethodInvocation = false
A extenção padrão para actions no Struts 2 é '.action'. Para mudar essa configuração e definir sua própria extenção, é preciso mudar o arquivo de configuração do Struts.
struts.propertiesstruts.action.extension = .nova_extencao
Interceptors
Objetos utilizados para execução de código antes e depois de Actions
Adiciona funcionalidades sem mexer na Action
Utilizado para desacoplamento de código: autenticação, validação, etc
Existem diversos interceptors prontos para uso, mas pode-se criar um novo implementando a interface Interceptor
Tags html
Até agora nós informamos qual ação nós queremos que a action faça (listar usuários, por exemplo), mas o conteúdo ainda não foi mostrado na jsp.
O Struts tem diversas tags html. É com o auxílio dessas tags que nós vamos mostrar o conteúdo no navegador.
Os atributos de classe definidos nas actions são disponibilizados para a página através de seus métodos de acesso (get e set).
Exemplo com tags html
Exemplo usando tags do Struts
Mais informações
http://struts.apache.org/2.x/
Revista Mundo Java – nº 22
Revista Java Magazine – nº 41