servlet-introducao

9,536 views
9,344 views

Published on

Introdução à tecnologia Servlet.

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
9,536
On SlideShare
0
From Embeds
0
Number of Embeds
62
Actions
Shares
0
Downloads
499
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

servlet-introducao

  1. 1. Servlet/JSP Introdução Fábio Nogueira de Lucena Instituto de Informática (UFG)
  2. 2. Introdução Motivação, conceitos básicos, ...
  3. 3. Motivação <ul><li>Bem, você já deve estar usando Java .... </li></ul><ul><ul><li>Caso contrário </li></ul></ul><ul><ul><ul><li>“ Muitos” estão usando </li></ul></ul></ul><ul><ul><ul><li>Segurança </li></ul></ul></ul><ul><ul><ul><li>Eficiência, ... </li></ul></ul></ul><ul><li>Servlet/JSP são tecnologias Java para a camada de apresentação de aplicações web </li></ul>
  4. 4. Cenário “típico” (tiers) Extraído de http://java.sun.com/javaee/5/docs/tutorial/doc/geysj.html
  5. 5. Outra perspectiva... Extraído de http://java.sun.com/javaee/5/docs/tutorial/doc/geysj.html
  6. 6. Em mais detalhes... Extraído de http://java.sun.com/javaee/5/docs/tutorial/doc/geysj.html
  7. 7. Pré-requisitos para os exemplos <ul><li>Java 5.0 (compilar, executar, ...) </li></ul><ul><li>Noções de orientação a objetos e de UML </li></ul><ul><li>Tomcat </li></ul><ul><ul><li>http://jakarta.apache.org/tomcat </li></ul></ul><ul><li>Editor de sua preferência </li></ul><ul><ul><li>Emacs, ... </li></ul></ul><ul><ul><li>Deve gravar nos formatos UTF-8, ISO-8859-1,... </li></ul></ul><ul><li>Uma shell para execução do compilador </li></ul><ul><ul><li>Linux (bash) </li></ul></ul><ul><ul><li>Windows (cmd) </li></ul></ul><ul><li>Um browser </li></ul><ul><ul><li>Firefox, .... </li></ul></ul><ul><li>Seu entusiasmo também é bem-vindo! </li></ul>
  8. 8. Elementos básicos <ul><li>Aplicação web exige cliente e servidor </li></ul><ul><li>Cliente </li></ul><ul><ul><li>Envia requisição para o servidor </li></ul></ul><ul><ul><li>Aguarda resposta </li></ul></ul><ul><ul><li>Repete os passos acima... </li></ul></ul><ul><li>Servidor </li></ul><ul><ul><li>Aguarda requisição </li></ul></ul><ul><ul><li>Envia resposta </li></ul></ul><ul><ul><li>Repete os passos acima... </li></ul></ul>
  9. 9. Serviços <ul><li>Entre cliente e servidor há uma rede </li></ul><ul><ul><li>Oferece serviços de comunicação </li></ul></ul><ul><ul><li>Mesma rede, qualquer que seja a aplicação </li></ul></ul><ul><li>Oferecidos pelo servidor </li></ul><ul><ul><li>Uma parte gerencia a rede (conexões, ...) </li></ul></ul><ul><ul><li>Outra parte a lógica de aplicação </li></ul></ul><ul><ul><ul><li>Retorna página estática </li></ul></ul></ul><ul><ul><ul><li>Página dinâmica exige extensão ( server extensions ) </li></ul></ul></ul><ul><ul><ul><ul><li>CGI ( Common Gateway Interface ) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Netscape Server (NSAPI) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Microsoft Internet Information Server (ISAPI), e outros ... </li></ul></ul></ul></ul>
  10. 10. Da perspectiva Java <ul><li>Extensões do servidor são escritas usando </li></ul><ul><ul><li>Servlet API ( Servlet Application Programming Interface ) </li></ul></ul><ul><li>Módulos resultantes são conhecidos por </li></ul><ul><ul><li>Servlets ou componentes web </li></ul></ul><ul><li>Servlet é executado em um contêiner </li></ul><ul><ul><ul><li>Tomcat </li></ul></ul></ul><ul><ul><ul><li>Jetty </li></ul></ul></ul><ul><ul><ul><li>Resin, ... </li></ul></ul></ul>
  11. 11. Processo típico empregando Servlets <ul><li>Cliente ( browser ) </li></ul><ul><li>Servidor </li></ul><ul><ul><li>Servidor Web Apache + Tomcat </li></ul></ul><ul><li>Entre cliente/servidor </li></ul><ul><ul><li>Browser faz requisição de URL via rede </li></ul></ul><ul><ul><li>Requisição atinge Servidor Web </li></ul></ul><ul><ul><li>Servidor web retorna página estática ou encaminha para contêiner </li></ul></ul><ul><ul><li>Contêiner encaminha para servlet correspondente </li></ul></ul><ul><ul><li>Servlet providencia a resposta (toda funcionalidade de Java à disposição) </li></ul></ul>
  12. 12. Fontes de referência <ul><li>Existem várias fontes de informação. Consulte algumas delas por meio dos links abaixo: </li></ul><ul><ul><li>http://del.icio.us/kyriosdata/servlet </li></ul></ul><ul><ul><li>http://del.icio.us/kyriosdata/jsp </li></ul></ul>
  13. 13. Compreendendo Servlets Servlet = classe que implementa resposta à requisição de browser
  14. 14. Meu Primeiro Servlet (ambientação) [ http://exemplos.googlecode.com/svn/trunk/scwcd/exemplo ]
  15. 15. Meu Primeiro Servlet (RosnarDoCao) <ul><li>import java.io.*; </li></ul><ul><li>import javax.servlet.*; </li></ul><ul><li>import javax.servlet.http.*; </li></ul><ul><li>public class RosnarDoCao extends HttpServlet { </li></ul><ul><li>public void service ( HttpServletRequest request, </li></ul><ul><li>HttpServletResponse response) </li></ul><ul><li>throws ServletException, IOException { </li></ul><ul><li>PrintWriter pw = resonse.getWriter(); </li></ul><ul><li>pw.println(“<html><head></head><body>”); </li></ul><ul><li>pw.println(“<h1>O cão rosna...</h1>”); </li></ul><ul><li>pw.println(“</body></html>”); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  16. 16. Servlet (resumo parcial) <ul><li>O que é? </li></ul><ul><ul><li>Tecnologia que estende função de servidor web </li></ul></ul><ul><ul><li>Classe em Java </li></ul></ul><ul><ul><li>Módulo de extensão do servidor </li></ul></ul><ul><li>Onde é executado? </li></ul><ul><ul><li>No servidor </li></ul></ul><ul><li>Quem executa? </li></ul><ul><ul><li>Contêiner (Tomcat, Jetty, Resin, ...) </li></ul></ul><ul><li>Qual a função? </li></ul><ul><ul><li>Produzir resposta para requisição </li></ul></ul>
  17. 17. Perspectiva de programador <ul><li>Criar classe </li></ul><ul><ul><li>Em geral, várias classes </li></ul></ul><ul><li>Compilar </li></ul><ul><ul><li>Servlet é código em Java (deve ser compilado) </li></ul></ul><ul><li>Implantar </li></ul><ul><ul><li>Como dizer para o contêiner o que fazer e para quais requisições? (Em inglês: deployment ) </li></ul></ul><ul><li>Executar </li></ul><ul><ul><li>Como disparar a execução de um servlet? </li></ul></ul>
  18. 18. Criando classe (RosnarDoCao) <ul><li>import java.io.*; </li></ul><ul><li>import javax.servlet.*; </li></ul><ul><li>import javax.servlet.http.*; </li></ul><ul><li>public class RosnarDoCao extends HttpServlet { </li></ul><ul><li>public void service ( HttpServletRequest r, </li></ul><ul><li>HttpServletResponse s) </li></ul><ul><li>throws ServletException, IOException { </li></ul><ul><li>PrintWriter pw = s.getWriter(); </li></ul><ul><li>pw.println(“<html><head></head><body>”); </li></ul><ul><li>pw.println(“<h1>O cão rosna...</h1>”); </li></ul><ul><li>pw.println(“</body></html>”); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  19. 19. Compilando um Servlet <ul><li>Um servlet típico faz uso dos pacotes </li></ul><ul><ul><li>javax.servlet </li></ul></ul><ul><ul><li>javax.servlet.http </li></ul></ul><ul><li>Estes pacotes estão implementados em </li></ul><ul><ul><li>$CATALINA_HOMElibservlet-api.jar </li></ul></ul><ul><li>Acrescente à variável CLASSPATH </li></ul><ul><ul><li>$CATALINA_HOMEcommonlibservlet-api.jar </li></ul></ul><ul><li>Compile a classe </li></ul><ul><ul><li>javac –cp $CLASSPATH RosnarDoCao.java </li></ul></ul>
  20. 20. Implantando (web.xml) <ul><li>Descritor de implantação da aplicação </li></ul><ul><li>Trata-se de arquivo xml <?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?> </li></ul><ul><li>Elemento raiz ( web-app ) </li></ul><ul><li>O que é preciso para descrever um servlet? </li></ul><ul><ul><li>servlet </li></ul></ul><ul><ul><ul><li>servlet-name </li></ul></ul></ul><ul><ul><ul><li>servlet-class </li></ul></ul></ul><ul><ul><li>servlet-mapping </li></ul></ul><ul><ul><ul><li>servlet-name </li></ul></ul></ul><ul><ul><ul><li>url-pattern </li></ul></ul></ul>
  21. 21. Implantando (continuação) (web.xml) <ul><li><?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?> </li></ul><ul><li>< web-app xmlns=&quot;http://java.sun.com/xml/ns/j2ee&quot; </li></ul><ul><li>xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; </li></ul><ul><li>xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/j2ee </li></ul><ul><li>http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd&quot; </li></ul><ul><li>version=&quot;2.4&quot;> </li></ul><ul><li>< servlet > </li></ul><ul><li><servlet-name>Rosnar</servlet-name> </li></ul><ul><li><servlet-class>RosnarDoCao</servlet-class> </li></ul><ul><li></ servlet > </li></ul><ul><li>< servlet-mapping > </li></ul><ul><li><servlet-name>Rosnar</servlet-name> </li></ul><ul><li><url-pattern>/servlet/RosnarDoCao</url-pattern> </li></ul><ul><li></ servlet-mapping > </li></ul><ul><li></ web-app > </li></ul>
  22. 22. Implantando (continuação) (Tomcat) <ul><li>Cenário “mais simples impossível” </li></ul><ul><ul><li>exemplo (diretório do “contexto” da aplicação) </li></ul></ul><ul><ul><ul><li>WEB-INF (dir) </li></ul></ul></ul><ul><ul><ul><ul><li>web.xml (descrição da aplicação web) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>classes (dir) </li></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>RosnarDoCao.java (nosso servlet) </li></ul></ul></ul></ul></ul><ul><ul><ul><ul><ul><li>RosnarDoCao.class (arquivo gerado pelo javac) </li></ul></ul></ul></ul></ul><ul><li>Copie todo o diretório exemplo para $CATALINA_HOMEwebapps </li></ul><ul><li>Observações </li></ul><ul><ul><li>A estrutura acima é rígida (acostume-se com ela) </li></ul></ul>
  23. 23. Executando um Servlet <ul><li>Inicie o contêiner (Tomcat) </li></ul><ul><ul><li>startup.bat (para interromper use shutdown.bat ) </li></ul></ul><ul><li>Inicie o seu browser </li></ul><ul><li>Visite o URL </li></ul><ul><ul><li>http://localhost:8080/exemplo/servlet/RosnarDoCao </li></ul></ul><ul><li>Resultado </li></ul>
  24. 24. Revisão <ul><li>Criou-se uma aplicação mínima (contexto exemplo ) </li></ul><ul><li>O Tomcat foi iniciado </li></ul><ul><li>O browser foi iniciado </li></ul><ul><li>Uma requisição feita ao URL http://localhost:8080/exemplo/servlet/RosnardoCao </li></ul><ul><li>O Tomcat recebe e repassa a requisição para o servlet correspondente (ver web.xml) </li></ul><ul><li>Servlet rosnar é executado e a resposta enviada para o browser </li></ul><ul><li>Interromper o Tomcat ( shutdown.bat ) </li></ul>
  25. 25. Relação entre Servlet, Servlet contêiner e Servlet API
  26. 26. Servlet e Tomcat <ul><li>Servlet usa Servlet API </li></ul><ul><ul><li>javax.servlet </li></ul></ul><ul><ul><li>javax.servlet.http </li></ul></ul><ul><li>Por meio da Servlet API um Servlet comunica-se com o contêiner para: </li></ul><ul><ul><li>Obter detalhes de uma requisição </li></ul></ul><ul><ul><li>Fornecer o resultado de um requisição </li></ul></ul><ul><li>Um Servlet é executado no contêiner </li></ul>
  27. 27. Contexto <ul><li>RosnarDoCao faz uso de Servlet API </li></ul><ul><li>Contêiner Tomcat implementa a Servlet API </li></ul>
  28. 28. Estrutura de pacotes <ul><li>Onde encontrar </li></ul><ul><ul><li>http://java.sun.com/products/servlet </li></ul></ul><ul><li>Pacotes </li></ul><ul><ul><li>javax.servlet </li></ul></ul><ul><ul><li>javax.servlet.http </li></ul></ul>
  29. 29. Alguns detalhes... <ul><li>javax.servlet </li></ul><ul><ul><li>14 interfaces </li></ul></ul><ul><ul><li>9 classes </li></ul></ul><ul><ul><li>2 exceções </li></ul></ul><ul><li>javax.servlet.http </li></ul><ul><ul><li>8 interfaces </li></ul></ul><ul><ul><li>7 classes </li></ul></ul>
  30. 30. Componentes envolvidos <ul><li>Aplicação Web (por exemplo, RosnarDoCao ) </li></ul><ul><li>Servlet API (interface usada pelo servlet) </li></ul><ul><li>Servlet API (implementada pelo Tomcat) </li></ul><ul><li>Componente servlet-api.jar (contém implementação da Servlet API. </li></ul>
  31. 31. Elementos envolvidos na execução <ul><li>Cliente (através do browser ) </li></ul><ul><li>Servidor que hospeda: </li></ul><ul><ul><li>Servidor Web (não necessariamente está disponível) </li></ul></ul><ul><ul><li>Tomcat que hospeda: </li></ul></ul><ul><ul><ul><li>Aplicação Web </li></ul></ul></ul>
  32. 32. Comunicação entre elementos <ul><li>Browser requisita URL, servidor web recebe, analisa e encaminha para o Tomcat, que identifica aplicação web e chama service para o servlet em questão </li></ul>
  33. 33. Pacote javax.servlet
  34. 34. Componentes (14 interfaces) <ul><li>Filter </li></ul><ul><li>FilterChain </li></ul><ul><li>FilterConfig </li></ul><ul><li>RequestDispatcher </li></ul><ul><li>Servlet </li></ul><ul><li>ServletConfig </li></ul><ul><li>ServletContext </li></ul><ul><li>ServletContextAttributeListener </li></ul><ul><li>ServletContextListener </li></ul><ul><li>ServletRequest </li></ul><ul><li>ServletRequestAttributeListener </li></ul><ul><li>ServletRequestListener </li></ul><ul><li>ServletResponse </li></ul><ul><li>SingleThreadModel </li></ul>
  35. 35. Componentes (9 classes) <ul><li>GenericServlet </li></ul><ul><li>ServletContextAttributeEvent </li></ul><ul><li>ServletContextEvent </li></ul><ul><li>ServletInputStream </li></ul><ul><li>ServletOutputStream </li></ul><ul><li>ServletRequestAttributeEvent </li></ul><ul><li>ServletRequestEvent </li></ul><ul><li>ServletRequestWrapper </li></ul><ul><li>ServletResponseWrapper </li></ul>
  36. 36. Componentes (2 exceções) <ul><li>ServletException </li></ul><ul><li>UnavailableException </li></ul>
  37. 37. Interface Servlet <ul><li>Relembrando... </li></ul><ul><ul><li>Servlet é um pequeno programa em Java que estende a funcionalidade de um servidor Web. </li></ul></ul><ul><ul><li>Um servlet recebe e responde requisições de um cliente web, por exemplo, browser </li></ul></ul><ul><li>Para isto, um servlet implementa Servlet </li></ul><ul><ul><li>javax.servlet.Servlet </li></ul></ul>
  38. 38. Métodos da interface Servlet <ul><li>destroy() </li></ul><ul><li>ServletConfig getServletConfig() </li></ul><ul><li>String getServletInfo() </li></ul><ul><li>void init(ServletConfig config) </li></ul><ul><li>void service(ServletRequest request, ServletResponse response) </li></ul>Chamado pelo contêiner para que o servlet responda à requisição realizada pelo cliente!
  39. 39. Requisição e resposta (detalhes) <ul><li>javax.servlet.ServletRequest </li></ul><ul><li>javax.servlet.ServletResponse </li></ul>
  40. 40. Pacote javax.servlet.http Oferece a funcionalidade básica para servlets HTTP
  41. 41. Componentes (8 interfaces) <ul><li>HttpServletRequest </li></ul><ul><li>HttpServletResponse </li></ul><ul><li>HttpSession </li></ul><ul><li>HttpSessionActivationListener </li></ul><ul><li>HttpSessionAttributeListener </li></ul><ul><li>HttpSessionBindingListener </li></ul><ul><li>HttpSessionContext </li></ul><ul><li>HttpSessionListener </li></ul>
  42. 42. Componentes (7 classes) <ul><li>Cookie </li></ul><ul><li>HttpServlet </li></ul><ul><li>HttpServletRequestWrapper </li></ul><ul><li>HttpServletResponseWrapper </li></ul><ul><li>HttpSessionBindingEvent </li></ul><ul><li>HttpSessionEvent </li></ul><ul><li>HttpUtils (todos os métodos foram não recomendados) ( deprecated ) </li></ul>
  43. 43. Classe javax.servlet.http.HttpServlet
  44. 44. Compreendendo JavaServer Pages [ http://exemplos.googlecode.com/svn/trunk/scwcd/jaca/ ] JavaServer Page = Página HTML (web) + código em Java
  45. 45. Ilustração (página estática, Servlet e JSP) <ul><li>Jaca.html <html> <body> <h1>A jaca caiu</h1> </body> </html> </li></ul><ul><li>Jaca.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Java extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter pw = resp.getWriter(); pw.println(“<html><body>”); if (“jaca”.equals(“jaca”)) pw.println(“<h1>A jaca caiu</h1>”); else pw.println(“<h1>A jaca não caiu</h1>”); pw.println(“</body>”); pw.println(“</html>”); } } </li></ul>Arquivo HTML Classe Java <ul><li>Jaca.jsp <html><body> <% if (“jaca”.equals(“jaca”)) { %> <h1>A jaca caiu</h1> <% } else { %> <h1>A jaca não caiu</h1> <% } %> </body></html> </li></ul>
  46. 46. Executando página JSP <ul><li>Obtenha a minúscula aplicação “jaca” de http://exemplos.googlecode.com/svn/trunk/scwcd/jaca/ </li></ul><ul><li>Copie o diretório criado para o Tomcat (diretório $CATALINA_HOME/webapps) </li></ul><ul><li>Inicie o Tomcat (startup) </li></ul><ul><li>Ao menos de forma explícita Não há o que compilar! </li></ul><ul><li>Aponte o browser para http://localhost:8080/jaca/jaca.jsp </li></ul>
  47. 47. Quando usar JSP? Quando usar Servlet? <ul><li>JSP exibe o resultado da requisição </li></ul><ul><li>Servlet sabe o que precisa ser feito para atender a requisição </li></ul><ul><li>Modelo MVC (Model-View-Controller) </li></ul>
  48. 48. HTTP Noções
  49. 49. Só serão fornecidas noções, ... <ul><li>Se você estiver interessado em detalhes... </li></ul>http://www.w3.org/Protocols/rfc2616/rfc2616
  50. 50. Protocolo HTTP <ul><li>HTTP HyperText Transfer Protocol </li></ul><ul><li>Modelo requisição/resposta </li></ul><ul><li>Mensagem HTTP (usada para requisição) </li></ul><ul><li>Mensagem HTTP (usada para resposta) </li></ul><ul><li>Protocolo sem estado ( stateless ) </li></ul><ul><ul><li>Após resposta, servidor “esquece” cliente </li></ul></ul><ul><ul><li>Para servidor toda requisição é “nova”, a “primeira” </li></ul></ul>
  51. 51. Mensagem HTTP <ul><li>Requisição do cliente </li></ul><ul><li>Resposta do servidor </li></ul><ul><li>Elementos de uma mensagem: </li></ul><ul><ul><li>Linha inicial (identifica propósito) </li></ul></ul><ul><ul><li>Cabeçalho (informações como tipo, tamanho) </li></ul></ul><ul><ul><li>Linha em branco </li></ul></ul><ul><ul><li>Corpo da mensagem (opcional) </li></ul></ul><ul><ul><li>Todas as linhas terminam com CRLF </li></ul></ul><ul><ul><ul><li>ASCII 13 (carriage return) seguido de 10 (line feed) </li></ul></ul></ul>
  52. 52. Requisição HTTP <ul><li>Enviado do cliente para o servidor </li></ul><ul><li>Linha inicial </li></ul><ul><ul><li>Nome do método </li></ul></ul><ul><ul><li>Caminho do recurso requisitado (URI) </li></ul></ul><ul><ul><li>Versão de HTTP empregada </li></ul></ul><ul><li>Exemplo </li></ul><ul><ul><li>GET /exemplo/servlet/RosnarDoCao HTTP/1.1 </li></ul></ul>Veremos detalhes usando Tcpmon...
  53. 53. Métodos (requisição) <ul><li>HTTP 1.1 </li></ul><ul><ul><li>GET (recuperar um recurso) </li></ul></ul><ul><ul><li>HEAD (recuperar meta-informação) resposta não contém header </li></ul></ul><ul><ul><li>POST (enviar dados para o servidor) </li></ul></ul><ul><ul><li>PUT (adicionar um recurso ao servidor) disponibiliza dados via um URI </li></ul></ul><ul><ul><li>OPTIONS </li></ul></ul><ul><ul><li>DELETE </li></ul></ul><ul><ul><li>TRACE </li></ul></ul><ul><ul><li>CONNECT </li></ul></ul>
  54. 54. Resposta HTTP <ul><li>Primeira linha ( status ) </li></ul><ul><ul><li>HTTP/1.1 404 Not Found </li></ul></ul><ul><ul><li>HTTP/1.1 500 Internal Error </li></ul></ul><ul><li>Resposta completa HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Content-Length: 58 Date: Sun, 09 Apr 2006 19:53:18 GMT <html> <body> <h1>A jaca caiu</h1> </body> </html> </li></ul>
  55. 55. Monitorando conexões TCP/IP... <ul><li>TCPMON ( http://tcpmon.dev.java.net ) </li></ul>
  56. 56. Monitorando pelo browser <ul><li>Browser Firefox </li></ul><ul><ul><li>Firebug https://addons.mozilla.org/en-US/firefox/addon/1843 </li></ul></ul><ul><ul><li>Tamper Data https://addons.mozilla.org/en-US/firefox/addon/966 </li></ul></ul>

×