Java para Web com Struts Danilo Toshiaki Sato [email protected] Treinamento ALESP – SPL Módulo I 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 2 Agenda - Módulo I 1. Web 1. Partindo do princípio: HTTP, HTML 2. Java para Web: Servlets, JSP 2. MVC (Model-View-Controller) 3. Outras tecnologias utilizadas 1. Java Beans 2. XML 4. Struts básico Copyleft 2006 Danilo Sato 3 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 4 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 5 Web - HTTP GET URL Headers ... ... ... ... ... HTTP Request HTTP Response Cliente 200 OK Headers ... ... ...<html> Servidor ... ...... </html> Copyleft 2006 Danilo Sato 6 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 7 Web - HTTP (GET x POST) Anatomia de um GET: Caminho H e a d e r s Parâmetros GET /search?hl=pt-BR&q=struts HTTP/1.1 Host: www.google.com.br User-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-us Keep-Alive: 300 Connection: keep-alive Copyleft 2006 Danilo Sato 8 Web - HTTP (GET x POST) Anatomia de um POST: Caminho H e a d e r s POST /search HTTP/1.1 Host: www.google.com.br User-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-us Keep-Alive: 300 Connection: keep-alive ?hl=pt-BR&q=struts Corpo Copyleft 2006 Danilo Sato 9 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 10 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 11 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 12 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 13 Web HTTP Request 1 2 4 3 HTTP Response Aplicação Amiga Servidor Cliente Copyleft 2006 Danilo Sato 14 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 15 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 16 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 malintencionados Copyleft 2006 Danilo Sato 17 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 18 Java para Web - Servlets HTTP Request 1 4 2 Contêiner Web 3 Servlet HTTP Response Cliente 2 response service(request, response) doGet(request, response) request Copyleft 2006 Danilo Sato Servidor 19 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 20 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/webapp_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 21 Java para Web - Servlets Organização em um web-app (WAR): Hello ... WEB-INF HTMLs classes lib web.xml HelloWWW.class Copyleft 2006 Danilo Sato 22 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 23 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 24 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 25 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 26 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" %> Copyleft 2006 Danilo Sato Inclui um arquivo na hora que o servlet é gerado 27 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 28 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 29 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 30 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 31 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 32 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 33 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 34 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 35 MVC Model Seleciona a View View Controller Ações do usuário Copyleft 2006 Danilo Sato 36 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 37 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 38 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 39 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 40 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 41 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 42 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 43 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 44 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 45 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 46 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 47 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 48 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 49 Struts Básico - Visão Geral Fluxo Básico de Controle Copyleft 2006 Danilo Sato 50 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 51 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 52 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 (strutsconfig.xml) ActionForward Associa um nome lógico para um encaminhamento (URI para um JSP ou outra Action) Definidos no arquivo de configuração (strutsconfig.xml) Geralmente uma requisição é encaminhada primeiramente para uma Action e depois para um JSP Copyleft 2006 Danilo Sato 53 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 54 Struts Básico - Visão Geral 6. 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 55 Struts Básico - Visão Geral 10. 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 56 Dúvidas ou Sugestões? Copyleft 2006 Danilo Sato 57