Java web

5.783 visualizações

Publicada em

1 comentário
1 gostou
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
5.783
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
161
Comentários
1
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt
  • Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt
  • Java web

    1. 1. Java Básico – Módulo 1 Java Web Java Web Régis Melo @regismelo@regismelo 1
    2. 2. Java Básico – Módulo 1 Java Web MissãoApresentar, motivar e exercitar a plataformaJava voltada para desenvolvimento deaplicações WEB. @regismelo 2
    3. 3. Java Básico – Módulo 1 Java Web Metodologias• Exposição e discussão teóricas;• Exercícios práticos de projeto e modelagem em laboratório. @regismelo 3
    4. 4. Java Básico – Módulo 1 Java Web O que esse curso não cobre ou não é?Não Cobre:• Conceitos gerais de Java e da plataforma J2SE.Não é:• Um curso para aprender Java – este é um curso para se aprofundar na plataforma, estudando os recursos voltados para web. @regismelo 4
    5. 5. Java Básico – Módulo 1 Java Web Programa I. Iniciando II. Introdução aos Applets III. Introdução a Servlets IV. Revisão do protocolo HTTP V. Trabalhando com dados de formulários VI. Processamento e ciclo de vida de um Servlet VII. Obtendo informações do ambiente VIII. Controle de Fluxo e Colaboração IX. Cookies X. Gerenciamento de Sessões XI. Java Server Pages XII. Tag Libs@regismelo 5
    6. 6. Java Básico – Módulo 1 Java Web Antes de iniciar…Vamos nos apresentar• Nome;• Empresa;• Experiência com programação;• Razões de estar fazendo esse treinamento;• Expectativas desse curso. @regismelo 6
    7. 7. Java Básico – Módulo 1 Java Web Livros sugeridos@regismelo 7
    8. 8. Java Básico – Módulo 1 Java Web Módulo I Iniciando@regismelo 8
    9. 9. Java Básico – Módulo 1 Java Web "People only see what they are prepared to see." Ralph Waldo Emerson@regismelo 9
    10. 10. Java Básico – Módulo 1 Java Web Iniciando• Nesse curso, abordaremos uma série de tecnologias do J2EE – Java 2 Enterprise Edition;• Iremos nos focar nos assuntos relacionados ao desenvolvimento para web. @regismelo 10
    11. 11. Java Básico – Módulo 1 Java Web Plataforma J2SE e J2EE@regismelo 11
    12. 12. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• No início as páginas eram apenas institucionais;• Não havia necessidade de dinamismo;• Serviços não eram oferecidos nas páginas;• Tecnologias utilizadas  HTML e eventualmente Applets. @regismelo 12
    13. 13. Java Básico – Módulo 1 Java WebPágina da Sefaz, em Dezembro de 1998@regismelo 13
    14. 14. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• Com o passar do tempo, percebeu-se a necessidade de interação;• O problema era como tornar as página dinâmicas;• Diversas tecnologias surgiram com esse fim. @regismelo 14
    15. 15. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• CGI – Common Gateway Interface – Surgiu em meados de 1996; – Na época era uma das única soluções para criação de web sites dinâmicos; – Em 1996, existiam cerca de 100.000 web sites e o browser mais utilizado era o Netscape Navigator 2.0 (o primeiro browser a suportar JavaScript – outra tecnologia para tornar páginas dinâmicas) @regismelo 15
    16. 16. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• CGI – Common Gateway Interface Um programa CGI pode ser implementado em diversas linguagens @regismelo 16
    17. 17. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web• CGI – Ciclo de Vida @regismelo 17
    18. 18. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• CGI – Common Gateway Interface – A escalabilidade é um dos principais problemas de aplicações CGI; – Para cada cliente, um novo processo é executado; – Se você tem um cliente, você tem um “executável” rodando; – Se você tem 1.000.000 de clientes… @regismelo 18
    19. 19. Java Básico – Módulo 1 Java Web Hello World em CGI/Perl#!/usr/local/bin/perl# simple Hello World scriptprint "Content-type: text/plainnn";print Hello World!; Toda a produção da página fica dentro de um programa que roda do lado servidor. @regismelo 19
    20. 20. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• ASP – Active Server Pages – Tecnologia bastante madura para o desenvolvimento de página dinâmicas; – É uma tecnologia desenvolvida pela Microsoft (não é multi-plataforma); – Excelentes ferramentas de desenvolvimento; – Diferente do CGI, é bastante escalável. @regismelo 20
    21. 21. Java Básico – Módulo 1 Java Web Hello World em ASP<%Dim I%> Código é embutido dentro da página HTML.<% <% e %> delimitam o código queFor I = 1 To 5 Step 1 será processado no servidor%> <FONT SIZE="<%= I %>">Hello World</FONT><BR><%Next%> @regismelo 21
    22. 22. Java Básico – Módulo 1 Java Web Hello World em ASPHello WorldHello WorldHello WorldHello WorldHello World@regismelo 22
    23. 23. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento WebTecnologias para desenvolvimento web• PHP – Linguagem de programação Server Side, HTML embedded; – Em teoria, similar ao ASP. @regismelo 23
    24. 24. Java Básico – Módulo 1 Java Web Hello World em PHP<HTML><HEAD></HEAD><BODY>This is in Html<BR><?php echo “Hello World<BR>"; ?></BODY></HTML>@regismelo 24
    25. 25. Java Básico – Módulo 1 Java WebBreve histórico do desenvolvimento Web “As tecnologias Java para web surgiram para resolver os problemas de escalabilidade, facilidade de uso e portabilidade.” @regismelo 25
    26. 26. Java Básico – Módulo 1 Java Web Página da Sefaz, Junho/2004@regismelo 26
    27. 27. Java Básico – Módulo 1 Java Web Módulo II Applets - Conceitos@regismelo 27
    28. 28. Java Básico – Módulo 1 Java Web Tecnologias Java para Web - Applets• Os applets surgiram em meados de 1996;• Applets = primeira tecnologia Java voltada para web;• Foram amplamente utilizadas para dar dinamismo as páginas;• As páginas HTML eram estáticas – o dinamismo era resolvido utilizando applets;• Código Java, executado do lado cliente. @regismelo 28
    29. 29. Java Básico – Módulo 1 Java Web AppletsExemplo deuma applet @regismelo 29
    30. 30. Java Básico – Módulo 1 Java Web Applets• Algumas aplicações que necessitam de interatividade intensiva, utilizam applets. @regismelo 30
    31. 31. Java Básico – Módulo 1 Java Web Applets - ExemploBiblioteca gráfica Classe que devepara “desenhar” ser extendida para criar uma nova appletimport java.applet.Applet;import java.awt.Graphics;class HelloWorld extends Applet{ public void paint(Graphics g){ g.drawString(“Hello World!”, 160, 70); } Método especial da applet chamado} pelo browser para “desenhar” o conteúdo da applet @regismelo 31
    32. 32. Java Básico – Módulo 1 Java Web Applets – Exemplo A página HTML que utiliza a applet<html><body><h1> O Applet Hello World” </h1><applet code = “HelloWorld.class” width = 400 height = 100></applet></body> Tag HTML utilizada para</html> referenciar a applet @regismelo 32
    33. 33. Java Básico – Módulo 1 Java Web Applets – Exemplo@regismelo 33
    34. 34. Java Básico – Módulo 1 Java Web Applets - Problemas• Código Java executado do lado cliente = necessidade de uma JVM no lado cliente;• Os browsers passaram a incorporar JVMs;• Atualização de versão das applets é feita de forma automática, porém...• Necessidade de constante atualização das JVMs. @regismelo 34
    35. 35. Java Básico – Módulo 1 Java Web Applets - Problemas• Para complicar, recentemente a instalação padrão dos principais browsers deixou de vir com suporte a JVMs;• As applets caíram em desuso... @regismelo 35
    36. 36. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter1.pdf)1.1 Servlets1.2 The Advantages of Servlets Over "Traditional" CGI – Efficient – Convenient – Powerful – Portable – Secure – Inexpensive1.3 JavaServer Pages1.4 The Advantages of JSP – Versus Active Server Pages (ASP) – Versus PHP – Versus Pure Servlets – Versus Server-Side Includes (SSI) – Versus JavaScript – Versus Static HTML @regismelo 36
    37. 37. Java Básico – Módulo 1 Java Web Módulo IIIIniciando no mundo dos Servlets@regismelo 37
    38. 38. Java Básico – Módulo 1 Java Web O que são Servlets?• Sevlets são a resposta da tecnologia Java a programação CGI(Common Gateway Interface);• Eles são programas que rodam em um servidor Web, agindo como uma camada intermediária entre uma requisição feita por um browser, ou outro cliente (em geral HTTP), com outras aplicações e banco de dados. @regismelo 38
    39. 39. Java Básico – Módulo 1 Java Web O que são Servlets?@regismelo 39
    40. 40. Java Básico – Módulo 1 Java Web Hello World com Servletsimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 40
    41. 41. Java Básico – Módulo 1 Java Web O que são Servlets?• Servlets são multi-thread (não sofrem com problemas de escalabilidade como as aplicações CGI) @regismelo 41
    42. 42. Java Básico – Módulo 1 Java Web Servlets x CGI• Eficientes – Em CGI cada requisição gera um novo processo no servidor. A JVM cria threads de execução para cada requisição;• Convenientes – Servlets já possuem todas as ferramentas para tratar documentos HTML, Cabeçalhos HTTP, Cookies, Gerenciamento de sessão etc. @regismelo 42
    43. 43. Java Básico – Módulo 1 Java Web Servlets x CGI• Poderosos – Servlets podem “falar” diretamente com o servidor Web (programas CGI precisam de uma API específica para cada servidor); – Servlets podem compartilhar dados facilitando a implementação de recursos compartilhados como pool conexões com o BD etc; @regismelo 43
    44. 44. Java Básico – Módulo 1 Java Web Servlets x CGI• Poderosos – Servlets podem manter dados entre as requisições, facilitando os mecanismos de gerenciamento de sessão etc. @regismelo 44
    45. 45. Java Básico – Módulo 1 Java Web Servlets x CGI• Portáveis – Feitos em Java e implementam um API padrão;• Seguros – CGI são executados como scripts shell do sistema;• Baratos – Existem servidores bons e gratuitos. @regismelo 45
    46. 46. Java Básico – Módulo 1 Java Web Entendendo o Hello World Classes do pacote java.io utilizadas para produzir Pacote com implementação das a saída do servlet interfaces e classes de Servletimport java.io.*;import javax.servlet.*; Implementação de Servletimport javax.servlet.http.*; para funcionar com HTTPpublic class HelloWorld extends HttpServlet{ ....} Servlets HTTP devem herdar dessa classe @regismelo 46
    47. 47. Java Básico – Módulo 1 Java Web Entendendo o Hello World Método chamado quando um usuário faz uma requisição public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ ...}Exceção geral disparada quando o servlet tem algum problema Encapsula os dados relativos a requisição (request) e o resultado Exceção disparada quando que será produzido (response) problemas na produção da página acontecem @regismelo 47
    48. 48. Java Básico – Módulo 1 Java Web Entendendo o Hello World Representa a saída Informa o tipo de conteúdo(a página que será produzida) que será produzido { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close();Produz o resultado } Finaliza o processo de geração da página @regismelo 48
    49. 49. Java Básico – Módulo 1 Java Web Entendendo o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 49
    50. 50. Java Básico – Módulo 1 Java Web Como rodar Servlets?• Para rodar Servlets é necessário instalar um servidor web que implemente a especificação de Servlets;• Pelo fato de Servlet ser uma especificação, e não uma implementação, o código escrito em um servidor de um fornecedor deverá funcionar sem alterações em outro servidor de outro fornecedor. @regismelo 50
    51. 51. Java Básico – Módulo 1 Java Web Como rodar Servlets?• A especificação da API de Servlets está atualmente na versão 2.4;• Existem dezenas de fornecedores e projetos open source que disponibilizam servidores compatíveis com a especificação de Servlets;• O software servidor é conhecido como container. @regismelo 51
    52. 52. Java Básico – Módulo 1 Java Web ContainersAlguns containers disponíveis: SUN Microsystems Atualmente conhecido como SUN One A solução IBM é conhecida como WebSphere BEA WebLogic Líder do mercado em soluções pagas JRUN – Solução da Macromedia Boa integração com seus produtos Borland Application Server @regismelo 52
    53. 53. Java Básico – Módulo 1 Java Web ContainersUtilizaremos nesse treinamento o Jakarta TomCat @regismelo 53
    54. 54. Java Básico – Módulo 1 Java Web TomCat• O TomCat é um servidor open source;• Fruto do projeto Jakarta, sub-projeto do projeto Apache;• O projeto Jakarta constrói aplicativos open source para java;• É a atual “reference implementation” da API Servlets e JSP;• Bastante utilizado e robusto. @regismelo 54
    55. 55. Java Básico – Módulo 1 Java Web TomCat• O TomCat pode ser obtido no site http://jakarta.apache.org/tomcat;• A versão que utilizaremos nesse treinamento é o TomCat 4.1.24, que suporta a especificação 2.3 da API Servlet (e JSP 1.2 que abordaremos mais a frente);• O arquivo disponível para instalação é o tomcat-4.1.24-LE-jdk14.exe. @regismelo 55
    56. 56. Java Básico – Módulo 1 Java Web Instalando o TomCat• Opções da instalação: TomCat rodará como um serviço (use somente em um ambiente de produção) @regismelo 56
    57. 57. Java Básico – Módulo 1 Java Web Instalando o TomCat• Ao final da instalação: Porta que o TomCat ficará escutando Usuário/senha utilizado para Administrar o TomCat @regismelo 57
    58. 58. Java Básico – Módulo 1 Java Web Instalando o TomCat• Depois da instalação concluída, você pode iniciar o servidor;• Para isso, utilize o ícone “Start TomCat”;• Ou carregue-o digitando o comando <tomcat>/bin/startup.bat ou <tomcat>/bin/startup.sh (linux/unix);• O TomCat é feito em Java, por isso, o mesmo código roda em qualquer S.O. que tenha uma JVM. @regismelo 58
    59. 59. Java Básico – Módulo 1 Java Web TomCat rodando@regismelo 59
    60. 60. Java Básico – Módulo 1 Java Web TomCat rodando• Para verificar se o TomCat está rodando corretamente, digite no seu browser: http://localhost:8080 Porta selecionada na instalação @regismelo 60
    61. 61. Java Básico – Módulo 1 Java Web TomCat rodando@regismelo 61
    62. 62. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Vamos agora configurar uma aplicação que irá rodar no TomCat;• As aplicações no TomCat, ficam em geral no diretório <tomcat>/webapps;• Vamos criar um diretório chamado curso debaixo dessa pasta: <tomcat>/webapps/curso @regismelo 62
    63. 63. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Essa pasta conterá nosso site;• A API de Servlets, a partir da versão 2.2, prevê uma estrutura padrão de diretórios das aplicações web;• Isso significa que da sua aplicação web, bem como seus arquivos de configuração se comportarão da mesma forma independente do produto que você esteja utilizado. @regismelo 63
    64. 64. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Document Root É a pasta raiz da sua aplicação web. Nela, colocaremos nossos arquivos HTML, JSP, etc.• WEB-INF Pasta padrão que conterá informações de configuração do seu site e suas classes (veja mais a frente). @regismelo 64
    65. 65. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• WEB-INF/web.xml Arquivo XML que descreve os servlets e outros componentes de sua aplicação.• WEB-INF/classes Contém as classes Java (e recursos associados) requeridos por sua aplicação (o nosso HelloWorld.class ficará nesse diretório). @regismelo 65
    66. 66. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• WEB-INF/lib Contém arquivos JAR requeridos por sua aplicação (como por exemplo, drivers JDBC). @regismelo 66
    67. 67. Java Básico – Módulo 1 Java Web Nossa estrutura de diretório Nossa aplicação Nossos servlets ficarão aqui@regismelo 67
    68. 68. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Após a estrutura de diretórios ter sido criada, podemos compilar nossa classe HelloWorld;• Podemos compilar essa classes usando nosso compilador favorito (Javac, Jikes ou a sua IDE). @regismelo 68
    69. 69. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• IMPORTANTE: Para compilar nossos servlets é necessário ter o arquivo servlet.jar no nosso classpath. Ele está disponível em <tomcat>/common/lib @regismelo 69
    70. 70. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Após compilado o arquivo, devemos copiar o nosso HelloWorld.class para o diretório: <tomcat>/webapps/curso/WEB-INF/classes @regismelo 70
    71. 71. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Antes de testar nossa aplicação precisamos configurar o TomCat para carregar nossos Servlets;• Essa configuração será feita no arquivo <tomcat>/conf/web.xml;• Precisamos apenas dizer que o TomCat irá carregar os servlets a partir de um determinada URL padrão. @regismelo 71
    72. 72. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Procure a entrada abaixo no arquivo <tomcat>/conf/ web.xml Perceba que essa entrada está comentada @regismelo 72
    73. 73. Java Básico – Módulo 1 Java Web Configurando uma Aplicação <servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>• Essa entrada diz que sempre que o usuário digitar... http://<servidor>:<porta>/<app>/servlet/<nomeServlet> O TomCat tentará carregar uma classe com o nome <nomeServlet> que herda de HttpServlet. @regismelo 73
    74. 74. Java Básico – Módulo 1 Java Web Configurando uma Aplicação• Essa linha, originalmente está comentada por questões de segurança;• Devemos retirar o comentário dessa linha para nosso servlet funcionar: @regismelo 74
    75. 75. Java Básico – Módulo 1 Java Web Relembrando o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 75
    76. 76. Java Básico – Módulo 1 Java Web Exercício• Primeiro, instalar e configurar o TomCat;• Iniciar o TomCat;• Digitar o código do slide anterior e salvá-lo em um arquivo chamado HelloWorld.java;• Compilar o código e copiar o .class para <tomcat>/webapps/curso/WEB-INF/classes;• Verificar se o HelloWorld funciona digitando no browser: http://localhost:8080/curso/servlet/HelloWorld 45 minutos @regismelo 76
    77. 77. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter1.pdf)1.5 Installation and Setup – Obtain Servlet and JSP Software – Bookmark or Install the Servlet and JSP API Documentation – Identify the Classes to the Java Compiler – Package the Classes – Configure the Server – Start the Server – Compile and Install Your ServletsCore Servlets and JSP Pages (CSAJSP-Chapter2.pdf)2.1 Basic Servlet Structure2.2 A Simple Servlet Generating Plain Text Compiling and Installing the Servlet Invoking the Servlet2.3 A Servlet That Generates HTML2.4 Packaging Servlets Creating Servlets in Packages Compiling Servlets in Packages Invoking Servlets in Packages @regismelo 77
    78. 78. Java Básico – Módulo 1 Java Web Módulo IV Revisão do protocolo HTTP@regismelo 78
    79. 79. Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP• A web que conhecemos hoje funciona com o protocolo HTTP, que significa Hyper Text Transfer Protocol;• HTTP é um protocolo, bastante simples, de transferência de dados;• É um padrão, definido pela W3C (http 1.1  RFC 2616) @regismelo 79
    80. 80. Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP@regismelo 80
    81. 81. Java Básico – Módulo 1 Java Web Revisão do protocolo HTTP• HTTP é um protocolo stateless, ou seja, não mantém estado;• Cada requisição estabelece uma conexão com o servidor, recebe os dados e fecha a conexão. @regismelo 81
    82. 82. Java Básico – Módulo 1 Java Web HTTP - Requisição• Quando um cliente faz uma requisição, ele especifica um comando, chamado método, que especifica o tipo de ação que ele quer efetuar;• A primeira linha da requisição também especifica a URL e a versão do protocolo: GET /index.jsp HTTP/1.0 @regismelo 82
    83. 83. Java Básico – Módulo 1 Java Web HTTP - Requisição• Após enviado o comando, o cliente pode enviar informações adicionais (tipo do browser, versão, etc): GET /index.jsp HTTP/1.0 User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95) Accept: image/gif, image/jpeg, text/*, */* @regismelo 83
    84. 84. Java Básico – Módulo 1 Java Web HTTP - Requisição• A requisição também pode ser feita com um método POST POST /index.jsp HTTP/1.0 User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95) Accept: image/gif, image/jpeg, text/*, */* @regismelo 84
    85. 85. Java Básico – Módulo 1 Java Web HTTP - RequisiçãoQual a diferença entre o método GET e o POST?• GET, envia dados através da URI (tamanho limitado) <uri>?dados• Um exemplo de um site que usa GET para enviar informações: http://www.google.com/search?q=cejug @regismelo 85
    86. 86. Java Básico – Módulo 1 Java Web HTTP - RequisiçãoQual a diferença entre o método GET e o POST?• POST envia os dados para o servidor como um fluxo de bytes – dados não aparecem na URL;• Útil para grandes formulários a informação não deve ser exibida na URL (senhas, por exemplo);• Desvantagem – usuário não pode fazer bookmarks da URL. @regismelo 86
    87. 87. Java Básico – Módulo 1 Java Web HTTP - Resposta• Feita uma requisição, o servidor envia uma resposta;• A primeira linha da resposta indica um código de status e sua descrição HTTP/1.0 200 OK @regismelo 87
    88. 88. Java Básico – Módulo 1 Java Web HTTP - RespostaAlguns códigos HTTP:• 200  Código default, sucesso;• 400  Erro de sintaxe na requisição;• 404  Recurso não existe no servidor;• 405  Método não permitido.Para consultar a lista completa, acesse: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html @regismelo 88
    89. 89. Java Básico – Módulo 1 Java Web HTTP - Resposta• Após a linha de status, o servidor envia os cabeçalhos de resposta: Date: Saturday, 23-May-00 03:25:12 GMT Server: Tomcat Web Server/3.2 MIME-version: 1.0 Content-type: text/html Content-length: 1029 Last-modified: Thursday, 7-May-00 12:15:35 GMT @regismelo 89
    90. 90. Java Básico – Módulo 1 Java Web HTTP – Resumindo@regismelo 90
    91. 91. Java Básico – Módulo 1 Java Web TCP Monitor• Uma boa forma de entender o protocolo HTTP é vê-lo funcionando;• O programa TCP Monitor exibe as requisições feitas pelos clientes e a resposta feita por um servidor;• O TCP Monitor é um utilitário, parte do projeto AXIS, do projeto Jakarta, e pode ser baixado em http://ws.apache.org/axis/ @regismelo 91
    92. 92. Java Básico – Módulo 1 Java Web Configurando o TCP Monitor• Primeiro passo – carregar o programa: java -cp axis.jar org.apache.axis.utils.tcpmon @regismelo 92
    93. 93. Java Básico – Módulo 1 Java Web Configurando o TCP MonitorSegundo passo – configurar Porta que será criada na nossa máquina O host para qual a requisição será direcionada Clique em adicionar depois de configurar @regismelo 93
    94. 94. Java Básico – Módulo 1 Java Web Configurando o TCP MonitorTerceiro passo – faça uma requisição normalmente doseu browser para a porta configurada: http://localhost:88 @regismelo 94
    95. 95. Java Básico – Módulo 1 Java Web Configurando o TCP MonitorE finalmente, veja os detalhes da requisição HTTP: @regismelo 95
    96. 96. Java Básico – Módulo 1 Java Web Exercício• Faça uma requisição ao seu próprio servidor e veja informações sobre a requisição;• Faça requisições a outros sites usando o TCP Monitor e descubra detalhes sobre alguns servidores. @regismelo 96
    97. 97. Java Básico – Módulo 1 Java Web Módulo V Trabalhando com dados de formulários@regismelo 97
    98. 98. Java Básico – Módulo 1 Java Web Dados vindos de formulários• Conforme vimos na nossa revisão de HTTP, dados podem ser postados utilizando os método GET e POST;• Iremos aprender nesse módulo como “capturar” esses dados nos nossos servlets. @regismelo 98
    99. 99. Java Básico – Módulo 1 Java Web Relembrando HTML e Formulários… Para onde o formulário Como o formulário será submetido será submetido <html> <form action="meuServlet" method=“get"> <input name="nome" type="text" value="Digite seu nome aqui!" size="40" maxlength="40"> </form> </html>@regismelo 99
    100. 100. Java Básico – Módulo 1 Java Web Dados vindos de formulários• No exemplo anterior, o formulário irá postar os dados para uma URL, no mesmo servidor, chamada meuServlet;• Precisamos criar um servlet para receber os dados desse formulário• Já sabemos criar um servlet, mas como receber os parâmetros passados? @regismelo 100
    101. 101. Java Básico – Módulo 1 Java Web Relembrando o HelloWorldimport java.io.*; import javax.servlet.*;import javax.servlet.http.*;public class HelloWorld extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( “Hello World!” ); out.close(); }}@regismelo 101
    102. 102. Java Básico – Módulo 1 Java Web A Interface HttpServletRequest• A instância de HttpServletRequest passada como parâmetro para o método doGet encapsula os dados vindos da requisição;• Através dela poderemos saber todos os dados relativos a requisição;• A interface HttpServletRequest herda de ServletRequest. @regismelo 102
    103. 103. Java Básico – Módulo 1 Java Web A Interface ServletRequestPrincipais métodos:• getParameter( String name )  - Retorna o valor relativo a um determinado parâmetro passado; - Esse parâmetro pode ser um dado de um formulário submetido ou um dado passado na URL; - O retorno de getParameter sempre é String! - Cuidado  O nome do parâmetro é sensitive case. - Cuidado  Se o parâmetro não existir na requisição, getParameter retorna null. @regismelo 103
    104. 104. Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• getParameterValues( String name )  - Retorna os valores relativos a um determinado parâmetro passado; - Use esse método quando um dado de um formulário tiver mais de um valor (um “select”, por exemplo) - O retorno de getParameterValues é um array de Strings. - Cuidado  O nome do parâmetro é sensitive case. - Cuidado  Se o parâmetro não existir na requisição, getParameterValues retorna null. @regismelo 104
    105. 105. Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• java.util.Map getParameterMap()  - Retornar todos os parâmetros passados na requisição, no formato de um Map. @regismelo 105
    106. 106. Java Básico – Módulo 1 Java Web …A Interface ServletRequestPrincipais métodos:• getMethod()  - Retorna o método utilizado para submeter os dados (GET, POST ou PUT).• getQueryString()  - Retorna a query postada (URL).• getParameterNames()  - Retorna um Enumeration de Strings contendo o nome de todos os parâmetros passados na requisição. @regismelo 106
    107. 107. Java Básico – Módulo 1 Java Web Construindo um formulário<html><form action="./servlet/Formulario" method="get"> <p> <input name="nome" type="text" value="Digite seu nome aqui!" size="40" maxlength="40"> </p> <p>Interesses:</p> <SELECT NAME=“preferencias" MULTIPLE> <OPTION VALUE=“1"> Musica </OPTION> <OPTION VALUE=“2"> Computadores </OPTION> <OPTION VALUE=“3"> Ocio </OPTION> </SELECT> <p> <input type="submit" name="Submit" value="Submit"> </p></form></html>@regismelo 107
    108. 108. Java Básico – Módulo 1 Java Web Servlet Formulariopublic class Formulario extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println("<HTML><HEAD><TITLE></TITLE>"); String nome = request.getParameter("nome"); out.println( "Nome --> " + nome + "<p>"); String[] dados = request.getParameterValues(“preferencias"); if ( dados == null ) out.println( "Dados é null." ); else for( int i=0; i < dados.length; i++ ) out.println( dados[i] ); }} @regismelo 108
    109. 109. Java Básico – Módulo 1 Java Web Entendedo o exemplo• Os dados do formulário são submetidos via GET;• Isso significa que também podemos disparar o servlet fazendo uma requisição na URL do tipo:http://localhost:8080/curso/servlet/Formulario ?nome=blabla&preferencias=1& preferencias=2 @regismelo 109
    110. 110. Java Básico – Módulo 1 Java Web Alterando o exemplo• Vamos alterar o exemplo anterior para que ele exiba todos os parâmetros passados;• Vamos utilizar o método getParameterNames para descobrir quais parâmetros foram passados para o formulário;• E o getParameterValues para obter os valores da requisição. @regismelo 110
    111. 111. Java Básico – Módulo 1 Java Web Servlet Formulario2public class Formulario2 extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponseresponse ) throws IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Enumeration paramNames = request.getParameterNames(); while(paramNames.hasMoreElements()) { String paramName = (String)paramNames.nextElement(); out.println( "<p><b> " + paramName + "</b><p>"); String[] paramValues = request.getParameterValues(paramName); for( int i=0; i < paramValues.length; ++i ) { out.print( "--> " + paramValues[i]); } }} @regismelo 111
    112. 112. Java Básico – Módulo 1 Java Web Suportando Post• Para fazer com que o servlet suporte GET, implementamos o método doGet;• Para fazer com que o servlet suporte POST, devemos implementar o método doPost. public void doPost( HttpServletRequest request, HttpServletResponse response ) @regismelo 112
    113. 113. Java Básico – Módulo 1 Java Web Suportando Post• Normalmente, é interessante suportar tanto get quanto post;• Para isso, é só implementar os dois métodospublic void doPost( HttpServletRequest request, HttpServletResponse response ) { ... }public void doGet ( HttpServletRequest request, HttpServletResponse response ) { ... } @regismelo 113
    114. 114. Java Básico – Módulo 1 Java Web Exercício• Construa um servlet que recebe as requisições de um formulário e exiba no browser;• Crie um servlet que mostre a lista de fatoriais entre 0 e 10;• Altere o servlet fatorial de forma que ele receba o valor máximo do fatorial a ser calculado e exiba o resultado do cálculo em uma tabela HTML. @regismelo 114
    115. 115. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter3.pdf)3.1 The Role of Form Data3.2 Reading Form Data from Servlets3.3 Example: Reading Three Explicit Parameters3.4 Example: Reading All Parameters3.5 A Resume Posting Service3.6 Filtering Strings for HTML-Specific Characters Code for Filtering Example @regismelo 115
    116. 116. Java Básico – Módulo 1 Java Web Módulo VIProcessamento e ciclo de vida de um Servlet@regismelo 116
    117. 117. Java Básico – Módulo 1 Java Web Servlet = Multi-Thread• Como já mencionamos, servlets são multi-thread;• A mesma instância do servlet processa diversas requisições. @regismelo 117
    118. 118. Java Básico – Módulo 1 Java Web Servlet = Multi Thread• Portanto, é importante programarmos os servlets de modo “thread safe”;• Isso significa – nada de propriedades de instância sendo utilizadas!• Cuidado com o acesso a recursos que podem ser danificados com o acesso multi-thread (arquivos, por exemplo). @regismelo 118
    119. 119. Java Básico – Módulo 1 Java Web Servlet Não Thread Safepublic class Problema extends HttpServlet{ public String nome; public void doGet ( HttpServletRequest request, HttpServletResponse response ) { nome = request.getParameter(“nome”); doSomething(); } public void doSomething() { deletarCliente(nome); Nome é uma propriedade } Não thread safe, compartilhada} pela mesma Instância do servlet  Problemas  @regismelo 119
    120. 120. Java Básico – Módulo 1 Java Web Servlet Thread Safepublic class Solucao extends HttpServlet{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) { String nome = request.getParameter(“nome”); doSomething(nome); } public void doSomething( String nome ) { deletarCliente(nome); } Nome é uma variável local.} Sem problemas com threads!  @regismelo 120
    121. 121. Java Básico – Módulo 1 Java Web Interface SingleThreadModel• Você pode sinalizar ao container para serializar o acesso a um servlet;• Basta fazer que seu servlet implemente a interface SingleThreadModel;• O Container pode garantir isso tornando o acesso ao servlet synchronized ou criando um pool de servlets, despachando cada acesso a um novo servlet. @regismelo 121
    122. 122. Java Básico – Módulo 1 Java Web Interface SingleThreadModel@regismelo 122
    123. 123. Java Básico – Módulo 1 Java Web Interface SingleThreadModel• Cuidado! O acesso serializado ao servlet diminui drasticamente a performance!!• Use-o somente quando for extremamente necessário (acesso a um arquivo no disco, por exemplo).• Na versão 2.4 da API de Servlets, SingleThreadModel está deprecated. @regismelo 123
    124. 124. Java Básico – Módulo 1 Java Web SingleThreadModelpublic class Solucao extends HttpServlet implements SingleThreadModel{ public void doGet ( HttpServletRequest request, HttpServletResponse response ) { doSomething(); } } @regismelo 124
    125. 125. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet@regismelo 125
    126. 126. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet• O ciclo de vida de um servlet é controlado pelo container;• Quando o servidor recebe uma requisição, ela é repassada para o container que a delega a um servlet. O container: 1 – Carrega a classe na memória; 2 – Cria uma instância da classe do servlet; 3 – Inicializa a instância chamando o método init()• Depois que o servlet foi inicializado, cada requisição é executado em um método service() • O container cria um objeto de requisição (ServletRequest) e de resposta (ServletResponse) e depois chama service() passando os objetos como parâmetros; • Quando a resposta é enviada, os objetos são destruídos.• Quando o container decidir remover o servlet da memória, ele o@regismelo chamando o método destroy() finaliza 126
    127. 127. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – init()• O método init() é disparado quando o servlet é carregado;• Você deve sobrescrevê-lo quando necessitar inicializar o servlet de alguma forma;• A sintaxe do método é: public void init(ServletConfig config) throws ServletException Sobrescreva esse public void init() método caso throws ServletException necessite inicializar algo @regismelo 127
    128. 128. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – init()• Caso você tenha algum problema na inicialização do Servlet, você deverá disparar a exceção UnavailableException (subclasse de ServletException). ... public void init() throws ServletException { String dir = getInitParameter(“diretorio”); // Problemas ao ler configuracao? if ( dir == null ) throw new UnavailableException(“Erro na configuracao!”) } @regismelo 128
    129. 129. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – service()• O método service() é o método que irá disparar o doGet ou doPost.• Ele é um método abstrato na sua declaração em GenericServlet. HttpServlet implementa esse método repassando a chamada para doGet ou doPost. @regismelo 129
    130. 130. Java Básico – Módulo 1 Java Web Diagrama de classes• Servlets não necessariamente estão ligados a aplicações web. Essa é a razão de existir a classe GenericServlet e a implementação HttpServlet @regismelo 130
    131. 131. Java Básico – Módulo 1 Java Web Ciclo de vida de um Servlet – destroy()• O método destroy() é chamado pelo container antes do servlet ser destruído;• O momento em quem o servlet será desativado é decidido pelo container;• É a última oportunidade para “limpar a casa”. public void destroy() { ... } @regismelo 131
    132. 132. Java Básico – Módulo 1 Java Web Processamento em Background• Um servlet pode fazer mais que simplesmente servir clientes;• Ele pode trabalhar entre os acessos;• Essa é uma habilidade interessante para processos muito demorados;• Um cliente pode, por exemplo, disparar um processo e eventualmente ficar consultando o resultado do processamento. @regismelo 132
    133. 133. Java Básico – Módulo 1 Java Web …Processamento em Background• Para exemplificar, vamos criar um servlet que calcule números primos;• Para fazer com que o processamento demore bastante, vamos iniciar a busca por números primos a partir de 1.000.000 (hum milhão);• Vamos utilizar um thread para ficar realizando o processamento em background. @regismelo 133
    134. 134. Java Básico – Módulo 1 Java Web ServletBackgroundimport java.io.*; import java.util.*;import javax.servlet.*; import javax.servlet.http.*;public class ServletBackground extends HttpServletimplements Runnable{private long lastprime = 0; // Ultimo primo encontradoDate lastprimeModified = new Date();Thread searcher; // Thread para buscapublic void init() throws ServletException { searcher = new Thread( this ); searcher.setPriority( Thread.MIN_PRIORITY ); searcher.start();}// ... Continua  @regismelo 134
    135. 135. Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuaçãopublic void run() { long candidate = 1000001L; // um milhao e um // Loop para buscar eternamente primos... while (!searcher.interrupted()) { if (isPrime(candidate)) { lastprime = candidate; lastprimeModified = new Date(); } candidate += 2; // Nos. pares não são primos // Dormir por 200ms... try { Thread.sleep(200); } catch (InterruptedException ignored) { } } @regismelo 135}
    136. 136. Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuaçãoprivate static boolean isPrime(long candidate) { long sqrt = (long) Math.sqrt(candidate); for (long i = 3; i <= sqrt; i += 2) { if (candidate % i == 0) return false; } return true;}public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); if (lastprime == 0) { out.println(“Procurando o 1o. primo..."); } else {out.println(“O último primo encontrado foi " + lastprime); out.println(" em " + lastprimeModified); } @regismelo 136}
    137. 137. Java Básico – Módulo 1 Java Web ServletBackground//  ... Continuação public void destroy() { // Sinalizar para o thread parar... searcher.interrupt(); }} @regismelo 137
    138. 138. Java Básico – Módulo 1 Java Web Exercício• Crie um servlet que exibe (usando System.out.println) os devidos eventos do ciclo de vida (init, service e destroy);• Implementa o exemplo ServletBackground e observe-o funcionar. @regismelo 138
    139. 139. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter2.pdf)2.6 The Servlet Life Cycle – The init Method – The service Method – The doGet, doPost, and doXxx Methods – The SingleThreadModel Interface – The destroy Method @regismelo 139
    140. 140. Java Básico – Módulo 1 Java Web Módulo VII Obtendo informações do ambiente@regismelo 140
    141. 141. Java Básico – Módulo 1 Java Web Obtendo informações• Em alguns casos é bastante importante conhecer informações do ambiente cliente e servidor;• Por exemplo, você pode decidir utilizar JavaScript ou não, dependendo da capacidade do browser que fez a requisição;• Ou, até mesmo, exibir a página utilizando uma outra língua, dependo do cliente que fez a requisição. @regismelo 141
    142. 142. Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• getLocale()  - Retorna o “Locale” associado ao cliente; - Locale é um objeto java, que dá informações relativas a localização; - As informações são extraídas a partir de Accept- Language. Se o cliente não prover esse cabeçalho HTTP, getLocale retorna o Locale default do servidor. @regismelo 142
    143. 143. Java Básico – Módulo 1 Java Web Localizacaopublic class Localizacao extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( "<p> getDisplayName --> " + request.getLocale().getDisplayName() ); out.println( "<p> getCountry --> " + request.getLocale().getCountry() ); out.println( "<p> getDisplayLanguage --> " + request.getLocale().getDisplayLanguage() ); out.println( "<p> getISO3Country --> " + request.getLocale().getISO3Country() ); out.println( "<p> getISO3Country --> " + request.getLocale().getISO3Language() ); out.close(); } } @regismelo 143
    144. 144. Java Básico – Módulo 1 Java Web Rodando o exercício anterior@regismelo 144
    145. 145. Java Básico – Módulo 1 Java Web Obtendo informaçõesDicas com relação ao Locale• getISO3Country  - Retorna 3 bytes indicando o país; - Você pode obter a lista dos países em http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_3166.html - Alguns países: - BRA – Brasil; - USA – Estados Unidos; - ARG – Argentina @regismelo 145
    146. 146. Java Básico – Módulo 1 Java Web Obtendo informaçõesDicas com relação ao Locale• getISO3Language  - Retorna 3 bytes indicando a linguagem preferencial do cliente; - Você pode obter a lista das linguagens em http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt - Algumas linguagens: - por – Português; - eng – Inglês. @regismelo 146
    147. 147. Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• String getHeader( String name )  - Obtém o valor associado a um determinado header• Enumeration getHeaderNames()  - Obtém o nome de todos os headers da requisição- Headeres úteis: - user-agent – Indica o browser e o S.O. do cliente; - refer – Indica de onde o usuário veio (a URL). @regismelo 147
    148. 148. Java Básico – Módulo 1 Java Web HttpHeaderpublic class HttpHeaderExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Enumeration enum = request.getHeaderNames(); String header; while( enum.hasMoreElements() ) { header = (String)enum.nextElement(); out.println( "<p> " + header + " --> "); out.println( request.getHeader( header ) ); } out.close(); }} @regismelo 148
    149. 149. Java Básico – Módulo 1 Java Web HttpHeader@regismelo 149
    150. 150. Java Básico – Módulo 1 Java Web Obtendo informaçõesMétodos interessantes ligados a HttpServletRequest:• String getRemoteAddr()  - Retorna o endereço IP do cliente que fez a requisição• String getRemoteHost()  - Retorna o nome do cliente que fez a requisição.- Com esses métodos você consegue saber quem acessa o seu site. @regismelo 150
    151. 151. Java Básico – Módulo 1 Java Web HttpAddrExemplopublic class HttpAddrExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println( "<p> getRemoteAddr --> " + request.getRemoteAddr() ); out.println( "<p> getRemoteHost --> " + request.getRemoteHost() ); out.close(); }} @regismelo 151
    152. 152. Java Básico – Módulo 1 Java Web HttpAddrExemplo@regismelo 152
    153. 153. Java Básico – Módulo 1 Java Web Exercício• Construa um servlet que a partir da requisição do cliente exibe qual o browser está sendo utilizado e qual S.O.;• Além disso, o servlet deverá exibir o IP do cliente;• O Servlet deverá mostrar a frase: “The quick brown fox jumps over the lazy dog” ou “A rápida raposa castanha pula sobre o cachorro preguiçoso” Dependendo da língua preferida do usuário. Dica  Para mudar as configurações de língua, no Internet Explorer acesse o menu Tools/Internet Options/Languages. @regismelo 153
    154. 154. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP PagesCHAPTER 5 (CSAJSP-Chapter5.pdf) Accessing the Standard CGI Variables 5.1 Servlet Equivalent of CGI Variables 5.2 A Servlet That Shows the CGI VariablesCHAPTER 6 (CSAJSP-Chapter6.pdf) Generating the Server Response: HTTP Status Codes 6.1 Specifying Status Codes 6.2 HTTP 1.1 Status Codes and Their Purpose 6.3 A Front End to Various Search EnginesCHAPTER 7(CSAJSP-Chapter7.pdf) Generating the Server Response: HTTP Response Headers 7.1 Setting Response Headers from Servlets 7.2 HTTP 1.1 Response Headers and Their Meaning 7.3 Persistent Servlet State and Auto-Reloading Pages 7.4 Using Persistent HTTP Connections 7.5 Using Servlets to Generate GIF Images@regismelo 154
    155. 155. Java Básico – Módulo 1 Java Web Módulo VIIIControle de fluxo e colaboração@regismelo 155
    156. 156. Java Básico – Módulo 1 Java Web Controle de Fluxo• Utilizando técnicas de controle de fluxo você pode redirecionar uma requisição;• Redirecionar, significa ir para uma outra página ou um outro servlet;• Você pode, por exemplo, receber uma requisição gerada a partir de uma página estática, fazer um processamento, e desviar para uma página dinâmica. @regismelo 156
    157. 157. Java Básico – Módulo 1 Java Web Controle de Fluxo• A primeira maneira de redirecionar uma página é retornando para o browser um cabeçalho HTTP de forma que ele gere uma nova requisição para outra página; @regismelo 157
    158. 158. Java Básico – Módulo 1 Java Web Controle de FluxoMétodo de HttpServletResponse• void sendRedirect(String location)  - Retorna um status HTTP que força o cliente a fazer uma nova requisição a nova location. - OBS: Você só pode utilizar esse método antes do response ser enviado para o cliente, do contrário, o método disparará IllegalStateException. @regismelo 158
    159. 159. Java Básico – Módulo 1 Java Web SendRedirectExemplopublic class SendRedirectExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { // Faça alguma coisa aqui ... response.sendRedirect( “http://www.sagaranatech.com“ ); // Oops!Nesse ponto você não pode mais gerar conteúdo! }} @regismelo 159
    160. 160. Java Básico – Módulo 1 Java Web Desvantagens do sendRedirect• O método sendRedirect retorna para o browser um código HTTP que faz com que ele faça outra requisição;• Isso significa que para o redirecionamento acontecer, outra requisição é necessária;• Essa é uma abordagem que pode ser lenta... @regismelo 160
    161. 161. Java Básico – Módulo 1 Java Web Redirecionamento• Existe uma outra forma de redirecionar, sem necessitar uma nova requisição;• É mais rápido redirecionar dentro do próprio servidor (sem realizar uma nova requisição);• Antes de ver como redirecionar, vamos aprender um pouco sobre “Servlet Collaboration”. @regismelo 161
    162. 162. Java Básico – Módulo 1 Java Web Servlet Collaboration• Eventualmente é interessante se comunicar com outros servlets dentro do mesmo servidor;• Damos a isso o nome de “colaboração”;• O seu servlet, por exemplo, pode fazer algum processamento e transferir a responsabilidade de lidar com a requisição para outro servlet. @regismelo 162
    163. 163. Java Básico – Módulo 1 Java Web Servlet Collaboration• Para suportar delegação, a API 2.1 de servlets inclue a interface javax.servlet.RequestDispatcher;• Utilize o método public RequestDispatcher ServletRequest.getRequestDispatcher(String path)• Dessa forma, você só pode redirecionar para recursos dentro do mesmo contexto. @regismelo 163
    164. 164. Java Básico – Módulo 1 Java Web Contextos?• Web Containers suportam a implantação de múltiplas aplicações web; – Definindo contextos separados para execução de servlets• No TomCat, essas aplicações estão na pasta webapps/• Todo diretório de contexto tem uma estrutura definida, que consiste de – Área de documentos do contexto (/), acessível externamente; – Área inacessível (/WEB-INF), que possui pelo menos um arquivo de configuração padrão (web.xml); – O WEB-INF pode conter ainda dois diretórios reconhecidos pelo servidor: o classpath da aplicação (WEB-INF/classes) e outro JARs para inclusão no classpath (/WEB-INF/lib). @regismelo 164
    165. 165. Java Básico – Módulo 1 Java Web Contextos• Contextos isolam as aplicações web;• A grande vantagem dos contextos é que uma aplicação não “quebra” outra aplicação;• Tudo está isolado, inclusive as classes que estão na memória. @regismelo 165
    166. 166. Java Básico – Módulo 1 Java Web Contextos@regismelo 166
    167. 167. Java Básico – Módulo 1 Java Web Servlet Collaboration• Voltando para o RequestDispatcher... public RequestDispatcher ServletRequest.getRequestDispatcher(String path)• O objeto RequestDispatcher possui dois métodos importantes: – forward( ServletRequest request, ServletResponse response )  - Redireciona para a página; – include( ServletRequest request, ServletResponse response )  - Inclue a página no response. @regismelo 167
    168. 168. Java Básico – Módulo 1 Java Web ForwardExemploimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;public class ForwardExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); rd.forward( request, response ); }} @regismelo 168
    169. 169. Java Básico – Módulo 1 Java Web IncludeExemploimport java.io.*;import javax.servlet.*;import javax.servlet.http.*;import java.util.*;public class IncludeExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); rd.include( request, response ); }} @regismelo 169
    170. 170. Java Básico – Módulo 1 Java Web IncludeExemplo2public class IncludeExemplo2 extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); RequestDispatcher rd = request.getRequestDispatcher("/Menu.html" ); rd.include( request, response ); out.println( "Regis Melo" ); rd = request.getRequestDispatcher("/Bottom.html" ); rd.include( request, response ); }} @regismelo 170
    171. 171. Java Básico – Módulo 1 Java Web Definindo atributos• Na API de Servlets, você pode disponibilizar informações entre servlets através da requisição;• O tempo de vida dessas informações é curto – somente o tempo da requisição. @regismelo 171
    172. 172. Java Básico – Módulo 1 Java Web Definindo atributosMétodos da interface ServletRequest• setAttribute( String name, Object o )  - Disponibiliza uma informação que só será visível para essa requisição;• removeAttribute( String name )  - Remove um atributo da requisição• Object getAttribute( String name )  - Obtém o atributo da requisição• Enumeration getAttributeNames()  - Retorna o nome de todos os atributos na requisição. @regismelo 172
    173. 173. Java Básico – Módulo 1 Java Web ForwardExemplo// import ...public class ForwardExemplo extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); RequestDispatcher rd = request.getRequestDispatcher("/DiaHoje.jsp" ); request.setAttribute( “cdCliente”, new Integer(10) ); rd.forward( request, response ); } Esse atributo estará disponível} para a página que está sendo redirecionada @regismelo 173
    174. 174. Java Básico – Módulo 1 Java Web Exercício• Defina um arquivo HTML representando um header, outro representando um footer;• Faça com que seu servlet inclua esses dois arquivos e exiba um conteúdo qualquer. @regismelo 174
    175. 175. Java Básico – Módulo 1 Java Web Exercício• Crie um novo servlet que receberá os dados de um formulário e gravará no banco de dados;• Caso os dados sejam gravados com sucesso, redirecione para uma página estática, mostrando sucesso;• Caso algum erro aconteça, redirecione para uma página de erro. @regismelo 175
    176. 176. Java Básico – Módulo 1 Java Web Exercício• Ainda no mesmo exercício, crie um link na sua aplicação que listará os dados de uma tabela no banco de dados;• Você deverá criar dois servlets - um deverá fazer a consulta no banco de dados, e disponibilizar na requisição os registros utilizando um ArrayList. Após feito isso, esse servlet deverá redirecionar para outro servlet que construirá a página a partir do ArrayList disponibilizado na requisição. @regismelo 176
    177. 177. Java Básico – Módulo 1 Java Web Para saber maisCore Servlets and JSP Pages (CSAJSP-Chapter15.pdf)15.1 Forwarding Requests 354 Using Static Resources 354 Supplying Information to the Destination Pages 355 Interpreting Relative URLs in the Destination Page 357 Alternative Means of Getting a RequestDispatcher 35815.2 Example: An On-Line Travel Agent 35815.3 Including Static or Dynamic Content 37515.4 Example: Showing Raw Servlet and JSP Output 37715.5 Forwarding Requests From JSP Pages 380@regismelo 177
    178. 178. Java Básico – Módulo 1 Java Web Módulo IX Cookies@regismelo 178
    179. 179. Java Básico – Módulo 1 Java Web Cookies• “Cookies são pequenas informações, enviadas pelo web server para um browser, que pode ser lida posteriormente do browser”;• Cookies foram introduzidos no Netscape Navigator (Netscape 0.94 beta);• Apesar de não serem um padrão oficial (definido pela IETF, Internet Engineering Task Force), cookies se tornaram um padrão de fato.• Atualmente, a especificação está padronizada através da RFC 2109 (http://www.ietf.org/rfc/rfc2109.txt) @regismelo 179

    ×