Struts
description
Transcript of Struts
StrutsStruts
Carlos Bazilio
Depto de Ciência e TecnologiaPólo Universitário de Rio das Ostras
Universidade Federal Fluminense
Struts 2Struts 2
Arquitetura Struts2 / Arquitetura Struts2 / MVCMVC
• http://struts.apache.org/2.x/
Hello WorldHello 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 Hello World: Apresentação Arquivo JSPArquivo 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 Hello World: Modelo Action/Classe JavaAction/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:ControleHello World:ControleArquivo struts.xmlArquivo 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 Hello World: Arquivo web.xmlweb.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: Hello World: Seqüência de Passos (1/3)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: Hello World: Seqüência de Passos (2/3)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: Hello World: Seqüência de Passos (3/3)Seqüência de Passos (3/3)
• Finalmente, o arquivo html resultante é enviado para o browser
Padrões de ProjetoPadrõ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 Exemplo de Padrão de Projeto – FaçadeProjeto – 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 Exemplo de Padrão de Projeto – FaçadeProjeto – Façade
MVC (MVC (Model-View-Model-View-ControllerController))
• É um padrão arquitetural que permite isolamento entre as camadas num sistema
• Este isolamento objetiva simplificar o processo de manutenção do software
MVC (MVC (Model-View-Model-View-ControllerController))
• http://java.sun.com/blueprints/patterns/MVC-detailed.html
MVC (MVC (Model-View-Model-View-ControllerController))
• 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 1Struts 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 Algumas Diferenças entre Struts 1 e 2Struts 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 Algumas Diferenças entre Struts 1 e 2Struts 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 Algumas Diferenças entre Struts 1 e 2Struts 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 StrutsInstalando 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 “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”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”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 ResultadosTipos 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 ResultadosTipos 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 ResultadosTipos de Resultados
• Estes tipos estão definidos no arquivo “struts-default.xml”, dentro da tag <result-types />
ConfiguraçãoConfiguração
InternacionalizaçãoInternacionalização
ValidaçãoValidação
Biblioteca de Tags do Biblioteca de Tags do StrutsStruts
Extendendo o FrameworkExtendendo o FrameworkPluginsPlugins
TilesTiles
• Framework criado para simplificar a construção de interfaces através de templates
• Este framework utiliza o padrão Composite
FreeMarkerFreeMarker
• É 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)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ênciasReferências
• http://struts.apache.org/2.x/– Página principal
• http://struts.apache.org/2.x/docs/core-developers-guide.html– Core Developers Guide