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
Download

Struts - Universidade Federal Fluminense