Java Básico – Módulo 1
                                     Java Web




             Java Web

             Régis Melo
              @regismelo




@regismelo                                  1
Java Básico – Módulo 1
                                            Java Web




                  Missão

Apresentar, motivar e exercitar a plataforma
Java voltada para desenvolvimento de
aplicações WEB.




  @regismelo                                       2
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
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
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
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
Java Básico – Módulo 1
                                          Java Web




             Livros sugeridos




@regismelo                                       7
Java Básico – Módulo 1
                                   Java Web




             Módulo I



             Iniciando




@regismelo                                8
Java Básico – Módulo 1
                                 Java Web




 "People only see what they
    are prepared to see."

              Ralph Waldo Emerson


@regismelo                              9
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
Java Básico – Módulo 1
                                           Java Web




             Plataforma J2SE e J2EE




@regismelo                                       11
Java Básico – Módulo 1
                                                      Java Web




Breve 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
Java Básico – Módulo 1
                                     Java Web




Página da Sefaz, em Dezembro de 1998




@regismelo                                 13
Java Básico – Módulo 1
                                               Java Web




Breve 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
Java Básico – Módulo 1
                                                      Java Web




Breve histórico do desenvolvimento Web

Tecnologias 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
Java Básico – Módulo 1
                                                 Java Web




Breve histórico do desenvolvimento Web

• CGI – Common Gateway Interface




                       Um programa CGI pode
                        ser implementado em
                         diversas linguagens


 @regismelo                                            16
Java Básico – Módulo 1
                                      Java Web




Breve histórico do desenvolvimento Web

• CGI – Ciclo de Vida




 @regismelo                                 17
Java Básico – Módulo 1
                                                     Java Web




Breve histórico do desenvolvimento Web

Tecnologias 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
Java Básico – Módulo 1
                                                         Java Web




               Hello World em CGI/Perl

#!/usr/local/bin/perl
# simple Hello World script
print "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
Java Básico – Módulo 1
                                                         Java Web




Breve histórico do desenvolvimento Web

Tecnologias 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
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 que
For I = 1 To 5 Step 1             será processado no servidor
%>
   <FONT SIZE="<%= I %>">Hello World</FONT><BR>
<%
Next
%>




  @regismelo                                                     21
Java Básico – Módulo 1
                                             Java Web




              Hello World em ASP

Hello World
Hello World
Hello World
Hello World
Hello World


@regismelo                                         22
Java Básico – Módulo 1
                                                 Java Web




Breve histórico do desenvolvimento Web

Tecnologias para desenvolvimento web
• PHP
   – Linguagem de programação Server Side, HTML
     embedded;
   – Em teoria, similar ao ASP.




 @regismelo                                            23
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
Java Básico – Módulo 1
                                              Java Web




Breve histórico do desenvolvimento Web


   “As tecnologias Java para web surgiram para
      resolver os problemas de escalabilidade,
          facilidade de uso e portabilidade.”




 @regismelo                                         25
Java Básico – Módulo 1
                                              Java Web




             Página da Sefaz, Junho/2004




@regismelo                                          26
Java Básico – Módulo 1
                                        Java Web




                  Módulo II



             Applets - Conceitos




@regismelo                                    27
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
Java Básico – Módulo 1
                                   Java Web



               Applets



Exemplo de
uma applet




  @regismelo                             29
Java Básico – Módulo 1
                                                   Java Web




                      Applets

• Algumas aplicações que necessitam de
  interatividade intensiva, utilizam applets.




 @regismelo                                              30
Java Básico – Módulo 1
                                                       Java Web




                      Applets - Exemplo
Biblioteca gráfica                            Classe que deve
para “desenhar”                              ser extendida para
                                               criar uma nova
                                                    applet
import 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
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
Java Básico – Módulo 1
                                           Java Web




             Applets – Exemplo




@regismelo                                       33
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
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
Java Básico – Módulo 1
                                                                  Java Web




                                 Para saber mais

Core Servlets and JSP Pages (CSAJSP-Chapter1.pdf)
1.1 Servlets
1.2 The Advantages of Servlets Over "Traditional" CGI
      – Efficient
      – Convenient
      – Powerful
      – Portable
      – Secure
      – Inexpensive
1.3 JavaServer Pages
1.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
Java Básico – Módulo 1
                                    Java Web




             Módulo III



Iniciando no mundo dos Servlets




@regismelo                                37
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
Java Básico – Módulo 1
                                             Java Web




             O que são Servlets?




@regismelo                                         39
Java Básico – Módulo 1
                                                     Java Web


             Hello World com Servlets
import 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
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
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
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
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
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
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 Servlet

import java.io.*;
import javax.servlet.*;                        Implementação de Servlet
import javax.servlet.http.*;                   para funcionar com HTTP


public class HelloWorld extends HttpServlet
{
   ....
}


                 Servlets HTTP devem herdar
                         dessa classe


    @regismelo                                                              46
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
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
Java Básico – Módulo 1
                                                     Java Web


             Entendendo o HelloWorld
import 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
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
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
Java Básico – Módulo 1
                                                             Java Web




                          Containers
Alguns 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
Java Básico – Módulo 1
                                              Java Web




                 Containers
Utilizaremos nesse treinamento o Jakarta TomCat




 @regismelo                                         53
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
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
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
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
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
Java Básico – Módulo 1
                                        Java Web




             TomCat rodando




@regismelo                                    59
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
Java Básico – Módulo 1
                                        Java Web




             TomCat rodando




@regismelo                                    61
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
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
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
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
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
Java Básico – Módulo 1
                                                Java Web




             Nossa estrutura de diretório


                                    Nossa aplicação




                                    Nossos servlets
                                      ficarão aqui




@regismelo                                            67
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
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
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
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
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
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
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
Java Básico – Módulo 1
                                                     Java Web


             Relembrando o HelloWorld
import 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
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
Java Básico – Módulo 1
                                                                               Java Web




                                  Para saber mais
Core 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 Servlets


Core Servlets and JSP Pages (CSAJSP-Chapter2.pdf)
2.1 Basic Servlet Structure
2.2 A Simple Servlet Generating Plain Text
      Compiling and Installing the Servlet
      Invoking the Servlet
2.3 A Servlet That Generates HTML
2.4 Packaging Servlets
      Creating Servlets in Packages
      Compiling Servlets in Packages
      Invoking Servlets in Packages

   @regismelo                                                                        77
Java Básico – Módulo 1
                                   Java Web




             Módulo IV



     Revisão do protocolo HTTP




@regismelo                               78
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
Java Básico – Módulo 1
                                             Java Web




             Revisão do protocolo HTTP




@regismelo                                         80
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
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
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
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
Java Básico – Módulo 1
                                                 Java Web




               HTTP - Requisição
Qual 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
Java Básico – Módulo 1
                                                  Java Web




               HTTP - Requisição
Qual 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
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
Java Básico – Módulo 1
                                                      Java Web




                  HTTP - Resposta
Alguns 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
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
Java Básico – Módulo 1
                                          Java Web




             HTTP – Resumindo




@regismelo                                      90
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
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
Java Básico – Módulo 1
                                                Java Web




               Configurando o TCP Monitor
Segundo 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
Java Básico – Módulo 1
                                                Java Web




               Configurando o TCP Monitor

Terceiro passo – faça uma requisição normalmente do
seu browser para a porta configurada:



  http://localhost:88




  @regismelo                                          94
Java Básico – Módulo 1
                                                  Java Web




               Configurando o TCP Monitor
E finalmente, veja os detalhes da requisição HTTP:




  @regismelo                                            95
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
Java Básico – Módulo 1
                                   Java Web




              Módulo V



      Trabalhando com dados de
              formulários




@regismelo                               97
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
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
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
Java Básico – Módulo 1
                                                    Java Web


             Relembrando o HelloWorld
import 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
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
Java Básico – Módulo 1
                                                      Java Web




               A Interface ServletRequest
Principais 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
Java Básico – Módulo 1
                                                      Java Web




               …A Interface ServletRequest
Principais 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
Java Básico – Módulo 1
                                                     Java Web




               …A Interface ServletRequest
Principais métodos:
• java.util.Map getParameterMap() 

  - Retornar todos os parâmetros passados na requisição, no
    formato de um Map.




  @regismelo                                              105
Java Básico – Módulo 1
                                                    Java Web




               …A Interface ServletRequest

Principais 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
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
Java Básico – Módulo 1
                                                              Java Web
                    Servlet Formulario
public 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
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
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
Java Básico – Módulo 1
                                                                Java Web
                     Servlet Formulario2
public class Formulario2 extends HttpServlet
{   public void doGet ( HttpServletRequest request, HttpServletResponse
response )    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
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
Java Básico – Módulo 1
                                                  Java Web




                Suportando Post
• Normalmente, é interessante suportar tanto get
  quanto post;

• Para isso, é só implementar os dois métodos

public void doPost( HttpServletRequest request,
                      HttpServletResponse response
               ) { ... }
public void doGet ( HttpServletRequest request,
                      HttpServletResponse response
               ) { ... }
  @regismelo                                           113
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
Java Básico – Módulo 1
                                                               Java Web




                        Para saber mais

Core Servlets and JSP Pages (CSAJSP-Chapter3.pdf)

3.1 The Role of Form Data
3.2 Reading Form Data from Servlets
3.3 Example: Reading Three Explicit Parameters
3.4 Example: Reading All Parameters
3.5 A Resume Posting Service
3.6 Filtering Strings for HTML-Specific Characters
     Code for Filtering
     Example




  @regismelo                                                        115
Java Básico – Módulo 1
                                   Java Web




             Módulo VI



Processamento e ciclo de vida de
          um Servlet




@regismelo                              116
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
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
Java Básico – Módulo 1
                                                       Java Web
                 Servlet Não Thread Safe
public 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
Java Básico – Módulo 1
                                                       Java Web
                 Servlet Thread Safe
public 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
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
Java Básico – Módulo 1
                                              Java Web




             Interface SingleThreadModel




@regismelo                                         122
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
Java Básico – Módulo 1
                                                     Java Web
                 SingleThreadModel

public class Solucao extends HttpServlet
    implements SingleThreadModel
{
    public void doGet ( HttpServletRequest request,
                         HttpServletResponse response )
    {
          doSomething();
    }
 }




    @regismelo                                            124
Java Básico – Módulo 1
                                               Java Web




             Ciclo de vida de um Servlet




@regismelo                                          125
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
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
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
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
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
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
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
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
Java Básico – Módulo 1
                                                    Java Web
                 ServletBackground
import java.io.*;           import java.util.*;
import javax.servlet.*;     import javax.servlet.http.*;
public class ServletBackground extends HttpServlet
implements Runnable
{

private long lastprime = 0; // Ultimo primo encontrado
Date lastprimeModified = new Date();
Thread searcher; // Thread para busca

public void init() throws ServletException {
    searcher = new Thread( this );
    searcher.setPriority( Thread.MIN_PRIORITY );
    searcher.start();
}
// ... Continua 
    @regismelo                                           134
Java Básico – Módulo 1
                                                          Java Web
                  ServletBackground
//  ... Continuação
public 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
}
Java Básico – Módulo 1
                                                         Java Web
                  ServletBackground
//  ... Continuação
private 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
}
Java Básico – Módulo 1
                                                           Java Web
                  ServletBackground
//  ... Continuação
    public void destroy() {
           // Sinalizar para o thread parar...
           searcher.interrupt();
    }
}




    @regismelo                                                  137
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
Java Básico – Módulo 1
                                                        Java Web




                      Para saber mais

Core 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
Java Básico – Módulo 1
                                       Java Web




                Módulo VII



         Obtendo informações do
                ambiente




@regismelo                                  140
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
Java Básico – Módulo 1
                                                     Java Web




               Obtendo informações
Mé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
Java Básico – Módulo 1
                                                              Java Web
                          Localizacao
public 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
Java Básico – Módulo 1
                                               Java Web




             Rodando o exercício anterior




@regismelo                                          144
Java Básico – Módulo 1
                                                               Java Web




                 Obtendo informações
Dicas 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
Java Básico – Módulo 1
                                                                     Java Web




                  Obtendo informações
Dicas 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
Java Básico – Módulo 1
                                                       Java Web




               Obtendo informações
Mé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
Java Básico – Módulo 1
                                                               Java Web
                              HttpHeader
public 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
Java Básico – Módulo 1
                                    Java Web
             HttpHeader




@regismelo                               149
Java Básico – Módulo 1
                                                      Java Web




               Obtendo informações
Mé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
Java Básico – Módulo 1
                                                           Java Web
                       HttpAddrExemplo
public 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
Java Básico – Módulo 1
                                         Java Web
             HttpAddrExemplo




@regismelo                                    152
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
Java Básico – Módulo 1
                                                                     Java Web




                         Para saber mais

Core Servlets and JSP Pages
CHAPTER 5 (CSAJSP-Chapter5.pdf)
   Accessing the Standard CGI Variables
   5.1 Servlet Equivalent of CGI Variables
   5.2 A Servlet That Shows the CGI Variables
CHAPTER 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 Engines
CHAPTER 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
Java Básico – Módulo 1
                                     Java Web




             Módulo VIII



Controle de fluxo e colaboração




@regismelo                                155
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
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
Java Básico – Módulo 1
                                                       Java Web




                 Controle de Fluxo
Mé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
Java Básico – Módulo 1
                                                                Java Web
                       SendRedirectExemplo
public 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
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
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
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
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
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
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
Java Básico – Módulo 1
                                   Java Web




             Contextos




@regismelo                              166
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
Java Básico – Módulo 1
                                                               Java Web
                          ForwardExemplo
import 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
Java Básico – Módulo 1
                                                               Java Web
                           IncludeExemplo
import 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
Java Básico – Módulo 1
                                                         Java Web
                    IncludeExemplo2
public 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
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
Java Básico – Módulo 1
                                                      Java Web




               Definindo atributos
Mé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
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
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
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
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
Java Básico – Módulo 1
                                                                        Java Web




                         Para saber mais

Core 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 358
15.2 Example: An On-Line Travel Agent 358
15.3 Including Static or Dynamic Content 375
15.4 Example: Showing Raw Servlet and JSP Output 377
15.5 Forwarding Requests From JSP Pages 380




@regismelo                                                                   177
Java Básico – Módulo 1
                                   Java Web




             Módulo IX



             Cookies




@regismelo                              178
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
Java Básico – Módulo 1
                                                               Java Web


                             Cookies
• A API Servlet provê a classe javax.servlet.http.Cookie para
  trabalhar com cookies;

• Todos os detalhes do cookie, são gerenciados pela API.

• Para criar um cookie
       new javax.servlet.http.Cookie( String name, String value )

• Para adicionar um cookie
       Cookie cookie = new Cookie( “ID”, “1975” );
       response.addCookie( cookie )




   @regismelo                                                       180
Java Básico – Módulo 1
                                                          Java Web


                         Cookies

• Cuidado!

  – Os cookies são enviados no cabeçalho HTTP, portanto, você
    deve adicionar os cookies antes de fechar o response;


  – Por padrão, os browsers devem suportar, no máximo, 20 cookies
    por site, 300 por usuário e limitam o tamanho dos cookies a no
    máximo 4096 bytes.




  @regismelo                                                    181
Java Básico – Módulo 1
                                                                  Java Web


                             Cookies
• Para recuperar os cookies gravados, use:

       public Cookie cookie[ ] = request.getCookies()

• Esse método, retorna um array de cookies que contém todos
  os cookies enviados pelo browser ou um array vazio, se
  nenhum cookie for enviado;

• Cuidado! A API Servlet anterior a versão 2.1 podia retornar
  null se nenhum cookie fosse enviado. Por isso, considere que
  isso pode acontecer.



   @regismelo                                                          182
Java Básico – Módulo 1
                                                          Java Web


                          Cookies
• O código abaixo, exibe todos os cookies com seus devidos
  valores:
  public class Biscoito extends HttpServlet {
        public void doGet ( HttpServletRequest request,
                           HttpServletResponse response ) {
          PrintWriter out;
          response.setContentType("text/html");
          out = response.getWriter();
          Cookie[] cookies = request.getCookies();
          for( int i=0, n = cookies.length; i < n; i++ ) {
            out.println( “<p>” );
            out.println( “Name – “ + cookies[i].getName() );
            out.println( “Valor – “ + cookies[i].getValue() );
          }
          out.close();
        }
   @regismelo                                                  183
   }
Java Básico – Módulo 1
                                                        Java Web


                         Cookies
• Uma boa dica para o uso de cookies é salvar um ID de usuário
  para personalizar o conteúdo;

• Diversos sites realizam esse tipo de operação. A Amazon, por
  exemplo;

• Porém, cuidado! O usuário poderá excluir ou até mesmo
  desabilitar os cookies.

• Usar cookies “impunemente” é uma péssima prática.




   @regismelo                                                184
Java Básico – Módulo 1
                                                      Java Web



    Principais métodos da classe Cookie
• setDomain(String pattern) 
  - Especifica o domínio relativo ao cookie. Normalmente é
    relativo ao seu site.
• setMaxAge(int expiry) 
  - Indica em quanto tempo o cookie vai expirar (segundos).
    Um valor negativo, indica o default, que o cookie irá
    expirar quando o browser for fechado. Zero, indica que o
    cookie será deletado imediatamente (é necessário dar
    um response.addCookie para isso funcionar).
• setSecure(boolean flag) 
  - Se TRUE, o cookie só será enviado em um canal seguro,
    como SSL.
  @regismelo                                               185
Java Básico – Módulo 1
                                                     Java Web




                      Exercício


• Construa um servlet que realiza um login e guarde o
  usuário que logou em um cookie;

• Da próxima vez que o usuário acessar seu site, ao invés
  de pedir um login, exiba uma saudação ao usuário.




  @regismelo                                              186
Java Básico – Módulo 1
                                                                   Java Web




                                Para saber mais

Core Servlets and JSP Pages (CSAJSP-Chapter8.pdf)
CHAPTER 8
     Handling Cookies
8.1 Benefits of Cookies
       Identifying a User During an E-commerce Session
       Avoiding Username and Password
       Customizing a Site
       Focusing Advertising
8.2 Some Problems with Cookies
8.3 The Servlet Cookie API
       Creating Cookies
       Cookie Attributes
       Placing Cookies in the Response Headers
       Reading Cookies from the Client
8.4 Examples of Setting and Reading Cookies
8.5 Basic Cookie Utilities
       Finding Cookies with Specified Names
       Creating Long-Lived Cookies
8.6 A Customized Search Engine Interface


 @regismelo                                                             187
Java Básico – Módulo 1
                                   Java Web




              Módulo X



      Gerenciamento de Sessões




@regismelo                              188
Java Básico – Módulo 1
                                                Java Web




                      Sessões
• O protocolo HTTP não mantém estado, chama-se
  isso de stateless;

• Isso causa um grande problema – cada requisição de
  um usuário é uma nova requisição;

• Isso é ótimo para escalabilidade;

• Mais péssimo quando se deseja saber “quem” é o
  usuário.
   @regismelo                                        189
Java Básico – Módulo 1
                                                 Java Web




                     Sessões
• E em que situação necessita-se saber “quem” é o
  usuário??

• Imagine, um carrinho de compras como o da
  Amazon...

• Se a cada requisição, temos um novo e
  desconhecido usuário, como iríamos manter os
  dados do carrinho de compras?


  @regismelo                                          190
Java Básico – Módulo 1
                                                          Java Web




                         Sessões
• Para esse tipo de situação os containers criaram a
  possibilidade de gerenciar sessões;

• Sessões representam um cliente
  – São únicas para cada cliente e persistem entre requisições




   @regismelo                                                  191
Java Básico – Módulo 1
                                                Java Web




                    Sessões

• Sessões são representadas por objetos HttpSession
  e são obtidas a partir de uma requisição;

• Entenda uma sessão como uma área de memória,
  reservada para um cliente no container;

• Nessa área de memória, você pode colocar qualquer
  objeto java.

  @regismelo                                         192
Java Básico – Módulo 1
                                                           Java Web




                       Sessões

• Para obter uma sessão:
  HttpSession session = request.getSession( false );

  Ou...
                                  False indica que se a sessão não
                                   estiver criada, ela não sera criada.
                                  Nesse caso, o método retornará null.

  HttpSession session = request.getSession()

   getSession(), sem parâmetros, sempre cria uma sessão,
   caso ela não exista.
  @regismelo                                                        193
Java Básico – Módulo 1
                                                    Java Web




                       Sessões

• Para saber se uma sessão é nova, use o método
  isNew()

       MyObject obj;
       if ( session.isNew() ) {
         obj = new MyObject();
       }
       else
       {
         obj = session.getAttribute( “id” );
       }
  @regismelo                                             194
Java Básico – Módulo 1
                                                   Java Web




       Principais Métodos de HttpSession
• setAttribute( String name, Object o ) 
   - Guarda um objeto na sessão.
• Object getAttribute( String name ) 
   - Obtém um determinado objeto armazenado na sessão.
     Caso ela não exista, o método retorna null.
• removeAttribute( String name ) 
   - Remove o atributo da sessão.
• getId() 
   - Retorna o número da sessão. Toda sessão tem um
     número único.

   @regismelo                                           195
Java Básico – Módulo 1
                                                             Java Web




        Compartilhando dados na sessão
• Como já dissemos os dados colocados em uma
  sessão ficam vivos entre requisições do usuário:

  Requisição 1 
     String[] vetor = { “1”, “2”, “3” };
     HttpSession session = request.getSession();
     session.setAttribute( “dados”, vetor );
  Requisição 2 
     HttpSession session = request.getSession();
     String[] dadosObtidos = (String[])session.getAttribute(“dados”);

  @regismelo                                                      196
Java Básico – Módulo 1
                                                 Java Web




               Gerenciando Sessões
• Não há como saber que o cliente não precisa mais
  de uma sessão;

• Por isso, o container pode “expirar” uma sessão
  baseado na inatividade do usuário;

• O tempo padrão configurado no TomCat é de 30
  minutos.


  @regismelo                                          197
Java Básico – Módulo 1
                                                       Java Web




       Métodos para gerência de sessões
• setMaxInactiveInterval(int segundos) 
   - Especifica o tempo máximo de inatividade, em segundos.
     Um valor negativo indica que a sessão nunca irá expirar.
• Int getMaxInactiveInterval()
   - Recupera o valor do timeout.
• invalidate()
   - Invalida (destrói) a sessão. Use-o, por exemplo, na opção
     de logoff do seu sistema.



   @regismelo                                               198
Java Básico – Módulo 1
                                                      Java Web




 Como os containers gerenciam sessões?
• Os containers gerenciam sessões usando cookies especiais;

• Esses cookies são os chamados cookies de sessão;

• Em geral, esse mecanismo funciona bem. Porém o usuário
  pode desabilitar os cookies no browser;

• Para contornar esse problema o container pode usar o
  mecanismo de reescrita de URL.


   @regismelo                                              199
Java Básico – Módulo 1
                                                       Java Web




...Como os containers gerenciam sessões?
• Reescrita de URL faz com que o número da sessão,
  HttpSession.getId(), seja passado como parâmetro na URL;

• Para isso, sempre que você criar um hiperlink, use o método
  HttpServletResponse.encodeUrl:
  out.print( “<a href=‘” +
  response.encodeURL(“pagina.jsp” ) + “’>” );


• Se o cliente suportar cookies, nada acontecerá. Se ele não
  suportar, o ID da sessão será passado como parâmetro:
  ex: http://www.cejug.org/pagina.jsp?jsessionid=KPT1275

   @regismelo                                               200
Java Básico – Módulo 1
                                                               Java Web




            Escopo de objetos em Servlets
• Servlets compartilham informações de várias maneiras;
   – Usando meios persistentes (banco de dados, arquivos, etc);
   – Usando objetos na memória por escopo (requisição, sessão,
     contexto);
   – Usando variáveis estáticas ou de instância.
• Servlets oferecem 3 níveis diferentes de persistência na
  memória (ordem decrescente de duração)
   – Contexto da aplicação – vale enquanto a aplicação estiver na
     memória (ServletContext, obtido através do método
     getServletContext());
   – Sessão – dura uma sessão do cliente (HttpSession);
   – Requisição – dura uma requisição (ServletRequest)

   @regismelo                                                       201
Java Básico – Módulo 1
                       Java Web




@regismelo                  202
Java Básico – Módulo 1
                                                     Java Web




   Escalabilidade x Tamanho das sessões
• Cuidado ao armazenar informações em sessões!

• Se você guardar 100kb em uma sessão e tiver um usuário,
  você estará ocupando 100kb;

• Se você tiver 1.000 usuários...

• Se você tiver 1.000.000 de usuários...




   @regismelo                                             203
Java Básico – Módulo 1
                                                            Java Web




                         Exercício


• Vamos construir o site da Amazon;
• Os requisitos são os seguintes:

   – Ter um carrinho de compras (usando sessões);
   – Identificar o usuário na sua próxima visita ao site (usando
     cookies);
   – Ter uma opção para listar o conteúdo do carrinho de compras;
   – Persistir os dados do carrinho de compras quando o usuário
     optar por finalizar a compra;
   – Ter uma opção de logout do site que invalidará a sessão.

 @regismelo                                                         204
Java Básico – Módulo 1
                                   Java Web
             Exercício




@regismelo                              205
Java Básico – Módulo 1
                                                                                        Java Web




                                Para saber mais
Core Servlets and JSP Pages (CSAJSP-Chapter9.pdf)
CHAPTER 9
     Session Tracking
9.1 The Need for Session Tracking
      Cookies
      URL-Rewriting
      Hidden Form Fields
      Session Tracking in Servlets
9.2 The Session Tracking API
      Looking Up the HttpSession Object Associated with the Current Request
      Looking Up Information Associated with a Session
      Associating Information with a Session
      Terminating Sessions
      Encoding URLs Sent to the Client
9.3 A Servlet Showing Per-Client Access Counts
9.4 An On-Line Store Using a Shopping Cart and Session Tracking
      Building the Front End
      Handling the Orders
      Behind the Scenes: Implementing the Shopping Cart and
      Catalog Items


 @regismelo                                                                                  206
Java Básico – Módulo 1
                                       Java Web




                 Módulo XI



             Java Server Pages




@regismelo                                  207
Java Básico – Módulo 1
                                                     Java Web




                Problemas com Servlets
• Servlets forçam o programador a embutir código HTML
  dentro de código Java;

• Grande desvantagem se a maior parte do que tem que ser
  gerado é HTML estático;

• Servlets = Páginas que não podem ser mantidas por
  WebDesigners;

• Mistura de funções – Programador x WebDesigner.

   @regismelo                                             208
Java Básico – Módulo 1
                                                       Java Web




                      Introdução
• Servlets – Código Java produzindo HTML;

• JSP – Código HTML com trechos de código Java para
  produzir dinamismo;

• Muito semelhante a ASP – Active Server Pages;

• Todo o poder de Java e toda a API de Servlets disponível.




   @regismelo                                               209
Java Básico – Módulo 1
                                                    Java Web



                   Exemplo
<%@ page import=“java.text.*, java.util.*” %>
<HTML>
<BODY>
<% Date d = new Date();
    String hoje =
  DateFormat.getDateInstance().format(d);
%>
Hoje é: <%=hoje%>
</BODY>
</HTML>

@regismelo                                               210
Java Básico – Módulo 1
                                                        Java Web




                Entendendo o exemplo
• A idéia é que o código Java contido entre os delimitadores
  “<%” e “%>” será interpretado pelo container;

• Na verdade, toda página JSP primeiro é compilada como um
  servlet para só depois ser executada;

• Isso significa que o código roda compilado (performance)!




   @regismelo                                                211
Java Básico – Módulo 1
                                             Java Web



               Arquitetura
 Fase de Tradução e Fase de Processamento




  @regismelo                                      212
Java Básico – Módulo 1
                                                             Java Web




                Entendendo o exemplo
• O processo de geração do servlet a partir da página JSP só acontece
  na primeira chamada a página (o container é esperto para saber
  quando é necessário gerar novamente o servlet da página JSP);

• Percebe-se que o primeiro acesso, do primeiro usuário será mais
  lento que todos os demais acessos;

• O servlet gerado a partir da página JSP é um servlet como outro
  qualquer, obedecendo alguns métodos básicos;

• Como o servlet será gerado, poderá variar de container para
  container.

   @regismelo                                                       213
Java Básico – Módulo 1
                                   Java Web



             Processamento




@regismelo                              214
Java Básico – Módulo 1
                       Java Web




@regismelo                  215
Java Básico – Módulo 1
                                                  Java Web



             Sintaxe Básica
 Elementos de Script
      Código Java que é incluído no servlet
       gerado a partir da página
      Acesso a variáveis pré-definidas
 Diretivas
      Permite controlar a estrutura do servlet
 Ações
      Especifica componentes a serem usados.

@regismelo                                             216
Java Básico – Módulo 1
                                        Java Web



             Elementos de Script
 Expressões
     <%= expressão %>

 Scriptlets
     <% código %>

 Declarações de métodos e variáveis
     <%! código %>

@regismelo                                   217
Java Básico – Módulo 1
                                             Java Web



               Expressões

   <%= expressão %>
   <%=myBean.getName()%>
   Hoje é <%= new java.util.Date()%>
   Acesso às variáveis pré-definidas
      request, response, session, out etc
      Host: <%= request.getRemoteHost() %>



@regismelo                                        218
Java Básico – Módulo 1
                                                  Java Web



                  Scriptlets
• Código que será incluído no método jspService()
  do servlet gerado a partir da página
• <% código Java %>
• Também permite acesso às variáveis pré-
  definidas
•    <% String nome = request.getParameter(“NOME”) %>
• Pode ser “intercalado” com código HTML



@regismelo                                             219
Java Básico – Módulo 1
                                                          Java Web



                      Scriptlets
 <% if (Math.random() < 0.5) { %>
 Tenha um <B>bom</B> dia!
 <% } else { %>
 Tenha um <B>mau</B> dia! <% } %>

 <%
 if (Math.random() < 0.5) {
     out.println(“Tenha um <B>bom</B> dia!”);
 } else {
     out.println(“Tenha um <B>mau</B> dia!”);
 }
 %>
@regismelo                                                     220
Java Básico – Módulo 1
                                             Java Web



             Declarações
• <%! código %>
• Variáveis e métodos que são inseridos no
  código do servlet gerado, fora do método
  jspService()
• <%! int i = 0; %>
• <%!       public void function() {
                  //código
            }
   %>

@regismelo                                        221
Java Básico – Módulo 1
                                                                  Java Web



                           Diretivas
• <%@ diretiva atributo=“valor” %>
• Especificadas no início da página.
• As principais são:
     – page
             • Permite alterar configurações do servlet gerado.
     – include
             • Permite a inclusão de um arquivo no servlet durante a
               geração deste.
     – taglib
             • Permite o uso de tags definidas pelo desenvolvedor.


@regismelo                                                             222
Java Básico – Módulo 1
                                                 Java Web



                      page
• import=“package.class”
     – <%@ page import=“java.util.*” %>

• contentType=“MIME-Type”
     – <%@ page contentType=“text/plain” %>


• isThreadSafe=“true|false”
     – Indica serialização do servlet ou não

@regismelo                                            223
Java Básico – Módulo 1
                                                      Java Web



                        page
• session=“true|false”
     – Indica se a página vai pertencer a sessão corrente
       ou não.
     – Se for false não é possível acessar a variável
       session.
• buffer=“sizekb|none”
     – Indica tamanho do buffer da variável out.
• autoFlush=“true|false”
     – Indica se o buffer deve ser esvaziado quando cheio

@regismelo                                                 224
Java Básico – Módulo 1
                                                 Java Web



                      page

• extends=“package.class”
     – Indica qual a super-classe do servlet
       gerado.
• info=“mensagem”
     – Indica uma String que pode ser obtida
       através do método getServletInfo()



@regismelo                                            225
Java Básico – Módulo 1
                                                Java Web



                     page
• errorPage=“url”
     – Especifica uma página que deve processar
       quaisquer exceções disparadas e não
       tratadas na página corrente

• isErrorPage=“true|false”
     – Especifica se a página corrente é a página
       que pode processar as exceções não
       tratadas

@regismelo                                           226
Java Básico – Módulo 1
                                                     Java Web



                        include
• <%@ include file=“url relativa” %>
• Indicada para inclusão de partes comuns a
  várias páginas como cabeçalhos ou rodapés.
    <HTML>
    <TITLE>Curso de JSP</TITLE>
    <BODY>
    <%@ include file=“cabecalho.html” %>
    .
    .
    .

@regismelo                                                227
Java Básico – Módulo 1
                                                   Java Web



                    Exemplo
<UL>
  <LI><B>Expressão.</B><BR>
      Your hostname: <%= request.getRemoteHost() %>.
  <LI><B>Scriptlet.</B><BR>
      <% out.println("Attached GET data: " +

  request.getQueryString()); %>
  <LI><B>Declaration (plus expression).</B><BR>
      <%! private int accessCount = 0; %>
      Accesses to page since server reboot: <%= +
  +accessCount %>
  <LI><B>Directive (plus expression).</B><BR>
      <%@ page import = "java.util.*" %>
      Current date: <%= new Date() %>
</UL>
   @regismelo                                           228
Java Básico – Módulo 1
                                 Java Web



             Exemplo




@regismelo                            229
Java Básico – Módulo 1
                                                      Java Web



        Variáveis Pré-Definidas
• request
     – Instância da classe HttpServletRequest que
       permite acessar os parâmetros enviados através
       do método getParameter().
• response
     – Instância de HttpServletResponse associada à
       resposta ao cliente.
• out
     – Instância de PrintWriter usada para gerar saída
       para o cliente

@regismelo                                                 230
Java Básico – Módulo 1
                                                Java Web



        Variáveis Pré-Definidas

• session
     – Instância de HttpSession associada ao
       request
• application
     – Obtida por getServletConfig().getContext()
• page
• exception

@regismelo                                           231
Java Básico – Módulo 1
                                      Java Web



             Escopo de Objetos




@regismelo                                 232
Java Básico – Módulo 1
                                                      Java Web



                        Ações
• Utiliza XML na sua sintaxe
• Controla o comportamento do interpretador
  JSP
• Possibilita:
     –   Inserção de arquivo
     –   Uso de componentes JavaBeans
     –   Chamar outra página
     –   Criar código HTML para um plugin Java.


@regismelo                                                 233
Java Básico – Módulo 1
                                    Java Web



                  Ações

•   jsp:include
•   jsp:useBean
•   jsp:setProperty
•   jsp:getProperty
•   jsp:forward
•   jsp:plugin


@regismelo                               234
Java Básico – Módulo 1
                                                       Java Web



                  jsp:include
• Permite inserir arquivos na página gerada.
• Difere da diretiva include no momento em
  que o arquivo é inserido.
     – Diretiva include insere o arquivo quando o servlet
       é gerado. Só é feito uma vez.
     – A ação insere o arquivo sempre que a página é
       requisitada.
• <jsp:include page=“url relativa” />


@regismelo                                                  235
Java Básico – Módulo 1
                                                 Java Web



              jsp:useBean
• Possibilita carregar um JavaBean e usá-lo na
  página JSP
• <jsp:useBean id=“nome” class=“package.class”
  [scope=“page,request,session,application”]/>
• Instancia um objeto da classe package.class
  e o associa à variável de nome name
• É possível especificar um escopo para o
  Bean.
• É possível utilizar um Bean já criado, desde
  que tenha mesmo id e mesmo escopo
@regismelo                                            236
Java Básico – Módulo 1
                                       Java Web



             jsp:useBean

• <jsp:useBean ...>
      código
• </jsp:useBean>
• código só é executado quando o bean
  é instanciado.




@regismelo                                  237
Java Básico – Módulo 1
                                            Java Web



             jsp:setProperty

• Permite modificar valores das
  propriedades do bean.
• <jsp:setProperty
     name=“id”
     property=“propriedade”
     [value=“valor”]
     [param=“parâmetro”] />

@regismelo                                       238
Java Básico – Módulo 1
                                       Java Web



             jsp:getProperty

• Obtém o valor de uma propriedade de
  um bean criado com um ação
  jsp:useBean.
• <jsp:getProperty
     name=“id”
     property=“propriedade” />



@regismelo                                  239
Java Básico – Módulo 1
                                               Java Web


                Exemplo
<HTML>
<BODY>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message"
  value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" /
  > </I></H1>
</BODY>
</HTML>

@regismelo                                          240
Java Básico – Módulo 1
                                         Java Web



             jsp:forward

• Permite passar o request para outra
  página.
• <jsp:forward page=“url relativa” />




@regismelo                                    241
Java Básico – Módulo 1
                                              Java Web



               jsp:plugin
• Permite inserir um applet Java na página.

<jsp:plugin
  type="applet"code="Clock2.class"
  codebase="/examples/jsp/plugin/ap
  plet" jreversion="1.2"
  width="160" height="150" >
</jsp:plugin>

@regismelo                                         242
Java Básico – Módulo 1
                                           Java Web



             Em resumo - JSP
• JSP permite que o desenvolvedor mescle
  código Java com apresentação;
• Bastante produtivo para o desenvolvimento
  de aplicações web;
• Programador não precisa embutir
  apresentação HTML dentro do código (como
  servlets);
• Todo o poder de Java para escrever
  aplicações WEB.

@regismelo                                      243
Java Básico – Módulo 1
                                                      Java Web




                      Exercício


• Altere o site da Amazon (feito no módulo de servlets)
  reimplementado todas as interfaces para utilizar JSP.




  @regismelo                                               244
Java Básico – Módulo 1
                                                                                   Java Web




                              Para saber mais
Core Servlets and JSP Pages
(CSAJSP-Chapter10)                            (CSAJSP-Chapter11.pdf)
CHAPTER 10 JSP Scripting Elements             CHAPTER 11
                                                 The JSP page Directive: Structuring Generated
10.1 Scripting Elements
                                                 Servlets
      Template Text
                                                 11.1 The import Attribute
10.2 JSP Expressions
                                                                      Directories for Custom Classes
      Predefined Variables
                                                                      Example
      XML Syntax for Expressions
                                                 11.2 The contentType Attribute
      Using Expressions as Attribute Values
                                                                      Generating Plain Text Documents
      Example
                                                                      Generating Excel Spreadsheets
10.3 JSP Scriptlets
                                                 11.3 The isThreadSafe Attribute
      Using Scriptlets to Make
                                                 11.4 The session Attribute
         Parts of the JSP File Conditional
                                                 11.5 The buffer Attribute
      Special Scriptlet Syntax
                                                 11.6 The autoflush Attribute
10.4 JSP Declarations
                                                 11.7 The extends Attribute
      Special Declaration Syntax
                                                 11.8 The info Attribute
10.5 Predefined Variables
                                                 11.9 The errorPage Attribute
                                                 11.10 The isErrorPage Attribute
                                                 11.11 The language Attribute
                                                 11.12 XML Syntax for Directives

 @regismelo                                                                                    245
Java Básico – Módulo 1
                                             Java Web




                  Módulo XII



             Tags Personalizados


               - Tag Libraries -

@regismelo                                        246
Java Básico – Módulo 1
                                                  Java Web




                   Tag Libraries
• Tags customizadas são mecanismos definidos na
  especificação JSP 1.1;

• A idéia é criar tags personalizados que poderão ser
  utilizadas facilmente pelo webdesigner ou outro
  desenvolvedor qualquer;

• Custom Tags são componentes web que rodam no
  servidor, e produzem código (assim como um servlet
  ou uma página JSP).

   @regismelo                                          247
Java Básico – Módulo 1
                                                 Java Web




               Tag Libraries - Motivação
• Como fazer para imprimir a data de hoje usando
  JSP?

  <%@page import="java.util.*" %>
  <HTML>
    Hoje é: <% out.print( new Date() ); %>
  </HTML>
  %>

                     Scriptlet



  @regismelo                                          248
Java Básico – Módulo 1
                                                 Java Web




               Tag Libraries - Motivação

• Na implementação do slide anterior, caso seja
  necessário fazer o mesmo procedimento em diversas
  páginas, tem-se que duplicar o código;

• Ou resolver o problema fazendo includes de
  pequenos pedaços de código.




  @regismelo                                          249
Java Básico – Módulo 1
                                                     Java Web




         Relembrando – Inclusão estática

• As inclusões estáticas são resolvidas nas páginas
  JSP em tempo de compilação;
• Por isso, são mais rápidas, porém, não devem ser
  utilizadas com códigos que mudam muito.

  <HTML>
  <%@include file=“menu.htm” %>
  ...
  </HTML>                     <a href=“opcao1”> Item1 </a>
                               <a href=“opcao2”> Item2 </a>
  @regismelo                                              250
Java Básico – Módulo 1
                                                   Java Web




       Relembrando – Inclusão dinâmica

• As inclusões dinâmicas são resolvidas no momento da
  requisição;
• Mais lentas, indicadas para inclusões aonde o código
  incluído muda muito.

  <HTML>
  <jsp:include
  page=“menu.html”/>
  ...                        <a href=“opcao1”> Item1 </a>
  </HTML>                    <a href=“opcao2”> Item2 </a>
  @regismelo                                            251
Java Básico – Módulo 1
                                                 Java Web




               Tag Libraries - Motivação

• Uma Tag provê uma maneira de tornar esses
  pequenos includes, componentes reutilizáveis;

• “Tag libraries reduzem a necessidade de embutir
  grande quantidade de código Java nas páginas JSP,
  movendo a funcionalidade para classes de Tags”;

• Tags podem ser utilizadas inclusive por pessoas que
  não entendem de programação Java.

  @regismelo                                          252
Java Básico – Módulo 1
                                                           Java Web




         Construindo nossa primeira Tag

Passos necessários para criarmos nossa Tag Lib:

  – Declarar uma classe que herda de uma das classes
    relacionadas a bibliotecas de Tag;

  – Declarar um Tag Library Descriptor (TLD) que descreve a tag
    lib;

  – Referenciar a Tag no arquivo JSP e usá-la.



  @regismelo                                                    253
Java Básico – Módulo 1
                                                              Java Web


               Construindo nossa primeira Tag
package br.com.softsite.tags;
                                                   DiaHoje.java
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
Import java.util.*;
public class DiaHoje extends TagSupport {
   public int doStartTag() throws JspException {
        try {
           pageContext.getOut().write( new Date().toString() );
        }
        catch(java.io.IOException e) {
           throw new JspException("IO Error: " + e.getMessage());
        }
             return EVAL_BODY_INCLUDE;
    }
}


        @regismelo                                                  254
Java Básico – Módulo 1
                                                         Java Web




          Construindo nossa primeira Tag
                                          Pacote que contém as
Entendendo o código escrito:              definições relacionadas
                                               a tag libraries
import    javax.servlet.jsp.*;
import    javax.servlet.jsp.tagext.*;
Import    java.util.*;
public    class DiaHoje extends TagSupport {
  ...
}
                                          Classe básica utilizada
                                              para criar uma
                                                 nova tag

   @regismelo                                                 255
Java Básico – Módulo 1
                                                 Java Web




         Construindo nossa primeira Tag

O que é a classe TagSupport?

• TagSupport é uma classe base utilizada para a
  criação de novas Tags;

• Como veremos adiante, TagSupport, não é a única
  classe que poderá ser extendida para criarmos novas
  Tags.


  @regismelo                                          256
Java Básico – Módulo 1
                                                             Java Web




          Construindo nossa primeira Tag
                                                   Método chamado
Entendendo o código escrito:                     automaticamente pelo
  ...                                                 container
  public int doStartTag() throws JspException {
      try {
         pageContext.getOut().write( new Date().toString() );
      }
      catch(java.io.IOException e) {
                                                  Obtém o writer
         throw new                                (equivalente a
             JspException("IO Error: " +       response.getWriter()
                     e.getMessage());             em um Servlet)
        }
        return EVAL_BODY_INCLUDE;
  }
  ...
   @regismelo                                                     257
Java Básico – Módulo 1
                                                 Java Web




         Construindo nossa primeira Tag
• O método doStartTag é chamado automaticamente
  pelo container;

• O writer pode ser obtido para escrever algum
  conteúdo (comumente HTML) através da chamada a
  pageContext.getOut()

• O “return EVAL_BODY_INCLUDE” indica que o corpo da
  tag deverá continuar a ser processado normalmente
  (veremos com mais detalhes adiante).
  @regismelo                                          258
Java Básico – Módulo 1
                          Java Web


Clico de vida
Tag Interface




  @regismelo                   259
Java Básico – Módulo 1
                                                        Java Web



                  Declarando a TLD
<?xml version="1.0" encoding="ISO-8859-1" ?>      curso.tld
<!DOCTYPE taglib
  "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
   <tlibversion>1.0</tlibversion>
   <jspversion>1.1</jspversion>
   <shortname>dh</shortname>
   <info>My first Tag library</info>
   <tag>
      <name>diaHoje</name>
      <tagclass>br.com.softsite.tags.DiaHoje</tagclass>
      <bodycontent>EMPTY</bodycontent>
   </tag>
</taglib>

   @regismelo                                                260
Java Básico – Módulo 1
                                                               Java Web




 Estrutura do TLD – Elemento <taglib>

     tlib-version   Versão da biblioteca de taglibs.
     jsp-version    Especificação JSP requerida para essa
                    biblioteca.(obrigatória)
     short-name     O prefixo a ser utilizado pela diretiva
                    taglib (obrigatória)
     description    Texto descrevendo a biblioteca.




@regismelo                                                          261
Java Básico – Módulo 1
                                                           Java Web




     Estrutura do TLD – Elemento <tag>

action         O nome definido após o prefixo.
tag-class      O Nome completo da classe que implementa a
               interface Tag.
body-content   (Opcional) Se a tag não tem corpo o valor deve ser
               “empty”. Tags que possuem corpo devem utilizar o
               valor “JSP”. Existe outro valor, “tagdependent”, que
               informa ao container que ele não deve processar o
               conteúdo da tag: seu conteúdo será passado para a
               classe para interpretação.




 @regismelo                                                     262
Java Básico – Módulo 1
                                                              Java Web




                Diretórios e Arquivos

• Importante:

   O Arquivo TLD normalmente fica dentro do diretório WEB-INF;

   A classe representando a Tag librarie deverá ficar no WEB-
    INF/classes ou WEB-INF/lib (no caso de um JAR)




  @regismelo                                                       263
Java Básico – Módulo 1
                                                        Java Web



                 Usando a Tag
                                              DiaHoje.jsp


<%@taglib uri="WEB-INF/curso.tld" prefix="ss" %>

<HTML>
  Hoje é: <ss:diaHoje />
</HTML>



                           Página JSP passa a usar um componente




  @regismelo                                                 264
Java Básico – Módulo 1
                                                Java Web




               A Classe TagSupport
• A classe TagSupport é uma das Tags mais simples;
• Utilize-a quando você deseja gerar algum resultado
  sem manipular o “corpo” da tag;
• A única coisa que pode ser feita, é considerar ou
  desconsiderar o corpo da tag.
• Exemplo:          Tag sem corpo



  <ss:diaHoje />                 <ss:iterate>
                Tag com corpo         Hello World
                                 </ss:iterate>
  @regismelo                                         265
Java Básico – Módulo 1
                                              Java Web




                De onde vem TagSupport?




Classes concretas
 Herde dessas
  classes para
 começar uma
    nova tag



   @regismelo                                      266
Java Básico – Módulo 1
                                                     Java Web




                  A Interface Tag
Principais métodos:
• doStartTag 
  - Inicia o processamento da tag.
  - Normalmente, é o método responsável pela geração de
    HTML;
  - Tem dois retornos possíveis:

     EVAL_BODY_INCLUDE – Indica que o conteúdo da Tag será
     considerado;
     SKIP_BODY – O conteúdo da tag será desconsiderado.


  @regismelo                                              267
Java Básico – Módulo 1
                                                      Java Web




                   A Interface Tag
Principais métodos:
• doEndTag 
  - Finaliza o processamento da tag.
  - Pode indicar se a página continuará a ser processada

     EVAL_PAGE – Indica que o restante da página será
     processado;
     SKIP_PAGE – O restante da página não será processado.




  @regismelo                                               268
Java Básico – Módulo 1
                                                     Java Web




                  A Interface Tag
Principais métodos:
• release 
  - Utilizado para limpar a casa;
  - O container chamará esse método antes de retirar a
    classe da memória;
  - Cuidado: Ele não é chamado entre as requisições a
    mesma tag!




  @regismelo                                              269
Java Básico – Módulo 1
                                                      Java Web




                      Exercício


• Implemente o exercício anterior – classe diaHoje e
  observe o comportamento de uma tag.




                                                   45 minutos

  @regismelo                                               270
Java Básico – Módulo 1
                                                          Java Web




                A Classe TagSupport
Além dos métodos disponíveis na interface Tag, a
classe TagSupport provê:
• doAfterBody 
  - Método disparado automaticamente após o
    processamento do corpo da tag (caso o método
    doStartTag retorne EVAL_BODY_INCLUDE);
  - Você pode utilizar esse método para, por exemplo, fazer
    um loop com uma tag exibindo seus itens diversas vezes;
  - Retornos possíveis:
       EVAL_BODY_AGAIN – O corpo da tag será processado
        novamente
       SKIP_BODY – O corpo não será processado novamente
  @regismelo                                                   271
Java Básico – Módulo 1
                                                 Java Web




               Exemplo com TagSupport

• Vamos imaginar, uma tag bem simples;
• Ela deverá apenas fazer uma iteração e repetir o
  corpo da tag 10 vezes.             Hello World
• Exemplo:                           Hello World
                                     Hello World
                                     Hello World
                                     Hello World
  <ss:iterate>                       Hello World
    Hello World                      Hello World
                                     Hello World
  </ss:iterate>                      Hello World
                                     Hello World


  @regismelo                                          272
Java Básico – Módulo 1
                                                  Java Web




               Exemplo com TagSupport

• Para construirmos essa Tag, precisaremos
  entender como a classe TagSupport trabalha com o
  corpo da Tag;



  <ss:iterate>              Tag com corpo
    Hello World
  </ss:iterate>


  @regismelo                                           273
Java Básico – Módulo 1
                                                          Java Web




               Exemplo com TagSupport

• O principal método que iremos trabalhar é o
  doAfterBody;

• Ele tem dois retornos possíveis:

       EVAL_BODY_AGAIN – O corpo da tag será processado
        novamente
       SKIP_BODY – O corpo não será processado novamente



  @regismelo                                                   274
Java Básico – Módulo 1
                                                                Java Web



package br.com.softsite.tags;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
Import java.util.*;
public class Iterate extends TagSupport {
   private int total = 0;
   public int doStartTag() throws JspException {
        return EVAL_BODY_INCLUDE;                          Indica que o
   }                                                        corpo será
   public int doAfterBody()                                 processado
   {
        if ( ++total < 10 )
                return EVAL_BODY_AGAIN;          Mostra o corpo da Tag,
        else                                         outras 9 vezes
                return SKIP_BODY;
   }
}

    @regismelo                                                       275
Java Básico – Módulo 1
                                                 Java Web




               Entendendo o exemplo
• A funcionalidade de “iterar” no corpo da Tag é
  propriciado pela interface IterationTag;
• Relembre o diagrama de classes:




  @regismelo                                          276
Java Básico – Módulo 1
                                 Java Web



Fluxo da
Interface
Iteration Tag



 Observe os retornos
  possíveis de cada
      método




   @regismelo                         277
Java Básico – Módulo 1
                                                         Java Web



           Não esqueça de adicioná-la a TLD!
...                                                 curso.tld
    <tag>
       <name>diaHoje</name>
       <tagclass>br.com.softsite.tags.DiaHoje</tagclass>
       <bodycontent>EMPTY</bodycontent>
    </tag>
   <tag>
       <name>iterate</name>
       <tagclass>br.com.softsite.tags.Iterate</tagclass>
       <bodycontent>JSP</bodycontent>
    </tag>
</taglib>




      @regismelo                                              278
Java Básico – Módulo 1
                             Java Web




Ciclo de Vida de
uma Tag




  @regismelo                      279
Java Básico – Módulo 1
                                                  Java Web




                     Cuidado!

• No exemplo anterior, o sistema só irá exibir a tag 10
  vezes da primeira chamada!

• Na segunda vez que a tag for solicitada, a variável
  total já estará inicializada com o valor 10;

• Esse “problema” acontece por que não é criada
  uma nova instância da tag (isso ajuda na
  performance mais pode criar problemas).
  @regismelo                                           280
Java Básico – Módulo 1
                                                 Java Web




                    Cuidado!

• Para corrigir o problema, devemos zerar a variável
  total no método doEndTag()
  ...
  public int doEndTag()
  {
      total = 0;
      return EVAL_PAGE;
  }
  ...

  @regismelo                                          281
Java Básico – Módulo 1
                                                     Java Web



...
public class Iterate extends TagSupport {
   private int total = 0;
   public int doStartTag() throws JspException {
       return EVAL_BODY_INCLUDE;
   }
   public int doAfterBody() {
       if ( ++total < 10 )
              return EVAL_BODY_AGAIN;
       else
              return SKIP_BODY;
   }
   public int doEndTag() {
       total = 0;
       return EVAL_PAGE;
   }
}
@regismelo                                                282
Java Básico – Módulo 1
                                                Java Web




               Alterando a Iterate

• Um requisito interessante para a nossa classe
  Iterate é poder passar um parâmetro indicando
  quantas iterações serão realizadas;

• Para fazer isso, precisamos aprender como passar
  parâmetros em Tags.




  @regismelo                                         283
Java Básico – Módulo 1
                                               Java Web




           Passando parâmetros em Tags

• A sintaxe para a passagem de parâmetros em tags
  é extremamente simples:

  <ss:iterate total=“5”>
    Hello World
  </ss:iterate>

                                      Fazer a iteração
                                      somente 5 vezes


  @regismelo                                        284
Java Básico – Módulo 1
                                                Java Web




           Passando parâmetros em Tags

• Precisamos apenas definir o devido método set/get
  na classe que representa a Tag:
  ...
  public void setTotal( int i ) {
      total = i;
  }

  public int getTotal() {
      return total;                     A conversão do
  }                                     tipo é feita pelo
  ...                                       container

  @regismelo                                           285
Java Básico – Módulo 1
                                        Java Web




        Vejamos o exemplo completo…




@regismelo                                   286
Java Básico – Módulo 1
                                                     Java Web



package br.com.softsite.tags;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.*;

public class Iterate extends TagSupport {
   private int total = 0;
   private int i = 0;
   public int doStartTag() throws JspException {
       return EVAL_BODY_INCLUDE;
   }
   public int doAfterBody() {
       if ( ++i < total )
              return EVAL_BODY_AGAIN;
       else
              return SKIP_BODY;
   }
@regismelo                                                287
Java Básico – Módulo 1
                                                Java Web



...
    public int doEndTag() {
        total = 0;
        i = 0;
        return EVAL_PAGE;
    }

    public void setTotal( int i ) {
        total = i;
    }

    public int getTotal()     {
        return total;
    }
}


@regismelo                                           288
Java Básico – Módulo 1
                                                             Java Web




                     O último passo…
• Alterar a TLD, informando a existência desse
  parâmetro:
  ...
  <tag>
      <name>iterate</name>
      <tagclass>br.com.softsite.tags.Iterate</tagclass>
      <bodycontent>JSP</bodycontent>

      <attribute>
         <name> total </name>
         <required> true </required>
      </attribute>

  </tag>
  ...

   @regismelo                                                     289
Java Básico – Módulo 1
                                                      Java Web




                       Exercício


• Implemente o exercício anterior – classe Iterate e observe
  seu funcionamento.




  @regismelo                                               290
Java Básico – Módulo 1
                                             Java Web




               A Classe BodyTagSupport

• Herde da classe BodyTagSupport quando você
  desejar manipular o conteúdo do corpo;

• Com TagSupport você pode processar ou não o
  corpo da Tag;

• Com BodyTagSupport você pode modificar o corpo
  da tag.

  @regismelo                                      291
Java Básico – Módulo 1
                                             Java Web




               A Classe BodyTagSupport

• BodyTagSupport implementa
  BodyTag que é a interface que
  efetivamente tem o poder de
  manipular o corpo de uma tag.




  @regismelo                                      292
Java Básico – Módulo 1
                             Java Web




Fluxo de BodyTag




 @regismelo                       293
Java Básico – Módulo 1
                                               Java Web




               Ciclo de um BodyTagSupport

• A classe que implementa BodyTag retorna
  EVAL_BODY_BUFFERED do método doStartTag;

• O método setBodyContent é chamado. Ele inicializa
  a propriedade bodyContent que será utilizada para
  obter dados da página;

• O método doInitBody é chamado;

  @regismelo                                        294
Java Básico – Módulo 1
                                               Java Web




               Ciclo de um BodyTagSupport

• O método doAfterBody é carregado. Nesse método
  você poderá processar o conteúdo do tag diversas
  vezes (assim como o exemplo iterate);

• O método doEndTag é chamado. Ele também pode
  processar o conteúdo do tag. Caso você não queira
  avaliar o conteúdo do tag várias vezes, você pode
  usar esse método ao invés de doAfterBody.


  @regismelo                                        295
Java Básico – Módulo 1
                                                Java Web




               Exemplo BodyTagSupport

• Vamos imaginar um exemplo – precisamos de uma
  tag que substitua todas os links, independente de
  quais sejam, por http://www.sagaranatech.com de
  toda uma página;

• A nossa tag precisa analisar o conteúdo da página
  e realizar a troca.



  @regismelo                                         296
Java Básico – Módulo 1
                                                      Java Web




               Exemplo BodyTagSupport

  <html>
  <a href=teste> Isso é um link para teste </a>
  <a href=cejug.org> Isso é um link para o CEJUG </a>
  </html>


Deveria ser trocado por:

  <html>
  <a href=www.sagaranatech.com?url=teste> Isso é um link para
    teste </a>
  <a href=www.sagaranatech.com?url=cejug.org> Isso é um link
    para o CEJUG </a>
  </html>
  @regismelo                                               297
Java Básico – Módulo 1
                                                Java Web




               Exemplo BodyTagSupport

• Nesse exemplo, fica claro que estaríamos alterando
  o conteúdo de uma página;

• Iremos usar os recursos de BodyTagSupport.




  @regismelo                                         298
Java Básico – Módulo 1
                                                          Java Web




                Exemplo BodyTagSupport

package br.com.softsite.tags;

import   javax.servlet.jsp.*;
import   javax.servlet.jsp.tagext.*;
import   java.util.*;
public   class ChangeURL extends BodyTagSupport {

  public int doStartTag() throws JspException {
      return EVAL_BODY_BUFFERED;
  }
                                                     Indica que o
                                                    conteúdo será
                                                     processado

   @regismelo                                                   299
Java Básico – Módulo 1
                                                        Java Web



...
   public int doEndTag() throws JspException
  {
       String pagina = this.bodyContent.getString();
       String newPagina = trocarReferencias( pagina )
       JspWriter jspwriter = this.pageContext.getOut();
        try
        {
            jspwriter.print( newPagina );
        }
        catch(java.io.IOException ioexception)
        {
              throw new JspException("Excecao em
   ChangeURL.doEndTag():" + ioexception.toString());
          }
       return EVAL_PAGE;
     }
   @regismelo                                                300
Java Básico – Módulo 1
                                                                 Java Web



...
   public String trocarReferencias( String pagina )
  {
       String regex = "hrefs*=s*";

      // Trocar todas as referencias...
      String newPagina = pagina.replaceAll( regex,
  "href=http://www.sagaranatech.com?url=" );

        return newPagina;
  }


                     Isso é um uso de uma regular expression
                      Esse recurso foi introduzido no SDK 1.4.
                         Para mais informações, consulte
                          http://guia-er.sourceforge.net/

   @regismelo                                                         301
Java Básico – Módulo 1
                                                          Java Web



        Não esqueça de alterar a TLD…
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library
  1.1//EN"
                "http://java.sun.com/j2ee/dtds/web-
  jsptaglibrary_1_1.dtd">
<taglib>
   <tlibversion>1.0</tlibversion>
   <jspversion>1.1</jspversion>
   <shortname>dh</shortname>
   <info>My first Tag library</info>
   <tag>
      <name>changeURL</name>
      <tagclass>br.com.softsite.tags.ChangeURL</tagclass>
      <bodycontent>JSP</bodycontent>
   </tag>
</taglib>

@regismelo                                                     302
Java Básico – Módulo 1
                                                  Java Web




     Exemplo de página usando esse tag

<%@taglib uri="WEB-INF/curso.tld" prefix="ss" %>
<ss:changeURL>
<HTML>
  <a href=http://www.cejug.org> Link para o CEJUG </a>
  <p>
  <a href=http://www.uol.com.br> Link para o UOL  </a>
  <p>
</HTML>
</ss:changeURL>



  @regismelo                                           303
Java Básico – Módulo 1
                                                       Java Web




                       Exercício


• Implemente o exercício anterior e faça-o rodar.




  @regismelo                                                304
Java Básico – Módulo 1
                                                                            Java Web




                              Para saber mais
Core Servlets and JSP Pages
(CSAJSP-Chapter14)                               14.5 Optionally Including the Tag Body
Creating Custom JSP Tag Libraries                              The Tag Handler Class
14.1 The Components That Make Up a Tag Library                 The Tag Library Descriptor File
       The Tag Handler Class                                   The JSP File
       The Tag Library Descriptor File           14.6 Manipulating the Tag Body
       The JSP File                                            The Tag Handler Class
14.2 Defining a Basic Tag                                      The Tag Library Descriptor File
       The Tag Handler Class                                   The JSP File
       The Tag Library Descriptor File           14.7 Including or Manipulating the Tag Body
                                                      Multiple Times
       The JSP File
                                                               The Tag Handler Class
14.3 Assigning Attributes to Tags
                                                               The Tag Library Descriptor File
       The Tag Handler Class
                                                               The JSP File
       The Tag Library Descriptor File
                                                 14.8 Using Nested Tags
       The JSP File
                                                               The Tag Handler Classes
14.4 Including the Tag Body
                                                               The Tag Library Descriptor File
       The Tag Handler Class
                                                               The JSP File
       The Tag Library Descriptor File
       The JSP File



 @regismelo                                                                                305
Java Básico – Módulo 1
                                               Java Web




             Que tecnologia utilizar?

                E quanto utilizar?




@regismelo                                          306
Java Básico – Módulo 1
                                                                                 Java Web

Aplicação simples ou time
   de desenvolvimento              •Execute código Java diretamente. Ponha todo
        pequeno                    código no JSP.
                                   •Execute código Java indiretamente. Desenvolva
                                   classes utilitárias separadas. Ponha na pagina JSP
                                   somente o código necessário para chamar as
                                   classes utilitárias.
                                   •Utilize Beans. Desenvolva classes utilitárias
                                   estruturadas como beans. Utilize jsp:useBean,
                                   jsp:getProperty, jsp:setProperty para efetuar as
                                   chamadas aos beans.
                                   •Utilize Tags customizadas. Desenvolva tags
                                   personalizadas. Se as tags ficarem complicadas,
                                   utilize classes utilitárias. Execute as tags utilizando a
                                   sintaxe XML de tags personalizadas.
Aplicação complexa ou time         •Utilize a arquitetura MVC. Tenha um servlet
de desenvolvimento grande          respondendo todas as requisições, buscando os
   Livro: More servlets and JSP;
                                   dados e armazenando os resultados em beans.
   Martin Hall                     Redirecione para um pagina JSP para mostrar os
    @regismelo
                                   dados.                                         307
Java Básico – Módulo 1
                       Java Web




@regismelo                  308
Java Básico – Módulo 1
                       Java Web




                 @regismelo




@regismelo                  309

Java web

  • 1.
    Java Básico –Módulo 1 Java Web Java Web Régis Melo @regismelo @regismelo 1
  • 2.
    Java Básico –Módulo 1 Java Web Missão Apresentar, motivar e exercitar a plataforma Java voltada para desenvolvimento de aplicações WEB. @regismelo 2
  • 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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Livros sugeridos @regismelo 7
  • 8.
    Java Básico –Módulo 1 Java Web Módulo I Iniciando @regismelo 8
  • 9.
    Java Básico –Módulo 1 Java Web "People only see what they are prepared to see." Ralph Waldo Emerson @regismelo 9
  • 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.
    Java Básico –Módulo 1 Java Web Plataforma J2SE e J2EE @regismelo 11
  • 12.
    Java Básico –Módulo 1 Java Web Breve 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.
    Java Básico –Módulo 1 Java Web Página da Sefaz, em Dezembro de 1998 @regismelo 13
  • 14.
    Java Básico –Módulo 1 Java Web Breve 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.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web Tecnologias 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.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web • CGI – Common Gateway Interface Um programa CGI pode ser implementado em diversas linguagens @regismelo 16
  • 17.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web • CGI – Ciclo de Vida @regismelo 17
  • 18.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web Tecnologias 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.
    Java Básico –Módulo 1 Java Web Hello World em CGI/Perl #!/usr/local/bin/perl # simple Hello World script print "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.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web Tecnologias 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.
    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 que For I = 1 To 5 Step 1 será processado no servidor %> <FONT SIZE="<%= I %>">Hello World</FONT><BR> <% Next %> @regismelo 21
  • 22.
    Java Básico –Módulo 1 Java Web Hello World em ASP Hello World Hello World Hello World Hello World Hello World @regismelo 22
  • 23.
    Java Básico –Módulo 1 Java Web Breve histórico do desenvolvimento Web Tecnologias para desenvolvimento web • PHP – Linguagem de programação Server Side, HTML embedded; – Em teoria, similar ao ASP. @regismelo 23
  • 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.
    Java Básico –Módulo 1 Java Web Breve 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.
    Java Básico –Módulo 1 Java Web Página da Sefaz, Junho/2004 @regismelo 26
  • 27.
    Java Básico –Módulo 1 Java Web Módulo II Applets - Conceitos @regismelo 27
  • 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.
    Java Básico –Módulo 1 Java Web Applets Exemplo de uma applet @regismelo 29
  • 30.
    Java Básico –Módulo 1 Java Web Applets • Algumas aplicações que necessitam de interatividade intensiva, utilizam applets. @regismelo 30
  • 31.
    Java Básico –Módulo 1 Java Web Applets - Exemplo Biblioteca gráfica Classe que deve para “desenhar” ser extendida para criar uma nova applet import 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.
    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.
    Java Básico –Módulo 1 Java Web Applets – Exemplo @regismelo 33
  • 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.
    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.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter1.pdf) 1.1 Servlets 1.2 The Advantages of Servlets Over "Traditional" CGI – Efficient – Convenient – Powerful – Portable – Secure – Inexpensive 1.3 JavaServer Pages 1.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.
    Java Básico –Módulo 1 Java Web Módulo III Iniciando no mundo dos Servlets @regismelo 37
  • 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.
    Java Básico –Módulo 1 Java Web O que são Servlets? @regismelo 39
  • 40.
    Java Básico –Módulo 1 Java Web Hello World com Servlets import 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.
    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.
    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.
    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.
    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.
    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.
    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 Servlet import java.io.*; import javax.servlet.*; Implementação de Servlet import javax.servlet.http.*; para funcionar com HTTP public class HelloWorld extends HttpServlet { .... } Servlets HTTP devem herdar dessa classe @regismelo 46
  • 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.
    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.
    Java Básico –Módulo 1 Java Web Entendendo o HelloWorld import 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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Containers Alguns 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.
    Java Básico –Módulo 1 Java Web Containers Utilizaremos nesse treinamento o Jakarta TomCat @regismelo 53
  • 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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web TomCat rodando @regismelo 59
  • 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.
    Java Básico –Módulo 1 Java Web TomCat rodando @regismelo 61
  • 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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Nossa estrutura de diretório Nossa aplicação Nossos servlets ficarão aqui @regismelo 67
  • 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.
    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.
    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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Relembrando o HelloWorld import 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.
    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.
    Java Básico –Módulo 1 Java Web Para saber mais Core 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 Servlets Core Servlets and JSP Pages (CSAJSP-Chapter2.pdf) 2.1 Basic Servlet Structure 2.2 A Simple Servlet Generating Plain Text Compiling and Installing the Servlet Invoking the Servlet 2.3 A Servlet That Generates HTML 2.4 Packaging Servlets Creating Servlets in Packages Compiling Servlets in Packages Invoking Servlets in Packages @regismelo 77
  • 78.
    Java Básico –Módulo 1 Java Web Módulo IV Revisão do protocolo HTTP @regismelo 78
  • 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.
    Java Básico –Módulo 1 Java Web Revisão do protocolo HTTP @regismelo 80
  • 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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web HTTP - Requisição Qual 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.
    Java Básico –Módulo 1 Java Web HTTP - Requisição Qual 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.
    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.
    Java Básico –Módulo 1 Java Web HTTP - Resposta Alguns 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.
    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.
    Java Básico –Módulo 1 Java Web HTTP – Resumindo @regismelo 90
  • 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.
    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.
    Java Básico –Módulo 1 Java Web Configurando o TCP Monitor Segundo 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.
    Java Básico –Módulo 1 Java Web Configurando o TCP Monitor Terceiro passo – faça uma requisição normalmente do seu browser para a porta configurada: http://localhost:88 @regismelo 94
  • 95.
    Java Básico –Módulo 1 Java Web Configurando o TCP Monitor E finalmente, veja os detalhes da requisição HTTP: @regismelo 95
  • 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.
    Java Básico –Módulo 1 Java Web Módulo V Trabalhando com dados de formulários @regismelo 97
  • 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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Relembrando o HelloWorld import 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.
    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.
    Java Básico –Módulo 1 Java Web A Interface ServletRequest Principais 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.
    Java Básico –Módulo 1 Java Web …A Interface ServletRequest Principais 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.
    Java Básico –Módulo 1 Java Web …A Interface ServletRequest Principais métodos: • java.util.Map getParameterMap()  - Retornar todos os parâmetros passados na requisição, no formato de um Map. @regismelo 105
  • 106.
    Java Básico –Módulo 1 Java Web …A Interface ServletRequest Principais 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.
    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.
    Java Básico –Módulo 1 Java Web Servlet Formulario public 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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Servlet Formulario2 public class Formulario2 extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) 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.
    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.
    Java Básico –Módulo 1 Java Web Suportando Post • Normalmente, é interessante suportar tanto get quanto post; • Para isso, é só implementar os dois métodos public void doPost( HttpServletRequest request, HttpServletResponse response ) { ... } public void doGet ( HttpServletRequest request, HttpServletResponse response ) { ... } @regismelo 113
  • 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.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter3.pdf) 3.1 The Role of Form Data 3.2 Reading Form Data from Servlets 3.3 Example: Reading Three Explicit Parameters 3.4 Example: Reading All Parameters 3.5 A Resume Posting Service 3.6 Filtering Strings for HTML-Specific Characters Code for Filtering Example @regismelo 115
  • 116.
    Java Básico –Módulo 1 Java Web Módulo VI Processamento e ciclo de vida de um Servlet @regismelo 116
  • 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.
    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.
    Java Básico –Módulo 1 Java Web Servlet Não Thread Safe public 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.
    Java Básico –Módulo 1 Java Web Servlet Thread Safe public 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.
    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.
    Java Básico –Módulo 1 Java Web Interface SingleThreadModel @regismelo 122
  • 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.
    Java Básico –Módulo 1 Java Web SingleThreadModel public class Solucao extends HttpServlet implements SingleThreadModel { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { doSomething(); } } @regismelo 124
  • 125.
    Java Básico –Módulo 1 Java Web Ciclo de vida de um Servlet @regismelo 125
  • 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.
    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.
    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.
    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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web ServletBackground import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletBackground extends HttpServlet implements Runnable { private long lastprime = 0; // Ultimo primo encontrado Date lastprimeModified = new Date(); Thread searcher; // Thread para busca public void init() throws ServletException { searcher = new Thread( this ); searcher.setPriority( Thread.MIN_PRIORITY ); searcher.start(); } // ... Continua  @regismelo 134
  • 135.
    Java Básico –Módulo 1 Java Web ServletBackground //  ... Continuação public 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.
    Java Básico –Módulo 1 Java Web ServletBackground //  ... Continuação private 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.
    Java Básico –Módulo 1 Java Web ServletBackground //  ... Continuação public void destroy() { // Sinalizar para o thread parar... searcher.interrupt(); } } @regismelo 137
  • 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.
    Java Básico –Módulo 1 Java Web Para saber mais Core 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.
    Java Básico –Módulo 1 Java Web Módulo VII Obtendo informações do ambiente @regismelo 140
  • 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.
    Java Básico –Módulo 1 Java Web Obtendo informações Mé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.
    Java Básico –Módulo 1 Java Web Localizacao public 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.
    Java Básico –Módulo 1 Java Web Rodando o exercício anterior @regismelo 144
  • 145.
    Java Básico –Módulo 1 Java Web Obtendo informações Dicas 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.
    Java Básico –Módulo 1 Java Web Obtendo informações Dicas 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.
    Java Básico –Módulo 1 Java Web Obtendo informações Mé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.
    Java Básico –Módulo 1 Java Web HttpHeader public 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.
    Java Básico –Módulo 1 Java Web HttpHeader @regismelo 149
  • 150.
    Java Básico –Módulo 1 Java Web Obtendo informações Mé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.
    Java Básico –Módulo 1 Java Web HttpAddrExemplo public 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.
    Java Básico –Módulo 1 Java Web HttpAddrExemplo @regismelo 152
  • 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.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages CHAPTER 5 (CSAJSP-Chapter5.pdf) Accessing the Standard CGI Variables 5.1 Servlet Equivalent of CGI Variables 5.2 A Servlet That Shows the CGI Variables CHAPTER 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 Engines CHAPTER 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.
    Java Básico –Módulo 1 Java Web Módulo VIII Controle de fluxo e colaboração @regismelo 155
  • 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.
    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.
    Java Básico –Módulo 1 Java Web Controle de Fluxo Mé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.
    Java Básico –Módulo 1 Java Web SendRedirectExemplo public 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.
    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.
    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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Contextos @regismelo 166
  • 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.
    Java Básico –Módulo 1 Java Web ForwardExemplo import 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.
    Java Básico –Módulo 1 Java Web IncludeExemplo import 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.
    Java Básico –Módulo 1 Java Web IncludeExemplo2 public 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.
    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.
    Java Básico –Módulo 1 Java Web Definindo atributos Mé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.
    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.
    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.
    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.
    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.
    Java Básico –Módulo 1 Java Web Para saber mais Core 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 358 15.2 Example: An On-Line Travel Agent 358 15.3 Including Static or Dynamic Content 375 15.4 Example: Showing Raw Servlet and JSP Output 377 15.5 Forwarding Requests From JSP Pages 380 @regismelo 177
  • 178.
    Java Básico –Módulo 1 Java Web Módulo IX Cookies @regismelo 178
  • 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
  • 180.
    Java Básico –Módulo 1 Java Web Cookies • A API Servlet provê a classe javax.servlet.http.Cookie para trabalhar com cookies; • Todos os detalhes do cookie, são gerenciados pela API. • Para criar um cookie new javax.servlet.http.Cookie( String name, String value ) • Para adicionar um cookie Cookie cookie = new Cookie( “ID”, “1975” ); response.addCookie( cookie ) @regismelo 180
  • 181.
    Java Básico –Módulo 1 Java Web Cookies • Cuidado! – Os cookies são enviados no cabeçalho HTTP, portanto, você deve adicionar os cookies antes de fechar o response; – Por padrão, os browsers devem suportar, no máximo, 20 cookies por site, 300 por usuário e limitam o tamanho dos cookies a no máximo 4096 bytes. @regismelo 181
  • 182.
    Java Básico –Módulo 1 Java Web Cookies • Para recuperar os cookies gravados, use: public Cookie cookie[ ] = request.getCookies() • Esse método, retorna um array de cookies que contém todos os cookies enviados pelo browser ou um array vazio, se nenhum cookie for enviado; • Cuidado! A API Servlet anterior a versão 2.1 podia retornar null se nenhum cookie fosse enviado. Por isso, considere que isso pode acontecer. @regismelo 182
  • 183.
    Java Básico –Módulo 1 Java Web Cookies • O código abaixo, exibe todos os cookies com seus devidos valores: public class Biscoito extends HttpServlet { public void doGet ( HttpServletRequest request, HttpServletResponse response ) { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); Cookie[] cookies = request.getCookies(); for( int i=0, n = cookies.length; i < n; i++ ) { out.println( “<p>” ); out.println( “Name – “ + cookies[i].getName() ); out.println( “Valor – “ + cookies[i].getValue() ); } out.close(); } @regismelo 183 }
  • 184.
    Java Básico –Módulo 1 Java Web Cookies • Uma boa dica para o uso de cookies é salvar um ID de usuário para personalizar o conteúdo; • Diversos sites realizam esse tipo de operação. A Amazon, por exemplo; • Porém, cuidado! O usuário poderá excluir ou até mesmo desabilitar os cookies. • Usar cookies “impunemente” é uma péssima prática. @regismelo 184
  • 185.
    Java Básico –Módulo 1 Java Web Principais métodos da classe Cookie • setDomain(String pattern)  - Especifica o domínio relativo ao cookie. Normalmente é relativo ao seu site. • setMaxAge(int expiry)  - Indica em quanto tempo o cookie vai expirar (segundos). Um valor negativo, indica o default, que o cookie irá expirar quando o browser for fechado. Zero, indica que o cookie será deletado imediatamente (é necessário dar um response.addCookie para isso funcionar). • setSecure(boolean flag)  - Se TRUE, o cookie só será enviado em um canal seguro, como SSL. @regismelo 185
  • 186.
    Java Básico –Módulo 1 Java Web Exercício • Construa um servlet que realiza um login e guarde o usuário que logou em um cookie; • Da próxima vez que o usuário acessar seu site, ao invés de pedir um login, exiba uma saudação ao usuário. @regismelo 186
  • 187.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter8.pdf) CHAPTER 8 Handling Cookies 8.1 Benefits of Cookies Identifying a User During an E-commerce Session Avoiding Username and Password Customizing a Site Focusing Advertising 8.2 Some Problems with Cookies 8.3 The Servlet Cookie API Creating Cookies Cookie Attributes Placing Cookies in the Response Headers Reading Cookies from the Client 8.4 Examples of Setting and Reading Cookies 8.5 Basic Cookie Utilities Finding Cookies with Specified Names Creating Long-Lived Cookies 8.6 A Customized Search Engine Interface @regismelo 187
  • 188.
    Java Básico –Módulo 1 Java Web Módulo X Gerenciamento de Sessões @regismelo 188
  • 189.
    Java Básico –Módulo 1 Java Web Sessões • O protocolo HTTP não mantém estado, chama-se isso de stateless; • Isso causa um grande problema – cada requisição de um usuário é uma nova requisição; • Isso é ótimo para escalabilidade; • Mais péssimo quando se deseja saber “quem” é o usuário. @regismelo 189
  • 190.
    Java Básico –Módulo 1 Java Web Sessões • E em que situação necessita-se saber “quem” é o usuário?? • Imagine, um carrinho de compras como o da Amazon... • Se a cada requisição, temos um novo e desconhecido usuário, como iríamos manter os dados do carrinho de compras? @regismelo 190
  • 191.
    Java Básico –Módulo 1 Java Web Sessões • Para esse tipo de situação os containers criaram a possibilidade de gerenciar sessões; • Sessões representam um cliente – São únicas para cada cliente e persistem entre requisições @regismelo 191
  • 192.
    Java Básico –Módulo 1 Java Web Sessões • Sessões são representadas por objetos HttpSession e são obtidas a partir de uma requisição; • Entenda uma sessão como uma área de memória, reservada para um cliente no container; • Nessa área de memória, você pode colocar qualquer objeto java. @regismelo 192
  • 193.
    Java Básico –Módulo 1 Java Web Sessões • Para obter uma sessão: HttpSession session = request.getSession( false ); Ou... False indica que se a sessão não estiver criada, ela não sera criada. Nesse caso, o método retornará null. HttpSession session = request.getSession()  getSession(), sem parâmetros, sempre cria uma sessão, caso ela não exista. @regismelo 193
  • 194.
    Java Básico –Módulo 1 Java Web Sessões • Para saber se uma sessão é nova, use o método isNew() MyObject obj; if ( session.isNew() ) { obj = new MyObject(); } else { obj = session.getAttribute( “id” ); } @regismelo 194
  • 195.
    Java Básico –Módulo 1 Java Web Principais Métodos de HttpSession • setAttribute( String name, Object o )  - Guarda um objeto na sessão. • Object getAttribute( String name )  - Obtém um determinado objeto armazenado na sessão. Caso ela não exista, o método retorna null. • removeAttribute( String name )  - Remove o atributo da sessão. • getId()  - Retorna o número da sessão. Toda sessão tem um número único. @regismelo 195
  • 196.
    Java Básico –Módulo 1 Java Web Compartilhando dados na sessão • Como já dissemos os dados colocados em uma sessão ficam vivos entre requisições do usuário: Requisição 1  String[] vetor = { “1”, “2”, “3” }; HttpSession session = request.getSession(); session.setAttribute( “dados”, vetor ); Requisição 2  HttpSession session = request.getSession(); String[] dadosObtidos = (String[])session.getAttribute(“dados”); @regismelo 196
  • 197.
    Java Básico –Módulo 1 Java Web Gerenciando Sessões • Não há como saber que o cliente não precisa mais de uma sessão; • Por isso, o container pode “expirar” uma sessão baseado na inatividade do usuário; • O tempo padrão configurado no TomCat é de 30 minutos. @regismelo 197
  • 198.
    Java Básico –Módulo 1 Java Web Métodos para gerência de sessões • setMaxInactiveInterval(int segundos)  - Especifica o tempo máximo de inatividade, em segundos. Um valor negativo indica que a sessão nunca irá expirar. • Int getMaxInactiveInterval() - Recupera o valor do timeout. • invalidate() - Invalida (destrói) a sessão. Use-o, por exemplo, na opção de logoff do seu sistema. @regismelo 198
  • 199.
    Java Básico –Módulo 1 Java Web Como os containers gerenciam sessões? • Os containers gerenciam sessões usando cookies especiais; • Esses cookies são os chamados cookies de sessão; • Em geral, esse mecanismo funciona bem. Porém o usuário pode desabilitar os cookies no browser; • Para contornar esse problema o container pode usar o mecanismo de reescrita de URL. @regismelo 199
  • 200.
    Java Básico –Módulo 1 Java Web ...Como os containers gerenciam sessões? • Reescrita de URL faz com que o número da sessão, HttpSession.getId(), seja passado como parâmetro na URL; • Para isso, sempre que você criar um hiperlink, use o método HttpServletResponse.encodeUrl: out.print( “<a href=‘” + response.encodeURL(“pagina.jsp” ) + “’>” ); • Se o cliente suportar cookies, nada acontecerá. Se ele não suportar, o ID da sessão será passado como parâmetro: ex: http://www.cejug.org/pagina.jsp?jsessionid=KPT1275 @regismelo 200
  • 201.
    Java Básico –Módulo 1 Java Web Escopo de objetos em Servlets • Servlets compartilham informações de várias maneiras; – Usando meios persistentes (banco de dados, arquivos, etc); – Usando objetos na memória por escopo (requisição, sessão, contexto); – Usando variáveis estáticas ou de instância. • Servlets oferecem 3 níveis diferentes de persistência na memória (ordem decrescente de duração) – Contexto da aplicação – vale enquanto a aplicação estiver na memória (ServletContext, obtido através do método getServletContext()); – Sessão – dura uma sessão do cliente (HttpSession); – Requisição – dura uma requisição (ServletRequest) @regismelo 201
  • 202.
    Java Básico –Módulo 1 Java Web @regismelo 202
  • 203.
    Java Básico –Módulo 1 Java Web Escalabilidade x Tamanho das sessões • Cuidado ao armazenar informações em sessões! • Se você guardar 100kb em uma sessão e tiver um usuário, você estará ocupando 100kb; • Se você tiver 1.000 usuários... • Se você tiver 1.000.000 de usuários... @regismelo 203
  • 204.
    Java Básico –Módulo 1 Java Web Exercício • Vamos construir o site da Amazon; • Os requisitos são os seguintes: – Ter um carrinho de compras (usando sessões); – Identificar o usuário na sua próxima visita ao site (usando cookies); – Ter uma opção para listar o conteúdo do carrinho de compras; – Persistir os dados do carrinho de compras quando o usuário optar por finalizar a compra; – Ter uma opção de logout do site que invalidará a sessão. @regismelo 204
  • 205.
    Java Básico –Módulo 1 Java Web Exercício @regismelo 205
  • 206.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter9.pdf) CHAPTER 9 Session Tracking 9.1 The Need for Session Tracking Cookies URL-Rewriting Hidden Form Fields Session Tracking in Servlets 9.2 The Session Tracking API Looking Up the HttpSession Object Associated with the Current Request Looking Up Information Associated with a Session Associating Information with a Session Terminating Sessions Encoding URLs Sent to the Client 9.3 A Servlet Showing Per-Client Access Counts 9.4 An On-Line Store Using a Shopping Cart and Session Tracking Building the Front End Handling the Orders Behind the Scenes: Implementing the Shopping Cart and Catalog Items @regismelo 206
  • 207.
    Java Básico –Módulo 1 Java Web Módulo XI Java Server Pages @regismelo 207
  • 208.
    Java Básico –Módulo 1 Java Web Problemas com Servlets • Servlets forçam o programador a embutir código HTML dentro de código Java; • Grande desvantagem se a maior parte do que tem que ser gerado é HTML estático; • Servlets = Páginas que não podem ser mantidas por WebDesigners; • Mistura de funções – Programador x WebDesigner. @regismelo 208
  • 209.
    Java Básico –Módulo 1 Java Web Introdução • Servlets – Código Java produzindo HTML; • JSP – Código HTML com trechos de código Java para produzir dinamismo; • Muito semelhante a ASP – Active Server Pages; • Todo o poder de Java e toda a API de Servlets disponível. @regismelo 209
  • 210.
    Java Básico –Módulo 1 Java Web Exemplo <%@ page import=“java.text.*, java.util.*” %> <HTML> <BODY> <% Date d = new Date(); String hoje = DateFormat.getDateInstance().format(d); %> Hoje é: <%=hoje%> </BODY> </HTML> @regismelo 210
  • 211.
    Java Básico –Módulo 1 Java Web Entendendo o exemplo • A idéia é que o código Java contido entre os delimitadores “<%” e “%>” será interpretado pelo container; • Na verdade, toda página JSP primeiro é compilada como um servlet para só depois ser executada; • Isso significa que o código roda compilado (performance)! @regismelo 211
  • 212.
    Java Básico –Módulo 1 Java Web Arquitetura  Fase de Tradução e Fase de Processamento @regismelo 212
  • 213.
    Java Básico –Módulo 1 Java Web Entendendo o exemplo • O processo de geração do servlet a partir da página JSP só acontece na primeira chamada a página (o container é esperto para saber quando é necessário gerar novamente o servlet da página JSP); • Percebe-se que o primeiro acesso, do primeiro usuário será mais lento que todos os demais acessos; • O servlet gerado a partir da página JSP é um servlet como outro qualquer, obedecendo alguns métodos básicos; • Como o servlet será gerado, poderá variar de container para container. @regismelo 213
  • 214.
    Java Básico –Módulo 1 Java Web Processamento @regismelo 214
  • 215.
    Java Básico –Módulo 1 Java Web @regismelo 215
  • 216.
    Java Básico –Módulo 1 Java Web Sintaxe Básica  Elementos de Script  Código Java que é incluído no servlet gerado a partir da página  Acesso a variáveis pré-definidas  Diretivas  Permite controlar a estrutura do servlet  Ações  Especifica componentes a serem usados. @regismelo 216
  • 217.
    Java Básico –Módulo 1 Java Web Elementos de Script  Expressões <%= expressão %>  Scriptlets <% código %>  Declarações de métodos e variáveis <%! código %> @regismelo 217
  • 218.
    Java Básico –Módulo 1 Java Web Expressões  <%= expressão %>  <%=myBean.getName()%>  Hoje é <%= new java.util.Date()%>  Acesso às variáveis pré-definidas  request, response, session, out etc  Host: <%= request.getRemoteHost() %> @regismelo 218
  • 219.
    Java Básico –Módulo 1 Java Web Scriptlets • Código que será incluído no método jspService() do servlet gerado a partir da página • <% código Java %> • Também permite acesso às variáveis pré- definidas • <% String nome = request.getParameter(“NOME”) %> • Pode ser “intercalado” com código HTML @regismelo 219
  • 220.
    Java Básico –Módulo 1 Java Web Scriptlets <% if (Math.random() < 0.5) { %> Tenha um <B>bom</B> dia! <% } else { %> Tenha um <B>mau</B> dia! <% } %> <% if (Math.random() < 0.5) { out.println(“Tenha um <B>bom</B> dia!”); } else { out.println(“Tenha um <B>mau</B> dia!”); } %> @regismelo 220
  • 221.
    Java Básico –Módulo 1 Java Web Declarações • <%! código %> • Variáveis e métodos que são inseridos no código do servlet gerado, fora do método jspService() • <%! int i = 0; %> • <%! public void function() { //código } %> @regismelo 221
  • 222.
    Java Básico –Módulo 1 Java Web Diretivas • <%@ diretiva atributo=“valor” %> • Especificadas no início da página. • As principais são: – page • Permite alterar configurações do servlet gerado. – include • Permite a inclusão de um arquivo no servlet durante a geração deste. – taglib • Permite o uso de tags definidas pelo desenvolvedor. @regismelo 222
  • 223.
    Java Básico –Módulo 1 Java Web page • import=“package.class” – <%@ page import=“java.util.*” %> • contentType=“MIME-Type” – <%@ page contentType=“text/plain” %> • isThreadSafe=“true|false” – Indica serialização do servlet ou não @regismelo 223
  • 224.
    Java Básico –Módulo 1 Java Web page • session=“true|false” – Indica se a página vai pertencer a sessão corrente ou não. – Se for false não é possível acessar a variável session. • buffer=“sizekb|none” – Indica tamanho do buffer da variável out. • autoFlush=“true|false” – Indica se o buffer deve ser esvaziado quando cheio @regismelo 224
  • 225.
    Java Básico –Módulo 1 Java Web page • extends=“package.class” – Indica qual a super-classe do servlet gerado. • info=“mensagem” – Indica uma String que pode ser obtida através do método getServletInfo() @regismelo 225
  • 226.
    Java Básico –Módulo 1 Java Web page • errorPage=“url” – Especifica uma página que deve processar quaisquer exceções disparadas e não tratadas na página corrente • isErrorPage=“true|false” – Especifica se a página corrente é a página que pode processar as exceções não tratadas @regismelo 226
  • 227.
    Java Básico –Módulo 1 Java Web include • <%@ include file=“url relativa” %> • Indicada para inclusão de partes comuns a várias páginas como cabeçalhos ou rodapés. <HTML> <TITLE>Curso de JSP</TITLE> <BODY> <%@ include file=“cabecalho.html” %> . . . @regismelo 227
  • 228.
    Java Básico –Módulo 1 Java Web Exemplo <UL> <LI><B>Expressão.</B><BR> Your hostname: <%= request.getRemoteHost() %>. <LI><B>Scriptlet.</B><BR> <% out.println("Attached GET data: " + request.getQueryString()); %> <LI><B>Declaration (plus expression).</B><BR> <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= + +accessCount %> <LI><B>Directive (plus expression).</B><BR> <%@ page import = "java.util.*" %> Current date: <%= new Date() %> </UL> @regismelo 228
  • 229.
    Java Básico –Módulo 1 Java Web Exemplo @regismelo 229
  • 230.
    Java Básico –Módulo 1 Java Web Variáveis Pré-Definidas • request – Instância da classe HttpServletRequest que permite acessar os parâmetros enviados através do método getParameter(). • response – Instância de HttpServletResponse associada à resposta ao cliente. • out – Instância de PrintWriter usada para gerar saída para o cliente @regismelo 230
  • 231.
    Java Básico –Módulo 1 Java Web Variáveis Pré-Definidas • session – Instância de HttpSession associada ao request • application – Obtida por getServletConfig().getContext() • page • exception @regismelo 231
  • 232.
    Java Básico –Módulo 1 Java Web Escopo de Objetos @regismelo 232
  • 233.
    Java Básico –Módulo 1 Java Web Ações • Utiliza XML na sua sintaxe • Controla o comportamento do interpretador JSP • Possibilita: – Inserção de arquivo – Uso de componentes JavaBeans – Chamar outra página – Criar código HTML para um plugin Java. @regismelo 233
  • 234.
    Java Básico –Módulo 1 Java Web Ações • jsp:include • jsp:useBean • jsp:setProperty • jsp:getProperty • jsp:forward • jsp:plugin @regismelo 234
  • 235.
    Java Básico –Módulo 1 Java Web jsp:include • Permite inserir arquivos na página gerada. • Difere da diretiva include no momento em que o arquivo é inserido. – Diretiva include insere o arquivo quando o servlet é gerado. Só é feito uma vez. – A ação insere o arquivo sempre que a página é requisitada. • <jsp:include page=“url relativa” /> @regismelo 235
  • 236.
    Java Básico –Módulo 1 Java Web jsp:useBean • Possibilita carregar um JavaBean e usá-lo na página JSP • <jsp:useBean id=“nome” class=“package.class” [scope=“page,request,session,application”]/> • Instancia um objeto da classe package.class e o associa à variável de nome name • É possível especificar um escopo para o Bean. • É possível utilizar um Bean já criado, desde que tenha mesmo id e mesmo escopo @regismelo 236
  • 237.
    Java Básico –Módulo 1 Java Web jsp:useBean • <jsp:useBean ...> código • </jsp:useBean> • código só é executado quando o bean é instanciado. @regismelo 237
  • 238.
    Java Básico –Módulo 1 Java Web jsp:setProperty • Permite modificar valores das propriedades do bean. • <jsp:setProperty name=“id” property=“propriedade” [value=“valor”] [param=“parâmetro”] /> @regismelo 238
  • 239.
    Java Básico –Módulo 1 Java Web jsp:getProperty • Obtém o valor de uma propriedade de um bean criado com um ação jsp:useBean. • <jsp:getProperty name=“id” property=“propriedade” /> @regismelo 239
  • 240.
    Java Básico –Módulo 1 Java Web Exemplo <HTML> <BODY> <P> <jsp:useBean id="test" class="hall.SimpleBean" /> <jsp:setProperty name="test" property="message" value="Hello WWW" /> <H1>Message: <I> <jsp:getProperty name="test" property="message" / > </I></H1> </BODY> </HTML> @regismelo 240
  • 241.
    Java Básico –Módulo 1 Java Web jsp:forward • Permite passar o request para outra página. • <jsp:forward page=“url relativa” /> @regismelo 241
  • 242.
    Java Básico –Módulo 1 Java Web jsp:plugin • Permite inserir um applet Java na página. <jsp:plugin type="applet"code="Clock2.class" codebase="/examples/jsp/plugin/ap plet" jreversion="1.2" width="160" height="150" > </jsp:plugin> @regismelo 242
  • 243.
    Java Básico –Módulo 1 Java Web Em resumo - JSP • JSP permite que o desenvolvedor mescle código Java com apresentação; • Bastante produtivo para o desenvolvimento de aplicações web; • Programador não precisa embutir apresentação HTML dentro do código (como servlets); • Todo o poder de Java para escrever aplicações WEB. @regismelo 243
  • 244.
    Java Básico –Módulo 1 Java Web Exercício • Altere o site da Amazon (feito no módulo de servlets) reimplementado todas as interfaces para utilizar JSP. @regismelo 244
  • 245.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter10) (CSAJSP-Chapter11.pdf) CHAPTER 10 JSP Scripting Elements CHAPTER 11 The JSP page Directive: Structuring Generated 10.1 Scripting Elements Servlets Template Text 11.1 The import Attribute 10.2 JSP Expressions Directories for Custom Classes Predefined Variables Example XML Syntax for Expressions 11.2 The contentType Attribute Using Expressions as Attribute Values Generating Plain Text Documents Example Generating Excel Spreadsheets 10.3 JSP Scriptlets 11.3 The isThreadSafe Attribute Using Scriptlets to Make 11.4 The session Attribute Parts of the JSP File Conditional 11.5 The buffer Attribute Special Scriptlet Syntax 11.6 The autoflush Attribute 10.4 JSP Declarations 11.7 The extends Attribute Special Declaration Syntax 11.8 The info Attribute 10.5 Predefined Variables 11.9 The errorPage Attribute 11.10 The isErrorPage Attribute 11.11 The language Attribute 11.12 XML Syntax for Directives @regismelo 245
  • 246.
    Java Básico –Módulo 1 Java Web Módulo XII Tags Personalizados - Tag Libraries - @regismelo 246
  • 247.
    Java Básico –Módulo 1 Java Web Tag Libraries • Tags customizadas são mecanismos definidos na especificação JSP 1.1; • A idéia é criar tags personalizados que poderão ser utilizadas facilmente pelo webdesigner ou outro desenvolvedor qualquer; • Custom Tags são componentes web que rodam no servidor, e produzem código (assim como um servlet ou uma página JSP). @regismelo 247
  • 248.
    Java Básico –Módulo 1 Java Web Tag Libraries - Motivação • Como fazer para imprimir a data de hoje usando JSP? <%@page import="java.util.*" %> <HTML> Hoje é: <% out.print( new Date() ); %> </HTML> %> Scriptlet @regismelo 248
  • 249.
    Java Básico –Módulo 1 Java Web Tag Libraries - Motivação • Na implementação do slide anterior, caso seja necessário fazer o mesmo procedimento em diversas páginas, tem-se que duplicar o código; • Ou resolver o problema fazendo includes de pequenos pedaços de código. @regismelo 249
  • 250.
    Java Básico –Módulo 1 Java Web Relembrando – Inclusão estática • As inclusões estáticas são resolvidas nas páginas JSP em tempo de compilação; • Por isso, são mais rápidas, porém, não devem ser utilizadas com códigos que mudam muito. <HTML> <%@include file=“menu.htm” %> ... </HTML> <a href=“opcao1”> Item1 </a> <a href=“opcao2”> Item2 </a> @regismelo 250
  • 251.
    Java Básico –Módulo 1 Java Web Relembrando – Inclusão dinâmica • As inclusões dinâmicas são resolvidas no momento da requisição; • Mais lentas, indicadas para inclusões aonde o código incluído muda muito. <HTML> <jsp:include page=“menu.html”/> ... <a href=“opcao1”> Item1 </a> </HTML> <a href=“opcao2”> Item2 </a> @regismelo 251
  • 252.
    Java Básico –Módulo 1 Java Web Tag Libraries - Motivação • Uma Tag provê uma maneira de tornar esses pequenos includes, componentes reutilizáveis; • “Tag libraries reduzem a necessidade de embutir grande quantidade de código Java nas páginas JSP, movendo a funcionalidade para classes de Tags”; • Tags podem ser utilizadas inclusive por pessoas que não entendem de programação Java. @regismelo 252
  • 253.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag Passos necessários para criarmos nossa Tag Lib: – Declarar uma classe que herda de uma das classes relacionadas a bibliotecas de Tag; – Declarar um Tag Library Descriptor (TLD) que descreve a tag lib; – Referenciar a Tag no arquivo JSP e usá-la. @regismelo 253
  • 254.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag package br.com.softsite.tags; DiaHoje.java import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; Import java.util.*; public class DiaHoje extends TagSupport { public int doStartTag() throws JspException { try { pageContext.getOut().write( new Date().toString() ); } catch(java.io.IOException e) { throw new JspException("IO Error: " + e.getMessage()); } return EVAL_BODY_INCLUDE; } } @regismelo 254
  • 255.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag Pacote que contém as Entendendo o código escrito: definições relacionadas a tag libraries import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; Import java.util.*; public class DiaHoje extends TagSupport { ... } Classe básica utilizada para criar uma nova tag @regismelo 255
  • 256.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag O que é a classe TagSupport? • TagSupport é uma classe base utilizada para a criação de novas Tags; • Como veremos adiante, TagSupport, não é a única classe que poderá ser extendida para criarmos novas Tags. @regismelo 256
  • 257.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag Método chamado Entendendo o código escrito: automaticamente pelo ... container public int doStartTag() throws JspException { try { pageContext.getOut().write( new Date().toString() ); } catch(java.io.IOException e) { Obtém o writer throw new (equivalente a JspException("IO Error: " + response.getWriter() e.getMessage()); em um Servlet) } return EVAL_BODY_INCLUDE; } ... @regismelo 257
  • 258.
    Java Básico –Módulo 1 Java Web Construindo nossa primeira Tag • O método doStartTag é chamado automaticamente pelo container; • O writer pode ser obtido para escrever algum conteúdo (comumente HTML) através da chamada a pageContext.getOut() • O “return EVAL_BODY_INCLUDE” indica que o corpo da tag deverá continuar a ser processado normalmente (veremos com mais detalhes adiante). @regismelo 258
  • 259.
    Java Básico –Módulo 1 Java Web Clico de vida Tag Interface @regismelo 259
  • 260.
    Java Básico –Módulo 1 Java Web Declarando a TLD <?xml version="1.0" encoding="ISO-8859-1" ?> curso.tld <!DOCTYPE taglib "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>dh</shortname> <info>My first Tag library</info> <tag> <name>diaHoje</name> <tagclass>br.com.softsite.tags.DiaHoje</tagclass> <bodycontent>EMPTY</bodycontent> </tag> </taglib> @regismelo 260
  • 261.
    Java Básico –Módulo 1 Java Web Estrutura do TLD – Elemento <taglib> tlib-version Versão da biblioteca de taglibs. jsp-version Especificação JSP requerida para essa biblioteca.(obrigatória) short-name O prefixo a ser utilizado pela diretiva taglib (obrigatória) description Texto descrevendo a biblioteca. @regismelo 261
  • 262.
    Java Básico –Módulo 1 Java Web Estrutura do TLD – Elemento <tag> action O nome definido após o prefixo. tag-class O Nome completo da classe que implementa a interface Tag. body-content (Opcional) Se a tag não tem corpo o valor deve ser “empty”. Tags que possuem corpo devem utilizar o valor “JSP”. Existe outro valor, “tagdependent”, que informa ao container que ele não deve processar o conteúdo da tag: seu conteúdo será passado para a classe para interpretação. @regismelo 262
  • 263.
    Java Básico –Módulo 1 Java Web Diretórios e Arquivos • Importante:  O Arquivo TLD normalmente fica dentro do diretório WEB-INF;  A classe representando a Tag librarie deverá ficar no WEB- INF/classes ou WEB-INF/lib (no caso de um JAR) @regismelo 263
  • 264.
    Java Básico –Módulo 1 Java Web Usando a Tag DiaHoje.jsp <%@taglib uri="WEB-INF/curso.tld" prefix="ss" %> <HTML> Hoje é: <ss:diaHoje /> </HTML> Página JSP passa a usar um componente @regismelo 264
  • 265.
    Java Básico –Módulo 1 Java Web A Classe TagSupport • A classe TagSupport é uma das Tags mais simples; • Utilize-a quando você deseja gerar algum resultado sem manipular o “corpo” da tag; • A única coisa que pode ser feita, é considerar ou desconsiderar o corpo da tag. • Exemplo: Tag sem corpo <ss:diaHoje /> <ss:iterate> Tag com corpo Hello World </ss:iterate> @regismelo 265
  • 266.
    Java Básico –Módulo 1 Java Web De onde vem TagSupport? Classes concretas Herde dessas classes para começar uma nova tag @regismelo 266
  • 267.
    Java Básico –Módulo 1 Java Web A Interface Tag Principais métodos: • doStartTag  - Inicia o processamento da tag. - Normalmente, é o método responsável pela geração de HTML; - Tem dois retornos possíveis: EVAL_BODY_INCLUDE – Indica que o conteúdo da Tag será considerado; SKIP_BODY – O conteúdo da tag será desconsiderado. @regismelo 267
  • 268.
    Java Básico –Módulo 1 Java Web A Interface Tag Principais métodos: • doEndTag  - Finaliza o processamento da tag. - Pode indicar se a página continuará a ser processada EVAL_PAGE – Indica que o restante da página será processado; SKIP_PAGE – O restante da página não será processado. @regismelo 268
  • 269.
    Java Básico –Módulo 1 Java Web A Interface Tag Principais métodos: • release  - Utilizado para limpar a casa; - O container chamará esse método antes de retirar a classe da memória; - Cuidado: Ele não é chamado entre as requisições a mesma tag! @regismelo 269
  • 270.
    Java Básico –Módulo 1 Java Web Exercício • Implemente o exercício anterior – classe diaHoje e observe o comportamento de uma tag. 45 minutos @regismelo 270
  • 271.
    Java Básico –Módulo 1 Java Web A Classe TagSupport Além dos métodos disponíveis na interface Tag, a classe TagSupport provê: • doAfterBody  - Método disparado automaticamente após o processamento do corpo da tag (caso o método doStartTag retorne EVAL_BODY_INCLUDE); - Você pode utilizar esse método para, por exemplo, fazer um loop com uma tag exibindo seus itens diversas vezes; - Retornos possíveis: EVAL_BODY_AGAIN – O corpo da tag será processado novamente SKIP_BODY – O corpo não será processado novamente @regismelo 271
  • 272.
    Java Básico –Módulo 1 Java Web Exemplo com TagSupport • Vamos imaginar, uma tag bem simples; • Ela deverá apenas fazer uma iteração e repetir o corpo da tag 10 vezes. Hello World • Exemplo: Hello World Hello World Hello World Hello World <ss:iterate> Hello World Hello World Hello World Hello World </ss:iterate> Hello World Hello World @regismelo 272
  • 273.
    Java Básico –Módulo 1 Java Web Exemplo com TagSupport • Para construirmos essa Tag, precisaremos entender como a classe TagSupport trabalha com o corpo da Tag; <ss:iterate> Tag com corpo Hello World </ss:iterate> @regismelo 273
  • 274.
    Java Básico –Módulo 1 Java Web Exemplo com TagSupport • O principal método que iremos trabalhar é o doAfterBody; • Ele tem dois retornos possíveis: EVAL_BODY_AGAIN – O corpo da tag será processado novamente SKIP_BODY – O corpo não será processado novamente @regismelo 274
  • 275.
    Java Básico –Módulo 1 Java Web package br.com.softsite.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; Import java.util.*; public class Iterate extends TagSupport { private int total = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; Indica que o } corpo será public int doAfterBody() processado { if ( ++total < 10 ) return EVAL_BODY_AGAIN; Mostra o corpo da Tag, else outras 9 vezes return SKIP_BODY; } } @regismelo 275
  • 276.
    Java Básico –Módulo 1 Java Web Entendendo o exemplo • A funcionalidade de “iterar” no corpo da Tag é propriciado pela interface IterationTag; • Relembre o diagrama de classes: @regismelo 276
  • 277.
    Java Básico –Módulo 1 Java Web Fluxo da Interface Iteration Tag Observe os retornos possíveis de cada método @regismelo 277
  • 278.
    Java Básico –Módulo 1 Java Web Não esqueça de adicioná-la a TLD! ... curso.tld <tag> <name>diaHoje</name> <tagclass>br.com.softsite.tags.DiaHoje</tagclass> <bodycontent>EMPTY</bodycontent> </tag> <tag> <name>iterate</name> <tagclass>br.com.softsite.tags.Iterate</tagclass> <bodycontent>JSP</bodycontent> </tag> </taglib> @regismelo 278
  • 279.
    Java Básico –Módulo 1 Java Web Ciclo de Vida de uma Tag @regismelo 279
  • 280.
    Java Básico –Módulo 1 Java Web Cuidado! • No exemplo anterior, o sistema só irá exibir a tag 10 vezes da primeira chamada! • Na segunda vez que a tag for solicitada, a variável total já estará inicializada com o valor 10; • Esse “problema” acontece por que não é criada uma nova instância da tag (isso ajuda na performance mais pode criar problemas). @regismelo 280
  • 281.
    Java Básico –Módulo 1 Java Web Cuidado! • Para corrigir o problema, devemos zerar a variável total no método doEndTag() ... public int doEndTag() { total = 0; return EVAL_PAGE; } ... @regismelo 281
  • 282.
    Java Básico –Módulo 1 Java Web ... public class Iterate extends TagSupport { private int total = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } public int doAfterBody() { if ( ++total < 10 ) return EVAL_BODY_AGAIN; else return SKIP_BODY; } public int doEndTag() { total = 0; return EVAL_PAGE; } } @regismelo 282
  • 283.
    Java Básico –Módulo 1 Java Web Alterando a Iterate • Um requisito interessante para a nossa classe Iterate é poder passar um parâmetro indicando quantas iterações serão realizadas; • Para fazer isso, precisamos aprender como passar parâmetros em Tags. @regismelo 283
  • 284.
    Java Básico –Módulo 1 Java Web Passando parâmetros em Tags • A sintaxe para a passagem de parâmetros em tags é extremamente simples: <ss:iterate total=“5”> Hello World </ss:iterate> Fazer a iteração somente 5 vezes @regismelo 284
  • 285.
    Java Básico –Módulo 1 Java Web Passando parâmetros em Tags • Precisamos apenas definir o devido método set/get na classe que representa a Tag: ... public void setTotal( int i ) { total = i; } public int getTotal() { return total; A conversão do } tipo é feita pelo ... container @regismelo 285
  • 286.
    Java Básico –Módulo 1 Java Web Vejamos o exemplo completo… @regismelo 286
  • 287.
    Java Básico –Módulo 1 Java Web package br.com.softsite.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.util.*; public class Iterate extends TagSupport { private int total = 0; private int i = 0; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } public int doAfterBody() { if ( ++i < total ) return EVAL_BODY_AGAIN; else return SKIP_BODY; } @regismelo 287
  • 288.
    Java Básico –Módulo 1 Java Web ... public int doEndTag() { total = 0; i = 0; return EVAL_PAGE; } public void setTotal( int i ) { total = i; } public int getTotal() { return total; } } @regismelo 288
  • 289.
    Java Básico –Módulo 1 Java Web O último passo… • Alterar a TLD, informando a existência desse parâmetro: ... <tag> <name>iterate</name> <tagclass>br.com.softsite.tags.Iterate</tagclass> <bodycontent>JSP</bodycontent> <attribute> <name> total </name> <required> true </required> </attribute> </tag> ... @regismelo 289
  • 290.
    Java Básico –Módulo 1 Java Web Exercício • Implemente o exercício anterior – classe Iterate e observe seu funcionamento. @regismelo 290
  • 291.
    Java Básico –Módulo 1 Java Web A Classe BodyTagSupport • Herde da classe BodyTagSupport quando você desejar manipular o conteúdo do corpo; • Com TagSupport você pode processar ou não o corpo da Tag; • Com BodyTagSupport você pode modificar o corpo da tag. @regismelo 291
  • 292.
    Java Básico –Módulo 1 Java Web A Classe BodyTagSupport • BodyTagSupport implementa BodyTag que é a interface que efetivamente tem o poder de manipular o corpo de uma tag. @regismelo 292
  • 293.
    Java Básico –Módulo 1 Java Web Fluxo de BodyTag @regismelo 293
  • 294.
    Java Básico –Módulo 1 Java Web Ciclo de um BodyTagSupport • A classe que implementa BodyTag retorna EVAL_BODY_BUFFERED do método doStartTag; • O método setBodyContent é chamado. Ele inicializa a propriedade bodyContent que será utilizada para obter dados da página; • O método doInitBody é chamado; @regismelo 294
  • 295.
    Java Básico –Módulo 1 Java Web Ciclo de um BodyTagSupport • O método doAfterBody é carregado. Nesse método você poderá processar o conteúdo do tag diversas vezes (assim como o exemplo iterate); • O método doEndTag é chamado. Ele também pode processar o conteúdo do tag. Caso você não queira avaliar o conteúdo do tag várias vezes, você pode usar esse método ao invés de doAfterBody. @regismelo 295
  • 296.
    Java Básico –Módulo 1 Java Web Exemplo BodyTagSupport • Vamos imaginar um exemplo – precisamos de uma tag que substitua todas os links, independente de quais sejam, por http://www.sagaranatech.com de toda uma página; • A nossa tag precisa analisar o conteúdo da página e realizar a troca. @regismelo 296
  • 297.
    Java Básico –Módulo 1 Java Web Exemplo BodyTagSupport <html> <a href=teste> Isso é um link para teste </a> <a href=cejug.org> Isso é um link para o CEJUG </a> </html> Deveria ser trocado por: <html> <a href=www.sagaranatech.com?url=teste> Isso é um link para teste </a> <a href=www.sagaranatech.com?url=cejug.org> Isso é um link para o CEJUG </a> </html> @regismelo 297
  • 298.
    Java Básico –Módulo 1 Java Web Exemplo BodyTagSupport • Nesse exemplo, fica claro que estaríamos alterando o conteúdo de uma página; • Iremos usar os recursos de BodyTagSupport. @regismelo 298
  • 299.
    Java Básico –Módulo 1 Java Web Exemplo BodyTagSupport package br.com.softsite.tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.util.*; public class ChangeURL extends BodyTagSupport { public int doStartTag() throws JspException { return EVAL_BODY_BUFFERED; } Indica que o conteúdo será processado @regismelo 299
  • 300.
    Java Básico –Módulo 1 Java Web ... public int doEndTag() throws JspException { String pagina = this.bodyContent.getString(); String newPagina = trocarReferencias( pagina ) JspWriter jspwriter = this.pageContext.getOut(); try { jspwriter.print( newPagina ); } catch(java.io.IOException ioexception) { throw new JspException("Excecao em ChangeURL.doEndTag():" + ioexception.toString()); } return EVAL_PAGE; } @regismelo 300
  • 301.
    Java Básico –Módulo 1 Java Web ... public String trocarReferencias( String pagina ) { String regex = "hrefs*=s*"; // Trocar todas as referencias... String newPagina = pagina.replaceAll( regex, "href=http://www.sagaranatech.com?url=" ); return newPagina; } Isso é um uso de uma regular expression Esse recurso foi introduzido no SDK 1.4. Para mais informações, consulte http://guia-er.sourceforge.net/ @regismelo 301
  • 302.
    Java Básico –Módulo 1 Java Web Não esqueça de alterar a TLD… <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web- jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>dh</shortname> <info>My first Tag library</info> <tag> <name>changeURL</name> <tagclass>br.com.softsite.tags.ChangeURL</tagclass> <bodycontent>JSP</bodycontent> </tag> </taglib> @regismelo 302
  • 303.
    Java Básico –Módulo 1 Java Web Exemplo de página usando esse tag <%@taglib uri="WEB-INF/curso.tld" prefix="ss" %> <ss:changeURL> <HTML> <a href=http://www.cejug.org> Link para o CEJUG </a> <p> <a href=http://www.uol.com.br> Link para o UOL </a> <p> </HTML> </ss:changeURL> @regismelo 303
  • 304.
    Java Básico –Módulo 1 Java Web Exercício • Implemente o exercício anterior e faça-o rodar. @regismelo 304
  • 305.
    Java Básico –Módulo 1 Java Web Para saber mais Core Servlets and JSP Pages (CSAJSP-Chapter14) 14.5 Optionally Including the Tag Body Creating Custom JSP Tag Libraries The Tag Handler Class 14.1 The Components That Make Up a Tag Library The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.6 Manipulating the Tag Body The JSP File The Tag Handler Class 14.2 Defining a Basic Tag The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.7 Including or Manipulating the Tag Body Multiple Times The JSP File The Tag Handler Class 14.3 Assigning Attributes to Tags The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File 14.8 Using Nested Tags The JSP File The Tag Handler Classes 14.4 Including the Tag Body The Tag Library Descriptor File The Tag Handler Class The JSP File The Tag Library Descriptor File The JSP File @regismelo 305
  • 306.
    Java Básico –Módulo 1 Java Web Que tecnologia utilizar? E quanto utilizar? @regismelo 306
  • 307.
    Java Básico –Módulo 1 Java Web Aplicação simples ou time de desenvolvimento •Execute código Java diretamente. Ponha todo pequeno código no JSP. •Execute código Java indiretamente. Desenvolva classes utilitárias separadas. Ponha na pagina JSP somente o código necessário para chamar as classes utilitárias. •Utilize Beans. Desenvolva classes utilitárias estruturadas como beans. Utilize jsp:useBean, jsp:getProperty, jsp:setProperty para efetuar as chamadas aos beans. •Utilize Tags customizadas. Desenvolva tags personalizadas. Se as tags ficarem complicadas, utilize classes utilitárias. Execute as tags utilizando a sintaxe XML de tags personalizadas. Aplicação complexa ou time •Utilize a arquitetura MVC. Tenha um servlet de desenvolvimento grande respondendo todas as requisições, buscando os Livro: More servlets and JSP; dados e armazenando os resultados em beans. Martin Hall Redirecione para um pagina JSP para mostrar os @regismelo dados. 307
  • 308.
    Java Básico –Módulo 1 Java Web @regismelo 308
  • 309.
    Java Básico –Módulo 1 Java Web @regismelo @regismelo 309

Notas do Editor

  • #104 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #105 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #106 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #107 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #108 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #109 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #110 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #111 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #112 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #113 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #114 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #172 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #173 Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
  • #291 Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt
  • #305 Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt