370 likes | 635 Views
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.
E N D
Struts Carlos Bazilio Depto de Ciência e Tecnologia Pólo Universitário de Rio das Ostras Universidade Federal Fluminense
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 <%@taglibprefix="s"uri="/struts-tags"%> <html> <head> <title>Hello World!</title> </head> <body> <h2><s:propertyvalue="message"/></h2> </body> </html>
Hello World: Modelo Action/Classe Java import com.opensymphony.xwork2.ActionSupport; publicclass HelloWorld extends ActionSupport { publicstaticfinal String MESSAGE = "Struts is up and running ..."; public String execute() throws Exception { setMessage(MESSAGE); returnSUCCESS; // ERROR, INPUT, LOGIN, NONE: Constantes de ActionSupport } private String message; publicvoid setMessage(String message){ this.message = message; } public String getMessage() { returnmessage; } }
Hello World:ControleArquivo struts.xml <!DOCTYPEstrutsPUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <packagename="tutorial"extends="struts-default"> <actionname="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> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</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.
MVC (Model-View-Controller) • É um padrão arquitetural que permite isolamento entre as camadas num sistema • Este isolamento objetiva simplificar o processo de manutenção do software
http://java.sun.com/blueprints/patterns/MVC-detailed.html MVC (Model-View-Controller)
MVC (Model-View-Controller) • 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 “WEB-INF/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” <!DOCTYPEstrutsPUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <packagename="tutorial"extends="struts-default"> <include file="outra_configuracao.xml" /> <actionname="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 <!DOCTYPEstrutsPUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <packagename="tutorial"extends="struts-default"> <actionname="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 <result-types />
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/core-developers-guide.html • Core Developers Guide