Introdução ao Java Web com Applets, Servlets e JSP
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
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
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
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
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
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
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
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
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
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
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
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
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
Notes de l'éditeur
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Comente nesse ponto a necessidade de conversão de tipos caso seja necessário receber um inteiro ou uma data, por exemplo.
Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt
Veja o exemplo do Struts em ./samples/TagLibraries-BodyTagSupport-Struts.txt ou softsite.com.br/university/java/web/TagLibraries-BodyTagSupport-Struts.txt