Post on 18-Apr-2015
Java para Web com Struts
Danilo Toshiaki Satodtsato@ime.usp.br
Treinamento ALESP – SPLMódulo I
Copyleft 2006 Danilo Sato 2
Visão Geral Curso Dividido em 3 módulos
Módulo I (Geral) Java para Web MVC Struts Básico
Módulo II (Struts) Model Controller
Módulo III (Struts) View
Copyleft 2006 Danilo Sato 3
Agenda - Módulo I
1. Web1. Partindo do princípio: HTTP, HTML2. Java para Web: Servlets, JSP
2. MVC (Model-View-Controller) 3. Outras tecnologias utilizadas
1. Java Beans2. XML
4. Struts básico
Copyleft 2006 Danilo Sato 4
Web - HTTP HTTP = Hypertext Transfer Protocol Protocolo que é a fundação da Web Orientado a transações de
transferência de dados entre cliente e servidor
Implementado sobre TCP/IP TCP: Garante integridade dos pacotes IP: Responsável pelo roteamento dos
pacotes
Copyleft 2006 Danilo Sato 5
Web - HTTP Protocolo “sem estado” (stateless)
Cada transação é tratada isoladamente Estrutura básica de uma transação HTTP:
Request Ação (Método HTTP) URL a ser acessada Parâmetros
Response Código de status (Sucesso ou Erro) Tipo do conteúdo (texto, imagem, HTML, ...) Conteúdo
Copyleft 2006 Danilo Sato 6
Web - HTTP
HTTP Request
HTTP Response
Cliente Servidor
GET URLHeaders... ... ... ... ...
GET URLHeaders... ... ... ... ...
200 OKHeaders... ... ... ... ...
200 OKHeaders... ... ... ... ... <html>
...</html>
<html>...</html>
Copyleft 2006 Danilo Sato 7
Web - HTTP Métodos HTTP (Request)
GET: Requisição de um recurso numa URL POST: Requisição para o servidor interpretar o
conteúdo do Request e encaminhá-lo para a URL HEAD: Pede apenas pelo cabeçalho que seria
retornado por um GET TRACE: Pede apenas um loopback da
mensagem enviada (para testes) PUT: Requisição para guardar o conteúdo na
URL informada DELETE: Requisição para apagar o recurso na
URL informada OPTIONS: Pede uma lista dos métodos HTTP
suportados na URL informada
Copyleft 2006 Danilo Sato 8
Web - HTTP (GET x POST) Anatomia de um GET:
GET /search?hl=pt-BR&q=struts HTTP/1.1Host: www.google.com.brUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: en-usKeep-Alive: 300Connection: keep-alive
ParâmetrosCaminho
Headers
Copyleft 2006 Danilo Sato 9
Web - HTTP (GET x POST) Anatomia de um POST:
POST /search HTTP/1.1Host: www.google.com.brUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: en-usKeep-Alive: 300Connection: keep-alive
?hl=pt-BR&q=struts
Caminho
Headers
Corpo
Copyleft 2006 Danilo Sato 10
Web - HTML
HTML = HyperText Markup Language Quando o servidor responde um
Request HTTP ele geralmente envia algum tipo de conteúdo para ser exibido no navegador (cliente)
Descreve como o navegador deve exibir o conteúdo para o usuário
Decora um texto com tags e atributos
Copyleft 2006 Danilo Sato 11
Web - HTML
Estrutura básica:<html> <head> <title>Título da Página</title> </head> <body> <!– Aqui vai o conteúdo a ser exibido --> <h1>Título</h1> <p> Parágrafo com um link para o <a href=“http://www.google.com”>Google</a> </p> <img src=“foto.jpg”/> </body></html>
Copyleft 2006 Danilo Sato 12
Web Servidores Web são bons para localizar um
recurso (uma página HTML, por exemplo) e entregar para o cliente (navegador)
Bom para conteúdo estático E se eu quiser colocar uma informação
dinâmica na página HTML? Data atual? Loja virtual:
1 página para cada produto? Total da compra?
Copyleft 2006 Danilo Sato 13
Web Servidor pode pedir ajuda para uma
“aplicação amiga” CGI = Common Gateway Interface Permite que o cliente (navegador) peça
conteúdo para outra aplicação que roda no servidor web
O servidor inicia a aplicação em outro processo e encaminha os parâmetros da requisição
A aplicação gera a página com conteúdo dinâmico e devolve para o servidor
Copyleft 2006 Danilo Sato 14
Web
HTTP Request
HTTP Response
Cliente Servidor
AplicaçãoAmiga
1 2
4 3
Copyleft 2006 Danilo Sato 15
Java para Web - Servlets Resposta de Java: Servlets Servlets são classes Java executadas no
servidor Servlets permitem o tratamento dinâmico
do Request e do Response Uso mais comum: HTTPServlet Servlets rodam dentro de um contêiner Contêiner funciona como a “aplicação
amiga” do servidor
Copyleft 2006 Danilo Sato 16
Java para Web - Servlets Vantagens sobre CGI:
Eficiência: No uso tradicional de CGI, um novo processo é iniciado a cada requisição HTTP. O contêiner é responsável pelo gerenciamento dos servlets, rodando sobre a mesma JVM em diferentes Threads
Conveniência: Escritos em Java. API que facilita manipulação da transação HTTP (cabeçalhos, cookies, session, ...)
Durabilidade: Servlets podem guardar informações entre diferentes requisições, facilitando o uso de, por exemplo, um pool de conexão com o Banco de Dados ou um cache
Copyleft 2006 Danilo Sato 17
Java para Web - Servlets
Vantagens sobre CGI: Portabilidade: Podem ser utilizados em
diferentes plataformas, pois são escritos em Java e seguem uma API bem definida
Segurança: Servlets são executados dentro de um contêiner rodando num Sandbox protegido, evitando a possibilidade de execução de Servlets potencialmente perigosos e mal-intencionados
Copyleft 2006 Danilo Sato 18
Java para Web - Servlets Ciclo de vida gerenciado pelo contêiner Quando uma requisição é mapeada para
um Servlet, o contêiner: Se uma instância do Servlet não existe:
Carrega a classe do Servlet Cria uma instância do Servlet Inicializa o Servlet chamando o método init
Chama o método service passando os objetos correspondente ao Request e ao Response
Copyleft 2006 Danilo Sato 19
Java para Web - Servlets
HTTP Request
HTTP Response
Cliente
Servidor
Servlet
ContêinerWeb
request
response
1 2
2service(request, response)doGet(request, response)
34
Copyleft 2006 Danilo Sato 20
Java para Web - Servlets
Exemplo: Hello WWW
public class HelloWWW extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>\n"); out.println("<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n"); out.println("<BODY>\n"); out.println("<H1>Hello WWW</H1>\n"); out.println("<P>Data atual:" + new Date() + "</P>"); out.println("</BODY></HTML>"); }}
Copyleft 2006 Danilo Sato 21
Java para Web - Servlets
Exemplo: Deployment Descriptor
<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/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>Hello WWW</servlet-name> <servlet-class>HelloWWW</servlet-class> </servlet> <servlet-mapping> <servlet-name>Hello WWW</servlet-name> <url-pattern>/Hello.do</url-pattern> </servlet-mapping></web-app>
Copyleft 2006 Danilo Sato 22
Java para Web - Servlets
Organização em um web-app (WAR):
WEB-INFWEB-INF
HelloHello
classesclasses liblib
HTMLs
web.xml
HelloWWW.class
...
Copyleft 2006 Danilo Sato 23
Java para Web - JSP Problema:
Gerar código HTML não é fácil Muitos print() e println()
Solução: JSP JSP = Java Server Pages Vantagens:
Separação da parte estática do HTML da parte dinâmica
Separação de profissionais
Copyleft 2006 Danilo Sato 24
Java para Web - JSP Basta incluir código Java no arquivo HTML
entre os marcadores "<%" e "%>" Um arquivo JSP parece mais com HTML que
com um Servlet Porém, o JSP é compilado e convertido num
Servlet (a parte estática vira println() e print())
Isso acontece na primeira vez que a página é requisitada
Copyleft 2006 Danilo Sato 25
Java para Web - JSP
Exemplo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@ page import="java.util.Date"%>
<html><head><title>Hello WWW</title></head><body> <h1>Hello WWW</h1> <p>Data atual: <%= new Date() %></p></body></html>
Copyleft 2006 Danilo Sato 26
Java para Web - JSP
JSP permite três tipos de construção: Elementos de script: Código Java que
fará parte do Servlet resultante Diretivas: Controla a estrutura geral do
Servlet resultante Ações: Permite utilizar componentes
existentes e controlar o comportamento do compilador JSP
Algumas variáveis pré-definidas
Copyleft 2006 Danilo Sato 27
Java para Web - JSP
Elemento JSP Sintaxe Interpretação
Expressão <%= expressão %> Expressão é avaliada e impressa na saída
Scriptlet <% código %> Código é inserido no método service()
Declaração <%! código %> Código é inserido no corpo do servlet
Diretiva JSP: page <%@ page att="val“ %>
Diretiva geral para o compilador JSP
Diretiva JSP: include <%@ include file="url" %>
Inclui um arquivo na hora que o servlet é gerado
Copyleft 2006 Danilo Sato 28
Java para Web - JSP
Elemento JSP Sintaxe Interpretação
Comentário <%-- foo --%> Foo é ignorado
Ação jsp:include <jsp:include page="url"/>
Inclui um arquivo na hora que a página é requisitada
Ação jsp:useBean <jsp:useBean att="val"/>
Encontra ou constrói um JavaBean
Ação jsp:setProperty
<jsp:setProperty att="val"/>
Atualiza uma propriedade do bean
Ação jsp:getProperty
<jsp:getProperty name="bean" property="prop"/>
Imprime o valor de uma propriedade do bean na saída
Copyleft 2006 Danilo Sato 29
Java para Web - JSP
Elemento JSP Sintaxe Interpretação
Ação jsp:forward <jsp:forward page="url"/>
Encaminha a requisição para outra página
Ação jsp:plugin <jsp:plugin att=val*>
...
</jsp:plugin>
Gera um tag OBJECT ou EMBED para executar um applet através do plugin Java
Copyleft 2006 Danilo Sato 30
Java para Web - JSP Variáveis pré-definidas:
request: representa o HttpServletRequest response: representa o HttpServletResponse out: representa o PrintWriter associado ao
response session: representa o HttpSession associado
ao request application: representa o ServletContext config: representa o ServletConfig pageContext: representa o PageContext page: apenas um sinônimo para this
Copyleft 2006 Danilo Sato 31
Java para Web - Servlets & JSP
As aplicações web começaram a ficar muito centradas no JSP
Muita lógica e código Java misturado no meio da página JSP
Nas primeiras especificações de JSP foram definidos: Modelo 1: Utiliza somente páginas JSP Modelo 2: Utiliza páginas JSP e Servlets
Copyleft 2006 Danilo Sato 32
Java para Web - Servlets & JSP
Modelo 1: Páginas JSP responsáveis pelo
processamento da requisição e construção da página de exibição
Copyleft 2006 Danilo Sato 33
Java para Web - Servlets & JSP
Modelo 2: Servlets processam a requisição Páginas JSP constroem da página de
exibição
Copyleft 2006 Danilo Sato 34
MVC Semelhança com idéia antiga de
Smalltalk Padrão conhecido como MVC Divisão de responsabilidades:
Model: representa o estado da aplicação (dados)
Controller: representa o fluxo de controle
View: representa a camada de exibição (apresentação na tela)
Copyleft 2006 Danilo Sato 35
MVC Vantagens:
Desacoplamento entre o modelo da aplicação e a camada de exibição
Permite a existência de diferentes camadas de exibição
Transparência: o modelo não precisa saber qual a camada de exibição usada
Utiliza o padrão Observer para que o modelo notifique alterações para a camada de exibição (View)
Copyleft 2006 Danilo Sato 36
MVC
Model
ControllerViewSeleciona a View
Ações do usuário
Con
sulta
dado
sN
otifi
caçã
o de
alter
ação A
lteração do estado
Copyleft 2006 Danilo Sato 37
Outras Tecnologias - JavaBeans
JavaBeans são classes Java com algumas características especiais
Seguem um determinado padrão: A classe deve ser concreta e pública Deve disponibilizar um construtor sem
argumentos Expõem os campos internos como
propriedades acessadas por métodos de acesso/atualização padronizados
Copyleft 2006 Danilo Sato 38
Outras Tecnologias - JavaBeans
Por seguir um padrão, podem ser manipulados por introspecção
Foram originalmente projetados para serem utilizados por reflexão
São largamente utilizados em outras aplicações (em especial no Struts)
Exemplo: Form do Struts
Copyleft 2006 Danilo Sato 39
Outras Tecnologias - JavaBeans Setters:
Métodos de alteração de estado Nome do método deve ser prefixado por “set” O primeiro caractere do nome da propriedade
deve ter letra maiúscula O valor de retorno é sempre void O método deve aceitar somente um argumento,
que pode ser de qualquer tipo Exemplo:
public void setTotal(Double total)
Copyleft 2006 Danilo Sato 40
Outras Tecnologias - JavaBeans Getters:
Métodos de recuperação de estado Nome do método deve ser prefixado por “get” O primeiro caractere do nome da propriedade
deve ter letra maiúscula O valor de retorno coincide com o parâmetro do
método setter O método não deve ter argumentos Exemplo:
public Double getTotal()
Copyleft 2006 Danilo Sato 41
Outras Tecnologias - JavaBeans Getters:
Variação para tipos booleanos: Nome do método pode ser prefixado por
“is” O primeiro caractere do nome da
propriedade deve ter letra maiúscula O valor de retorno deve ser Boolean ou
boolean O método não deve ter argumentos Exemplo:
public boolean isActive()
Copyleft 2006 Danilo Sato 42
Outras Tecnologias - JavaBeans Reflexão:
É o processo de determinar os membros e métodos de um objeto em tempo de execução
Introspecção: É uma forma especializada de reflexão usada na
API dos JavaBeans Através de introspecção é possível descobrir
quais métodos de um JavaBean devem ser chamados para alterar seu estado
O Struts usa introspecção para converter parâmetros HTTP em propriedades JavaBean e para popular campos HTML a partir de um JavaBean
Copyleft 2006 Danilo Sato 43
Outras Tecnologias - XML XML = Extensible Markup Language Originalmente criado para definir um
padrão para documentos estruturados Permite a separação da semântica dos
dados Atualmente é utilizado em diversas
situações e muitas tecnologias foram desenvolvidas ao seu redor: XML Schema, XPath, XSLT, RDF, SOAP ...
Copyleft 2006 Danilo Sato 44
Outras Tecnologias - XML Muitas tecnologias Java utilizam
documentos XML como arquivos de configuração
Quando utilizados dessa forma, os documentos XML são geralmente são chamamos de descritores
Exemplos: web.xml struts-config.xml
Copyleft 2006 Danilo Sato 45
Struts Básico Struts é um arcabouço (framework)
para desenvolvimento de aplicações Web em Java
Disponibiliza uma camada de controle robusta baseada em tecnologias conhecidas
Foco principal no Controller do MVC Encoraja o desenvolvimento de
aplicações no Modelo 2
Copyleft 2006 Danilo Sato 46
Struts Básico Utiliza um componente próprio para o
Controller Possui integração com outras tecnologias
para suporte ao Model e ao View: Model: JavaBeans e classes utilitárias View: TagLibs para utilização nas páginas JSP
Utiliza arquivos de configuração XML para juntar todos os componentes
O nome é uma analogia às características do Struts que facilitam a estruturação de uma aplicação web
Copyleft 2006 Danilo Sato 47
Struts Básico - Por quê?
Por que usar o Struts? Diversas tecnologias para representar
o Model (JavaBeans, EJB, JDBC) Diversas tecnologias para representar
o View em aplicações web (JSP, Velocity, JSF)
E o Controller?
Copyleft 2006 Danilo Sato 48
Struts Básico - Por quê? O Struts funciona como um
controlador central entre as regras de negócio e a interface com o usuário
Vantagens: Separação entre código de apresentação
e regras de negócio Você pode reaproveitar partes da regra
de negócio em diferentes fluxos Um lugar central para controlar a
interação entre as camadas
Copyleft 2006 Danilo Sato 49
Struts Básico - Por quê?
Outras funcionalidades: Internacionalização: suporte através
de ResourceBundles e TagLibs Gerenciamento de erros: mensagens
de erro geradas nas regras de negócio podem ser exibidas para o usuário
Validação de campos: suporte à validação dos dados de entrada de um Form
Copyleft 2006 Danilo Sato 50
Struts Básico - Visão Geral
Fluxo Básico de Controle
Copyleft 2006 Danilo Sato 51
Struts Básico - Visão Geral ActionServlet
Responsável pelo controle do fluxo de navegação Esse fluxo é definido no arquivo de configuração
(struts-config.xml) Fluxo pode ser alterado sem recompilar a aplicação
Action Classe de controle responsável por:
Acessar a camada de negócio Construir a resposta para a requisição Controle e tratamento de erros
Redireciona o fluxo de execução para uma página JSP (ou outra Action)
Copyleft 2006 Danilo Sato 52
Struts Básico - Visão Geral ActionForms
São JavaBeans Coletam informações de formulários para os objetos
Action Podem ser utilizados para preencher formulários
automaticamente Páginas JSP
Responsáveis apenas pela apresentação dos resultados
Tipicamente devem ter muito pouco código Java (devem usar as taglibs do Struts)
Copyleft 2006 Danilo Sato 53
Struts Básico - Visão Geral ActionMapping
Informa ao ActionServlet quais Action, ActionForm e ActionForwards devem ser utilizados para cada URI
Definidos no arquivo de configuração (struts-config.xml)
ActionForward Associa um nome lógico para um encaminhamento
(URI para um JSP ou outra Action) Definidos no arquivo de configuração (struts-
config.xml) Geralmente uma requisição é encaminhada
primeiramente para uma Action e depois para um JSP
Copyleft 2006 Danilo Sato 54
Struts Básico - Visão Geral Fluxo de uma requisição:
1. O servidor recebe uma requisição cuja URL corresponde a um Servlet (ActionServlet)
2. O container transfere o controle para o ActionServlet
3. O ActionServlet encontra o ActionMapping correspondente à URL requisitada
4. O ActionMapping especifica qual classe Action deve ser utilizada e o ActionForm associado
5. O ActionForm é populado com os dados de formulário da requisição (feito automaticamente pelo Struts – Introspecção no JavaBean)
Copyleft 2006 Danilo Sato 55
Struts Básico - Visão Geral6. O controle é transferido para Action
correspondente (através de uma chamada do método execute())
7. A Action utiliza os dados do ActionForm e acessa a camada de negócio (Model) para gerar uma resposta para a requisição
8. Uma vez gerada a resposta, a Action a armazena em algum contexto do contêiner (tipicamente request ou session) para acesso pela página JSP
9. A Action retorna um ActionForward para o ActionServlet indicando a página JSP (ou outro recurso) que exibirá a resposta
Copyleft 2006 Danilo Sato 56
Struts Básico - Visão Geral10. A página JSP constrói o resultado com
informações obtidas dos contextos utilizados (request ou session) ou do ActionForm
11. A página JSP encaminha o resultado para o contêiner
12. O contêiner encaminha a resposta para o cliente que iniciou a requisição
Copyleft 2006 Danilo Sato 57
Dúvidas ou Sugestões?