WebWork 2 João Carlos Pinheiro jcpinheiro@cefet-ma.br Versão: 0.5 Última Atualização: Agosto/2005 1
Agenda Introdução WebWork 2 & XWork Actions Views Interceptadores Validação Inversão de Controle (IoC) 2
Introdução Definição do WebWork É um framework para desenvolvimento web que provê uma serie de ferramentas úteis e flexíveis, capaz de aliviar consideravelmente o trabalho muitas vezes mecânico e repetitivo do programador, integrando-se facilmente com outras ferramentas O webwork é um projeto de software livre da OpenSymphony 3
WebWork 2 Características Framework MVC (Pull-based) Centrado em componentes e reuso de código Pode ser utilizado, também em aplicações não web Largamente utilizado pela comunidade de desenvolvimento 4
XWork O XWork é um framework que fornece uma implementação do padrão de projeto Command que poderá ser utilizado para executar unidades de trabalho que são classe que implementam a interface com.opensymphony.xwork.action Cada ação (comando) representa uma unidade de trabalho (objeto) 5
XWork fornece! Padrão command em ambiente requisição / resposta Action chaining Inversão de Controle (IoC) Não fornece qualquer recurso para web 6
WebWork O WebWork além de implementar o MVC modelo 2 por meio de ações e resultados, ainda provê ao desenvolvedor características web-based: Ações O gerenciamento de ações ou de comandos é a característica mais básica do WebWork. Descrevendo uma ação no arquivo de xwork.xml e criando uma classe Java para esta ação é o suficiente para ver o WebWork em funcionamento Redirecionamento Como resultado de uma ação temos um redirecionamento. Ao ser chamada uma ação, esta retorna para onde deseja redirecionar a aplicação na camada de visualização 7
WebWork Interceptadores Com os interceptors, uma ação pode ser interceptada antes e depois da sua execução podendo ter seu fluxo desviado Múltiplos interceptors podem ser utilizados para uma ação Validação de formulários O WebWork pode automatizar a validação de formulários com arquivos simples em XML, separando e facilitando sem a necessidade de programação em Java conversão automática de dados Componentes Com a característica de Inversão de Controle do XWork, é possível ter objetos que ficam disponíveis para as ações em um determinado escopo 8
WebWork Tags JSP, macros Velocity e JasperReports Internacionalização O WebWork possui arquivos de recursos separados por ações e por língua 9
Arquitetura do WebWork Figura retirado do livro: MANNING Art of Java Web Development 10
Exemplo de uma Action (bem simples) package helloword; import com.opensymphony.xwork.actionsupport; public class ActionCadastroNoticia implements Action { private String nome; private String saudacao; } public void setnome(string nome) { this.nome = nome; } public Date getsaudacao() { return this.saudacao; } public String execute() throws Exception { saudacao = Olá + nome; return SUCCESS; } Definido na interface Action 11
Tipos de retorno da interface Action package com.opensymphony.xwork; public interface Action { public static final String SUCESS = sucess ; public static final String INPUT = input ; public static final String ERROR = error ; public static final String NONE = none ; public static final String LOGIN = login ; public String execute(); } 12
Configurando o Descritor Web (web.xml) <?xml version="1.0"?> <web-app> <display-name>conexao Java 2004</display-name> <servlet> <servlet-name>webwork</servlet-name> <servlet-class> com.opensymphony.webwork.dispatcher.servletdispatcher </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>webwork</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>... </web-app> Esta configuração mapeia o ServletDispatcher do WebWork e faz com que todas as ações que terão a extenção *.action para este servlet que se encarregará de chamar a ação correspondente 13
Configurando o XWork Depois de configurar o container com o arquivo web.xml é necessário configurar o XWork A configuração é feita no arquivo xwork.xml que deve ficar em WEB-INF/classes O arquivo a seguir não faz nada, é a configuração mais básica do Xwork <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.0.dtd"> <xwork> <include file="webwork-default.xml" /> <package name="default" extends="webwork-default">... </package> </xwork> Configuração das actions e interceptadores 14
Ações e Resultados As ações são as classes que recebem a requisição do WebWork. Estas classes devem estar configuradas no arquivo xwork.xml e deve estar prontas para receber a requisição do WebWork Utilizando o WebWork, os JSP s terão apenas a tarefa de controlar a visualização do sistema, a camada View, e eles é quem irão fazer a requisição das ações ao WebWork 15
Ações e Resultados configurando no xwork.xml <xwork> <include file="webwork-default.xml" /> <package name="default" extends="webwork-default"> <default-interceptor-ref name="defaultstack" /> <action name="anonascimento" class="guia.calculaanonascimento"> <result name="error" type="dispatcher">leidade.jsp</result> <result name="success" type="dispatcher">mostraano.jsp</result> </action> </package> </xwork> Padrão para utilização básica do WebWork OBS: este arquivo será adicionado na pasta WEB-INF/classes 16
Actions em mais detalhes No XWork, entrada e saída são tratados como JavaBean ou (POJO Plain Old Java Object) que implementa a interface Action Action é uma operação Actions devem ser simples! A interface Action define apenas um método: package com.opensymphony.xwork; public interface Action { public static final String SUCESS = sucess ; // outras constantes public String execute(); } 17
Resultados Ao ser configurada uma ação, devem ser especificados todos os possível retornos: Dispatcher - Encaminha o resultado para um determinado local, este é o mais utilizado no WebWork. Redirect - Encaminha o resultado para um determinado local Diferente do dispacher, o redirect não envia as propriedades da ação para a página de resultado Velocity - Encaminha o resultado para um arquivo de modelo do velocity. O WebWork trabalha nativamente com o Velocity Chain - Encaminha o resultado de uma ação para outra ação 18
Exemplo simples (completo) Será criado um exemplo de ação, que será uma página que perguntará o nome e a idade e de uma pessoa e se esta pessoa já fez aniversário este ano. Como resposta terá o ano de nascimento dessa pessoa 19
Config: xwork.xml <xwork> <include file="webwork-default.xml" /> <package name="default" extends="webwork-default"> <default-interceptor-ref name="defaultstack" /> <action name="anonascimento" class="guia.calculaanonascimento"> <result name="error" type="dispatcher">leidade.jsp</result> <result name="success" type="dispatcher">mostraano.jsp</result> </action> </package> </xwork> 20
leidade.jsp: página que requisita os dados do usuário <html> <body> <h2>guia do WebWork</h2> <Form method="post" action="anonascimento.action"> Entre com os dados:<br> Nome: <input type="text" name="nome" size="30"> <BR> Idade: <input type="text" name="idade" size="5"> <BR> Já fez aniversário este ano: <input type="checkbox" name="aniversario" value="true"> <input type="submit" value="mostra Ano Nascimento"> </form> </body> </html> No arquivo web.xml, foi configurado para que tudo que termine com *.action seja direcionado ao WebWork. E no xwork.xml foi configurado uma ação AnoNascimento 21
ActionCalculaAnoNascimento.java import com.opensymphony.xwork.actionsupport; import java.util.calendar; public class ActionCalculaAnoNascimento extends ActionSupport { private String nome; private Integer idade; private Boolean aniversario; private Integer ano; public String execute() throws Exception { if (nome == null nome.equals("") idade == null idade.equals("")) { return ERROR; } if (aniversario == null) { aniversario = new Boolean(false); } if (!aniversario.booleanvalue()) { idade = new Integer(idade.intValue()+1); } Calendar data = Calendar.getInstance(); data.add(calendar.year, (idade.intvalue()*-1)); ano = new Integer(data.get(Calendar.YEAR)); return SUCCESS; } // Métodos Get e Set O WebWork utiliza o conceito de Inversão de Controle e Injeção de Dependência, isto faz com que criar ações seja muito simples. Os dados do formulário são injetados dentro da classe em seus respectivos atributos fazendo uma chamada ao método setnome(string nome)
IoC e Componentes É uma forma de administrar dependência entre objetos A idéia é fornecer automaticamente para algumas actions instancias de objetos necessárias para se realizar a ação É preciso definir uma interface (chamada de interface habilitadora) a ser implementada pela ação Em seguida precisamos fazer um registro no arquivo components.xml 23
IoC e Componentes public class CarrinhoCompras implements Serializable { private List itens = new ArrayList(); public List getitens() { return itens; } public void setitens(list itens) { this.itens = itens; } } public interface CarrinhoComprasAware { public void setcarrinhocompras(carrinhocompras carrinho); } <components> <component> <scope>session</scope> <class>br.com.javafree.ww.carrinhocompras</class> <enabler>carrinhocomprasaware</enabler> </component> </components> 24
IoC e Componentes É preciso adicionar no web.xml <web-app> <filter> <filter-name>container</filter-name> <filter-class>com.opensymphony.webwork.lifecycle.requestlifecyclefilter</filter-class> </filter> <filter-mapping> <filter-name>container</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <listener> <listener-class>com.opensymphony.webwork.lifecycle.sessionlifecyclelistener</listener-class> </listener> <listener> <listener-class>com.opensymphony.webwork.lifecycle.applicationlifecyclelistener</listener-class> </listener> 25
IoC e Componentes Arquivo xwork.xml <xwork> <!-- Importa as configurações default do WebWork. --> <include file="webwork-default.xml" /> <!-- Configuração para pacote default. --> <package name="default" extends="webwork-default"> <interceptors> <interceptor-stack name="basicstack"> <interceptor-ref name="validationworkflowstack" /> <interceptor-ref name="component" /> </interceptor-stack> </interceptors> <action name="vercarrinho" class="br.com.javafree.ww.vercarrinhoaction"> <interceptor-ref name="basicstack" /> <result name="success" type="dispatcher">mostraritens.jsp</result> </action> </package> </xwork> 26
Bibliografia Consultada 27