Palestra realizada durante o VII Encontro de Tecnologia da Informação na FIC. Foi uma palestra muito boa, tive um ótimo retorno. Pena que nos slides não há o demo que eu fiz no NetBeans, acho que foi o mais importante.
Palestra realizada durante o VII Encontro de Tecnologia da Informação na FIC. Foi uma palestra muito boa, tive um ótimo retorno. Pena que nos slides não há o demo que eu fiz no NetBeans, acho que foi o mais importante.
Palestra sobre JavaFX 1.2 apresentada no Sun Day da II Semana da Computação da UFPB. Apresenta uma introdução sobre JavaFX e as novidades do JavaFX 1.2.
Desenvolvimento web - conceitos, tecnologia e tendências.Valmir Justo
O Desenvolvimento de Aplicações WEB nem sempre é uma tarefa trivial. Esta apresentação demonstra diversos conceitos, tecnologias e metodologias que são utilizadas em diversos projetos.
Melhores práticas de deployment do IBM Connectionsrodrigoareis
Dependendo do tamanho da arquitetura de deployment, sistema operacional, segurança e outras considerações, você terá diferentes opções para configurar o IBM Connections. Esta apresentação traz recomendações de melhores práticas a partir de multiplas implementações do IBM Connections em vários clientes.
#ptBR Palestra dada na FATEC-ZL sobre desenvolvimento para a web em Java e o uso de frameworks. Exemplo dado usando SpringMVC.
A palestra teve bastante live coding, mas os repositórios contendo os códigos estudados estão indicados no slide.
Palestra sobre JavaFX 1.2 apresentada no Sun Day da II Semana da Computação da UFPB. Apresenta uma introdução sobre JavaFX e as novidades do JavaFX 1.2.
Desenvolvimento web - conceitos, tecnologia e tendências.Valmir Justo
O Desenvolvimento de Aplicações WEB nem sempre é uma tarefa trivial. Esta apresentação demonstra diversos conceitos, tecnologias e metodologias que são utilizadas em diversos projetos.
Melhores práticas de deployment do IBM Connectionsrodrigoareis
Dependendo do tamanho da arquitetura de deployment, sistema operacional, segurança e outras considerações, você terá diferentes opções para configurar o IBM Connections. Esta apresentação traz recomendações de melhores práticas a partir de multiplas implementações do IBM Connections em vários clientes.
#ptBR Palestra dada na FATEC-ZL sobre desenvolvimento para a web em Java e o uso de frameworks. Exemplo dado usando SpringMVC.
A palestra teve bastante live coding, mas os repositórios contendo os códigos estudados estão indicados no slide.
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Tchelinux
Escrever um bom código, legível, eficiente e seguro, é uma competência necessária para codificar em qualquer linguagem. O objetivo é abordar técnicas de refatoração, boas práticas, código seguro e testes, utilizando exemplos com a linguagem Java. A bibliografia indicada é Refatoração, do Martin Fowler, e Effective Java do Joshua Bloch.
Resumo de algumas palestras interessantes que participei do Agile Brazil 2013.
Dividi em três partes:
1 - Processos ágeis e Kanban
2 - Desenvolvimento ágil
3 - Time, motivação e gestão
Primeiro Módulo do curso de Java Básico da Interplan Soluções em Conectividade Ltda. Serão um total de 11 (onze) módulos. Este curso aborda os conceitos fundamentais da Linguagem Java da Interplan soluções em Conectividade.
A apresentação aborda sobre a origem e o core do Spring, um framework open-source para desenvolvimento Java, bem como seus principais projetos e porque esse mega projeto de quase 20 anos de idade, ainda hoje é popular do mundo Java. Discutiremos sua arquitetura, funcionalidades e um roadmap dos projetos que estão sendo trabalhados no momento.
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
Notas do Editor
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