Struts Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense Struts 2 Arquitetura Struts2 / MVC • http://struts.apache.org/2.x/ Hello World • Nos próximos slides apresentaremos uma aplicação inicial que está disponibilizada no site oficial do Struts • Esta é constituída de 3 arquivos: – Uma página no servidor (.jsp) para exibir a mensagem – Uma ação (Action – classe java) para criar a mensagem – Um mapeamento entre a página e a ação (struts.xml) • http://struts.apache.org/2.x/docs/hello-world.html Hello World: Apresentação Arquivo JSP <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>Hello World!</title> </head> <body> <h2><s:property value="message" /></h2> </body> </html> Hello World: Modelo Action/Classe Java import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { public static final String MESSAGE = "Struts is up and running ..."; public String execute() throws Exception { setMessage(MESSAGE); return SUCCESS; // ERROR, INPUT, LOGIN, NONE: Constantes de ActionSupport } private String message; public void setMessage(String message){ this.message = message; } public String getMessage() { return message; } } Hello World:Controle Arquivo struts.xml <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="helloworld" class="br.com.siriusnet.cursojava.HelloWorld"> <result>/helloworld.jsp</result> <!-Dispatcher --> </action> </package> </struts> Hello World: Arquivo web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <filter> <filter-name>struts2</filter-name> <filterclass>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareA ndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> Hello World: Seqüência de Passos (1/3) • O contêiner recebe uma requisição do servidor web ao recurso HelloWorld.action • De acordo com o arquivo web.xml, o filtro do framework é acionado para todo tipo de recurso • O framework procura em struts.xml por uma ação com nome HelloWorld, instancia a classe associada e dispara o método execute() Hello World: Seqüência de Passos (2/3) • O método execute() atribui a mensagem e retorna o valor SUCCESS • O framework checa o arquivo struts.xml para ver que recurso retornar no caso de SUCCESS. O framework diz ao container para retornar o arquivo HelloWorld.jsp • Quando o arquivo jsp é processado, as tags codificadas são resolvidas. Exemplo, para a tag <s:property value="message" />, o método get() da propriedade é chamado e o valor é inserido na página html resultante Hello World: Seqüência de Passos (3/3) • Finalmente, o arquivo html resultante é enviado para o browser Padrões de Projeto • Um padrão de projeto é uma solução comum para um problema comum encontrado no desenvolvimento de software (Sun); • A utilização desses padrões (boas práticas) usualmente implica em algumas vantagens: – Facilidade de comunicação: padrões possuem nomes, os quais resumem uma solução que deve ser de conhecimento comum entre equipes de desenvolvimento; – Credibilidade: sua implementação estará utilizando soluções amplamente testadas e aprovadas; – Facilidade de manutenção: padrões tendem a reduzir o acoplamento entre componentes, o que implica num sistema de fácil manutenção; Exemplo de Padrão de Projeto – Façade • Similar a idéia de fachada; • Entretanto, o objetivo deste padrão é simplificar, e não ocultar serviços oferecidos por um dado sistema; • Facilita a adoção de 2 importantes aspectos: – Diminuição do acoplamento; – Aumento da granularidade; • Usualmente, um façade é utilizado na camada de regras de negócio, o que oferece uma interface simplificada para um subsistema; • Com frequência também, seus clientes estão localizados na camada de apresentação; • Porém, nada impede que um façade invoque serviços oferecidos por outro façade. Exemplo de Padrão de Projeto – Façade MVC (Model-ViewController) • É um padrão arquitetural que permite isolamento entre as camadas num sistema • Este isolamento objetiva simplificar o processo de manutenção do software MVC (Model-ViewController) • http://java.sun.com/blueprints/patterns/MVC-detailed.html MVC (Model-ViewController) • O exemplo da aplicação “HelloWorld” mostrada é compatível com este padrão: – O arquivo .jsp que exibe a mensagem representa a camada de apresentação – A classe java (ação) que cria a mensagem representa a camada de modelo – O arquivo .xml que relaciona os arquivos anteriores representa a camada de controle Struts 1 • Primeira versão do framework que apresentava diversas facilidades para a programação da web em jsp na época • A codificação de aplicações foi significativamente simplificada com o advento da versão 2 Algumas Diferenças entre Struts 1 e 2 • Classes Action: – Na versão 1, classes Action precisam estender uma classe base abstrata – Na versão 2, qualquer classe POJO com um método execute() pode ser utilizada • Modelo de threads: – Na versão 1, actions são singletons e precisam ser thread-safe, pois haverá 1 instância para todas as requisições – Na versão 2, são criados objetos action para cada requisição Algumas Diferenças entre Struts 1 e 2 • Dependência de servlets: – Na versão 1, o método execute() recebe como parâmetros objetos HttpServletRequest e HttpServletResponse – Na versão 2, estes valores são obtidos de um “dicionário”, ou seja, não há necessidade de acessar os objetos do servlet explicitamente • Testes: – Na versão 1, a dependência de servlets também dificultava a realização de testes sobre a aplicação – Na versão 2, estes testes podem ser realizados simplesmente criando objetos da action a ser testada Algumas Diferenças entre Struts 1 e 2 • Formulários de entrada: – Na versão 1, os formulários que tratavam ações de formulários precisavam estender uma classe base abstrata – Na versão 2, estes são substituídos elegantemente por classes POJO com propriedades, como JavaBeans Instalando o Struts • O framework Struts é distribuído como uma biblioteca Java (.jar), juntamente com outras bibliotecas necessárias a sua execução • Para fazer com o que o servidor seja capaz de processar uma aplicação Struts, podemos: – Colocar os arquivo .jar num local adequado no servidor • Nesta opção, os arquivos ficam na pasta “tomcat/lib” – Inserir estas bibliotecas dentro de um arquivo de distribuição .war • Nesta opção, os arquivos devem ficar dentro da pasta “WEBINF/lib” Arquivo “struts.properties” • Arquivo de configuração que permite a modificação do comportamento padrão do framework • As propriedades padrão estão definidas no arquivo “default.properties” contido na distribuição “struts2-core.jar” • Algumas propriedades: – struts.url.http.port = 8080 ## Porta padrão – struts.configuration.xml.reload=false ## Força recarga do struts.xml após mudança Arquivo “struts.xml” • Este arquivo representa a camada de controle no padrão MVC • Nele indicamos que urls são interceptadas, quais classes de modelo tratam estas requisições e que recursos são utilizados para exibir a resposta ao cliente Arquivo “struts.xml” <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <include file="outra_configuracao.xml" /> <action name="nome_acao_url" class="nome.completo.ClasseModelo"> <result type="tipo_Resultado"> /arquivo_saida.jsp <!–- um exemplo --> </result> <!-- Dispatcher é o default--> </action> </package> </struts> Tipos de Resultados • Enquanto as ações (Actions) são utilizadas para mudança de estado de uma aplicação, os resultados (Result Types) gerenciam as visões <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="tutorial" extends="struts-default"> <action name="helloworld" class="br.com.siriusnet.cursojava.HelloWorld"> <result>/helloworld.jsp</result> <!-- Dispatcher --> </action> </package> </struts> Tipos de Resultados • • • • • • • • • • • • • Chain Result Dispatcher Result FreeMarker Result HttpHeader Result Redirect Result Redirect Action Result Stream Result Velocity Result XSL Result PlainText Result Tiles Result ..., Tipos de Terceiros http://struts.apache.org/2.x/docs/result-types.html Tipos de Resultados • Estes tipos estão definidos no arquivo “struts-default.xml”, dentro da tag <resulttypes /> Configuração Internacionalização Validação Biblioteca de Tags do Struts Extendendo o Framework Plugins Tiles • Framework criado para simplificar a construção de interfaces através de templates • Este framework utiliza o padrão Composite FreeMarker • É uma ferramenta genérica de geração de texto baseado em templates • Está disponível como uma biblioteca java • Apesar de não estar amarrada a aplicações web, é bastante utilizada na geração de páginas html JSF (JavaServer Faces) • Diferentemente do Struts, JSF é uma especificação Java e não um produto proprietário • Seu objetivo é oferecer uma maneira de se construir interfaces independente da plataforma do cliente • Para tal, é identificado o tipo do cliente para que a interface se renderizada de forma adequada Referências • http://struts.apache.org/2.x/ – Página principal • http://struts.apache.org/2.x/docs/coredevelopers-guide.html – Core Developers Guide