Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Programação para a Web
Alexandre Meslin
meslin@inf.puc-rio.br
2
Ementa
� Tecnologias Web
� JSP
� Cookies
� JavaBeans
� Banco de Dados
� Servlets
� Hibernate
3
Referências
� Bibliografia
� Web Development with Java Server Pages
Fields/Kolb
Manning
� Use a cabeça! Servlets & JSP
Brian Basham, Kathy Sierra e Bert Bates
Altabooks
� Na Internet
� http://www.inf.puc-rio.br/~meslin/Web
� http://www.apache.org
� http://jcp.org/en/home/index
� http://www.jguru.com/index.jsp
� http://www.jspbrasil.com.br
� http://www.macromedia.com
5
Sistema de Avaliação
� G1: 2 trabalhos práticos
� G2: 2 trabalhos práticos
� PF: 1 prova teórica
� Obs.: 
� Não aceito trabalhos 
entregues depois do 
prazo
� A PF funciona como 2a
chamada para um dos 
trabalhos (apenas UM). 
Se necessário, servirá 
também como PF
6
Plano de Aula
� Introdução
� Java Server Page
� Elementos de script
� Tags
� Declarações de variáveis e métodos
� Diretivas
� Objetos Implícitos
� Session
� Application
� Trabalhando com cookies
� JavaBeans
� JDBC
� Construindo uma aplicação
� Persistência com Hibernate
7
Por que Java?
8
Por que JSP/Servlet (Java)?
Fonte: http://w
w
w
.tiobe.com
9
Por que JSP/Servlet (Java)?
Fonte: http://w
w
w
.tiobe.com
10
Perguntas?
11
Parte 1
� Introdução
12
Usos de JSP
� Mecanismo de criação de páginas com 
conteúdo dinâmico na Web
� Aplicações
� Contadores de acesso
� Livros de visitantes
� Banners aleatórios
� Envio de correspondência (email)
� Interface com banco de dados
13
Suporte à JSP
� Tomcat (http://www.apache.org)
� Freeware
� JRun (http://www.macromedia.com)
� Trial
� Não vou usar (e não conheço ninguém que use)
14
Instalação do ambiente de trabalho
� Instale Java
� Instale servidor Web
� Instale container JSP
� Instale o ambiente de desenvolvimento (IDE)
� Em um futuro próximo
� Instale o conector do banco de dados
� Instale o Hibernate
15
Instalação de Java
� (espero que você já tenha feito isto há muito 
tempo!)
� Faça download da última versão do J2SE em 
http://java.sun.com
� Este material foi desenvolvido utilizando-se JDK 6
� Instale o pacote utilizando o método NNF
16
Instalação de Java
� Inicie a instalação
17
Instalação de Java
� Leia atentamente os 
termos da licença e 
somente os aceite se 
concordar plenamente!
� Clique em Accept
18
Instalação de Java
� Selecione o que deve se 
instalado
� Para economizar 
espaço, podem ser 
retirados
� Demos
� Source Code
� Clique Next
19
Instalação de Java
� Espere (muito!!!)
20
Instalação de Java
� Selecione os itens que 
você deseja para a 
máquina virtual
� Clique Next
21
Instalação de Java
� Espere muito 
novamente...
22
Instalação de Java
� Clique Finish (até que 
enfim!!!)
23
Instalação do Apache Tomcat
� Instalou Java?
� Agora instale Apache+Tomcat
� Para dar suporte a JSP 2.0 é necessário Tomcat 5 ou 
mais recente
� O Tomcat é composto por:
� Catalina: um container para servlets
� Coyote: conector HTTP
� Jasper: compilador JSP para Java
� Você pode instalar de duas formas:
� Como serviço (primeiro exemplo)
� Instalação manual (segundo exemplo)
24
Instalação do Apache Tomcat como Serviço
(primeira opção)
� No site http://www.apache.org (ou em 
http://tomcat.apache.org), faça download da 
última versão do Tomcat
� Instale o pacote através de NNF, apenas 
verificando o que você gostaria que fosse 
instalado
� A seguir, exemplo de instalação da versão 6
25
Instalação do Apache Tomcat versão 6
� Inicie a instalação
26
Instalação do Apache Tomcat
� Clique Next
27
Instalação do Apache Tomcat
� Leia atentamente os 
termos da licença e 
somente os aceite se 
concordar plenamente!
� Clique em I Agree
28
Instalação do Apache Tomcat
� Selecione os itens que 
devem ser instalados
� Para economizar 
espaço, podem ser 
excluidos
� Start Menu Itens
� Documentation
� Examples
� Webapps
� Clique Next
29
Instalação do Apache Tomcat
� Selecione a pasta de 
instalação (pode usar a 
padrão)
� Clique Next
30
Instalação do Apache Tomcat
� Escolha a porta do serviço
� 8080, se houver outro 
servidor web instalado (ex.: 
IIS)
� 80, caso seja o único 
servidor web
� Entre com o User Name e 
Password para o 
administrador do sistema
� Obs.:
� Não esqueça o User Name e 
Password
� Lembre-se que a senha será 
armazenada em texto livre!!!
� Clique Next
31
Instalação do Apache Tomcat
� Informe a pasta onde 
está o JRE
� Clique em Install
32
Instalação do Apache Tomcat
� Espere…
33
Instalação do Apache Tomcat
� Espere mais um 
pouco…
34
Instalação do Apache Tomcat
� Espere mais um 
pouco…’tá quase lá...
35
Instalação do Apache Tomcat
� Clique Finish
Instalação do Apache Tomcat Manualmente
(segunda opção)
� Faça download do 
arquivo ZIP de acordo 
com o seu sistema 
operacional (32 ou 64 
bits)
� Descompacte em algum 
diretório
� E... acabou!
36
37
Configuração do Apache-Tomcat
(para desenvolvimento APENAS!!!)
� No arquivo web.xml, habilite a opção de browse no diretório através de 
navegador
� Somente faça isto para facilitar a localização dos seus itens durante o 
desenvolvimento
� Pode representar um risco para sites de produção
<servlet> 
 <servlet-name>default</servlet-name> 
 <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> 
 <init-param> 
 <param-name>debug</param-name> 
 <param-value>0</param-value> 
 </init-param> 
 <init-param> 
 <param-name>listings</param-name> 
 <param-value>true</param-value> 
 </init-param> 
 <load-on-startup>1</load-on-startup> 
</servlet> 
38
Verificação da Instalação do Apache Tomcat
� Abra o Monitor Tomcat 
em Start�All Programs 
�Apache Tomcat 6.0 
� Monitor Tomcat
39
Verificação da Instalação do Apache Tomcat
� No System Tray, clique 
como botão direito do 
mouse no ícone do 
monitor e selecione 
Configure...
40
Verificação da Instalação do Apache Tomcat
� Clique em Start
41
Verificação da Instalação do Apache Tomcat
� E espere...
42
Verificação da Instalação do Apache Tomcat
� Tenha certeza que o 
serviço foi iniciado 
corretamente...
43
Verificação da Instalação do Apache Tomcat
� Abra o browser
� Digite:
� http://localhost:8080
� Você deve obter uma 
página semelhante a 
esta
48
Instalação do Eclipse
� http://www.eclipse.org
� Procure pelo eclipse WTP (Web Tools 
Platform)
� Eclipse Helios (WTP 3.6.1)
� Eclipse Galileo (WTP 3.1)
� Eclipse Ganymed (WTP 3.0.5)
49
Configuração do Eclipse
� Para instalar o Eclipse, 
extraia o conteudo do 
arquivo ZIP dentro de 
Arquivos de programas 
ou Program files ou na 
raiz do seu disco
50
Configuração do Eclipse
51
Configuração do Eclipse
� Selecione o local para ser o seu workspace
� (a pasta onde serão criados os seus projetos)
� Clique OK
52
Configuração do Eclipse
� Verifique se a 
instalação reconheceu o 
JRE correto
� Clique em:
� Windows
� Preferences...
53
Configuração do Eclipse
� Clique em:
� Java
� Instaled JREs
� Selecione o JRE ou
� Adicione o JRE correto
54
Configuração do Eclipse
� Clique em:
� Java
� Compiler
� Selecione o nível 
correto de 
conformidade do 
compilador (6.0)
� Clique em OK
55
Configuração do Tomcat no eclipse
� Clique em
� Server
� Runtime Environment
� Clique em Add...
56Configuração do Tomcat no eclipse
� Expanda o item Apache
� Selecione a versão 
correta (Apache Tomcat 
v6.0, no nosso caso)
� Clique Next
57
Configuração do Tomcat no eclipse
� Informe o diretório de 
instalação do Apache 
Tomcat
� Informe o JRE que você 
configurou previamente
� Clique Finish
67
Perguntas?
68
Parte 2
� Criando um novo projeto
69
Criando um Novo Projeto Web
� Clique em:
� File
� New
� Dynamic Web Project
70
Criando um Novo Projeto Web
� Em Project name: 
informe o nome do 
projeto
� Verifique se o “Target 
runtime” é o Apache 
Tomcat que você criou 
anteriormente
� Clique em Next
71
Criando um Novo Projeto Web
Dynamic web module version
Valor Descrição
2.2 J2EE 1.2
2.3 J2EE 1.3
2.4 J2EE 1.4
2.5 J2EE 5
3.0 J2EE 6
72
Criando um Novo Projeto Web
� Adicione, edite e/ou 
remova folders, caso 
necessário 
(normalmente não é)
� Clique Next
73
Criando um Novo Projeto Web
� Modifique o nome 
público do projeto, caso 
necessário (aqui, 
normalmente também 
não precisamos mexer)
� Modifique o nome do 
diretório de conteúdo 
(idem)
� Clique Finish
74
Criando um Novo Projeto Web
� A esta altura, deve ter sido 
criada a árvore mostrada ao 
lado
� Estrutura de pastas criada:
� WebContent: HTML, CSS, 
JSP, etc.
� src: arquivos fontes em Java 
(javabeans e servlets)
� WEB-INF/classes: .class 
(javabeans e servlets)
� WEB-INF/lib: .jar
� WEB-INF: arquivos sem 
acesso direto pelo cliente
� work: servlets convertidos a 
partir de páginas JSP
75
Criando uma Nova Pasta em um Projeto Web
� Crie uma nova pasta 
para organizar os itens 
(opcional)
� Selecione o projeto
� Clique em:
� File
� New
� Folder
76
Criando uma Nova Pasta em um Projeto Web
� Informe a localização 
da pasta (dentro de 
WebContent do seu 
novo projeto)
� Informe o nome da 
pasta
� Clique Finish
77
Criando um Arquivo JSP em um Projeto Web
� Selecione:
� File
� New
� Other
78
Criando um Arquivo JSP em um Projeto Web
� Em Web, selecione JSP
� Clique Next
79
Criando um Arquivo JSP em um Projeto Web
� Selecione o diretório 
correto (aquele que 
você acabou de criar)
� Informe o nome do 
arquivo no formato: 
nome.jsp
� Clique Next
80
Criando um Arquivo JSP em um Projeto Web
� Selecione o modelo de 
acordo com a saída 
desejada
� HTML
� XHTML
� XML
� Clique Finish
81
Criando um Javabean em um Projeto Web
� Selecione:
� File
� New
� Other
82
Criando um Javabean em um Projeto Web
� Em Java, selecione 
Class
� Clique Next
83
Criando um Javabean em um Projeto Web
� Entre com o nome do 
pacote
� Entre com o nome da 
classe
� Clique Finish
� (lembre-se que este nome 
também será o nome do 
arquivo .java)
� Obs.: de preferência inicie o 
pacote com letra minúscula 
e a classe com letra 
maiúscula
84
Instalação de uma Biblioteca Externa
� Clicar com o botão 
direito no projeto
� Selecionar Build Path
� Clicar em Add 
libraries...
85
Instalação de uma Biblioteca Externa
� Selecionar User Library
� Clicar em Next
86
Instalação de uma Biblioteca Externa
� Clicar em User 
Libraries...
87
Instalação de uma Biblioteca Externa
� Clicar em New
88
Instalação de uma Biblioteca Externa
� Informar o nome da 
nova biblioteca
89
Instalação de uma Biblioteca Externa
� Clicar em Add JARS...
90
Instalação de uma Biblioteca Externa
� Navegar até o .JAR 
desejado
� Clicar OK
91
Instalação de uma Biblioteca Externa
� Adicione quantos jar’s 
forem necessários
� Clicar em OK quando 
terminar de adicionar 
os jar’s
92
Instalação de uma Biblioteca Externa
� Clicar em Finish
93
Instalação de uma Biblioteca Externa
� Verifique em “Problems” se a biblioteca será 
exportada (caso seja necessário)
94
Instalação de uma Biblioteca Externa
� Caso a biblioteca deva ser publicada junto com a 
aplicação, clique com o botão direito na advertência 
e selecione “Quick Fix”
95
Instalação de uma Biblioteca Externa
� Selecione “Mark the 
associated raw 
classpath entry as a 
publish/export 
dependency.”
� Selecione os projetos 
que devem conter a 
biblioteca
� Clique em Finish
96
Publicando um site de um Projeto Web
� Clique com o botão da 
direita no projeto
� Selecione Export
97
Publicando um site de um Projeto Web
� Em Web, selecione 
WAR file
� Clique Next
98
Publicando um site de um Projeto Web
� Verifique se o nome do 
projeto está correto
� Informe o nome do arquivo 
WAR (com a path!)
� Lembre-se de marcar 
“Export source files”
(mas somente durante o 
curso, e nunca depois)
� Clique Finish
99
Publicando um site de um Projeto Web
� Você sabia...
� Que o arquivo .WAR é na verdade um arquivo 
ZIP com alguns arquivos descrevendo como 
deve ser publicado
� Que você pode (e deve) abrir o arquivo WAR 
com um programa de manipulação de arquivos 
ZIP
� Dica: antes de publicar (ou de entregar o seu 
trabalho), abra o arquivo para ver se está tudo certo!
100
Problemas conhecidos e suas “soluções”
� Problema:
� Site não encontrado
� Solução:
� Clique com o botão direito do mouse sobre o 
servidor Tomcat na aba “Servers”
� Selecione “Clean...”
� Reinicie o servidor
101
Problemas conhecidos e suas “soluções”
� Problema:
� Classe não pode ser carregada mas foi incluída 
como biblioteca do usuário
� Solução:
� Selecione a aba “Problems”
� Clique com o botão direito sobre a biblioteca que 
não está sendo exportada
� Selecione “Quick fix”
� Selecione exportar a biblioteca
� Reinicie o servidor
102
Problemas conhecidos e suas “soluções”
� Sintoma:
� Erro ao importar javax.servlet.*
� Problema:
� Faltando biblioteca do Apache Tomcat em “Java 
Resources: src” dentro do “Project Explorer”
� Solução:
� Clique com o botão direito no seu projeto
� Em “Build Path”, selecione “Configure Build Path…”
� Na aba “Libraries”, clique em “Add Library…”
� Selecione Server Runtime na janela “Add Library”
� Clique Next
� Selecione “Apache Tomcat vX.X” (o X.X vai depender
da versão instalada do seu Tomcat)
� Clique Finish e depois clique em OK
Problemas conhecidos e suas “soluções”
� Problema
� Faltando alguma biblioteca ou classe
� Solução
� Incluir a biblioteca ou JAR que está faltando
103
Problemas conhecidos e suas “soluções”
� Problema
� Nome do runtime já em uso quando um novo 
projeto Web Dinâmico está sendo criado
� Solução
� Reiniciar o eclipse (fechar e abrir) ???
104
105
Perguntas?
106
Parte 3
� IP
� TCP
� HTTP
� HTML
107
Um pouco de TCP/IP
108
HTTP em TCP
109
HTTP em IP
110
Arquitetura Web
� Baseada em HTTP 
� Protocolo simples de transferência de arquivos. 
� Sem estado (não mantém sessão aberta).
� Funcionamento (simplificado):
111
Cliente e Servidor HTTP
� Servidor HTTP 
� Gerencia sistema virtual de arquivos e diretórios 
� Mapeia pastas do sistema de arquivos local (ex: 
c:\htdocs) a diretórios virtuais (ex: /) acessíveis 
remotamente (notação de URI - Uniform 
Resource Identifiers)
� Papel do servidor HTTP
� Interpretar requisições HTTP do cliente (métodos 
GET, POST, ...) 
112
Cliente e Servidor HTTP
� Cliente HTTP
� Navegadores (IE, Netscape, Mosaic, Chrome, Opera, 
Safari, Firefox, etc.)
� Papel do cliente HTTP
� Enviar requisições HTTP (GET, POST, HEAD, ...) a um 
servidor. 
� Requisições contém URI do recurso remoto e, 
opcionalmente, dados (se método HTTP for POST)
�Processar respostas HTTP recebidas (interpretar 
cabeçalhos, identificar tipo de dados, interpretar dados 
ou repassá-los.
113
Página Alo Mundo (AloMundo.html)
<HTML>
<HEAD>
<TITLE>Alo Mundo em HTML</TITLE>
</HEAD>
<BODY>
Alo mundo!!!
</BODY>
</HTML>
114
Página Alo Mundo (AloMundo.html)
115
Flags TCP
� CWR - Congestion Window Reduced
� ECE - Explicit Congestion Notification echo
� URG – Urgent
� ACK – Acknowledgement
� PSH – Push
� RST – Reset
� SYN – Synchronize
� FIN - Finished
116
Página com imagem (Imagem.html)
<html>
<head>
<title>Página com imagem</title>
</head>
<body>
Imagem: <img src="java.jpg">
</body>
</html>
117
Página com imagem (Imagem.html)
118
Página com imagem (Imagem.html)
119
Página com cookie
GET /Exemplos/html/Cookies.html HTTP/1.1
Accept: */*
Referer: http://setembro:8080/Exemplos/html/
Accept-Language: pt-br
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Sat, 09 Aug 2008 15:08:07 GMT
If-None-Match: W/"225-1218294487705"
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: setembro:8080
Connection: Keep-Alive
Cookie: nomeDoCookie=COMIDA
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
ETag: W/"225-1218294893537"
Last-Modified: Sat, 09 Aug 2008 15:14:53 GMT
Content-Type: text/html
Content-Length: 225
Date: Sat, 09 Aug 2008 15:15:12 GMT
<html>
<head>
<META HTTP-EQUIV="Set-Cookie" CONTENT="nomeDoCookie=COMIDA;expires=Wednesday, 19-Jan-38 3:14:07 GMT; 
path=/">
<title>Envia e recebe cookies</title>
</head>
<body>
Usando cookies em html
</body>
</html>
120
Comparação entre tecnologias
� Cliente-side
� Javascript (Jscript)
� VBScript
� Applets Java
� Server-side
� CGI (Perl)
� ASP
� PHP
� Servlets
� JSP
121
HTML - HyperText Markup Language
� Define a interface do usuário na Web
� Pode ser usada para 
� Definir a estrutura do texto de uma página (que 
o browser posteriormente formatará com uma 
folha de estilos) 
� Incluir imagens numa página 
� Incluir vínculos a outras páginas 
� Construir uma interface com formulários para 
envio de dados ao servidor 
� Servir de base para aplicações rodarem dentro 
do browser (javascript, applets Java, plug-ins, 
vídeos, etc.)
122
CSS - Cascading Style Sheets
� Linguagem usada para definir folhas de estilo 
que podem ser aplicadas a todo o site. 
� Cuida exclusivamente da aparência (forma) 
da página 
� Permite posicionamento absoluto de textos e 
imagens, manipulação com fontes, cores, etc.
� Regras são colocadas em arquivo de texto 
.css: 
123
Limitações
� HTML e CSS são linguagens declarativas, 
interpretadas pelo browser, que definem apenas 
como a informação será organizada e apresentada.
� Não oferecem recursos de programação.
� Os formulários criados com HTML não fazem nada 
(eles precisam ser vinculados a uma aplicação)
� Não é possível construir aplicações Web interativas 
utilizando apenas CSS e HTML
� DHTML: solução para alguns problemas 
� apresentação + estrutura + interatividade
124
Tecnologias interativas
� Lado-cliente 
� Linguagens de extensão: JavaScript, VBScript 
� Plug-ins e componentes (applets, activeX) 
� Soluções integradas: DHTML
� Persistência de sessão cliente-servidor 
� Cookies
� Lado-servidor 
� CGI, plug-ins do servidor e componentes 
� Linguagens de extensão: SAPIs, ASP, JSP, PHP
125
Tecnologias lado cliente
� Estendem a funcionalidade básica do browser
� Permitem criar uma interface do usuário dinâmica 
� Tratamento de eventos 
� Alteração dinâmica do conteúdo ou da apresentação 
� Realização de cálculos e computação 
� Disposição de recursos não disponíveis no browser
� Principais tecnologias 
� Extensões do HTML (scripts): JavaScript, VBScript, 
linguagens proprietárias 
� Extensões do browser (componentes): Applets, ActiveX, 
Plug-ins
126
Scripts: extensões do HTML
� Forma mais flexível de estender o HTML
� Código geralmente fica visível na página: 
� Linguagens de roteiro (script) mais populares 
� VBScript (MSIE): baseado na sintaxe do VB.
� JavaScript (Netscape)/JScript (MSIE): sintaxe 
semelhante a C
� Código é interpretado diretamente pelo 
browser
127
Tecnologias lado servidor
� Estendem as funções básicas de servidor HTTP: 
� CGI - Common Gateway Interface 
� APIs: ISAPI, NSAPI, Apache API, Servlet API, ... 
� Scripts: ASP, JSP, LiveWire (SSJS), Cold Fusion, PHP, ...
� Rodam do lado do servidor, portanto, não 
dependem de suporte por parte dos browsers 
� Browsers fornecem apenas a interface do usuário
� Interceptam o curso normal da comunicação 
� Recebem dados via requisições HTTP (GET e POST) 
� Devolvem dados através de respostas HTTP
128
CGI - Common Gateway Interface
� Especificação que determina como construir uma 
aplicação que será executada pelo servidor Web
� Programas CGI podem ser escritos em qualquer 
linguagem de programação. A especificação limita-
se a determinar os formatos de entrada e saída dos 
dados (HTTP).
� O que interessa é que o programa seja capaz de:
� Obter dados de entrada a partir de uma requisição HTTP 
� Gerar uma resposta HTTP incluindo os dados e parte do 
cabeçalho
� Escopo: camada do servidor 
� Não requer quaisquer funções adicionais do cliente ou do 
HTTP
129
Scripts de servidor
� Alguns dos mais populares: 
� Microsoft Active Server Pages (ASP) 
� Sun JavaServer Pages (JSP) 
� PHP
� A página geralmente possui uma extensão de nome de 
arquivo diferente para que o servidor a identifique como um 
programa
� As página ASP, PHP, JSP, etc. são processadas e os roteiros 
são executados pelo servidor, que os consome 
� No browser, chega apenas a saída do programa: página HTML 
� Comandos % .. % ou similares nunca chegam no browser 
� Servidor envia cabeçalho Content-type: text/html (default) ou algum 
outro tipo texto (text/xml, text/plain)
130
Resumindo: Site Web x Aplicação Web
Site Web Aplicação Web
131
Alo Mundo em HTML
<HTML>
<HEAD>
<TITLE>Alo Mundo em HTML</TITLE>
</HEAD>
<BODY>
Alo mundo!!!
</BODY>
</HTML>
132
Alo Mundo em JSP
<html>
<head>
<title>Alo mundo em JSP</title>
</head>
<body>
<%="Alo mundo!!! Funcionou!!! Ops... é óbvio..." %>
</body>
</html>
133
Alo Mundo Bean
package aloMundo;
public class AloMundo implements java.io.Serializable
{
Private String nome;
public AloMundo()
{
this.nome = "mundo";
}
public String getNome()
{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}
}
134
Alo Mundo Bean
<HTML>
<HEAD>
<TITLE>Alo mundo (versão Bean)</TITLE>
</HEAD>
<BODY>
<jsp:useBean id="alo" class="aloMundo.AloMundo"/>
<jsp:setProperty name="alo" property="nome" param="nome"/>
Alo <jsp:getProperty name="alo" property="nome"/>!!
</BODY>
</HTML>
135
Perguntas?
136
Aula HTML
� HTML
137
Arquivo HTML
� O que é uma página web?
� Uma página é um arquivo texto
� (abra uma página qualquer e utilize "visualizar fonte")
� Browser (navegador)
� Interpreta o HTML
� Exibe a página formatada
� Ex. de uso médio em dezembro de 2010:
� Internet Explorer (44,53%)
� Firefox (29,56%)
� Chrome (12,34%)
� Safari (5,80%)
� Opera (2,15%)
� Móvel (4,10%)
Fonte: http://en.w
ikipedia.org/w
iki/U
sage_share_of_w
eb_brow
sers
138
HTML
� Hypertext Markup Language (Linguagem de 
Marcação de Hipertexto)
� Hipertexto: links dentro de uma página web
� HTML não é uma linguagem de programação
� HTML utiliza tags para realizar a marcação do 
texto das páginas web
139
Tags HTML
� Tags de marcação HTML são chamadas 
simplesmente de tags HTML
� TagsHTML são palavras chaves dentro de < e > 
como por exemplo <html>
� Tags HTML geralmente aparecem aos pares 
como <b> e </b>
� A primeira tag de um par é a tag de abertura e a 
segunda a tag de fechamento
140
Documento HTML = Página Web
� Documentos HTML:
� Descrevem páginas web
� Contém tags HTML e texto puro
� Também chamadas de páginas web
� A finalidade de um browser é ler o 
documento HTML e o exibir como uma página 
web
� O browser não mostra as tags HTML, mas as 
utiliza para interpretar o conteúdo da página
141
Documento HTML = Página Web
<html>
<body>
<h1>Meu primeiro cabeçalho</h1>
<p>Meu primeiro parágrafo</p>
</body>
</html>
142
Elementos HTML
� Um elemento HTML é tudo desde a tag de abertura 
até a tag de fechamento
Tag de abertura Elemento contido Tag de fechamento
<p> Este é um parágrafo </p>
<a href="pagina.html"> Este é um link </a>
<br />
143
Sintaxe dos elementos HTML
� Um elemento HTML inicia com uma tag de abertura
� Um elemento HTML termina com uma tag de fechamento
� O elemento contido é qualquer coisa entre o início e o fim
� Algumas tags HTML tem conteúdo vazio
� Elementos vazios são fechados na tag de abertura
� Algumas tags podem possuir atributos
� Um elemento HTML inicia com uma tag de abertura
� Um elemento HTML termina com uma tag de fechamento
� O elemento contido é qualquer coisa entre o início e o fim
� Algumas tags HTML tem conteúdo vazio
� Elementos vazios são fechados na tag de abertura
� Algumas tags podem possuir atributos
144
Elementos HTML Aninhados
� A maior parte dos elementos HTML podem 
ser aninhados – podem conter outros 
elementos HTML
� Um documento HTML consiste de elementos 
HTML aninhados
<html>
<body>
<h1>Meu primeiro cabeçalho</h1>
<p>Meu primeiro parágrafo</p>
</body>
</html>
145
Não esqueça a tag de fechamento!
� A maior parte dos browsers irão exibir corretamente 
mesmo se você esquecer as tags de fechamento
<p>Isto é um parágrafo
<p>Isto é outro parágrafo
� O exemplo acima irá funcionar na maioria dos 
browsers, mas não confine nisto.
� Esquecer a tag de fechamento pode causar 
resultados inesperados ou erros em versões futuras 
de browsers
� Obs.: versões futuras de HTML não permitirão que 
você não use as tags de fechamento
146
Elementos HTML vazios
� Elementos HTML sem conteúdo são 
chamados de elementos vazios
� Elementos vazios podem ser fechados na tag 
de abertura
� <br> é um elemento que não possui uma tag 
de fechamento
� Em XHTML, XML e versões futuras de HTML, 
todos os elementos deverão ser fechados
� Utilize <... /> em tags vazias (sem conteúdo) 
- <br />
147
Atributos HTML
� Elementos HTML podem ter atributos
� Atributos:
� Fornecem informações adicionais sobre o 
elemento
� Somente são especificados na tag de abertura
� Aparecem em pares do tipo nome/valor: 
nome="valor"
148
Exemplo de atributo
� Links HTML são especificados pela tag <a>
� O endereço do link é fornecido como um 
atributo
<a href='http://www.meslin.com.br'>Este é um link</a>
149
Utilize cotas para valores dos atributos
� Os valores dos atributos devem ser escritos 
entre aspas " ou entre plics ' (aspas simples)
<a href="http://www.meslin.com.br">Este é um link</a>
<a href='http://www.meslin.com.br'>Este é um link</a>
150
Dica: utilize letras minúsculas
� Tags HTML não diferenciam letras maiúsculas de 
minúsculas.
� <P> e <p> significam a mesma coisa
� W3C recomenda o uso de letras minúsculas em 
HTML 4
� Futuras versões de HTML e XHTML utilizarão 
somente tags com letras minúsculas
� Nome do atributo e seu valor também não 
diferenciam maiúsculas de minúsculas
� Da mesma forma, o uso de letras minúsculas para o 
nome do atributo é recomendável
� Utilize também letras minúsculas para o valor do 
atributo, exceto quando o uso de letras maiúsculas 
for necessário
151
Cabeçalhos HTML
� Cabeçalhos são definidos por tags de <h1> (maior letra) até <h6> (menor letra)
� Exemplo:
<html>
<body>
<h1>Este é um cabeçalho H1</h1>
<h2>Este é um cabeçalho H2</h2>
<h3>Este é um cabeçalho H3</h3>
</body>
</html>
� Obs.: o browser adiciona uma quebra de linha antes e depois de um cabeçalho
152
Linhas em HTML
� A tag <hr /> é utilizada para criar uma linha horizontal
<html>
<body>
<h1>Este é um cabeçalho H1</h1>
<hr />
<h2>Este é um cabeçalho H2</h2>
<hr />
<h3>Este é um cabeçalho H3</h3>
</body>
</html>
153
Comentário HTML
� Comentários devem ser incluídos nos códigos 
HTML para melhorar a legibilidade e o 
entendimento
� Comentários são ignorados pelo browser –
eles não são exibidos
<!-- este é um comentário -->
� Atenção: existe um ponto de exclamação no 
início da tag, mas não no final
154
Parágrafos
� Parágrafos são definidos pela tag <p>
<html>
<body>
<p>Isto é um parágrafo</p>
<p>Isto é outro parágrafo</p>
</body>
</html>
155
Quebra de linhas
� Utilize <br /> se você quiser quebrar uma linha sem começar um novo parágrafo
<html>
<body>
<p>Isto é 
um parágrafo</p>
<p>Isto é outro parágrafo</p>
<p>Este 
é um <br />
pará<br />
grafo com quebra de linha</p>
</body>
</html>
156
Formatação
157
Atributo style
� Utilize no lugar das seguintes tags:
� <center>
� <font>
� <basefont>
� <s>
� <strikeout>
� <u>
� E dos seguintes atributos:
� align
� bgcolor
� color
158
Exemplos de style
� Cor do fundo:
� Define uma cor de fundo para uma página:
<body style="background-color:yellow">
� Tipo, cor e tamanho de fonte:
� Define um estilo para um parágrafo
<p style="font-family:courier new; color:red; font-
size:20px">
� Alinhamento de texto:
� Define um alinhamento para um cabeçalho <h1>
<h1 style="text-align:center">
159
Hiperlinks, âncoras e links
� Hiperlink é uma referência a um recurso na 
web
� Hiperlink pode apontar para qualquer recurso 
da web:
� Uma página HTML
� Uma imagem
� Um arquivo de som
� Um arquivo de filme
� Âncora é o termo utilizado para o destino de 
um hiperlink dentro de um documento
160
Um link HTML
� Sintaxe:
<a href="url">texto do link</a>
� Obs.: o "texto do link" não precisa ser um texto, 
pode ser uma imagem ou qualquer outro elemento 
HTML
� O atributo href define o endereço destino do link
<a href='http://www.meslin.com.br'>Meu site</a>
� O código acima irá ser exibido em um browser da 
seguinte forma:
Meu site
161
O atributo target
� O atributo target define onde o documento 
referenciado deverá ser aberto
<a href="http://www.meslin.com.br" 
target="_blank">Meu site</a>
� O código acima irá abrir o documento em 
uma nova janela do browser
162
O atributo name
� Quando o atributo name é utilizado, a tag <a> define uma 
âncora dentro de um documento HTML
� Uma âncora é invisível para o usuário
� Sintaxe:
<a name="lugar">qualquer conteúdo (geralmente vazio)</a>
� Um link para esta âncora dentro da mesma página:
<a href="#lugar">o link</a>
� Um link para esta âncora em outra página web
<a href="pagina.html#lugar">o link</a>
� Um link para esta âncora em outra página de outro site
<a href="http://www.meslin.com.br/pagina.html#lugar">o link</a> 
163
Imagens
� Em HTML, uma imagem é definida por uma tag <img>
� A tag <img> é vazia
� O atributo src indica o endereço (url) da imagem
� Sintaxe:
<img src="url" />
� Exemplo:
� Imagem no mesmo diretório do arquivo HTML
<img src="imagem.gif">
� Imagem em outro diretório
<img src="diretorio/imagem.gif" />
� Imagem em outro site
<img src="http://www.meslin.com.br/diretorio/imagem.gif" />
164
O atributo alt
� Utilizado para definir um texto alternativo
� Texto definido pelo autor
� Ferramentasde acessibilidade utilizam este texto 
para descrever a imagem para deficientes visuais
� O texto será mostrado
� Se o endereço da imagem estiver errado
� Se a imagem demorar a ser carregada
� Se o usuário desabilitar a possibilidade do browser exibir 
imagem
� Sintaxe:
<img src="imagem.gif" alt="um texto alternativo"/>
165
Tabelas
� Definição da tabela em si:
<table> .... </table>
� Atributos:
� border = largura da borda em pixels
� cellspacing = espaço entre as células
� cellpadding = espaço entre o texto e as bordas
� width = largura da tabela
166
Tabelas
� Definição dos elementos da tabela:
� <tr>....</tr> - Linha
� <th>....</th> - Cabeçalho
� <td>....</td> - Célula
� Atributos:
� valign = alinhamento vertical (TOP, MIDDLE ou BOTTOM)
� align = alinhamento horizontal (LEFT, CENTER ou RIGHT)
� rowspan = número de linhas ocupadas pela célula
� colspan = número de colunas ocupadas pela célula
� width = largura da célula
� height = altura da célula
� bgcolor = cor de fundo
� nowrap
167
Tabelas
� Aplicando cores na tabela:
� bgcolor pode ser usado dentro de
� <table>
� <tr>
� <td>
168
Exemplos de tabelas
<html>
<body>
<table border="1">
<tr>
<td>linha 1, célula 1</td>
<td>linha 1, célula 2</td>
</tr>
<tr>
<td>linha 2, célula 1</td>
<td>linha 2, célula 2</td>
</tr>
</table> 
</body>
</html>
169
Tabela com cabeçalho
<html>
<body>
<table border="1">
<tr>
<th>Cabeçalho</th>
<th>Outro Cabeçalho</th>
</tr>
<tr>
<td>linha 1, célula 1</td>
<td>linha 1, célula 2</td>
</tr>
<tr>
<td>linha 2, célula 1</td>
<td>linha 2, célula 2</td>
</tr>
</table> 
</body>
</html>
170
Tabela com célula vazia
<html>
<body>
Uma tabela
<table border="1">
<tr>
<td>linha 1, célula 1</td>
<td>linha 1, célula 2</td>
</tr>
<tr>
<td>linha 2, célula 1</td>
<td></td>
</tr>
</table> 
Outra tabela
<table border="1">
<tr>
<td>linha 1, célula 1</td>
<td>linha 1, célula 2</td>
</tr>
<tr>
<td>linha 2, célula 1</td>
<td>&nbsp;</td>
</tr>
</table> 
</body>
</html>
171
Listas não numeradas
� <ul type="circle" | "disc" | "square">
<li type="circle" | "disc" | "square"
value="numero">
</ul>
172
Listas não numeradas
<ul>
<li> Correio Eletrônico </li>
<li> Telnet </li>
<li> FTP </li>
</ul>
� Obs:
� Listas podem ser aninhadas
� </li> é opcional atualmente, mas devemos nos 
lembrar de colocar
173
Listas Numeradas
<ol 
start="numero" 
type="A" | "a" | "I" | "i" | "1">
<li type="circle" | "disc" | "square" |
"A" | "a" | "I" | "i" | "1"
value="numero">
</ol>
174
Listas numeradas
<ol>
<li> Correio Eletrônico </li>
<li> Telnet </li>
<li> FTP </li>
</ol>
175
Listas usando estilo
� <ol style="list-style-type: tipo;">
� tipo:
� decimal – números decimais começando de 1 
� decimal-leading-zero – números decimais começando com zero (ex: 
01, 02, 03, ..., 98, 99). 
� lower-roman: algarismos romanos minúsculos
� upper-roman : algarismos romanos maiúsculos
� hebrew: números hebraicos tradicionais
� georgian: números "Georganos" tradicionais(an, ban, gan, ..., he, 
tan, in, in-an, ...). 
� armenian: números armenianos tradicionais
� cjk-ideographic: números plenamente ideograficos
� hiragana: a, i, u, e, o, ka, ki, ... 
� Katakana: A, I, U, E, O, KA, KI, ... 
� hiragana-iroha: i, ro, ha, ni, ho, he, to, ... 
� katakana-iroha: I, RO, HA, NI, HO, HE, TO, ... 
176
Exemplo de listas
Lista não ordenada
<ul>
<li> Correio Eletrônico </li>
<li> Telnet </li>
<li> FTP </li>
</ul>
Lista ordenada
<ol>
<li> Correio Eletrônico </li>
<li> Telnet </li>
<li> FTP </li>
</ol>
Romano Minúsculo
<ol style="list-style-type: lower-roman;">
<li> Este é o primeiro item.</li>
<li> Este é o segundo item.</li>
<li> Este é o terceiro item.</li>
</ol>
Decimal
<ol style="list-style-type: decimal;">
<li> Este é o primeiro item.</li>
<li> Este é o segundo item.</li>
<li> Este é o terceiro item.</li>
</ol>
Romano Maiúsculo
<ol style="list-style-type: upper-roman;">
<li> Este é o primeiro item.</li>
<li> Este é o segundo item.</li>
<li> Este é o terceiro item.</li>
</ol>
Alfabético minúsculo
<ol style="list-style-type: lower-alpha;">
<li> Este é o primeiro item.</li>
<li> Este é o segundo item.</li>
<li> Este é o terceiro item.</li>
</ol>
Alfabético minúsculo
<ol style="list-style-type: upper-alpha;">
<li> Este é o primeiro item.</li>
<li> Este é o segundo item.</li>
<li> Este é o terceiro item.</li>
</ol>
177
Formulários
� Um formulário é uma área onde são 
colocados os elementos de um formulário
� Elementos de um formulário permitem ao 
usuário entrar com informações
� Um formulário é definido pela tag <form>
<form>
Elementos de entrada
</form>
178
Formulários: Codificação Básica
<form method="post|get" action="URL do CGI">
. . .
definição dos ítens do formulário
. . .
</form>
� Para enviar o formulário por e-mail:
<form action="mailto:nome@servidor"
enctype="text/plain">
179
Campo de Texto
Conta:<input type="text" name="conta" 
size="20" maxlength="20" />
Senha:<input type="password" name="senha" 
size="20" maxlength="20" />
180
Área de Texto
Comentários:<br />
<textarea name="texto" rows="3" 
cols="40">
Digite aqui um texto qualquer.
</textarea>
181
Menus
� Sexo: 
<select name="sexo">
<option selected>Masculino</option>
<option>Feminino</option>
</select>
182
Botões "Sim ou Não"
� Áreas de interesse: <br />
<input type="checkbox" name="b1" 
value="v1" />Redes<br />
<input type="checkbox" name="b2" 
value="v2" />Bancos de Dados<br />
183
Botões de Rádio
� Sexo: 
<input type="radio" name="sexo" value="M" />Masculino
<input type="radio" name="sexo" value="F" />Feminino
184
Outros Campos
� Campo escondido
<input type="hidden" name="nome" value="valor" />
� Campo de upload de arquivo
<input type="file" name="nome" value="valor" />
185
Botões de Envio
� <input type="submit" value="Envia" />
<input type="reset" value="Limpa" />
186
Tabelas
� Com tabelas, podemos facilmente dividir uma 
página em colunas e células
187
Frames
� Com frames, podemos mostra mais do que 
um documento HTML na mesma janela do 
browser
� Cada documento HTML se localiza em um 
frame
� Os frames são independentes
� Problemas:
� Vários documentos HTML
� Pode gerar dificuldades com a impressão
188
A tag <frameset>
� Define como a janela será dividida em frames
� Cada <frameset> define um conjunto de 
linhas OU colunas
189
A tag <frame>
� Define o documento HTML que irá ocupar o frame
� Exemplo:
� Um conjunto de duas colunas
� A primeira com 25% da largura
� O documento frameA.html ocupará a primeira coluna 
enquanto o documento frameB.html a segunda
<frameset cols="25%,*">
<frame src="frameA.html" />
<frame src="frameB.html" />
</frameset>
� Obs.: o tamanho da coluna pode ser especificado 
em pixels
190
Exemplo
<html>
<frameset rows="50%,50%">
<frame noresize="noresize" src="frame_a.htm" name="FrameA">
<frameset cols="25%,75%">
<frame noresize="noresize" src="frame_b.htm" name="FrameB">
<frame noresize="noresize" src="frame_c.htm" name="FrameC">
</frameset>
</frameset>
</html>
191
Exemplo de uso de <iframe>
<html>
<body>
<iframe src="default.asp"/>
<p>Some older browsers don't support iframes.</p>
<p>If they don't, the iframe will not be visible.</p>
</body>
</html>
192
Modificando fontes
� A tag <font> é desaconselhada
� Devemos utilizar o atributo style
<html>
<body>
<h1 style="font-family:verdana">Cabeçalho</h1>
<p style="font-family:courier">Parágrafo</p>
</body>
</html>
� Tamanho de fontes
<html>
<body>
<h1 style="font-size:150%">Cabeçalho</h1><p style="font-size:80%">Parágrafo</p>
</body>
</html>
193
Mais fontes
� Cor do texto
<html>
<body>
<h1 style="color:blue">Cabeçalho</h1>
<p style="color:red">Parágrafo</p>
</body>
</html>
� Combinando tudo...
<html>
<body>
<p style="font-family:verdana;font-size:80%;color:green">
Este é um parágrafo em verdana, com 80% do tamanho na cor verde.
</p>
</body>
</html>
194
Mais sobre estilos
� Uso de uma folha de estilos externa:
<head>
<link rel="stylesheet" type="text/css" href="mystyle.css">
</head> 
� Uma folha de estilos interna
<head>
<style type="text/css">
body {background-color: red}
p {margin-left: 20px}
</style>
</head> 
� Estilos inline
<p style="color:red; margin-left:20px">Parágrafo</p>
195
Caracteres especiais
196
Elementos de um cabeçalhos
� Dentro das tags <head></head> podemos 
encontrar:
� <base> : define a base para os links neste 
documento
� <link> : define uma referência para recursos
� <meta> : define meta-informações
� <title> : define o título do documento
� <style> : define um estilo
� <script> : permite a criação de scripts
197
Tag <meta>
� Descrição da página:
<meta name="description" content="Free Web 
tutorials on HTML, CSS, XML, and XHTML" /> 
� Definição de palavras chaves:
<meta name="keywords" content="HTML, 
DHTML, CSS, XML, XHTML, JavaScript" /> 
� Outros atributos de meta (???)
<meta name="security" content="low" /> 
198
Links
� Um link tem o seguinte formato:
esquema://[host].domínio:[porta][/caminho][/arqu
ivo]
� esquema: tipo de serviço
� host: nome da máquina
� domínio: domínio onde está a máquina
� porta: número da porta
� caminho: pasta ou diretório
� arquivo: o arquivo propriamente dito
199
Alguns esquemas
200
Exemplos
� Acesso a newsgroup
<a href="news:alt.html">HTML Newsgroup</a> 
� Download via ftp
<a href="ftp://ftp.meslin.com.br/ftp/winzip.exe">Download 
WinZip</a> 
� Enviando email
<a href="mailto:alguem@correio.com.br">Enviar email 
para alguém</a> 
� Link para uma outra página em outro site:
<a href='http://www.outrosite.com.br/diretorio/arquivo'>O 
link</a>
201
Exemplos
� Link para uma outra página no meu site:
<a href='/diretorio/arquivo'>O link</a>
� Equivalente a <a 
href='http://www.meusite.com.br/diretorio/arqui
vo'>O link</a>
� Link para um arquivo no mesmo diretório
<a href='arquivo.html'>O link</a>
� Para mudar de protocolo
href='https://www.meusite.com.br/diretorio/arqui
vo'>O link</a>
202
Scripts (em javascript, é óbvio!)
� Não confunda Java com Javascript!
<html>
<body>
<script type="text/javascript">
document.write("Alo mundo!");
</script>
</body>
</html> 
203
Eventos
� Eventos relativos a janelas
� Somente válidos em body e em frameset
204
Eventos
� Eventos relativos a formulários
� Somente válidos em elementos de formulários
205
Eventos
� Eventos de teclado
206
Eventos
� Eventos relativos a mouse
207
Perguntas?
208
Parte 4
� Java Server Page
� Elementos de script
� Tags
� Declarações de variáveis e métodos
209
JSP - Java Server Page 
� Tecnologia para desenvolvimento de aplicações 
WEB semelhante ao Microsoft Active Server Page 
(ASP).
� Usada para servir conteúdo dinâmico para o 
usuário, usando lógica e dados no lado do servidor.
� Permite ao desenvolvedor de sites produzir 
aplicações que permitam: 
� o acesso a banco de dados ou a arquivos texto, 
� a captação de informações através de formulários ou 
sobre o visitante e sobre o servidor, 
� o uso de variáveis e loops, entre outras coisas.
210
Vantagens do JSP 
� Portabilidade de plataforma.
� Em conjunto com Java Servlets e Java Beans pode 
ser usada para desenvolver aplicações web 
eficientes, escaláveis e seguras rapidamente.
� Codificação simples, facilitando assim a elaboração e 
manutenção da aplicação.
� Permite separar a programação lógica (conteúdo 
dinâmico) da programação visual (conteúdo 
estático).
211
Arquitetura de Aplicação Java para Web
JSP
Application Server
Browser
Servlet
Classes Java
/ EJB
HTTP / HTML
Banco 
de Dados
212
Um página JSP
� É um documento texto composto por duas 
partes:
� dados de template estáticos, que podem ser 
expressos em qualquer formato baseado em 
texto (HTML, XML e similares); 
� e elementos JSP, construindo conteúdo 
dinâmico.
213
Funcionamento
� A página JSP é 
requisitada pelo cliente 
através do browser;
� Esta página é 
executada pelo 
servidor;
� É gerada uma página 
HTML que será enviada 
de volta ao browser do 
cliente.
214
Tags JSP
� As tags em HTML são processadas pelo 
navegador do cliente para mostrar a página.
� As tags no JSP são usadas pelo servidor WEB 
para gerar conteúdo dinâmico.
� Tags do tipo script
� <% %>
� !
� =
� @
215
Tags JSP
� Tags do tipo XML
� Case-sensitive
� Self-container
� <jsp:xxxxx />
� Container
� <jsp:xxxxxx> yyyyyyy </jsp:xxxxxx>
216
Elementos de Script
� Scriptlets <% %>
� Declarações <%! %>
� Expressões <%= %>
� Comentários <%-- --%>
� Diretivas <%@ %>
217
Scriptlets
� <% scriptlet %>
� São blocos de código Java embutidos numa página 
JSP. 
� O código do scriptlet é inserido literalmente no 
servlet gerado pela página.
� Sintaxe: 
<% bloco com vários comandos %>
� Exemplo: (Alo mundo! no próximo slide)
218
Elementos de Scripts: scriptlets
<HTML>
<HEAD>
<TITLE>Alo mundo!!!</TITLE>
</HEAD>
<BODY>
<%
String visitante = 
request.getParameter("nome");
if (visitante == null)
visitante = "mundo";
%>
Alo <%=visitante%>!
</BODY>
</HTML>
package org.apache.jsp.AloMundo;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class AloMundo_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("<HTML>\r\n");
out.write("<HEAD>\r\n");
out.write("<TITLE>Alo 
mundo!!!</TITLE>\r\n");
out.write("</HEAD>\r\n");
out.write("<BODY>\r\n");
String visitante = 
request.getParameter("nome");
if (visitante == null) visitante = 
"mundo";
out.write("\r\n");
out.write("Alo ");
out.print(visitante);
out.write("!\r\n");
out.write("</BODY>\r\n");
out.write("</HTML>\r\n");
} catch (Throwable t) {
if(!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
219
Declarações
� São usadas para definir variáveis de classe e 
métodos específicos para uma página JSP.
� Os métodos e variáveis podem então ser 
referenciados por outros elementos de criação de 
scriptlets na mesma página.
� Sintaxe: 
� <%! Declaração %>
� <jsp:declaration>declarações</jsp:declaration>
� Exemplo 
� <%! int i = 0; double d; %>
� <%! Cliente c = new Cliente("Francesca");%>
220
Declaração de variáveis de classe
<html>
<head>
<title>Variáveis</title>
</head>
<body>
<%!int a; %>
<%int b; %>
</body>
</html>
package org.apache.jsp.AloMundo;
…
public final class Variaveis_jsp 
extends ... {
int a;
public void 
_jspService(HttpServletRequest 
request, HttpServletResponse 
response)
throws java.io.IOException, 
ServletException {
…
out.write("<html>\n");
out.write("<head>\n");
out.write("<title>Variáveis</title
>\n");
out.write("</head>\n");
out.write("<body>\r\n");
out.write('\n');
int b;
out.write("\n");
out.write("</body>\n");
out.write("</html>");
…
221
Declaração de Métodos
<%!
public long fatorial (long x)
{
if (x == 0)
return 1;
return x * fatorial (x-1);
}
%>
� Por que tem que ser uma declaração e não pode ser 
um scriptlet?
222
Declarações
<html>
<head>
<title>Página inicial</title>
</head>
<body>
Criando as variáveis x, y e unidades com os respectivos valores
0, 1, "metros"
<%!
private int x = 87, y = 52;
private String unidades="metros";
%>
<% int z = 8752; %>
<p>
x = <%=x++ %><br>
y = <%=y-- %><br>
unidades = <%=unidades %><br>
z = <%=--z %><br>
</body>
</html>
223
Manipulando eventos com ciclo de vida
<%!
public void jspInit()
{
// código de inicialização
}
public void jspDestroy()
{
// código de "destruição"
}
%>
224
Manipulando eventos com ciclo de vida
<%@ page import="java.util.Date" %>
<html>
<head>
<title>jspInit &amp; jspDestroy</title>
</head>
<body>
<% Date data = new Date(); %>
Último acesso em: 
<%=data.getHours()%>:<%=data.getMinutes()%>:<%=data.getSeconds()%>
<%!
public void jspInit() // código de inicialização
{
Date data = new Date();
System.out.println("***Iniciando a página em " + data.getHours() + 
":" + data.getMinutes() + ":" + data.getSeconds() + "***");
}
public void jspDestroy() // código de "destruição"
{
Date data = new Date();
System.out.println("***Terminando a página em " + data.getHours() + 
":" + data.getMinutes() + ":" + data.getSeconds() + "***");
}
%>
</body>
</html>
225
Expressões
� Contém uma expressão válida da linguagem 
Java, que é avaliada, convertida para String e 
inserida na página JSP.
� Não é usado ponto-e-vírgula para terminar a 
expressão.
� Essa avaliação é feita em tempo de execução 
(quando a página é solicitada), permitindo 
fácil e rápido acesso à informação que foi 
requisitada.
226
Elementos de Script: expressões
� Sintaxe:
� <%= expressão %>
� <jsp:expression>expressão</jsp:expression>
� Equivalente a:
� <% out.print(expressão); %>
� Exemplo:
<%= a+b+c %>
<%= itens[i] %>
227
Alo Mundo (2) em JSP
<HTML>
<HEAD>
<TITLE>Alo mundo!!!</TITLE>
</HEAD>
<BODY>
<%
String visitante = request.getParameter("nome");
if (visitante == null)
visitante = "mundo";
%>
Alo <%=visitante%>!
</BODY>
</HTML>
228
Comentários
� Existem dois tipos de comentários que podem ser 
usados em uma página JSP: 
� Comentários de Conteúdo: Esses comentários são 
transmitidos de volta para navegador como parte da 
resposta de JSP e são visíveis na visualização do código 
da página. 
� <!-- comentário -->
� Cometários JSP: Não são enviados para o cliente e são 
visíveis apenas nos arquivos fonte JSP originais. O corpo 
do comentário é ignorado pelo container JSP. 
� <%-- comentário --%>
� <% /* comentário */ %>
� <% // comentário %>
229
Parte 4,5
� Diretivas
� page
� include
� taglib
230
Diretivas
� São usadas para fornecer informações 
especiais ao container JSP sobre a página JSP 
quando esta é compilada para servlet.
� Sintaxe:
� <%@ diretiva atributo1="valor1" atributo 
2="valor2" ... %>
� <jsp:directive.diretiva atributo1="valor1" 
atributo 2="valor2" ... />
231
Diretivas
� Não produz saída visível para o cliente.
� Existem três tipos de diretivas: 
� page: define atributos que são aplicados a todo 
o arquivo JSP e a todos os seus arquivos 
incluídos estaticamente. 
� include: permite que sejam incluídos arquivos 
na hora em que a página JSP é traduzida no 
servlet.
� taglib: definem um modelo de tags 
personalizadas
232
Diretiva page
� info
� language
� contentType
� extends
� import
� session
� buffer
� autoFlush
� isThreadSafe
� errorPage
� isErrorPage
233
Diretiva page: info
� Informações sobre documentação
� Utilizado por programas de documentação
� <%@ page info="Informações sobre 
esta página" %>
� Normalmente incluir:
� Autor
� Versão
� Copyright
� <%@page info="e-Comércio, Copyright 
2005, Alexandre Meslin" %>
234
Diretiva page: info
<%@ page info = "Alo mundo, copyright by Meslin" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Alo mundo!</TITLE>
</HEAD>
<BODY>
<h1>Alo mundo!!!</h1>
e só...
</BODY>
</HTML>
235
Diretiva page: info
236
Diretiva page: info
237
Diretiva page: language
� Utilizado para especificar a linguagem de 
script de servidor utilizada na página
� Java, por padrão
� <%@ page language="java" %>
238
Diretiva page: language
<%@ page 
info = "Alo mundo, copyright by Meslin" 
language="java"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML><HEAD>
<TITLE>Exemplo de escolha de linguagem</TITLE>
</HEAD>
<BODY>
<h1>Alo mundo!!!</h1>
e só...
</BODY></HTML>
239
Diretiva page: contentType
� Especifica o conteúdo da resposta a ser enviada
� <%@page contentType="text/html; 
charset=ISO-8859-1" %>
� <%@page contentType="text/xml" %>
� <%@page contentType="text/plain" %>
� <%@page contentType="image/gif" %>
� <%@page contentType="image/jpeg" %>
� <%@page contentType="application/msword" %>
240
Diretiva page: contentType
<%@ page contentType="application/vnd.ms-excel"%>
<HTML><HEAD><TITLE>Planilha Excel</TITLE></HEAD><BODY>
<TABLE>
<TR ALIGN="left" VALIGN="middle">
<TH>Mes</TH>
<TH>Filial 1</TH>
<TH>Filial 2</TH>
<TH>Filial 3</TH>
<TH>Filial 4</TH>
<TH>Filial 5</TH>
</TR>
<TR ALIGN="left" VALIGN="middle">
<TD>1</TD>
<TD>1</TD>
<TD>2</TD>
<TD>3</TD>
<TD>4</TD>
<TD>5</TD>
</TR>
<TR ALIGN="left" VALIGN="middle">
<TD>2</TD>
<TD>1</TD>
<TD>2</TD>
<TD>3</TD>
<TD>4</TD>
<TD>5</TD>
</TR>
<TR ALIGN="left" VALIGN="middle">
<TD>3</TD>
241
Mime types
� application/msword doc 
� application/pdf pdf 
� application/vnd.ms-excel xls 
� application/vnd.ms-
powerpoint ppt 
� application/x-shockwave-
flash swf 
� image/bmp bmp 
� image/gif gif 
� image/jpeg jpeg jpg jpe 
� image/png png 
� video/mpeg mpeg mpg 
mpe 
� application/zip zip 
� text/xml xml dtd xsl
� text/html shtml html htm 
� text/css css 
� image/tiff tiff tif 
� audio/x-wav wav 
� audio/midi mid midi kar 
� audio/mpeg mpga mp2 
mp3 
� application/postscript ai eps 
ps 
� video/quicktime qt mov 
242
Mime types
� application/andrew-inset ez 
� application/mac-binhex40 hqx 
� application/mac-compactprocpt 
� application/mathml+xml mathml 
� application/octet-stream bin dms lha lzh 
exe class so dll 
� application/oda oda 
� application/ogg ogg 
� application/rdf+xml rdf 
� application/smil smi smil 
� application/srgs gram 
� application/srgs+xml grxml 
� application/vnd.mif mif 
� application/vnd.mozilla.xul+xml xul 
� application/vnd.wap.wbxml wbxml 
� application/vnd.wap.wmlc wmlc 
� application/vnd.wap.wmlscriptc wmlsc 
� application/voicexml+xml vxml 
� application/x-bcpio bcpio 
� application/x-cdlink vcd 
� application/x-chess-pgn pgn 
� application/x-cpio cpio 
� application/x-x509-ca-cert .crt 
� application/xhtml+xml xhtml xht 
� application/xml xml xsl 
� application/xml-dtd dtd 
� application/xslt+xml xslt 
� audio/basic au snd 
� audio/x-aiff aif aiff aifc 
� audio/x-mpegurl m3u 
� audio/x-pn-realaudio ram rm 
� audio/x-pn-realaudio-plugin rpm 
� audio/x-realaudio ra 
� chemical/x-pdb pdb 
� chemical/x-xyz xyz 
� image/cgm cgm 
� image/ief ief 
� image/svg+xml svg 
� image/vnd.djvu djvu djv 
� image/vnd.wap.wbmp wbmp 
� image/x-cmu-raster ras 
� image/x-icon ico 
� image/x-portable-anymap pnm 
� image/x-portable-bitmap pbm 
243
Diretiva page: extends
� <%@ page extends="pacote1.pacote2.Classe" %>
244
Diretiva page: import
� <%@ page import="java.util.List" %>
� <%@ page import="java.util.List, 
java.text.*" %>
245
Diretiva page: import
<%@ page 
info="eu já vi isto antes..."
language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" 
import="java.util.Date" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<TITLE>Dia & Hora</TITLE>
</head>
<body>
<h1>Dia e Hora</h1>
<% Date data = new Date(); %>
Ao sinal serão... 
<%=data.getDate()%>/<%=data.getMonth()+1%>/<%=data.getYear()+1900%> -
<%=data.getHours()%>:<%=data.getMinutes()%>
</body>
</html>
246
Diretiva page: session
� Informa se a página deve participar ou não 
da sessão
� true por padrão
� <%@ page session="false" %>
� <%@ page session="true" %>
247
Diretiva page: session
<%@ page 
info="Copyright: Alexandre Meslin"
language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" 
session="true"
%>
<html>
<head>
<title>Sessão</title>
</head>
<body>
<%
int
cont=Integer.parseInt(session.getAttribute("cont")==null?"0":sessio
n.getAttribute("cont").toString());
session.setAttribute("cont", new Integer (++cont)); 
%>
Bem vindo visitante <%= cont %>
</body>
</html>
248
Diretiva page: buffer
� Informa o tamanho do buffer de saída
� <%@ page buffer="none"%>
� <%@ page buffer="128kb"%>
� O valor padrão depende do servidor utilizado
� Normalmente igual ou maior que 8 kbytes
249
Diretiva page: autoFlush
� Verdadeiro: o buffer é enviado quando cheio
� Falso: é levantada uma exceção quando o 
buffer estiver cheio
� <%@ page autoFlush="true"%>
� <%@ page autoFlush="false"%>
� Obs.: o valor falso é inválido para 
buffer="none"
250
Diretiva page buffer & autoFlush
<%@ page language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
buffer="128kb"
autoFlush="false"
%>
<html>
<head>
<title>Flush e Buffer (128k)</title>
</head>
<body>
<% out.flush(); %>
Início da página...
<%
Thread.sleep(20*1000); // tempo em milisegundos
out.flush(); 
Thread.sleep(20*1000); // tempo em milisegundos
%>
<p>Fim da página...
</body>
</html>
251
Diretiva page: isThreadSafe
� Indica se a thread pode ser executada em 
paralelo a outras instâncias dela
<%@ page isThreadSafe="true"%>
<%@ page isThreadSafe="false"%>
� Default: true
� Veja exemplo no próximo slide de um código 
não seguro
252
Diretiva page: isThreadSafe
� Exemplo de código não seguro
<%@ page language="java" 
isThreadSafe="false"
%>
<html>
<head>
<title>Thread Unsafe</title>
</head>
<body>
<%! private int idNum = 0; %>
<%
String userID = "userID" + idNum;
out.println("Seu ID é " + userID + ".");
idNum = idNum + 1;
%>
</body>
</html>
253
Diretiva page: isThreadSafe
� Exemplo de código seguro
<%@ page language="java" 
isThreadSafe="true"
%>
<html>
<head>
<title>Thread Safe</title>
</head>
<body>
<%! private int idNum = 0; %>
<%
synchronized(this)
{
String userID = "userID" + idNum;
out.println("Seu ID é " + userID + ".");
idNum = idNum + 1;
}
%>
</body>
</html>
Péssima idéia 
usar “this” para 
sincronizar
254
Diretiva page: errorPage
� Importância de uma página de erro (veja o 
próximo slide)
� Não substitui o conjunto try-catch
� Mensagem de erro ao usuário deve ser clara 
e procurar minimizar o problema
� Deve apresentar alternativas ou forma 
eficiente de contato para solucionar o 
problema
255
Diretiva page: errorPage
256
Diretiva page: errorPage
257
Diretiva page: errorPage
258
Diretiva page: errorPage
259
Diretiva page: errorPage
� <%@ page errorPage="/dir/erro.jsp"%>
<%@page errorPage="Erro.jsp" %>
<HTML>
<HEAD><TITLE>Cálculo de Velocidade</TITLE></HEAD>
<BODY>
<h1>Calculando a velocidade</h1>
<%!
private double toDouble (String valor)
{
return Double.valueOf(valor).doubleValue();
}
%>
<%
double distancia = toDouble (request.getParameter("dist"));
double tempo = toDouble (request.getParameter("tempo"));
double vel = distancia/tempo;
%>
<ul>
<li>Distância = <%=distancia%>
<li>Tempo = <%=tempo%>
<li>Velocidade = <b><%=vel%> km/h</b>
</ul>
</BODY>
</HTML>
260
Diretiva page: isErrorPage
� <%@ page isErrorPage= "true" %>
<%@page import="java.io.*"
isErrorPage="true"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Arquivo de erro de velocidade</TITLE>
</HEAD>
<BODY>
<h1><font color=red>Erro ao calcular velocidade</font></h1>
Ocorreu o seguinte erro em Velocidade.jsp: <%=exception%>.
<p>
Este erro ocorreu na seguinte parte do código 
(esta mensagem abaixo, em vermelho, você não está vendo!):
<pre>
<font color="red">
<% exception.printStackTrace(new PrintWriter (out)); %>
</font>
</pre>
</BODY>
</HTML>
Obviamente, isto é apenas 
um exemplo, ninguém vai 
imprimir a stack para o 
usuário
261
Diretiva page: isErrorPage
� Mesma página sem isErrorPage...
<%@page import="java.lang.Exception,java.io.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Arquivo de erro de velocidade</TITLE>
</HEAD>
<BODY>
<h1><font color=red>Erro ao calcular velocidade</font></h1>
Ocorreu o seguinte erro em Velocidade.jsp: 
<%="Não tenho o objeto exception"%>.
<p>
Este erro ocorreu na seguinte parte do código:
<% // exception.printStackTrace(new PrintWriter (out)); %>
</BODY>
</HTML>
262
Diretiva include
� É processada quando a página JSP é traduzida para uma 
classe de servlet.
� O efeito da diretiva é inserir o texto contido em outro arquivo 
- conteúdo estático ou outra página JSP - na página JSP 
inclusiva.
� Sintaxe 
� <%@ include file="URLlocal" %>
� Exemplo (no próximo slide)
� Rodape.jsp
� Pagina.jsp
263
Diretiva include – exemplo
� Pagina.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Página com include</TITLE>
</HEAD>
<BODY>
<h1>Exemplo de include</h1>
Esta página tem um include que inclui um arquivo chamado Rodape.jsp. 
Este arquivo realiza um contador de acessos.
<p>Veja logo a seguir o efeito:
<p>
<%@include file="Rodape.jsp" %>
<p>
Voltei!!! Será?
</BODY>
</HTML>
264
Diretiva include – exemplo
� Rodape.jsp
<!-- note a ausência de cabeçalho html -->
<%@page import="java.util.Date"%>
<%!
private int contador = 0;
privateDate data = new Date ();
private String host = "nenhum acesso anterior";
%>
Esta página foi acessada <%=++contador%> vezes desde que o 
conteiner foi reiniciado.<br>
E foi acessada a última vez por <%=host%> em <%=data%>.
<%
host = request.getRemoteHost();
data = new Date();
%>
265
Contador com arquivo
<%@page language="java"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Contagem permanente</TITLE>
</HEAD>
<BODY>
<h1>Exemplo de include</h1>
Esta página tem um include que inclui um arquivo chamado 
RodapeArquivo2.jsp. 
Este arquivo realiza um contador de acessos onde o nome do 
arquivo é passado como parâmetro para o
arquivo de contagem.
<p>Veja logo a seguir o efeito:
<jsp:include page="RodapeArquivo2.jsp" flush="true">
<jsp:param name="arquivo" value="contador.txt" />
</jsp:include>
</BODY>
</HTML>
266
Contador com arquivo
� Rodapé: arquivo RodapeArquivo2.jsp
<!-- note a ausência de cabeçalho html -->
<%@ page import="java.io.*"%>
<%
String arquivo = new String ("C:\\Documents and Settings\\meslin\\My 
Documents\\Cursos\\JSP\\auxiliar\\"+request.getParameter("arquivo"));
int contador;
try
{
BufferedReader entrada = new BufferedReader(new FileReader(arquivo));
contador = Integer.parseInt(entrada.readLine());
entrada.close();
}
catch (IOException e)
{
contador = 0;
}
catch (Exception e)
{
contador = 0;
}
contador++;
BufferedWriter saida = new BufferedWriter(new FileWriter(arquivo));
saida.write(String.valueOf(contador));
saida.close();
%>
<hr>Esta página foi acessada <%=contador%> vezes desde que o container foi criado.
267
Diretiva taglib
� <%@ taglib uri="URIBiblioteca" 
prefix="Prefixo"%>
� <jsp:directive.taglib uri="URIBiblioteca" 
prefix="Prefixo" />
268
Diretiva taglib – Arquivo AloMundo.jsp
<%@ page 
language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri="AloMundo.tld" prefix="alo" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
Transitional//EN">
<html>
<head>
<title><alo:mundo />JTLB</title>
</head>
<body>
<h1><alo:mundo /></h1>
</body>
</html>
269
Diretiva taglib – Arquivo AloMundo.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD 
JSP Tag Library 1.1//EN" 
"http://java.sun.com/j2ee/dtds/web-
jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>alo</shortname>
<info>TabLib de Alo Mundo!!!</info>
<tag>
<name>mundo</name>
<tagclass>tagLib.AloMundo</tagclass>
<info>Devolve Alo Mundo</info>
<bodycontent>EMPTY</bodycontent>
</tag>
</taglib>
270
Diretiva taglib – Arquivo AloMundo.java
package tagLib;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class AloMundo extends TagSupport
{
private static final long serialVersionUID = 1L;
public int doStartTag()
{
JspWriter saida = pageContext.getOut();
try
{
saida.print("Alo mundo!!!");
} 
catch (IOException e)
{
e.printStackTrace();
}
return SKIP_BODY;
}
}
271
Diretiva taglib – Arquivo AloMundos.jsp
<%@ page 
language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<%@ taglib uri="AloMundo.tld" prefix="alo" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 
Transitional//EN">
<html>
<head>
<title><alo:mundos vezes='3' /> JTLB</title>
</head>
<body>
<h1><alo:mundos vezes ='5' /></h1>
</body>
</html>
272
Diretiva taglib – Arquivo AloMundo.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag 
Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-
jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>alo</shortname>
<info>TabLib de Alo Mundo!!!</info>
<tag>
. . .
</tag>
<tag>
<name>mundos</name>
<tagclass>tagLib.AloMundos</tagclass>
<info>Devolve Alo Mundo Mundo Mundo...</info>
<bodycontent>EMPTY</bodycontent>
<attribute>
<name>vezes</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
273
Diretiva taglib – Arquivo AloMundos.java
package tagLib;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class AloMundos extends TagSupport
{
private static final long serialVersionUID = 1L;
private int vezes=0;
public int getVezes() { return vezes; }
public void setVezes(int vezes) { this.vezes = vezes; }
public int doStartTag()
{
JspWriter saida = pageContext.getOut();
try
{
saida.print("Alo");
for (int i = 0; i < vezes; i++)
saida.print(" Mundo");
saida.print("!!!");
} 
catch (IOException e)
{
e.printStackTrace();
}
return SKIP_BODY;
}
}
275
Perguntas?
276
Exercícios 1
277
Exercícios em conjunto
1. Faça uma página HTML que escreva “Alo 
mundo!”.
2. Converta a página do exercício anterior para 
JSP
3. Mude o valor estático da frase do exercício 
anterior para uma string JSP
278
Exercícios individuais
� Faça uma página que mostre o valor de uma 
variável
� Algoritmo:
� Crie uma variável
� Atribua um valor a esta variável
� Mostre o valor da variável em um browser
279
Exercícios individuais
� Faça uma página que some dois números 
inteiros (2 e 3) utilizando variáveis e mostre o 
resultado no formato: 2 + 3 = 5
� Algoritmo:
� Crie 3 variáveis
� Atribua 2 e 3 às duas primeiras variáveis
� Some as duas variáveis e armazene o resultado na 
terceira variável
� Mostre o resultado no formato pedido
280
Exercícios individuais
� Faça uma página que escreva os números de 
0 até 9, um número em cada linha.
0
1
2
3
4
5
6
7
8
9
281
Exercícios individuais
� Faça uma página que imprima números de 0 
até 99 (10 em cada linha).
282
Exercícios individuais
� Faça uma página que mostre um tabuleiro de 
xadrez (8x8)
283
Exercícios individuais
1. Faça uma página que mostre o dia e a hora 
do servidor no formato: dd/mm/aaaa –
hh:mm.
2. Refaça a página anterior para mostrar a 
data por extenso em português.
Sábado, 25 de setembro de 2004
284
Exercícios individuais
� Faça uma página JSP que imprima uma 
tabela HTML de conversão Celsius-Fahrenheit 
com valores de temperatura entre -40 e 100 
graus Celsius em incremento de 10 em 10. A 
equação é: F = 9/5 C + 32
285
Exercícios individuais
� Faça uma página que possua um contador de 
acesso. 
286
Exercícios individuais
1. Faça uma página JSP que gere um conteúdo 
no formato texto
2. Modifique o exercício anterior para gerar um 
conteúdo no formato documento do MS-
Word
287
Parte 5
� Objetos Implícitos
288
Objetos Implícitos
� page 
� config 
� request 
� response 
� out
� session 
� application 
� pageContext
� exception
289
pageContext
� Usado em servlets para obter informações de 
contexto de JSP
� Classe:
� javax.servlet.jsp.PageContext
292
pageContext.forward(url)
� Desvia para a página especificada pela url relativa
<%@ page 
language="java" 
contentType="text/html; charset=ISO-8859-1“
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Página não vista</title>
</head>
<body>
<h1>Esta página irá desviar para outra página</h1>
(em 10 segundos!)
<%
//out.flush(); // com flush o forward não funciona!
Thread.sleep(10 * 1000);
pageContext.forward("final.jsp"); 
%>
</body>
</html>
293
pageContext.include(url)
� Inclui a página especificada pela url relativa
<%@ pagelanguage="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Página original</title>
</head>
<body>
<h1>Texto na página original!</h1>
<%pageContext.include("paginaIncluida.jsp"); %>
<h2>Novamente, texto na página original</h2>
</body>
</html>
294
page
� Representa a própria página
� Interface:
� javax.servlet.jsp.HttpJspPage 
� Descrição: Instância de servlet da página. 
� Equivalente ao “this”.
295
config
� Recupera parâmetros de inicialização
� Interface: javax.servlet.ServletConfig. 
� Descrição: Dados de configuração de servlet.
� Raramente utilizado
� Enumeration config.getInitParameterNames()
� String config.getInitParameter(String nome)
� ServletContext config.getServletContext()
� String config.getServletName()
297
request
� Interface: 
� javax.servlet.ServletRequest. 
� Descrição: Dados de solicitação, incluindo 
parâmetros.
298
request - atributos
� Atributos
� Object request.getAttribute(String nome) 
� Valor do atributo por nome
� Enumeration request.getAttributeNames()
� Nome dos atributos 
� void request.setAttribute(String nome, Object valor) 
� Modifica valor do atributo por nome
� void request.removeAttribute(Object nome)
� Remove atributo
Exemplo no próximo slide
299
request - atributos
<%@ page 
language="java" 
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<html>
<head>
<title>Cria atributos</title>
</head>
<body>
<h1>Cria atributos...</h1>
<%
request.setAttribute("atributo1", "valor1");
request.setAttribute("atributo2", "valor2");
request.setAttribute("atributo3", "valor3");
RequestDispatcher proximo = 
request.getRequestDispatcher("Request.jsp?campo=banana&campo
1=abacaxi&campo2=abacate");
proximo.forward(request, response);
%>
</body>
</html>
request –
atributos
<HTML>
<BODY>
<H1>Objeto Request</H1>
<H2>Métodos</H2>
<TABLE BORDER>
<TR>
<TH COLSPAN="2">Atributos</TH>
</TR>
<TR>
<TD>request.setAttribute(nome,valor)</TD><TD><%request.setAttribute("nome","valor");%></TD>
</TR>
<TR>
<TD>request.getAttribute(nome)</TD><TD><%=request.getAttribute("nome")%></TD>
</TR>
<TR>
<TD>request.getAttribute("atributo1")</TD><TD><%=request.getAttribute("atributo1")%></TD>
</TR>
<TR>
<TD>request.getAttributeNames()</TD>
<TD><%=request.getAttributeNames()%> <%
Enumeration<String> atributos = (Enumeration<String>)request.getAttributeNames();
while (atributos.hasMoreElements())
{
out.println ("<br>|" + atributos.nextElement() + "|");
}
%>
</TD>
</TR>
<TR>
<TD>request.removeAttribute(nome)</TD><TD><%request.removeAttribute("nome");%></TD>
</TR>
</TABLE>
</BODY>
</HTML>
301
request
� Codificação
� String request.getCharacterEncoding()
� Obtém a página de código
� void request.setCharacterEncoding(String 
código)
� Especifica a página de código
� Obrigatoriamente, um valor válido de página de 
código
Exemplo no próximo slide
302
request
<% request.setCharacterEncoding("ISO-8859-1"); %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Character Encoding</title>
</head>
<body>
O tipo de codificação desta página é: 
<%= request.getCharacterEncoding() %>
</body>
</html>
303
request
� Transferência
� int request.getContentLength()
� Obtém o tamanho da transferência
� String request.getMethod() 
� Método da requisição (post/get)
� String request.getContentType() 
� Obtém o tipo de dado transferido
� String request.getQueryString()
� Query String (!)
� String request.getContextPath()
� Endereço do contexto
Exemplo no próximo slide
304
request (transferência)
<html>
<head>
<title>Transferência</title>
</head>
<body>
<h1>Transferência</h1>
<b><%= request.getContentLength() %></b> bytes transferidos<br>
O método da transferência é <b><%=request.getMethod() %></b><br>
O tipo da transferência foi <b><%= request.getContentType() %></b><br>
A querystring é <b><%= request.getQueryString() %></b><br>
O contexto está em <b><%= request.getContextPath() %></b><br>
<hr>
<form action="<%= request.getRequestURL() %>?campo=valor" 
method="post">
<input type="text" name="campo" value="valor">
<input type="submit" value="Envia">
</form>
</body>
</html>
305
request
� Parâmetros
� String request.getParameter(String nome) 
� Obtém o valor do campo do formulário pelo nome
� String[] request.getParameterValues(String nome)
� Obtém os valores do campo do formulário pelo nome 
� Enumeration request.getParameterNames() 
� Obtém o nome dos campos do formulário
� Map request.getParameterMap()
Exemplo no próximo slide
306
request (parâmetros)
<%@ page import="java.util.*" %>
<html><head><title>Parâmetros</title></head>
<body>
<h1>Parâmetros</h1>
Parametro "campo": <%= request.getParameter("texto") %><br>
<%
String nome="texto"; 
String nomes[] = request.getParameterValues("caixa");
Enumeration lista = request.getParameterNames();
%>
<p>
Valores do checkbox:<br>
<%
if (nomes != null)
for (int i=0; i<nomes.length; i++)
out.println(i + ": " + nomes[i] +"<br>");
else
out.print("***Não há parâmetros \"checkbox\"");
out.println("<p>Nome dos campos<br/>");
while (lista.hasMoreElements())
out.println((String)lista.nextElement() +"<br>");
%> � Continua
307
request (parâmetros)
� Continuação
<form action="<%=request.getRequestURL() %>" method="post">
<input type="text" name="texto" value="valor do texto"><br>
<%
for (int i = 0; i < 10; i++)
{
out.println("<input type='checkbox' name='caixa' 
value='checkbox" + i + "' checked>");
}
%>
<br>
<input type="submit" name="envia">
</form>
</body>
</html>
308
request
� Transporte
� String request.getAuthType() 
� String request.getProtocol() 
� String request.getScheme() 
� String request.getServerName() 
� boolean request.isSecure() 
� String request.getRequestURI()
� RequestDispatcher 
request.getRequestDispatcher(String path)
� String request.getRequestURL()
309
request
� Transporte
� String request.getServerName() 
� Nome do servidor
� int request.getServerPort() 
� Porta do servidor
� String request.getRemoteAddr() 
� Endereço IP do cliente
� String request.getRemoteHost() 
� Nome ou endereço IP do cliente
� String request.getLocalAddr()
� Endereço IP do servidor
� String request.getLocalName()
� Nome do servidor
Exemplo no próximo slide
310
request
<html>
<head>
<title>Informações do Cliente</title>
</head>
<body>
Detalhes do computador cliente:<br>
Endereço IP: <%=request.getRemoteAddr()%><br>
Nome do computador: <%=request.getRemoteHost()%><br>
Detalhes do computador servidor:<br>
Endereço IP: <%=request.getLocalAddr()%><br>
Nome do computador: <%=request.getLocalName()%><br>
Nome do servidor: <%=request.getServerName() %><br>
Porta do servidor: <%=request.getServerPort() %>
</body>
</html>
311
request
� Local
� String request.getLocale()
� Local do browser
� Enumeration request.getLocales() 
� Lista de locais do browser
312
request – Localidade
<html>
<head>
<title>Localidade</title>
</head>
<body>
Localidade: <%=request.getLocale() %><br>
Todas as localidades: 
<%
java.util.Enumeration lista = request.getLocales();
while (lista.hasMoreElements())
out.println(lista.nextElement());
%>
</body>
</html>
313
request
� Cookies & Sessão
� Cookie request.getCookies()
� HttpSession request.getSession()
� HttpSession request.getSession(boolean create)
� boolean request.isRequestedSessionIdValid()� boolean request.isRequestedSessionIdFromURL()
� boolean request.isRequestedSessionIdFromCookie()
� boolean request.getRequestedSessionId()
314
request
� Cabeçalho (header)
� String request.getHeader(String nome) 
� Enumeration request.getHeaders(String nome)
� Enumeration request.getHeaderNames()
� long request.getDateHeader(String nome)
� int request.getIntHeader(String nome)
315
request
� Autenticação
� String request.getRemoteUser()
� Principal request.getUserPrincipal() 
� boolean request.isUserInRole(String regra)
316
request
� Outros
� String request.getRealPath(String path)
� BufferedReader request.getReader()
� ServletInputStream request.getInputStream()
� String request.getServletPath()
� String request.getPathTranslated()
� String request.getPathInfo()
317
response
� Interface:
� java.servlet.ServletResponse. 
� Descrição: Dados de resposta.
318
response – métodos
� setContentType(tipo/subtipo)
� getCharacterEncoding()
� addCookie(cookie)
� containsHeader(nome)
� setHeader(nome, valor)
� setIntHeader(nome, valor)
� setDateHeader(nome, data)
� addHeader(nome, valor)
� addIntHeader(nome, valor)
� addDateHeader(nome, data)
� setStatus(codigo)
� sendError(status, mensagem)
� sendRedirect(url)
� encodeRedirectURL(url)
� encodeURL(nome)
319
response – propriedades
� int SC_ACCEPTED 
� int SC_BAD_GATEWAY 
� int SC_BAD_REQUEST 
� int SC_CONFLICT 
� int SC_CONTINUE 
� int SC_CREATED 
� int SC_EXPECTATION_FAILED 
� int SC_FORBIDDEN 
� int SC_GATEWAY_TIMEOUT 
� int SC_GONE 
� int SC_HTTP_VERSION_NOT_SUPPORTED 
� int SC_INTERNAL_SERVER_ERROR 
� int SC_LENGTH_REQUIRED 
� int SC_METHOD_NOT_ALLOWED 
� int SC_MOVED_PERMANENTLY 
� int SC_MOVED_TEMPORARILY 
� int SC_MULTIPLE_CHOICES 
� int SC_NO_CONTENT 
� int SC_NON_AUTHORITATIVE_INFORMATION 
� int SC_NOT_ACCEPTABLE 
� int SC_NOT_FOUND 
� int SC_NOT_IMPLEMENTED 
� int SC_NOT_MODIFIED 
� int SC_OK static int SC_PARTIAL_CONTENT 
� int SC_PAYMENT_REQUIRED 
� int SC_PRECONDITION_FAILED 
� int SC_PROXY_AUTHENTICATION_REQUIRED 
� int SC_REQUEST_ENTITY_TOO_LARGE 
� int SC_REQUEST_TIMEOUT 
� int SC_REQUEST_URI_TOO_LONG 
� int SC_REQUESTED_RANGE_NOT_SATISFIABLE 
� int SC_RESET_CONTENT 
� int SC_SEE_OTHER 
� int SC_SERVICE_UNAVAILABLE 
� int SC_SWITCHING_PROTOCOLS 
� int SC_TEMPORARY_REDIRECT 
� int SC_UNAUTHORIZED 
� int SC_UNSUPPORTED_MEDIA_TYPE 
� int SC_USE_PROXY
Exem
plo: com
pactação de conteúdo
package servlet.gzip;
import ...
public class ServletLongo extends HttpServlet
{
protected void doGet(HttpServletRequest request, 
HttpServletResponse response) throws
ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out;
if (UtilitarioGzip.isGzipSuportado(request) && 
!UtilitarioGzip.isGzipDesabilitado(request))
{
out = 
UtilitarioGzip.getEscritorGzip(response);
response.setHeader("Content-Encoding", 
"gzip");
}
else
out = response.getWriter();
out.println("<html><head><title>Dados Compri …
String linha = "The quick brown fox jump ove …
for(int i=0; i< 10000; i++)
out.println(linha);
out.println("</body></html>");
out.close();
}
protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws
ServletException, IOException
{
doGet(request, response);
}
}
class UtilitarioGzip
{
public static boolean 
isGzipSuportado(HttpServletRequest request)
{
String codificacao = 
request.getHeader("Accept-Encoding");
return (codificacao != null) && 
(codificacao.contains("gzip"));
}
public static boolean 
isGzipDesabilitado(HttpServletRequest request)
{
String flag = 
request.getParameter("disableGzip");
return (flag != null) && 
!flag.equalsIgnoreCase("false");
}
public static PrintWriter 
getEscritorGzip(HttpServletResponse response) 
throws IOException
{
return new PrintWriter(new 
GZIPOutputStream(response.getOutputStream()));
}
}
321
Captura da transmissão com compactação
GET /ExemplosWeb/ServletLongo HTTP/1.1
Host: 10.0.0.100:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.N …
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Encoding: gzip
Content-Type: text/html
Content-Length: 1603
Date: Wed, 07 Apr 2010 23:03:33 GMT
............1R.P........h.........o@.O.$.=.....t..{w.=/.....MUS..[.T.TM>..<Ls7t...a..&..;Ny.>..1..q,n........f..%....i....k..a.v....y
.o.3.....).a..}.u
M..z.......................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..............................................................................................................................................................................
..........................................bQ..R..].....H.VW.z..............
322
out
� Classe:
� javax.servlet.jsp.JspWriter. 
� Descrição: Fluxo de saída para conteúdo da página. 
� isAutoFlush()
� getBufferSize() // retorna o tamanho do buffer
� getRemaining()
� clearBuffer()
� clear() // limpa o conteúdo do buffer
� newLine()
� flush() // dá flush no stream
� close() // dá flush e fecha o stream
� print()
323
out
<%@ page language="java" 
contentType="text/html; charset=ISO-8859-1"
buffer="8kb"
autoFlush="false"
pageEncoding="ISO-8859-1"%>
<html><head><title>out</title></head>
<body>
Texto que nunca será visto!
<p>abstract void clear(): Clear the contents of the buffer. 
<% out.clear(); %>
Este também nunca será visto!
<p>abstract void clearBuffer(): Clears the current contents of the buffer. 
<% out.clearBuffer(); %>
<p>abstract void flush(): Flush the stream. 
<% out.flush(); %>
<p>int getBufferSize(): This method returns the size of the buffer used by the 
JspWriter. 
<%= out.getBufferSize() %>
<p>abstract int getRemaining(): This method returns the number of unused bytes 
in the buffer. 
<%= out.getRemaining() %>
<p>boolean isAutoFlush(): This method indicates whether the JspWriter is 
autoFlushing. 
<%= out.isAutoFlush() %>
<p>abstract void newLine(): Write a line separator. 
<% out.newLine(); %>
<p>abstract void close(): Close the stream, flushing it first. 
<% out.close(); %>
</body></html>
324
Objeto exception
� Classe:
� java.lang.Throwable. 
� Somente existe nas páginas com a diretiva
� <%@ page isErrorPage="true" %>
� Descrição: Erros não capturados ou exceção. 
� exception.getMessage()
� exception.printStackTrace(saida)
� exception.toString()
<b>getMessage:</b><%=exception.getMessage()%><br>
<b>printStackTrace:</b> <%exception.printStackTrace(new 
PrintWriter(out));%><br>
<b>toString:</b> <%=exception.toString()%>
325
Trabalhando com formulário
� Arquivos:
� Formulário HTML
� Script JSP
326
Trabalhando com formulário
� Formulário HTML
<HTML>
<HEAD>
<TITLE>Formulario Get/Post</TITLE>
</HEAD>
<BODY>
<h1>Formulário POST</h1>
<form action='Formulario.jsp' method=post>
Nome: <input type=text name=nome>
Telefone: <input type=text name=telefone>
<input type=submit><input type=reset>
</form>
<hr>
<h1>Formulário GET</h1>
<form action='Formulario.jsp' method=get>
Nome: <input type=text name=nome>
Telefone: <input type=text name=telefone>
<input type=submit><input type=reset>
</form>
</BODY>
</HTML>
327
Trabalhando com formulário
� Script JSP
<HTML>
<HEAD>
<TITLE>Formulario Get/Post</TITLE>
</HEAD>
<BODY>
<table>
<tr>
<td align='right'>Nome:</td>
<td><%=request.getParameter("nome")%></td>
</tr>
<tr>
<td align='right'>Telefone:</td>
<td><%=request.getParameter("telefone")%></td>
</tr>
</table>
</BODY>
</HTML>
328
Trabalhando com formulário
� Formulário POST
POST /Exemplos/Formulario/Formulario.jsp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, 
application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*
Referer: http://10.0.0.5:8080/Exemplos/Formulario/Formulario.html
Accept-Language: pt-br
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 10.0.0.5:8080
Content-Length: 40
Connection: Keep-Alive
Cache-Control: no-cache
nome=Alexandre+Meslin&telefone=5555-8752
329
Trabalhando com formulário
� Formulário GET
GET /Exemplos/Formulario/Formulario.jsp?nome=Alexandre+Meslin&telefone=5555-8752 
HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, 
application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*
Referer: http://10.0.0.5:8080/Exemplos/Formulario/Formulario.html
Accept-Language: pt-br
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: 10.0.0.5:8080
Connection: Keep-Alive
Cookie: JSESSIONID=EEB7B2485BACB3D17D3A645ED66B56D0
330
Trabalhando com formulário - vetores
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; 
charset=ISO-8859-1">
<title>Exemplo de Formulário com vetor</title>
</head>
<body>
<h1>Formulário</h1>
<form action="Vetor.jsp" method="post">
<input type="text" name="texto"><br>
<input type="text" name="texto"><br>
<input type="text" name="texto"><br>
<input type="text" name="texto"><br>
<input type="text" name="texto"><br>
<input type="submit">
</form>
</body>
</html>
331
Trabalhando com formulário - vetores
<%@ page 
language="java" 
contentType="text/html; charset=ISO-8859-1“
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Formulário recebido</title>
</head>
<body>
<h2>Valores recebidos do Formulário</h2>
<%
for (String campo : request.getParameterValues("texto"))
{
out.print(campo + " ");
}
%>
</body>
</html>
332
Perguntas?
333
Exercícios
334
Objeto request
1. Faça uma página que mostre o seu próprio nome 
(o nome da página).
/public_html/pagina.jsp
335
Objeto request
1. Faça uma página que mostre o endereço IP do 
cliente que a está acessando (teste com os seus 
vizinhos de micro).
IP: 25.78.87.52
336
Objeto request
1. Faça uma página que inicialize dois vetores: um 
com perguntas e outro com respostas. Cada vez 
que esta página for requisitada, mostre 
aleatoriamente uma pergunta e uma resposta.
P: Qual é a cor do cavalo
branco de Napoleão?
R: Branco
337
Objeto request
1. Modifique o exercício anterior de forma que seja 
mostrada apenas a pergunta. Ao clicar num link, a 
página deve ser chamada passando um parâmetro 
e mostrar a resposta da pergunta anterior.
P: Qual é a cor do cavalo
branco de Napoleão?
Resposta
R: Branco
P: Qual é a cor do cavalo
branco de Napoleão?
Resposta
R: Branco
338
Objeto request
1. Faça um formulário que pergunte o nome de uma 
pessoa. O formulário deverá gerar uma página 
com uma saudação do tipo: bom dia, boa tarde ou 
boa noite.
Nome: Boa noite, Ana
Ana
index.html sauda.jsp
339
Objeto request
1. Transforme o exercício anterior em uma única 
página em JSP.
Nome: Boa noite, Ana
Ana
index.jsp index.jsp
340
Formulário
1. Faça um formulário 
que pergunte a 
quantidade de linhas 
e colunas de uma 
tabela e depois 
imprima a tabela, 
colocando como 
conteúdo das células 
da tabela, a sua 
posição em linhas e 
colunas.
1,1 1,2 1,3 1,4
2,1 2,2 2,3 2,4
3,1 3,2 3,3 3,4
4,1 4,2 4,3 4,4
5,1 5,2 5,3 5,5
341
Formulário
1. Faça uma página em JSP que receba, 
através de um formulário, dois números e 
informe a sua soma.
2. Faça uma página em JSP que receba, 
através de um formulário, dois números e o 
tipo de operação (soma, subtração, 
multiplicação ou divisão) e informe o 
resultado da operação (se possível). 
342
Formulário
� Altere o exercício sobre temperatura para que 
o usuário possa informar a temperatura 
inicial, final e o incremento.
�Faça uma página JSP que imprima 
uma tabela HTML de conversão 
Celsius-Fahrenheit com valores de 
temperatura entre -40 e 100 graus 
Celsius em incremento de 10 em 10. 
A equação é: F = 9/5 C + 32
343
Parte 6
� Persistência:
� Session
� Application
� Trabalhando com 
cookies
344
Sessões
� O HTTP é um protocolo "Stateless": não mantêm 
estado
� Como a interação entre o Browser e o Web server 
se dá em pares discretos tipo requisição/resposta, o 
valor das informações não se preserva entre 
chamadas
� Cada request é como se viesse de um novo usuário
� Não se consegue identificar o usuário que navega 
por várias páginas
� Sessões contornam esse problema: é criado uma 
para cada usuário que acessa o aplicativo
� Problema: sessões se baseiam em cookies
345
Sessões
� No início de uma nova sessão o servidor armazena 
um cookie com uma identificação do usuário no 
browser.
� Desta forma o servidor reconhece acessos 
subsequentes do usuário, associando-os a mesma 
sessão.
� Se o browser não suportar cookies ou estiver 
desabilitado pelo usuário, uma querystring é 
utilizada para manter a sessão
346
Sessões
� Usos
� Armazenar preferências do usuário
� Armazenar interesses do usuário
� Implementação de cestos de compras
� Exemplo
� Session.jsp
� Login.jsp
347
session
� Interface:
� javax.servlet.http.HttpSession. 
� Descrição: Dados de sessão específicos de usuário. 
� getId()
� getCreationTime()
� getLastAccessTime()
� getMaxInactiveInterval()
� setMaxInactiveInterval()
� isNew()
� invalidate()
� setAttribute()
� getAttribute()
348
Objeto session
session.getMaxInactiveInterval()
O tempo máximo de inatividade da sessão é: 
<%=session.getMaxInactiveInterval()%> 
segundos.
�Tempo máximo de inatividade em segundos
349
Objeto session
session.getCreationTime()
Esta sessão foi criada em 
<%=session.getCreationTime()%> 
milisegundos depois 1o de janeiro de 
1970 GMT.
�Tempo de criação da sessão em 
milisegundos depois de 1o de janeiro de 1970
350
Objeto session
session.getId()
A identificação única do usuário é 
<%=session.getId()%>.
�Retorna um valor que é a chave de 
identificação da sessãodo usuário
351
Objeto session
session.getLastAccessedTime()
O último acesso foi em 
<%=session.getLastAccessedTime()%> 
depois de 1o de janeiro de 1970 GMT.
�Horário do último acesso contado a partir de 
1o de janeiro de 1970
352
Objeto session
session.invalidate()
<%session.invalidate();%>
� Termina (invalida) a sessão
353
Objeto session
session.isNew()
<%
if (session.isNew())
out.println ("Nova sessão");
else
out.println ("Sessão antiga");
%>
�Retorna verdadeiro se a sessão é nova ou se 
o browser não suporta cookies
354
Objeto session
Object session.getAttribute(String nome)
� Este método extrai um valor previamente 
armazenado
� Retorna null se não houver valor associado ao 
nome
355
Objeto session
Enumeration session.getAttributeNames()
� Retorna o nome de todos os atributos da sessão
356
Objeto session
void setAttribute(String nome, Object objeto)
� Cria um objeto na sessão
357
Objeto session
public void removeAttribute(String nome)
� Este método remove qualquer valor associado ao 
nome
358
Objeto session
void setMaxInactiveTime(intervalo)
<%session.setMaxInactiveTime(3000);%>
� Modifica o tempo máximo de inatividade em 
milisegundos.
� Tempo negativo indica que a sessão não deve 
expirar
� O tempo de expiração é controlado pelo 
servidor e não pelo cliente como acontece 
com os cookies
359
Informações sobre a sessão
<html>
<head>
<title>Informações sobre a Sessão</title>
</head>
<body>
<%
String titulo = "Bem vindo de volta";
if (session.isNew()) titulo = "Bem vindo, novato";
%>
<h1 align="center"><%=titulo %></h1>
<h2 align="center">Informações sobre a sua sessão:</h2>
<table border="1" align="center">
<tr><th>Tipo da Informação</th><th>Valor da Informação</th></tr>
<tr><td>ID</td> <td><%=session.getId() %></td></tr>
<tr><td>Hora da criação</td><td><%=new Date(session.getCreationTime()) %></td></tr>
<tr><td>Hora do último acesso</td><td><%=new Date(session.getLastAccessedTime())%></td></tr>
<tr><td>Tempo máximo de inatividade</td><td><%=session.getMaxInactiveInterval() %>s</td></tr>
<%
Enumeration<String> enumeracao = (Enumeration<String>)session.getAttributeNames();
if (enumeracao != null)
while (enumeracao.hasMoreElements())
{
String objeto = enumeracao.nextElement();
out.print("<tr><td>" + objeto + "</td>");
out.print("<td>" + session.getAttribute(objeto) + "</td></tr>");
}
%>
</table>
</body>
</html>
360
Exemplo de objeto session
<BODY>
<h1>Sessão</h1>
<p>Esta sessão foi criada em <%=session.getCreationTime()%> milisegundos depois 1o de janeiro de 
1970 GMT.
<p>O tempo máximo de inatividade da sessão é: <%=session.getMaxInactiveInterval()%> segundos.
<p>A identificação única do usuário é <%=session.getId()%>.
<p>O último acesso foi em <%=session.getLastAccessedTime()%> depois de 1o de janeiro de 1970 GMT.
<%
int cont;
if (session.isNew())
{
out.println ("Uma nova sessão");
cont = 1;
}
else
{
out.println ("Sessão antiga");
try
{
cont = Integer.parseInt(session.getAttribute("contador").toString());
}
catch (Exception e)
{
cont = 0;
}
cont++;
}
session.setAttribute("contador", new Integer(cont));
%>
Esta página já foi carregada por você <%=cont%> vezes.
</BODY>
361
Objeto application
� Interface:
� javax.servlet.ServletContext. 
� Descrição: Dados compartilhados por todas as 
páginas da aplicação. 
362
Objeto application
� Object getAttribute(String nome)
� Retorna o valor do atributo referenciado pelo nome ou 
null se não houver
� Enumeration getAttributeNames()
� Retorna os nomes dos atributos
� void removeAttribute(String nome)
� Remove o atributo pelo nome 
� void setAttribute(String name, Object object)
� Associa um objeto a um atributo
363
Objeto application
<%@page language="java" import="java.util.*" %>
<HTML>
<HEAD>
<TITLE>Manipulação de atributos</TITLE>
</HEAD>
<BODY>
<h1>Manipulação de Atributos de um objeto application</h1>
<h2>Listagem dos atributos:</h2>
<% Enumeration nomes = application.getAttributeNames(); %>
<table border>
<tr><th>Nome<th>Valor
<%
while (nomes.hasMoreElements())
{
String nome = (String)nomes.nextElement();
out.print ("<tr><td>" + nome + "<td>" + 
application.getAttribute(nome));
}
%>
</table>
</BODY>
</HTML>
Contador de acesso com
 o objeto application
<%@ page language="java"%>
<html>
<head>
<title>Contador com application</title>
</head>
<body>
<H1>Cabeçalho da página</H1>
Conteúdo da página...
<p>
The quick brown fox jumps over the lazy dog. The quick brown fox jumps 
over the lazy dog. The
<hr>
<%
int cont;
try
{
cont = ((Integer)application.getAttribute("contador"));
}
catch(Exception e)
{
cont = 0;
}
cont++;
application.setAttribute ("contador", new Integer (cont));
%>
Esta página já foi carregada <b><%=cont%></b> vezes.
</body>
</html>
365
Exemplo de sincronização
<html>
<head>
<title>Sincro</title>
</head>
<frameset rows="50%,*">
<frame src="1Pagina.jsp">
<frame src="1Pagina.jsp">
<noframes>
</noframes>
</frameset>
</html>
<%@ page language="java" 
contentType="text/html"%>
<html>
<head>
</head>
<body>
<h1>Exemplo de uso de 
synchronized(objeto)</h1>
Vou entrar na região crítica...
<%
out.flush(); 
synchronized(this)
{
out.print("dentro da região crítica...");
out.flush();
Thread.sleep(60*1000);
out.print("fim da região crítica...");
out.flush();
}
%>
fora da região crítica
</body>
</html>
366
Exemplo de sincronização em 2 páginas
<html>
<head>
<title>Sincro</title>
</head>
<frameset rows="50%,*">
<frame src="2PaginasA.jsp">
<frame src="2PaginasB.jsp">
<noframes>
</noframes>
</frameset>
</html>
<html>
<body>
<h1>Exemplo de uso de 
synchronized(objeto)</h1>
<h2>Página A</h2>
Vou entrar na região crítica...
<%
out.flush(); 
synchronized(application)
{
out.print("dentro da região crítica...");
out.flush();
Thread.sleep(60*1000);
out.print("fim da região crítica...");
out.flush();
}
%>
fora da região crítica
</body>
</html>
367
Contador de acesso com o objeto application
(agora sincronizado!)
<%
int cont;
synchronized(this)
{
try
{
cont = ((Integer)application.getAttribute("contador"));
}
catch(Exception e)
{
cont = 0;
}
cont++;
application.setAttribute ("contador", new Integer (cont));
}
%>
Esta página já foi carregada <b><%=cont%></b> vezes.
</body>
</html>
368
Objeto application
� String getInitParameter(String nome)
� Retorna o valor do nome do parâmetro de inicialização do contexto 
ou null se não houver
� Enumeration getInitParameterNames()
� Retorna os nomes dos parâmetros de inicialização do contexto ou 
vazio se não houver
<% Enumeration nomes = application.getInitParameterNames(); %>
<table border>
<tr>
<th>Nome
<th>Valor
<%
while (nomes.hasMoreElements())
{
String nome = (String)nomes.nextElement();
out.print ("<tr><td valign=top>" + nome + "<td valign=top>" +
application.getInitParameter(nome));
}
%>
</table>
369
Objeto application
� void log(String msg)
� Escreve uma mensagem no log 
� void log(String msg, Throwable throwable)
� Escreve uma mensagem com stack no log
<%application.log("Mensagem de exemplo!");%>
<%
try
{
int i = Integer.parseInt("abc");
}
catch (Exception e)
{
application.log("Mensagem de exemplo com throwable!", e);
}
%>
370
Objeto application
� String getMimeType(String arquivo)
� O tipo MIME do arquivo ou null se não for 
conhecido 
<%=application.getMimeType("arquivo.gif")%>
371
Objeto application� String getRealPath(String path)
� Retorna o caminho real para um caminho virtual 
� URL getResource(String path)
� Retorna o caminho virtual para um caminho real 
� Set getResourcePaths(String path)
� Retorna um conjunto de caminhos para o recurso 
<%=application.getRealPath("/Application/Outros.jsp")%>
<%=application.getResource("\\Application\\Outros.jsp")%>
<%
Set conjunto = 
application.getResourcePaths("Application\\Outros.jsp");
Object caminhos[] = conjunto.toArray();
for (int i = 0; i < caminhos.length; i++)
out.println (caminhos[i].toString());
372
Objeto application
� ServletContext getContext(String uripath)
� Retorna um objeto ServletContext correspondente a URL 
especificada (próprio application)
� InputStream getResourceAsStream(String path)
� Retorna o caminho como um objeto do tipo InputStream
� String getServerInfo()
� Retorna o nome e a versão do conteiner 
� String getServletContextName()
� Retorna o nome da aplicação
<%=application.getServerInfo()%>
<%=application.getServletContextName()%>
373
Objeto application
� int getMajorVersion()
� A maior versão de API Java que o conteiner 
suporta
� int getMinorVersion()
� A menor versão de API Java que o conteiner 
suporta
<%=application.getMajorVersion()%>
<%=application.getMinorVersion()%>
374
Sessão e Aplicação
� Exemplo: sala de chatos
� Arquivos
� index.htm
� Frames.jsp
� ChatOpinioes.jsp
� ChatFormulario.jsp
375
Perguntas?
376
Exercícios
377
Session
� Escreva uma página HTML que mostre um 
formulário na tela com dois campos: email e 
mensagem
� Escreva uma página JSP que receba os dois 
campos do formulário e os grave na sessão 
do usuário
� Faça com que a primeira página aponte para 
a segunda
� Crie uma terceira página que mostre todas as 
mensagens gravadas na sessão até o 
momento
378
Application
� Escreva uma página HTML que mostre um 
formulário na tela com dois campos: email e 
mensagem
� Escreva uma página JSP que receba os dois 
campos do formulário e os grave na aplicação
� Faça com que a primeira página aponte para 
a segunda
� Crie uma terceira página que mostre todas as 
mensagens gravadas na aplicação até o 
momento
379
Session & Application
1. Faça uma página cujas cores possam ser configuradas pelo usuário. Use session para 
garantir persistência
2. Faça uma página com diversos links. Se o usuário tiver visitado recentemente um dos 
links, ao seu lado deverá ser exibida uma mensagem avisando-o. Use session.
3. Faça uma página JSP que mostre a hora do ultimo acesso por qualquer usuário e pelo 
usuário atual. Se nunca tiver sido acessada por ninguém, deve mostrar a mensagem: 
“Esta aplicação nunca foi usada antes”.Se é a primeira vez que este usuário específico 
acessa a página, a seguinte mensagem deve ser exibida: “Esta é a primeira vez que você 
usa esta aplicação” (Dica: use os objetos application e session).
4. Faça uma página com o conteúdo de acesso restrito. O acesso ao conteúdo desta página 
somente será permitido caso o usuário efetue login no sistema (ou seja, faça também 
uma página de login).
5. Faça uma página que possua um contador de acesso usando session.
6. Faça uma página que possua um contador de acesso usando application.
7. Modifique a página de login para que o milésimo usuário a se conectar seja desviado 
para uma página avisando-o que ele vai receber um prêmio especial.
8. Faça uma sala de chat que armazene as últimas 10 mensagens dos participantes. Para 
entrar na sala de chat, o usuário deverá digitar um nickname. 
380
Parte 7
� Cookies
381
O que são cookies
� Texto
� Envido primeiramente do servidor para o cliente
� Armazenado no cliente
� Cliente envia cookie de volta para o servidor
382
Problemas com cookies
� Privacidade x Segurança
� Servidores podem usar cookies para lembrar suas ações 
anteriores
� Servidores podem compartilhar cookies com terceiros, 
como por exemplo, com doubleclick.net
� Sites feitos por programadores ruins (não meus alunos) 
podem armazenar informações sensíveis nos cookies
� Antigos browsers possuem bugs que permitem acesso a 
cookies através de javascript
� Em resumo:
� Somente use cookies se realmente não houver outra 
alternativa
� Nunca ponha informações confidenciais em cookies
383
Cookies de sessão e cookies persistentes
� Cookies de sessão
� Armazenados apenas em memória
� São removidos quando o browser é fechado
� Não possuem tempo de validade
� Cookies persistentes
� Armazenados no disco do cliente
� Continuam existindo mesmo depois do 
computador desligado e ligado
� Possuem tempo de validade
384
Cookies
� Construtor
� public Cookie(String nome, String valor) 
� Cookies armazenados em:
� MSIE
� XP
C:\Documents and Settings\Meslin\Cookies
� Vista ou 7
C:\Users\meslin\AppData\Roaming\Microsoft\Windows\Cookies
� Firefox
� XP
c:\Documents and Settins\Meslin\Application 
Data\Mozilla\Firefox\Profiles\xxx\cookies.sqlite
� Vista ou 7:
C:\Users\meslin\AppData\Roaming\Mozilla\Firefox\Profiles\ty7hya91.default\cookies.sqlit
e
� Chrome
� XP
C:\Documents and Settings\User- Name\Local Settings\Application 
Data\Google\Chrome\User Data
� Vista ou 7:
C:\Users\ User-Name\AppData\Local\Google\Chrome\User Data
385
Cookies
� Metodos
� public void setComment(String purpose) 
� public String getComment() 
� public void setDomain(String pattern) 
� public String getDomain() 
� public void setMaxAge(int expiry) 
� public int getMaxAge() 
� public void setPath(String uri) 
� public String getPath() 
� public void setSecure(boolean flag) 
� public boolean getSecure() 
� public String getName() 
� public void setValue(String newValue) 
� public String getValue() 
� public int getVersion() 
� public void setVersion(int v) 
� public Object clone() 
386
Cookies
� Criando cookies
<%
Cookie cookieJSP = new Cookie("nome", "valor");
//tempo de vida = 7 dias (604800 segundos)
cookieJSP.setMaxAge(7 * 24 * 60 * 60);
//o cookie pode ser transferido por HTTP padrão
cookieJSP.setSecure(false); 
//grava o cookie na máquina do usuário 
response.addCookie(cookieJSP); 
%>
387
Cookies
� Recebendo cookies
<%
Cookie listaPossiveisCookies[] = request.getCookies();
Cookie cookieJSP = null;
if (listaPossiveisCookies != null) 
{
//quando não existe cookies associados o método getCookies() 
retorna null
int numCookies = listaPossiveisCookies.length;
for (int i = 0 ; i < numCookies ; ++i) 
{
//procura pelo cookie
if (listaPossiveisCookies[i].getName().equals("nome")) 
{ 
cookieJSP = listaPossiveisCookies[i];
break;
}
}
}
%>
388
Cookies
� Recebendo cookies
<%
if (cookieJSP != null) 
{ 
%>
Cookie recebido: <%=cookieJSP.getValue()%>
<% 
}
else
{ 
%>
Não foi recebido nenhum cookie. (???)
<%
}
%>
389
Cookies – Contador de acesso
<HTML><HEAD><TITLE>Contador de Acesso</TITLE></HEAD>
<BODY><h1>Texto da página</h1>
<%
int nVezes;
Cookie listaPossiveisCookies[] = request.getCookies();
Cookie cookieJSP = null;
// recebeu cookies
if (listaPossiveisCookies != null) 
{
// procura o cookie desejado
int numCookies = listaPossiveisCookies.length;
for (int i = 0 ; i < numCookies ; ++i) 
{
// verifica se achou
if (listaPossiveisCookies[i].getName().equals("contadorIndex")) 
{ 
// achou!!!
cookieJSP = listaPossiveisCookies[i];
break;
}
}
}
390
Cookies – Contador de acesso
// realmente achou?
if (cookieJSP != null) 
{ 
nVezes = Integer.parseInt(cookieJSP.getValue()) +1;
}
else
{ 
nVezes = 1;
}
// envia o cookie atualizado de volta
cookieJSP = new Cookie("contadorIndex", Integer.toString(nVezes));cookieJSP.setMaxAge(7 * 24 * 60 * 60); //define o tempo de vida 
como 7 dias (604800 segundos)
cookieJSP.setSecure(false); //indica que o cookie 
deve ser transferido pelo protocolo HTTP padrão
response.addCookie(cookieJSP); //grava o cookie na 
máquina do usuário
%>
Esta página já foi carregada por você <%=nVezes%> vez(es).
</BODY>
</HTML>
391
Cookies para detectar a primeira visita
Cookies para detectar a prim
eira visita
<%
boolean calouro = true;
String titulo = "Bem vindo de volta";
Cookie[] cookies = request.getCookies();
if (cookies != null)
{
for (Cookie cookie : cookies)
if ((cookie.getName().equals("veterano")) && 
(cookie.getValue().equals("sim")))
{
calouro = false;
break;
}
if(calouro)
{
Cookie cookie = new Cookie("veterano", "sim");
cookie.setMaxAge(365*24*60*60);
response.addCookie(cookie);
titulo = "Bem vindo a bordo";
}
}
%>
<html>
<head><title><%=titulo %></title></head>
<body><h1><%=titulo %></h1></body>
</html>
393
Listagem de todos os cookies
<html>
<head>
<title>Todos os Cookies</title>
</head>
<body>
<h1>Cookies Atuais</h1>
<table border="2">
<tr><th>Nome do Cookie</th><th>Valor do Cookie</th></tr>
<%
Cookie[] cookies = request.getCookies();
if (cookies == null)
out.print("<tr><td colspan='2' align='center'>Sem cookies</td></tr>");
else
for (Cookie cookie : cookies)
{
out.print("<tr><td>" + cookie.getName() + "</td>");
out.print("<td>" + cookie.getValue() + "</td></tr>");
}
%>
</table>
</body>
</html>
394
Primeiro Acesso
GET /ExemplosWeb/Cookies/Contador.jsp HTTP/1.1
Accept: */*
Accept-Language: pt-br
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; …
Accept-Encoding: gzip, deflate
Host: setembro:8080
Connection: Keep-Alive
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=28A15D20860E8C439CF147099B0961A2; Path=/ExemplosWeb
Set-Cookie: contadorIndex=1; Expires=Mon, 05-Oct-2009 15:48:04 GMT
Content-Type: text/html
Content-Length: 235
Date: Mon, 28 Sep 2009 15:48:04 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Contador de Acesso</TITLE>
</HEAD>
<BODY>
<h1>Texto da p.gina</h1>
<hr>
Esta p.gina j. foi carregada por voc. 1 vez(es).
</BODY>
</HTML>
395
Segundo Acesso
GET /ExemplosWeb/Cookies/Contador.jsp HTTP/1.1
Accept: */*
Accept-Language: pt-br
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; …
Accept-Encoding: gzip, deflate
Host: setembro:8080
Connection: Keep-Alive
Cookie: contadorIndex=1; JSESSIONID=28A15D20860E8C439CF147099B0961A2
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: contadorIndex=2; Expires=Mon, 05-Oct-2009 15:52:52 GMT
Content-Type: text/html
Content-Length: 235
Date: Mon, 28 Sep 2009 15:52:52 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Contador de Acesso</TITLE>
</HEAD>
<BODY>
<h1>Texto da p.gina</h1>
<hr>
Esta p.gina j. foi carregada por voc. 2 vez(es).
</BODY>
</HTML>
396
Terceiro Acesso
GET /ExemplosWeb/Cookies/Contador.jsp HTTP/1.1
Accept: */*
Accept-Language: pt-br
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; Trident/4.0; .NET CLR 2.0.50727; …
Accept-Encoding: gzip, deflate
Host: setembro:8080
Connection: Keep-Alive
Cookie: contadorIndex=2; JSESSIONID=28A15D20860E8C439CF147099B0961A2
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=B30F49FDF187A01DD6FE526EEE7E98E5; Path=/ExemplosWeb
Set-Cookie: contadorIndex=3; Expires=Mon, 05-Oct-2009 16:52:24 GMT
Content-Type: text/html
Content-Length: 235
Date: Mon, 28 Sep 2009 16:52:24 GMT
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Contador de Acesso</TITLE>
</HEAD>
<BODY>
<h1>Texto da p.gina</h1>
<hr>
Esta p.gina j. foi carregada por voc. 3 vez(es).
</BODY>
</HTML>
397
Perguntas?
398
Exercícios
399
Cookies
� Faça um cookie de boas vindas que informe ao usuário quando foi a 
última vez (data e hora) que ele visitou a página.
� Faça uma página cujas cores possam ser configuradas pelo usuário 
usando cookies para garantir a persistência.
� Faça uma página com diversos links. Se o usuário tiver visitado 
recentemente um dos links, ao seu lado deverá ser exibida uma 
mensagem avisando-o. Use cookies.
� Faça uma página com o conteúdo de acesso restrito. O acesso ao 
conteúdo desta página somente será permitido caso o usuário efetue 
login no sistema (ou seja, faça também uma página de login).
� Faça uma página que possua um contador de acesso usando cookies.
� Faça uma página que possua um contador de acesso. Este contador não 
deve contar o mesmo usuário duas vezes. 
400
Cookies
� Faça um formulário de registro com nome, 
sobrenome e email. Se o usuário voltar ao 
mesmo formulário, este deverá ser 
apresentado preenchido. Utilize cookies nesta 
tarefa.
401
Parte 7,5
� Servlets
402
MVC
Apresentação
(visual)
Implementação
(controle)
HTML e tags 
JSP tipo HTML
JavaBeans
403
O trabalho de um servlet
� Ler dados enviados pelo cliente (formulários)
� Ler dados implícitos enviados pelo cliente 
(ambiente)
� Processar informações
� Gerar resultado
� Opcionalmente:
� Enviar dados HTML (ou em outro formato) para 
o cliente
� Enviar dados implícitos para o cliente (headers e 
códigos de status)
404
O Servlet
� Estende HttpServlet
� doDelete(), doGet(), doHead(), doOptions(), 
doPost(), doPut(), doTrace(), getLastModified(), 
service()
� HttpServlet estende GenericServlet
� String getInitParameters(String nome)
� Enumeration getInitParametersNames()
� ServletConfig getServletConfig()
� ServletContext getServletContext()
� String getServletInfo()
� String getServletName()
405
Obtendo alguns objetos...
� Objeto application
ServletContext application = getServletContext();
� Objeto session
HttpSession session = request.getSession();
� Objeto cookie
Cookies cookie = request.getCookies();
� Objeto request
� Parâmetro do servlet
� Objeto response
� Parâmetro do servlet
� Objeto dispatcher
RequestDispatcher dispatcher = request.getRequestDispatcher(URL);
dispatcher.forward(request, response);
406
Criando nosso primeiro servlet
� Selecione File � New �
Servlet
� Informe o nome do pacote 
onde o servlet será criado
� Informe o nome da classe 
(será o nome do arquivo 
.java também!)
� (normalmente não é 
necessário modificar a 
informação de superclasse)
� Clique Next
407
Criando nosso primeiro servlet
� Informe o nome pelo qual o 
servlet será conhecido no 
mundo (normalmente, o 
mesmo nome da classe)
� Opcionalmente, dê uma 
descrição ao seu servlet (é 
apenas um comentário, 
para seres humanos)
� Clique Next
Endereço do servlet criado:
/ExemplosWeb/RecebeForm
408
Criando nosso primeiro servlet
� Informe algumas 
opções necessárias 
para o seu 
funcionamento
� No nosso caso, agora, 
não preciso de mais 
nada...
� Clique Finish
409
Resultado no arquivo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance …>
<display-name>ExemplosWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description>Servlet para receber um formulário</description>
<display-name>RecebeForm</display-name>
<servlet-name>RecebeForm</servlet-name>
<servlet-class>servlet.RecebeForm</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RecebeForm</servlet-name>
<url-pattern>/RecebeForm</url-pattern></servlet-mapping>
</web-app>
410
Texto da página HTML que chama o servlet
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Primeiro Servlet</title>
</head>
<body>
<form action="/ExemplosWeb/RecebeForm" method="get">
<table>
<tr>
<td>Texto:</td>
<td><input type="text" name="texto"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="Envia"></td>
</tr>
</table>
</form>
</body>
</html>
411
Nosso primeiro servlet
package servlet;
import …
public class RecebeForm extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException
{
processa(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException
{
processa(request, response);
}
private void processa(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException
{
ServletOutputStream out = response.getOutputStream();
out.print("Este foi o dado recebido pelo servlet: <b>"
+ request.getParameter("texto") + "</b>");
}
}
412
Ciclo de vida do servlet
Construtor
init
service
doGet doPost
destroy
GC
413
Servlets e Threads
Container
Cliente A Cliente B
HTTP request HTTP request
HTTP response HTTP response
Servlet
Thread A
request response
Thread B
request response
414
Um servlet...
package servlet;
import …
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() { }
public void init(ServletConfig config) throws ServletException { }
public void destroy() { }
public ServletConfig getServletConfig() { return null; }
public String getServletInfo() { return null; }
protected void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException { }
}
415
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
� O construtor do servlet
416
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
� O container chama o init() antes que o servlet sirva 
a qualquer solicitação do cliente
� Você pode anular o init() para inicializar alguma 
coisa antes do tratamento em si da solicitação
� Normalmente o processamento do servlet não está 
no init()
417
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
� Chamado quando o server remove a instância do 
servlet da memória
� Não é chamado após cada request
418
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
419
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
420
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
� O método service() faz mais do que chamar doGet() 
ou doPost()
� Para suportar post e get simultaneamente, a 
alternativa é fazer com que doPost() chame doGet() 
ou vice-versa
421
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
422
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
423
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
424
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfigconfig) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
425
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
426
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
}
427
Por partes...
public class ServletCompleto extends HttpServlet 
{
public ServletCompleto() 
{
}
public void init(ServletConfig config) throws ServletException 
{
}
public void destroy() 
{
}
public ServletConfig getServletConfig() 
{
return null;
}
public String getServletInfo() 
{
return null; 
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doHead(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doOptions(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
}
protected void doTrace(HttpServletRequest request, 
HttpServletResponse response) throws ServletException, IOException 
{
}
}
428
Servlet e MVC
� O servlet recebe e processa as informações
� O servlet seleciona a página de saída mais 
apropriada
� Opcionalmente, o servlet envia dados para a 
página de saída (não agora neste nosso 
primeiro exemplo...)
� Arquivos do exemplo:
� oQueFazer.html
� OQueFazer.java
� executa.jsp
� cancela.jsp
� desconhecido.jsp
429
oQueFazer.html
...
<body>
<h1>O que fazer...</h1>
<h2>Selecione a opção desejada:</h2>
<table><tr><td>
<fieldset>
<legend>Opção:</legend>
<form action="/ExemplosWeb/OQueFazer" method="get">
<table>
<tr>
<td>Selecione:</td>
<td>
<select name="opcao">
<option>Executar</option>
<option>Cancelar</option>
</select>
</td>
</tr>
<tr><td><input type="submit"></td></tr>
</table>
</form>
</fieldset>
</td></tr></table>
</body>
</html>
Observe o 
endereço do 
servlet
430
OQueFazer.java
package servlet;
import …
public class OQueFazer extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException
{
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException
{
String endereco;
String operacao = request.getParameter("opcao");
if (operacao == null) endereco = "/WEB-INF/servlet/desconhecido.jsp";
else if (operacao.equals("Executar")) endereco = "/WEB-
INF/servlet/executa.jsp";
else if (operacao.equals("Cancelar")) endereco = "/WEB-
INF/servlet/cancela.jsp";
else endereco = "/WEB-INF/servlet/desconhecido.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(endereco);
dispatcher.forward(request, response);
}
}
Note o endereço das páginas JSP. 
Dentro de WEB-INF , elas não 
podem ser acessadas diretamente 
pelos usuários WEB
431
Uma aplicação “completa” com servlet
� Um exemplo funcional
� Uma página referencia o servlet
� O servlet é executado
� O servlet redireciona para uma página JSP
� A página JSP exibe o conteúdo
432
Uma aplicação “completa” com servlet
� Um exemplo funcional
� Uma página referencia o servlet
� A página calculadora.html envia dados para o servlet
� O servlet é executado
� O servlet calculadora.java calcula o resultado da operação
� O servlet redireciona para uma página JSP
� O servlet calculadora.java envia o resultado para calculadora.jsp
� A página JSP exibe o conteúdo
� A página calculadora.jsp (apenas) exibe o resultado
433
calculadora.html
<html>
<head>
<title>Calculadora</title>
</head>
<body>
<form action="/ExemplosWeb/Calculadora"method="post">
<input type="text" name="op1" maxlength="10" size="10">
<select name="operacao">
<option>+</option>
<option>-</option>
<option>x</option>
<option>/</option>
</select>
<input type="text" name="op2" maxlength="10" size="10">
<input type="submit" value=" = ">
</form>
</body>
</html>
434
Calculadora.java
package servlet;
import …
public class Calculadora extends HttpServlet
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
String op = request.getParameter("operacao");
double op1 = Double.parseDouble(request.getParameter("op1"));
double op2 = Double.parseDouble(request.getParameter("op2"));
double resultado;
if (op.equals("+")) resultado = op1 + op2;
else if (op.equals("-")) resultado = op1 - op2;
else if (op.equals("x")) resultado = op1 * op2;
else resultado = op1 / op2;
request.setAttribute("op1", new Double(op1));
request.setAttribute("op2", new Double(op2));
request.setAttribute("operacao", op);
request.setAttribute("resultado", new Double(resultado));
request.getRequestDispatcher("/servlet/calculadora.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
doGet(request, response);
}
}
435
calculadora.jsp
<html>
<head>
<title>
Resultado da operação de <%=request.getAttribute("operacao")%>
</title>
</head>
<body>
<%=request.getAttribute("op1") %>
<%=request.getAttribute("operacao") %>
<%=request.getAttribute("op2") %>
=
<%=request.getAttribute("resultado") %>
</body>
</html>
436
Calculadora V2.0
� O mesmo exemplo, agora escrito para JSP 2.0
� Utiliza javabean (veja na próxima aula)
� Servlet com Apache Tomcat 7.0
� Anotações
� Não tem arquivo web.xml
� Servlet v3.0
437
calculadora2.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Calculadora versão JSP 2.0</title>
</head>
<body>
<form action="/ExemplosWeb/Calculadora2" method="post">
<input type="text" name="op1" maxlength="10" size="10">
<select name="operacao">
<option>+</option>
<option>-</option>
<option>x</option>
<option>/</option>
</select>
<input type="text" name="op2" maxlength="10" size="10">
<input type="submit" value=" = ">
</form>
</body>
</html>
Criando o servlet
438
Calculadora2.java
...
@WebServlet("/Calculadora2")
public class Calculadora2 extends HttpServlet
{
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) thro...
{
String op = request.getParameter("operacao");
double op1 = Double.parseDouble(request.getParameter("op1"));
double op2 = Double.parseDouble(request.getParameter("op2"));
double resultado;
if (op.equals("+")) resultado = op1 + op2;
else if (op.equals("-")) resultado = op1 - op2;
else if (op.equals("x")) resultado = op1 * op2;
else resultado = op1 / op2;
CalculadoraBean bean = new CalculadoraBean();
bean.setOp1(op1);
bean.setOp2(op2);
bean.setOperacao(op);
bean.setResultado(resultado);
request.setAttribute("bean", bean);
request.getRequestDispatcher("/calculadora2.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) thro...
{
doGet(request, response);
}
}
Calculadora2.java
@WebServlet(
asyncSupported = true,
description = "Descrição: implementa uma calculadora",
displayName = "nome", 
initParams = {
@WebInitParam(name = "Parametro1", value = "Valor 1", 
description = "Valor do parâmetro 1"),
@WebInitParam(name = "Parametro2", value = "Valor 2", 
description = "Valor do parâmetro 2") },
largeIcon = "/imagens/iconeGrande.gif", 
loadOnStartup = 1,
name = "Nome do servlet", 
smallIcon = "/imagens/iconePequeno.gif",
urlPatterns = {
"/Calculadora", 
"/outraURL" },
value = "/OServlet"
)
441
CalculadoraBean.java
package servlet;
public class CalculadoraBean
{
private double op1, op2;
private String operacao;
private double resultado;
public double getOp1() { return op1; }
public void setOp1(double op1) { this.op1 = op1; }
public double getOp2() { return op2; }
public void setOp2(double op2) { this.op2 = op2; }
public String getOperacao() { return operacao; }
public void setOperacao(String operacao) { this.operacao = operacao; }
public double getResultado() { return resultado; }
public void setResultado(double resultado) {this.resultado=resultado;}
}
442
calculadora2.jsp
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Resultado da operação de ${bean.operacao }</title>
</head>
<body>
${bean.op1 } ${bean.operacao } ${bean.op2 } = ${bean.resultado }
<p><a href='servlet/calculadora2.html'>Volta</a></p>
</body>
</html>
No arquivo Calculadora2.java:
request.setAttribute("bean", calculadora);
Perguntas?
443
444
Exercícios
445
Calculadora
1. Faça uma página que envie, através de um 
formulário, dois números. A aplicação 
deverá informar a sua soma. Utilize um 
servlet para somar.
2. Faça uma página que envie, através de um 
formulário, dois números e o tipo de 
operação (soma, subtração, multiplicação ou 
divisão). A aplicação deverá informar o 
resultado da operação (se possível). Utilize 
um servlet para realizar a operação.
446
Formulário
� Altere o exercício sobre temperatura para que 
o usuário possa informar a temperatura 
inicial, final e o incremento.
� O exercício deverá apresentar uma página
com uma tabela de conversão entre graus
Celsius e Fahrenheit
447
Saudação
� Faça um formulário que pergunte o nome de uma 
pessoa. O formulário deverá gerar uma página com 
uma saudação do tipo: bom dia, boa tarde ou boa 
noite.
Nome: Ana
index.html
Boa noite, Ana
sauda.jsp
Servlet
448
Parte 8
� JavaBeans
449
MVC
Apresentação
(visual)
Implementação
(controle)
HTML e tags 
JSP tipo HTML
JavaBeans
450
JavaBeans
� São componentes de software projetados para 
serem unidades reutilizáveis. 
� Uma vez criados podem ser reusados sem 
modificação de código.
� É um modelo de componente independente de 
plataforma, portável e escrito em Java.
� Modelo de Componente: é um conjunto de classes e 
interfaces na forma de pacotes Java que devem ser 
usados em uma forma particular e devem 
encapsular um conjunto de funcionalidades.
451
Regras para escrever um JavaBeans
� O processo é descobrir quais as 
funcionalidades do Bean e disponibilizá-la 
para o usuário. 
452
Regras para escrever um JavaBeans
� Um bean usa a idéia de encapsulamento. 
� Suas variáveis devem ser acessadas somente 
através de métodos. 
� As variáveis de um bean são suas propriedades.
� O construtor de um bean deve ser sem 
parâmetros (vazio).
� Pode ser definido explicitamente ou pela 
ausência de um construtor
453
Regras para escrever um JavaBeans
� O nome dos métodos que darão acesso as 
propriedades do bean são divididos em duas 
categorias: 
� Métodos de leitura: permitem ao usuário do 
componente ler o conteúdo da propriedade.
� Métodos de escrita: permitem ao usuário do 
componente modificar o conteúdo da 
propriedade. 
454
Regras para escrever um JavaBeans
� Métodos de Leitura
� Permitem ao usuário do componente ler o conteúdo da 
propriedade.
� public TipoDaPropriedade getNomeDaPropriedade()
� Para as variáveis booleanas vale o mesmo conceito, 
contudo, ao invés doget usa-se a palavra is.
� public boolean isFree()
� Se algum método de leitura não for definido para a 
variável, não será permitido o seu acesso através do 
método get.
� Obs.: o importante é o nome do método e não o nome 
da variável da instância
� Obs2.: getNome() � nome, getURL() � URL
455
Regras para escrever um JavaBeans
� Métodos de escrita
� Permitem ao usuário do componente modificar o 
conteúdo da propriedade. 
� Se algum método de escrita não for definido 
para a variável, não será permitida a sua 
modificação através do método set.
� public void setNomeDaPropriedade()
� Obs.: o importante é o nome do método e não o 
nome da variável da instância
� Obs2.: setNome() � nome, setURL() � URL
456
Regras para escrever um JavaBeans
� O bean deve implementar a interface 
Serializable. 
� A implementação dessa interface fornece ao 
bean a propriedade de persistência. 
� Persistência é permitir que o usuário faça uso do 
componente em um determinado momento e 
possa salvar o seu estado para o uso posterior 
partindo do mesmo ponto. 
� A tecnologia que possibilita essa propriedade é a 
Serialização de Objetos, que permite salvarmos o 
objeto em um fluxo para posterior recuperação.
457
Como as ferramentas lêem um Bean?
� Como as ferramentas são capazes de descobrir a 
funcionalidade de um bean já que ele não é uma 
classe conhecida, ou seja, pode ser qualquer 
componente? 
� Introspecção: é usada uma API disponível no Ambiente 
Runtime da plataforma Java, a Java Reflection API. 
� Usando a funcionalidade desta API a ferramenta procura 
métodos públicos do bean e faz a ligação dos métodos 
com as propriedades. 
� Os métodos são disponibilizados para uso. 
� A introspecção é realizada pela classe 
java.beans.Reflection, que usa a Reflection API para 
descobrir as informações sobre o bean por casamento 
padrão.
458
Componentes JavaBeans em páginas JSP
� O modelo de componente da tecnologia JSP é 
baseado na arquitetura de componentes 
JavaBeans.
459
Por que usar um componente JavaBeans?
� Uma página JSP pode criar qualquer tipo de objeto de 
linguagem de programação Java dentro de uma declaração 
ou scriptlet.
� Exemplo - cria um carrinho de comprar da livraria e o 
armazena como um atributo de sessão. 
Carrinho carrinho = (Carrinho) session.getAttribute("carrinho");
if (carrinho == NULL)
{
carrinho = new Carrinho();
session.setAttribute("carrinho", carrinho);
}
� Se o objeto carrinho de compras estiver de acordo com as 
convenções dos JavaBeans, as páginas JSP podem usar 
elementos JSP para criar e acessar o objeto.
460
Criando e usando um componente JavaBeans
� Antes de acessar um Bean dentro de uma página 
JSP é necessário identificar o bean e obter uma 
referência dele. 
� A tag <jsp:useBean> associa uma instância de um 
objeto Java definido dentro de um determinado 
escopo a um identificador que será válido por todo o 
escopo em questão. 
� Sintaxe:
<jsp:useBean id="nomeDaInstancia" 
scope="page|request|session|application" 
class="package.Class" />
� O atributo id recebe um nome que deve ser único em 
toda a unidade de tradução e identifica um elemento 
específico que aparece na página e no container. 
� O atributo scope indica o escopo de disponibilidade de 
utilização deste bean.
461
Criando e usando um componente JavaBeans
� Exemplo:
<jsp:useBean id="carrinho" 
class="carrinho.Carrinho" scope="session" />
� Outro exemplo:
<jsp:useBean id="livro" class="livraria.Item" 
scope="page" />
� É equivalente a:
<% livraria.Item livro = new livraria.Item(); 
%>
� (somente será criada uma nova instância do objeto 
se não houver um outro com o mesmo nome e 
escopo já definido)
462
Criando e usando um componente JavaBeans
� O atributo type pode ser utilizado para 
instanciar um objeto de um tipo diferente da 
classe do bean
� Exemplo:
<jsp:useBean id="thread1" 
class="MinhaClasse" type="Runnable" />
� É equivalente a:
<% Runnable thread1 = new 
MinhaClasse(); %>
463
Criando e usando um componente JavaBeans
� Os escopos definem o ciclo de vida de um objeto, eles
podem ser definidos como:
� page: Objetos definidos com o escopo page são vistos apenas pela 
página onde ele foi criado. As referências para objetos no contexto 
page são armazenados no objeto pageContext. 
� request: Objetos definidos no escopo request são vistos nas 
páginas usadas para responder a requisição do usuário. Se uma 
página é redirecionada para outra os objetos de escopo request são 
preservados uma vez que fazem parte da mesma requisição. As 
referências a objetos do contexto request são armazenados no 
objeto implícito request. 
� session: Objetos definidos no escopo sessão são acessíveis por 
páginas que fazem parte da mesma sessão. As referências as esses 
objetos são armazenadas no objeto session. 
� application: Objetos definidos no escopo application são acessíveis 
por toda aplicação JSP em questão e são armazenadas no objeto 
implícito application. 
464
Configurando propriedades do componente JavaBeans
� <jsp:getProperty> 
� Recupera os valores da propriedade especificada 
em property do JavaBeans indicado pelo atributo 
nome. 
� É necessário criar e localizar o bean com 
<jsp:useBean> antes de usar <jsp:getProperty> 
� Sintaxe
<jsp:getProperty name="nome do objeto bean" 
property="nome da propriedade" />
� A tag <jsp:getProperty> não é container.
� Exemplo
<jsp:getProperty name="carrinho" 
property="valorTotal"/>
<%= carrinho.getValorTotal() %>
465
Configurando propriedades do componente JavaBeans
� <jsp:setProperty> 
� Define os valores das propriedades dentro de um bean. 
� É necessário declarar o bean com <jsp:useBean> antes 
de ajustar uma propriedade. 
� Sintaxe:
� <jsp:setProperty name="nome da instância do 
bean" property="nome da propriedade" 
param="nome do parâmetro" />
� <jsp:setProperty name="nome da instância do 
bean" property="nome da propriedade" 
value="valor" />
� O atributo name define qual é o bean que estamos definindo. 
� Esse nome foi definido no atributo id da ação jsp:useBean.
� A tag <jsp:setProperty> NÃO é container.
466
Configurando propriedades do componente JavaBeans
� Exemplo:
� <jsp:setProperty name="produto" property="nome" 
value="livro" />
� <% produto.setNome("livro"); %>
� Outro exemplo:
� <jsp:setProperty name="produto" property="nome" 
value='<%=request.getParameter("nome")%>' />
� <jsp:setProperty name="produto" property="nome" 
param="nome" />
� <%produto.setNome(request.getParameter("nome"));%>
� Mais outro exemplo:
� <jsp:setProperty name="produto" property="*" />
467
Parâmetros de formulário
� Através da cláusula param, dados do 
formulário são enviados diretamente ao bean
� Se o campo do formulário não for preenchido, 
nenhuma ação será realizada (não será 
passado null para o bean)
� O nome do campo do formulário deverá ser 
exatamente igual ao nome da propriedade do 
bean, incluindo maiúsculas e minúsculas
468
Configurando propriedades do componente JavaBeans
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE>Alo mundo (versão Bean)</TITLE>
</HEAD>
<BODY>
<jsp:useBean id="alo" class="aloMundo.AloMundo"/>
<jsp:setProperty name="alo" property="nome" 
param="nome"/>
Alo <jsp:getProperty name="alo" property="nome"/>!!
</BODY>
</HTML>
469
Configurando propriedades do componente JavaBeans
package aloMundo;
public class AloMundo implements java.io.Serializable
{
private String nome;
public AloMundo()
{
this.nome = "mundo";
}
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
}
470
Execução condicional� Um javabeans pode ser instanciado 
utilizando-se a seguinte sintaxe:
<jsp:useBean id="oBean" class="pacote.Classe" scope="page" >
Comandos JSP, Javabean, HTML, etc.
</jsp:useBean>
� Os comandos somente serão executados se o 
bean for instanciado
471
Parâmetros de formulário
� Se necessário, a informação poderá ser 
convertida
Tipo da 
propriedade 
Conversão efetuada 
boolean Boolean.valueOf(paramString).booleanValue() 
Boolean Boolean.valueOf(paramString) 
byte Byte.valueOf(paramString).byteValue() 
Byte Byte.valueOf(paramString) 
char Character.valueOf(paramString).charValue() 
Character Character.valueOf(paramString) 
double Double.valueOf(paramString).doubleValue() 
Double Double.valueOf(paramString) 
int Integer.valueOf(paramString).intValue() 
Integer Integer.valueOf(paramString) 
float Float.valueOf(paramString).floatValue() 
Float Float.valueOf(paramString) 
long Long.valueOf(paramString).longValue() 
Long Long.valueOf(paramString) 
 
472
Resumo de propriedades
Nomes dos métodos Nome da 
propriedade
Exemplo de uso JSP
setPrimeiroNome()
getPrimeiroNome()
primeiroNome <jsp:setProperty name="pessoa" property="primeiroNome"/>
<jsp:getProperty name="pessoa" property="primeiroNome"/>
${pessoa.primeiroNome}
setExecutivo()
isExecutivo()
excutivo <jsp:setProperty name="pessoa" property="executivo"/>
<jsp:getProperty name="pessoa" property="executivo"/>
${pessoa.executivo}
setExecutivo()
getExecutivo()
executivo <jsp:setProperty name="pessoa" property="executivo"/>
<jsp:getProperty name="pessoa" property="executivo"/>
${pessoa.executivo}
setCEP()
getCEP()
CEP <jsp:setProperty name="pessoa" property="CEP"/>
<jsp:getProperty name="pessoa" property="CEP"/>
${pessoa.CEP}
473
Criando e usando um componente JavaBeans
package javaBeans;
public class Atributo
{
private int valor;
public int getValor() { return valor; }
public void setValor(int valor) { this.valor = valor; }
}
474
<%@ page language="java" %>
<html>
<jsp:useBean id="objetoPage" class="javaBeans.Atributo" scope="page" />
<jsp:setProperty name="objetoPage" property="valor" value="8752"/>
<jsp:useBean id="objetoRequest" class="javaBeans.Atributo" 
scope="request" />
<jsp:setProperty name="objetoRequest" property="valor" value="8752"/>
<jsp:useBean id="objetoSession" class="javaBeans.Atributo" 
scope="session" />
<jsp:setProperty name="objetoSession" property="valor" value="8752"/>
<jsp:useBean id="objetoApplication" class="javaBeans.Atributo" 
scope="application" />
<jsp:setProperty name="objetoApplication" property="valor" 
value="8752"/>
<jsp:forward page="Escopo2.jsp" />
</html>
Criando e usando um componente JavaBeans
475
Criando e usando um componente JavaBeans
…
<body>
<h1>Escopo (2)</h1>
<h2>page</h2>
<jsp:useBean id="objetoPage" class="javaBeans.Atributo" scope="page" >
Criando o objeto da página<br>
</jsp:useBean>
O valor do objeto da página é:
<jsp:getProperty name="objetoPage" property="valor" />
(${objetoPage.valor })
<h2>request</h2>
<jsp:useBean id="objetoRequest" class="javaBeans.Atributo"
scope="request" >
Criando o objeto de request<br>
</jsp:useBean>
O valor do objeto de request é:
<jsp:getProperty name="objetoRequest" property="valor" />
(${objetoRequest.valor })
Continua ����
476
Criando e usando um componente JavaBeans
���� Continuação
<h2>session</h2>
<jsp:useBean id="objetoSession" class="javaBeans.Atributo" scope="session" >
Criando o obejto de sessão<br>
</jsp:useBean>
O valor do objeto de sessão é:
<jsp:getProperty name="objetoSession" property="valor" />
(${objetoSession.valor })
<h2>application</h2>
(melhor abrir um outro browser para poder ver)<br>
<jsp:useBean id="objetoApplication" class="javaBeans.Atributo"
scope="application" >
Criando um objeto de aplicação<br>
</jsp:useBean>
O valor do objeto é:
<jsp:getProperty name="objetoApplication" property="valor" />
(${objetoApplication.valor })
<p><a href=Escopo2.jsp>Outra página na mesma sessão</a>
</body>
</html>
Funcionamento
477
page page page page
request
session
application
session
Outro
navegador
478
Controle de lógica com JavaBeans
� <jsp:forward> 
� Transfere o objeto request para outro arquivo. 
� Pode ser um arquivo HTML, outro arquivo JSP ou um 
servlet, desde que faça parte da mesma aplicação.
� Sintaxe:
<jsp:forward page="URL | <%=expressão%>" />
<jsp:forward page="URL | <%=expressão%>" >
<jsp:param name="nome do parâmetro" value="valor 
do parâmetro" | <%=expressão%>
</jsp:forward>
� Exemplo:
<jsp:forward page="fechamento/EfetuarCompra.jsp" >
<jsp:param name="usuario" value="Bianca" />
<jsp:param name="pais" value="BR" />
</jsp:forward>
479
Inclusão de páginas
� <jsp:include> 
� Permite incluir um arquivo estático ou dinâmico 
numa página JSP. 
� Se um arquivo é estático, seu conteúdo é 
incluído quando a página é compilada num 
servlet. 
� Se for dinâmico, funciona como uma requisição 
para o arquivo e manda o resultado de volta 
para a página.
480
Inclusão de páginas
� <jsp:include> 
� Sintaxe:
<jsp:include page="{URLrelativa | <%= expressão %>}" 
flush="true" />
<jsp:include page="{URLrelativa | <%= expressão %>}" 
flush="true" >
<jsp:param name="nomeDoParametro" 
value="{valor | <%= expressão %>}" />
</jsp:include> 
� Exemplo:
<jsp:include page="fechamento/EfetuarCompra.jsp" >
<jsp:param name="usuario" value="Bianca" />
<jsp:param name="pais" value="BR" />
</jsp:include>
481
<jsp:include> x <%@ include %>
� <jsp:include>
� Realiza a inclusão 
durante a execução da 
página
� É possível passar 
parâmetros
� <%@ include%>
� Realiza a inclusão 
durante a translação da 
página
� Não é possível passar 
parâmetros
482
Atenção
� As tags Javabeans são case-sensitive
� Podemos usar plics ' no lugar de aspas ", mas 
somente uma opção ou a outra
� Tags que não são do tipo container devem 
terminar com />
483
Persistência e Javabeans
� As propriedades de um javabeam podem ser 
salvas para uso posterior
� Precisa implementar java.io.Serializable
484
Persistência e Javabeans
�Arquivo firstPage.jsp
<%@ page language="java" %>
<jsp:useBean id="theBean" 
class="javaBeans.persistencia.SerializableBean" scope="page" />
<html>
<head>
<title>Serialized bean, Page One</title>
</head>
<body>
<br><%= theBean.getIntegerProperty() %>
<%
theBean.setIntegerProperty(8+theBean.getIntegerProperty()); %>
<br><%= theBean.getIntegerProperty() %>
<% theBean.save(theBean, "theBeanFile.ser"); %>
<br><a href="secondPage.jsp">click here</a>
</body>
</html>
485
Persistência e Javabeans
� Arquivo secondPage.jsp
<%@ page language="java" %>
<jsp:useBean id="saver" class="javaBeans.persistencia.SerializableBean" 
scope="session"/>
<html>
<head>
<title>Serialized bean, Page Two</title>
</head>
<body>
<% javaBeans.persistencia.SerializableBean anotherBean = 
(javaBeans.persistencia.SerializableBean)saver.retrieve("theBeanFile.ser"); %>
<%= anotherBean.getIntegerProperty() %>
<br><% anotherBean.setIntegerProperty(8+anotherBean.getIntegerProperty()); %>
<%= anotherBean.getIntegerProperty() %>
</body>
</html>
486
Persistência e Javabeans
� Arquivo SerializableBean.java
package javaBeans.persistencia;
import java.io.*;
public class SerializableBean implements Serializable
{
private int integerProperty=8;
public int getIntegerProperty() 
{
return integerProperty;
}
public void setIntegerProperty(int newInteger) 
{
integerProperty= newInteger;
}
Continua ����
487
Persistência e Javabeans
� Arquivo SerializableBean.java (continuação)
public boolean save(Object object, String file_name){
boolean status = true;
try
{
FileOutputStream fos;
ObjectOutputStream oos;
fos = new FileOutputStream(file_name);
oos = new ObjectOutputStream(fos);
oos.writeObject(object);
oos.close();
}
catch (Exception e) 
{
status = false;
System.out.println("Error with saving: " + e.toString());
}
return status;
}
Continua ����
488
Persistência e Javabeans
� Arquivo SerializableBean.java (continuação)
public Object retrieve(String file_name) 
{
Object object = new Object();
try
{
FileInputStream fis;
ObjectInputStream ois;
fis = new FileInputStream(file_name);
ois = new ObjectInputStream(fis);
object = ois.readObject();
ois.close();
}
catch (Exception e) 
{
System.out.println("Error with retrieval: " + e.toString());
}
return object;
}
}
490
Parte 8,5
� Expressões EL
(Expression Language)
491
Mais um pouco de MVC
1. Definir um bean para representar os dados resultantes
� POJO com métodos de acesso e construtor sem parâmetros
2. Usar um servlet para manipular o pedido (request)
� O servlet obtem os parâmetros do pedido, verifica dos dados, 
chama a lógica do negócio, etc.
3. Obter uma instância do bean
� O servlet invoca a lógica de negócio ou código de acesso a dados 
para obter o resultado
4. Armazenar os beans em um contexto de request, session 
ou servlet
� O servlet chama o método setAttribute no objeto request, session 
ou de contexto de servlet para armazernar referências aos beans 
representando os resultados do pedido
5. Dá um forward do request para uma página JSP
� O servlet determina qual página JSP é apropriada para a situação e 
transfere o controle para ela através do RequestDispatcher
6. Extrair os dados dos beans
� A página JSP acessa o bean através de <jsp:useBean> (ou ${})
494
Exemplo:
� No bean
public String getNome() { ... }
� No servlet
Cliente umCliente = ClienteUtil.achaCliente(...);
request.setAttribute("cliente", umCliente);
(use o RequestDispatcher.forward para transferir para a página JSP)
� Na página JSP
<h1>O nome do cliente é ${cliente.nome}<h1>
� Em resumo:
� <jsp:useBean id="algumaCoisa" 
class="algumPacote.algumaClasse" scope="request, session ou 
application"/>
<jsp:getProperty name="algumaCoisa" 
property="algumaPropriedade"/>
� É equivalente a:
� ${algumaCoisa.algumaPropriedade}
495
Uso de Expression Language (EL)
� Arquivos:
� acesso.html
� ServletAcesso.java
� Empresa.java
� Presidente.java
� Acesso.jsp
496
acesso.html
...
<h1>Acesso a objetos</h1>
<form action="/ExemplosWeb/ServletAcesso" method="get">
<table>
<tr>
<td align="right">Variável inteira:</td>
<td>8752<input type="hidden" name="variavel" value="8752"></td>
</tr>
<tr>
<td align="right">Objeto string:</td>
<td>"Uma string"<input type="hidden" name="string" value="Uma string"></td>
</tr>
<tr>
<td align="right">Nome da Empresa:</td>
<td>
AT&amp;T
<input type="hidden" name="empresa" value="Alexandre Trambiques e Trapaças">
</td>
</tr>
<tr>
<td align="right">Dono da Empresa</td>
<td>Eu<input type="hidden" name="dono" value="Alexandre"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="Envia"></td>
</tr>
</table>
</form>
...
ServletAcesso.java
package el;
…
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{
HttpSession session = request.getSession();
ServletContext application = getServletContext();
Empresa empresa = new Empresa();
empresa.setNome((String)request.getParameter("empresa"));
empresa.getPessoa().setNome((String)request.getParameter("dono"));
// cria atributos de request, sessão e contexto de servlet com número recebido 
por POST
request.setAttribute("variavelRequest", 
Integer.parseInt(request.getParameter("variavel")));
session.setAttribute("variavelSession", 
Integer.parseInt(request.getParameter("variavel")));
application.setAttribute("variavelApplication", 
Integer.parseInt(request.getParameter("variavel")));
// cria atributos de request, sessão e contexto de servlet com string recebida 
por POST
request.setAttribute("stringRequest", request.getParameter("string"));
session.setAttribute("stringSession", request.getParameter("string"));
application.setAttribute("stringApplication", request.getParameter("string"));
// cria atributos de request, sessão e contexto de servlet com objeto
request.setAttribute("empresaRequest", empresa);
session.setAttribute("empresaSession", empresa);
application.setAttribute("empresaApplication", empresa);
RequestDispatcher dispatcher = request.getRequestDispatcher("EL/acesso.jsp");
dispatcher.forward(request, response);
}
}
498
Empresa.java & Presidente.java
package el;
public class Empresa
{
private String nome;
private Presidente pessoa;
public Empresa() { pessoa = new Presidente(); }
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public Presidente getPessoa() { return pessoa; }
public void setPessoa(Presidente pessoa) { this.pessoa = pessoa; }
}
package el;
public class Presidente
{
private String nome;
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
}
acesso.jsp -
variáveis nativas
<%@ page … %>
<%
pageContext.setAttribute("variavelPageContext", 8752);
pageContext.setAttribute("stringPageContext", "Uma string");
...
%>
...
<body>
<h1>Resultados vindos do servlet</h1>
<table>
<tr>
<td align="right">Variável de pageContext</td>
<td>${variavelPageContext } (<%=pageContext.getAttribute("variavelPageContext") 
%>)</td>
</tr>
<tr>
<td align="right">Variável de request</td>
<td>${variavelRequest } (<%=request.getAttribute("variavelRequest") %>)</td>
</tr>
<tr>
<td align="right">Variável de sessão</td>
<td>${variavelSession } (<%=session.getAttribute("variavelSession") %>)</td>
</tr>
<tr>
<td align="right">Variável de contexto de servlet</td>
<td>${variavelApplication }</td>
</tr>
...
</table>
</body>
</html>
acesso.jsp –
objetos em
 geral
<%@ page … %>
<%
pageContext.setAttribute("variavelPageContext", 8752);
pageContext.setAttribute("stringPageContext", "Uma string");
...
%>
<html>
<head>
<title>Resultado</title>
</head>
<body>
<h1>Resultados vindos do servlet</h1>
<table>
...
<tr><td colspan='2' bgcolor="black"></td></tr>
<tr>
<td align="right">String de pageContext</td><td>${stringPageContext }</td>
</tr>
<tr>
<td align="right">String de request</td><td>${stringRequest }</td>
</tr>
<tr>
<td align="right">String de sessão</td><td>${stringSession }</td>
</tr>
<tr>
<td align="right">String de contexto de servlet</td><td>${stringApplication 
}</td>
</tr>
<tr><td colspan='2' bgcolor="black"></td></tr>
…
</table>
</body>
</html>
acesso.jsp –
beans em
 geral
<%@ page ... %>
<%
...
Empresa empresa = new Empresa();
empresa.setNome("Alexandre Trambiques & Trapaças");
empresa.getPessoa().setNome("Alexandre");
pageContext.setAttribute("empresaPageContext", empresa);
pageContext.setAttribute("donoEmpresaPageContext", empresa);
%>
<html>
<head>
<title>Resultado</title>
</head>
<body>
<h1>Resultados vindos do servlet</h1>
<table>
...
<tr><td colspan='2' bgcolor="black"></td></tr>
<tr><td align="right">Empresa no pageContext</td>
<td>${empresaPageContext.nome }</td></tr>
<tr><td align="right">Empresa no request</td>
<td>${empresaRequest.nome }</td></tr>
<tr><td align="right">Empresa na sessão</td>
<td>${empresaSession.nome }</td></tr>
<tr><td align="right">Empresa no servletContext</td>
<td>${empresaApplication.nome }</td></tr>
<tr><td colspan='2' bgcolor="black"></td></tr>
...
</table>
</body>
</html>
acesso.jsp –
objeto com
o propriedadede um
 bean
<%@ page ... %>
<%
...
Empresa empresa = new Empresa();
empresa.setNome("Alexandre Trambiques & Trapaças");
empresa.getPessoa().setNome("Alexandre");
pageContext.setAttribute("empresaPageContext", empresa);
pageContext.setAttribute("donoEmpresaPageContext", empresa);
%>
<html>
<head>
<title>Resultado</title>
</head>
<body>
<h1>Resultados vindos do servlet</h1>
<table>
...
<tr><td colspan='2' bgcolor="black"></td></tr>
<tr>
<td align="right">Nome do dono da empresa no 
pageContext</td><td>${empresaPageContext.pessoa.nome }</td>
</tr>
<tr>
<td align="right">Nome do dono da empresa no request</td><td>${empresaRequest.pessoa.nome 
}</td>
</tr>
<tr>
<td align="right">Nome do dono da empresa na sessão</td><td>${empresaSession.pessoa.nome 
}</td>
</tr>
<tr>
<td align="right">Nome do dono da empresa no contexto de 
servlet</td><td>${empresaApplication.pessoa.nome }</td>
</tr>
<tr><td colspan='2' bgcolor="black"></td></tr>
</table>
</body>
</html>
503
Conflito de nomes em diferentes escopos
� Caso haja objetos com o mesmo nome em escopos 
diferentes, a ordem de preferência será:
� PageContext
� Request
� Session
� Application
� Para especificar o escopo desejado, utilize:
� ${pageScope.atributo}
� ${requestScope.atributo}
� ${sessionScope.atributo}
� ${applicationScope.atributo}
� Ver exemplo a seguir...
� Conflito.java
� conflito.jsp
504
Conflito.java
package el;
import …
public class Conflito extends HttpServlet 
{
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException 
{
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException 
{
HttpSession session = request.getSession();
ServletContext application = getServletContext();
/* tem o pageContext na página JSP também */
application.setAttribute("atrib1", "aplicacao1");
session.setAttribute("atrib1", "sessao1");
request.setAttribute("atrib1", "request1");
application.setAttribute("atrib2", "aplicacao2");
session.setAttribute("atrib2", "sessao2");
request.setAttribute("atrib2", "request2");
application.setAttribute("atrib3", "aplicacao3");
session.setAttribute("atrib3", "sessao3");
RequestDispatcher dispatcher = request.getRequestDispatcher("EL/conflito.jsp");
dispatcher.forward(request, response);
}
}
Objeto com o mesmo nome em 
application, session e request 
(e page – no próximo arquivo)
Objeto com o mesmo nome em 
application, session e request
Objeto com o mesmo nome em 
Application e session
505
conflito.jsp
<%@ page language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<%
pageContext.setAttribute("atrib1", "pageContext1");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Resultado do Conflito</title>
</head>
<body>
<h1>Resultado do Conflito</h1>
<table border='1'>
<tr><th>Tipo de conflito</th><th>Resultado</th></tr>
<tr><td align="right">pageContext, request, session e application</td>
<td>${atrib1 }</td></tr>
<tr><td align="right">request, session e aplicaction</td>
<td>${atrib2 }</td></tr>
<tr><td align="right">session e aplicaction</td>
<td>${atrib3 }</td></tr>
</table>
</body>
</html>
507
Acesso a coleções
� ${colecao[entrada]}
� Funciona com:
� Array
� ${oArray[indice]}
� <%= oArray[indice] %>
� List
� ${aList[indice]}
� <%= aList.get(indice) %>
� Map
� ${oMap[chave]}
� <%= oMap.get(chave) %>
508
Referenciando objetos implícitos
Contexto Exemplo
pageContext ${pageContext.session.id}
param ${param.operacao}
header ${header.Accept} ou ${header["Accept"]
cookie ${cookie.contador.value} ou ${cookie["contador"].value}
initParam ${initParam.email}
pageScope ${pageScope.atributo}
requestScope ${requestScope.atributo}
sessionScope ${sessionScope.atributo}
applicationScope ${applicationScope.atributo}
509
Operadores em EL
� Aritméticas
� + - * div % mod
� Relacionais
� == eq != ne < lt > gt <= le >= ge
� Lógicas
� && and || or ! Not
� empty
� Verdadeiro para null, string, vetor, lista, mapa vazios. 
Falso caso contrário
510
Operadores
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Operadores</title>
</head>
<body>
<table>
<tr><th>Operadores Aritméticos</th></tr>
<tr>
<td valign="top">
<table border='1' width="100%">
<tr><th>Expressão</th><th>Resultado</th></tr>
<tr><td>\${3+2-1 }</td><td>${3+2-1 }</td></tr>
<tr><td>\${"1"+2 }</td><td>${"1"+2 }</td></tr>
<tr><td>\${3/4 }</td><td>${3/4 }</td></tr>
<tr><td>\${3 div 4 }</td><td>${3 div 4 }</td></tr>
<tr><td>\${3 % 4 }</td><td>${3 % 4 }</td></tr>
<tr><td>\${3 mod 4 }</td><td>${3 mod 4 }</td></tr>
</table>
</td>
</tr>
<tr><th>Operadores Relacionais</th></tr>
<tr>
<td valign="top">
<table border='1' width="100%">
<tr><th>Expressão</th><th>Resultado</th></tr>
<tr><td>\${1&lt;2 }</td><td>${1<2 }</td></tr>
<tr><td>\${1 lt 2 }</td><td>${1 lt 2 }</td></tr>
<tr><td>\${"B"&gt;"D" }</td><td>${"B">"D" }</td></tr>
<tr><td>\${null == "teste" }</td><td>${null == "teste" }</td></tr>
</table>
</td>
</tr>
<tr><th>Operadores Lógicos</th></tr>
<tr>
<td valign="top">
<table border='1' width="100%">
<tr><th>Expressão</th><th>Resultado</th></tr>
<tr><td>\${1&lt;2&amp;&amp;4&lt;3 }</td><td>${1<2&&4<3 }</td></tr>
<tr><td>\${1&lt;2||4&lt;3 }</td><td>${1<2||4<3 }</td></tr>
<tr><td>\${!(1&lt;2) }</td><td>${!(1<2) }</td></tr>
<tr><td>\${not (1&lt;2) }</td><td>${not (1<2) }</td></tr>
</table>
</td>
</tr>
<tr><th>Operador empty</th></tr>
<tr>
<td valign="top">
<table border='1' width="100%">
<tr><th>Expressão</th><th>Resultado</th></tr>
<tr><td>\${empty "" }</td><td>${empty "" }</td></tr>
<tr><td>\${empty null }</td><td>${empty null }</td></tr>
<tr><td>\${empty param.nada }</td><td>${empty param.nada
}</td></tr>
</table>
</td>
</tr>
</table>
</body>
</html>
Perguntas?
511
512
Exercícios
513
Javabeans
� Faça uma página que mostre o dia e a hora 
do servidor no formato: dd/mm/aaaa –
hh:mm.
� Faça uma versão com servlet
� Tente sem javabeans
� Tente com javabeans
� Faça uma versão instanciando um objeto Date 
usando <jsp:useBean>
� Tente com <jsp:getProperty>
� Tente com EL (lembre-se que aqui você pode usar 
uma expressão)
514
Javabeans
� Faça um formulário que pergunte o nome de 
uma pessoa. O formulário deverá gerar uma 
página com uma saudação do tipo: bom dia, 
boa tarde ou boa noite.
� Faça uma versão usando <jsp:useBean>
� Faça uma versão usando EL
515
Javabeans
� Faça um sistema que envie através de um 
formulário dois números e o tipo de operação 
(soma, subtração, multiplicação ou divisão). O 
sistema deverá informar o resultado da operação 
(se possível).
� Faça uma versão usando <jsp:useBean>
� Faça uma versão usando EL
� Faça um JavaBean que implemente as operações 
aritméticas básicas. A aplicação deve ser composta 
por um servlet, uma página JSP e um JavaBean. O 
JavaBean deve possuir os métodos tais que, dados 2 
números, forneça a soma, a diferença, o produto e o 
quociente entre eles. 
516
Parte 9
� JDBC
517
JDBC
� JDBC é um conjunto de classes e interfaces escritas 
em Java que tornam possível escrever aplicações 
que acessem bancos de dados.
� Faz parte do pacote java.sql.
� É semelhante a tecnologia ODBC (Open Data Base 
Connectivity), da Microsoft.
� Utilizando um driver JDBC, pode-se conectar a 
aplicação a um ou mais servidores de banco de 
dados, executar consultas SQL e operar como 
resultado, se for o caso.
� JDBC não é um acrônimo!
518
JDBC x ODBC
� ODBC é implementado em C e JDBC em Java, 
mantendo compatibilidade, segurança e 
portabilidade.
� O driver ODBC sempre tem que ser instalado 
e configurado manualmente nos clientes. 
� O código JDBC é 
� Automaticamente instalado e pode ser usado em 
qualquer plataforma.
519
Passos para JDBC
1. Carregar o driver JDBC
2. Definir a URL de conexão
3. Estabelecer a conexão
4. Criar um objeto do tipo statement
5. Executar a query ou o update
6. Processar o resultado
7. Fechar a conexão
520
URL JDBC
� O JDBC usa uma URL (Uniform Resource Locator) para 
identificar a conexão ao banco de dados.
� A URL JDBC permite que o desenvolvedor do driver 
especifique o que deve ser incluído na URL. 
� Cada URL é diferente para cada banco de dados:
jdbc:\<subprotocolo\>:\<subnome>\
� jdbc é o protocolo utilizado e todas as URLs iniciarão com esse 
protocolo. 
� subprotocolo é o nome do driver ou mecanismo de conexão ao banco 
de dados. 
� subnome identifica efetivamente o banco de dados. É passada uma 
String que é de implementação dos desenvolvedores de driver.
� Exemplos:
521
URL JDBC
� Exemplos:
� ODBC (ambiente Windows)
String url = "jdbc:odbc:DSNFuncionarios";
String url = "jdbc:odbc:Driver={Microsoft Access Driver 
(*.mdb)};DBQ=c:/data/banco.MDB";
� MySQL
String url = "jdbc:mysql://servidor/database";
String url = "jdbc:mysql://servidor/database?user=usuário&password=senha";
� SQL Server
String url = 
"jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;user=MyUser
Name;password=*****;"; 
� Oracle
String url = "jdbc:oracle:thin:username/password@//hostname:1521/database";
String url = "jdbc:oracle:oci:username/password@hostname:1521:database";
� Sybase
String url = "jdbc:sybase:Tds:hostname:porta";
� Mais informações em http://www.devx.com/tips/Tip/28818
528
Acessando o banco de dados via Java
� Instanciar um objeto do tipo driver JDBC
public static Class<?> forName(String className) throws ClassNotFoundException
� ODBC
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
� MySQL
Class.forName("com.mysql.jdbc.Driver ");
� SQL Server
Class.forName("connect.microsoft.MicrosoftDriver");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
� Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");
� Sybase
Class.forName("com.sybase.jdbc.SybDriver");
� Mais informações em http://www.devx.com/tips/Tip/28818
Para instalar o driver do MySQL
� Faça download do 
MySQL Connector/J do 
site do MySQL 
(http://www.mysql.com
)
� Maiores detalhes de 
como adicionar o drive 
ao projeto, veja slides 
na aula 0: Instalação de 
uma biblioteca externa
529
530
Para instalar o driver do SQL Server
� Faça download do driver do site da Microsoft 
(http://www.microsoft.com)
� Maiores detalhes de como adicionar o drive 
ao projeto, veja slides na aula 0: Instalação 
de uma biblioteca externa
531
Para instalar o driver do Oracle
� Faça download do drive do site da Oracle 
(http://www.oracle.com)
� Maiores detalhes de como adicionar o drive 
ao projeto, veja slides na aula 0: Instalação 
de uma biblioteca externa
532
Classe DriverManager
� static Connection getConnection(String url) 
throws SQLException
� static Connection getConnection(String url, 
String usuário, String senha) throws 
SQLException
� Tenta estabelecer uma conexão com um 
determinado banco de dados
533
Interface Connection
� PreparedStatement prepareStatement(String sql)
� PreparedStatement prepareStatement(String sql, int autoGenerateKeys)
� Statement createStatement() throws SQLException
� Cria um objeto para enviar comandos SQL para o banco de dados, 
opcionalmente pode permitir recuperar o valor do campo autonumerado
� void close()
� Libera este objeto e os respectivos recursos JDBC imediatamente em vez de 
esperar que eles sejam liberados automaticamente
534
Interface Connection
� void setAutoCommit(boolean autoCommit)
� Configura o modo auto-commit para um determinado estado
� void commit()
� Torna todas as modificações desde o último commit/rollback permanentes e 
libera o lock do banco de dados deste objeto Connection
� void rollback()
� Desfaz todas as modificações realizadas pela transação corrente e libera o 
lock do banco de dados deste objeto Connection
535
Acessando o banco de dados via Java
� Criar conexão com o DSN
� Connection con = 
DriverManager.getConnection ("url", 
"usuário", "senha");
� url deve ser o endereço do banco de dados
� O método levanta a exceção SQLException
� Exemplo de url: "jdbc:odbc:agendaJSP"
536
Acessando o banco de dados via Java
� Para fechar a conexão
� con.close();
537
Interface Statement
� ResultSet executeQuery(String sql)
� Executa o comando SQL que retorna um objeto ResultSet (um 
select, por exemplo)
� int executeUpdate(String sql)
� int executeUpdate(String sql, int autoGeneratedKeys)
� Executa o comando SQL que pode ser um INSERT, UPDATE ou 
DELETE
� ResultSet getGeneratedKeys()
� Recupera a chave gerada automaticamente por este Statement
538
Interface Statement
� void close()
� Libera este objeto e todos os recursos JDBC imediatamente 
associados a este objeto
539
Módulo de acesso à banco de dados
� Exemplo de conexão:
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// abre conexão com o banco de dados
String url = "jdbc:odbc:agendaJSP";
Connection con = DriverManager.getConnection (url, "", "");
}
catch (SQLException sqlex)
{
// erro de conexão
}
540
Acessando o banco de dados via Java
� Executa um comando SQL em um 
banco de dados já conectado 
(representado por con)
String SQL = "select * from Cadastro";
Statement stmt = con.createStatement ();
ResultSet registro = stmt.executeQuery(SQL);
541
Interface ResultSet
� Uma tabela de dados representando um resultado do banco de dados
� void close()
� Libera este objeto e todos os recursos JDBC imediatamente associados a 
este objeto
� boolean next()
� Move o cursor de uma linha a partir da sua posição atual
� Métodos de acesso aos campos do ResultSet (do banco de dados)
� BigDecimal getBigDecimal(String nomeColuna)
� Blob getBlob(String nomeColuna)
� boolean getBoolean(String nomeColuna)
� byte getByte(String nomeColuna)
� Date getDate(String nomeColuna)
� double getDouble(String nomeColuna)
� float getFloat(String nomeColuna)
� int getInt(String nomeColuna)
� long getLong(String nomeColuna)
� short getShort(String nomeColuna)
� String getString(String nomeColuna)
ATENÇÃO: cada 
coluna somente pode 
ser lida uma única
vez
542
Acessando o banco de dados via Java
� Obtém os campos de uma tabela 
extraída do banco (ResultSet)
ResultSet registro = stmt.executeQuery(SQL);
while (registro.next())
{
System.out.println(registro.getString("Nome"));
System.out.println(registro.getString("Endereco"));
System.out.println(registro.getString("Telefone"));
}
543
Módulo de acesso a banco de dados
� Exemplo de conexão (consulta):
� Consulta
package aula9.bancoDeBados;
import java.sql.*;
import java.util.ArrayList;
public class Consulta
{
private Pessoa pessoa;
public Consulta(Pessoa pessoa)
{
this.pessoa = pessoa;
}
public Consulta (String nome)
{
pessoa = new Pessoa(nome);
}
����

public ArrayList<Pessoa> resultado()
{
ArrayList<Pessoa> vPessoa = new ArrayList<Pessoa>();
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver 
(*.mdb)};DBQ=C:/Banco/Agenda.MDB";
Connection con = DriverManager.getConnection (url, "", "");
String SQL = "select * from Cadastrowhere nome like '%" + 
pessoa.getNome() + "%'";
Statement stmt = con.createStatement ();
ResultSet registro = stmt.executeQuery(SQL);
while (registro.next())
{
Pessoa pessoa = new Pessoa(registro.getString("Nome"),
registro.getString("Endereco"),
registro.getString("Telefone"));
vPessoa.add(pessoa);
}
registro.close();
con.close();
}
Tratamento de erro����

catch (ClassNotFoundException e)
{
System.err.println("Classe não encontrada para consulta");
System.exit(-1); // aborta o programa
}
catch (SQLException e)
{
System.err.println("Problemas na conexão");
}
return vPessoa;
}
}
Método main����
package aula9.bancoDeBados;
import java.util.*;
public class ConsultaNome
{
public static void main(String[] args)
{
Scanner entrada = new Scanner(System.in);
System.out.print("Entre com o nome: ");
String nome = entrada.nextLine();
Consulta consulta = new Consulta(nome);
Iterator<Pessoa> it = consulta.resultado().iterator();
while (it.hasNext())
{
System.out.println("----------");
Pessoa pessoa = it.next();
System.out.println("Nome: " + pessoa.getNome());
System.out.println("Endereco: " + pessoa.getEndereco());
System.out.println("Telefone: " + pessoa.getTelefone());
}
}
}
Outra versão ����
package aula9.bancoDeBados;
import java.util.*;
public class ConsultaNome2 // usando enhanced for
{
public static void main(String[] args)
{
Scanner entrada = new Scanner(System.in);
System.out.print("Entre com o nome: ");
String nome = entrada.nextLine();
Consulta consulta = new Consulta(nome);
for (Pessoa pessoa : consulta.resultado())
{
System.out.println("----------");
System.out.println("Nome: " + pessoa.getNome());
System.out.println("Endereco: " + pessoa.getEndereco());
System.out.println("Telefone: " + pessoa.getTelefone());
}
}
}
549
Módulo de acesso a banco de dados
� Exemplo de comando (sem record set)
� Inserção de um registro
550
Módulo de acesso a banco de dados
package aula9.bancoDeBados;
import java.sql.*;
public class Insere
{
private Pessoa pessoa;
public Insere(String nome, String endereco, String 
telefone)
{
pessoa = new Pessoa(nome, endereco, telefone);
}
public Insere(Pessoa pessoa)
{
this.pessoa = pessoa;
}
����

public int insere()
{
int nRegistros = 0;
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access 
Driver (*.mdb)};DBQ=C:/Banco/Agenda.MDB";
Connection con = DriverManager.getConnection (url, 
"", "");
String SQL = "insert into Cadastro (nome, endereco, 
telefone) values (?, ?, ?)";
PreparedStatement comandoSQL = 
con.prepareStatement(SQL);
int pos = 1;
comandoSQL.setString(pos++, pessoa.getNome());
comandoSQL.setString(pos++, pessoa.getEndereco());
comandoSQL.setString(pos++, pessoa.getTelefone());
nRegistros = comandoSQL.executeUpdate();
con.close();
return nRegistros;
}
Método main ����
catch (ClassNotFoundException e)
{
System.err.println("Classe não 
encontrada para consulta");
System.exit(-1); // aborta o programa
}
catch (SQLException e)
{
System.err.println("Problemas na 
conexão");
}
finally
{
return nRegistros;
}
}
}
Método main ����
package aula9.bancoDeBados;
import java.util.Scanner;
public class InserePessoa
{
public static void main(String[] args)
{
Scanner entrada = new Scanner(System.in);
System.out.print("Entre com o nome: ");
String nome = entrada.nextLine();
System.out.print("Entre com o endereço: ");
String endereco = entrada.nextLine();
System.out.print("Entre com o telefone: ");
String telefone = entrada.nextLine();
Insere insercao = new Insere(nome,endereco,telefone);
System.out.println("Quantidade de pessoas inseridas: " +
insercao.insere());
}
}
554
Outros exemplos...
� Já que consultamos e inserimos, porque não 
apagar e modificar?
package aula9.bancoDeBados;
import java.sql.*;
public class Conexao
{
public static Connection conexao() throws ClassNotFoundException, 
SQLException
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
try
{
// tenta conexão com a configuração de casa
String url = "jdbc:odbc:Driver={Microsoft Access Driver 
(*.mdb)};DBQ=C:/Banco/Agenda.MDB";
return DriverManager.getConnection (url, "", "");
}
catch (SQLException e)
{
// tenta conexão com a configuração do trabalho
String url = "jdbc:odbc:Driver={Microsoft Access Driver 
(*.mdb)};DBQ=C:/bancoDeBados/Agenda.MDB";
return DriverManager.getConnection (url, "", "");
}
}
}
556
Mais um exemplo...
� Apagar um registro
package aula9.bancoDeBados;
import java.sql.*;
public class Apaga
{
private Pessoa pessoa;
public Apaga(int id, String nome, String endereco, String telefone, 
int dia, int mes)
{
pessoa = new Pessoa(id,nome,endereco,telefone,dia,mes);
}
public Apaga(Pessoa pessoa)
{
this.pessoa = pessoa;
}
����

public int apaga()
{
int nRegistros = 0;
try
{
Connection con = Conexao.conexao();
String SQL = "delete from Cadastro where id=?";
PreparedStatement comandoSQL = con.prepareStatement(SQL);
int pos = 1;
comandoSQL.setInt(pos++, pessoa.getId());
nRegistros = comandoSQL.executeUpdate();
con.close();
return nRegistros;
}
catch (ClassNotFoundException e)
{
System.err.println("Classe não encontrada para atualização");
System.exit(-1); // aborta o programa
}
catch (SQLException e)
{
System.err.println("Problemas na conexão");
e.printStackTrace();
}
finally
{
return nRegistros;
}
}
}
559
Mais um exemplo
� Altera os dados de um registro
package aula9.bancoDeBados;
import java.sql.*;
public class Atualiza
{
private Pessoa pessoa;
public Atualiza(int id, String nome, String endereco, 
String telefone, int dia, int mes)
{
pessoa = new Pessoa(id, nome, endereco, telefone, dia, 
mes);
}
public Atualiza(Pessoa pessoa)
{
this.pessoa = pessoa;
}
����
public int atualiza()
{
int nRegistros = 0;
try
{
Connection con = Conexao.conexao();
String SQL = "update Cadastro set nome=?, endereco=?, 
telefone=?, diaAniversario=?, mesAniversario=? where id=?";
PreparedStatement comandoSQL = con.prepareStatement(SQL);
int pos = 1;
comandoSQL.setString(pos++, pessoa.getNome());
comandoSQL.setString(pos++, pessoa.getEndereco());
comandoSQL.setString(pos++, pessoa.getTelefone());
comandoSQL.setInt(pos++, pessoa.getDia());
comandoSQL.setInt(pos++, pessoa.getMes());
comandoSQL.setInt(pos++, pessoa.getId());
nRegistros = comandoSQL.executeUpdate();
con.close();
return nRegistros;
}
Tratamento de erro ����

catch (ClassNotFoundException e)
{
System.err.println("Classe não encontrada");
System.exit(-1); // aborta o programa
}
catch (SQLException e)
{
System.err.println("Problemas na conexão");
e.printStackTrace();
}
finally
{
return nRegistros;
}
}
}
Recuperação de índice autoincremento
public void inclui()
{
ResultSet rs = null;
// abre conexão com o banco de dados
Connection con = Conexao.conecta();
// inclui o registro e verifica se tudo deu certo
String SQL = "insert into Cadastro (nome, endereco, telefone, ...
Statement stmt = con.createStatement();
// executa o comando pedindo para retornar o valor da chave gerada
nReg = stmt.executeUpdate(SQL, Statement.RETURN_GENERATED_KEYS);
// obtém o valor da chave gerada. Somente uma linha é retornada
// a linha contém somente a coluna "GENERATED_KEY"
rs = stmt.getGeneratedKeys();
if(rs != null && rs.next()) id = rs.getInt(1);
// fecha a conexão com o banco de dados
con.close();
status = true;
}
563
564
Perguntas?
565
Exercícios
566
Banco de Dados
� Faça uma página com o conteúdo de acesso 
restrito. O acesso ao conteúdodesta página 
somente será permitido caso o usuário efetue login 
no sistema (ou seja, faça também uma página de 
login).
Conta:
Senha:
Login
Conteúdo
Secreto
Erro de
Login
Servlet
BD
index.html
Login.java
certo.jsp
errado.jsp
567
Banco de Dados
� Faça uma página que possua um contador de 
acesso usando banco de dados.
Agenda Eletrônica - Inserir
568
Pessoa
-id
-nome
-telefone
-diaNasc
-mesNasc
Nome:
Telefone:
Nascimento:
Insere
Servlet
OK
NOK
569
Banco de Dados
� Faça um sistema de controle online de 
estoque. As seguintes operações devem ser 
implementadas:
� Cadastro de produto – devem ser informados 
código e descrição
� Compra de itens do fornecedor para o estoque –
devem ser informados código e quantidade 
comprada
� Venda de itens do estoque para o consumidor –
devem ser informados código e quantidade 
vendida
� Relatório de todo o estoque
570
Parte 10
� Construindo uma aplicação
571
Exemplo - Agenda Eletrônica
572
Exemplo – Cabeçalho formulário
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 
Final//EN">
<HTML>
<HEAD>
<TITLE>Agenda Eletrônica - HP</TITLE>
</HEAD>
<BODY>
<H1>Agenda Eletrônica - Home</H1>
<h2>Login <a href=Adm/Login.html>aqui</a>!</h2>
--&gt; <a href=Adm/Logout.jsp>Logout</a> &lt;--
573
Exemplo – formulário de inclusão
<H2>Incluir</H2>
<form action=Inclui1.jsp method=post>
<TABLE BORDER=0>
<TR>
<TD align=right>Nome:</TD>
<TD align=left><input type=text name=nome></TD>
<TR>
<TD align=right>Endereço:</TD>
<TD align=left><input type=text name=endereco></TD>
<TR>
<TD align=right>Telefone:</TD>
<TD align=left><input type=text name=telefone></TD>
<TR>
<TD align=center colspan=2><input type=submit 
value="-->Inclui<--"></TD>
</TABLE>
</form>
574
Exemplo – formulário de consulta
<H2>Consultar</H2>
<form action=Consulta.jsp method=post>
<TABLE BORDER=0>
<TR>
<TD align=right>Nome:</TD>
<TD align=left>
<input type=text name=nome>
</TD>
<TR>
<TD align=center colspan=2>
<input type=submit value="-->Consulta<--">
</TD>
</TABLE>
</form>
575
Exemplo – formulário de exclusão
<H2>Excluir</H2>
<form action=Exclui1.jsp method=post>
<TABLE BORDER=0>
<TR>
<TD align=right>
Nome:
</TD>
<TD align=left>
<input type=text name=nome>
</TD>
<TR>
<TD align=center colspan=2>
<input type=submit value="-->Consulta<--">
</TD>
</TABLE>
</form>
576
Exemplo - formulário de alteração
<H2>Alterar</H2>
<form action=Altera1.jsp method=post>
<TABLE BORDER=0>
<TR>
<TD align=right>
Nome:
</TD>
<TD align=left>
<input type=text name=nome>
</TD>
</TR>
<TR>
<TD align=center colspan=2>
<input type=submit value="-->Consulta<--">
</TD>
</TR>
</TABLE>
</form>
577
Exemplo – Altera.jsp
<HTML><HEAD><TITLE></TITLE></HEAD><BODY>
<%@ page import="java.sql.*" %>
<jsp:useBean id="altera" class="AgendaEletronica.AgendaEletronica" 
scope="page" />
<jsp:setProperty name="altera" property="nome" param="nome" />
<jsp:setProperty name="altera" property="endereco" param="endereco" />
<jsp:setProperty name="altera" property="telefone" param="telefone" />
<jsp:setProperty name="altera" property="endIp" 
value="<%=request.getRemoteAddr()%>" />
<H1>Alteração finalizada</H1>
<%
if (altera.getStatus())
{
%>
<H2>Alteração finalizada com êxito</H2>
<h3>Dados alterados:</h3>
<% } %>
</BODY></HTML>
578
Exemplo – Inclui.jsp
<HTML><HEAD><TITLE>Incluisão finalizada</TITLE></HEAD>
<BODY>
<jsp:useBean id="inclusao" class="AgendaEletronica.AgendaEletronica" 
scope="page" />
<jsp:setProperty name="inclusao" property="nome" param="nome" />
<jsp:setProperty name="inclusao" property="endereco" 
param="endereco" />
<jsp:setProperty name="inclusao" property="telefone" 
param="telefone" />
<jsp:setProperty name="inclusao" property="endIp" 
value="<%=request.getRemoteAddr()%>" />
<H1>Inclusão finalizada</H1>
<% inclusao.inclui();
if (inclusao.getStatus()) { %>
<H2>Inclusão finalizada com êxito</H2>
<% } else { %>
<H2><font color=red>Inclusão finalizada com erro</font></H2>
<% } %>
</BODY></HTML>
579
Exemplo – Exclui.jsp
<HTML><HEAD><TITLE>Exclusão dos Itens Selecionados</TITLE></HEAD>
<BODY>
<%@ page import="java.sql.*" %>
<jsp:useBean id="apaga" class="AgendaEletronica.AgendaEletronica" 
scope="page" />
<%
String[] nome = request.getParameterValues("quem");
for (int i = 0; i < nome.length; i++)
{
%>
<jsp:setProperty name="apaga" property="nome" value='<%=nome[i]%>' 
/>
<% apaga.apague(); %>
<%
if (!apaga.getStatus())
{
out.println("Erro: " + 
apaga.getMensagem()+apaga.getCodigo()+apaga.getEstado());
}
%>
</BODY></HTML>
580
Exemplo – Consulta.jsp
<HTML><HEAD><TITLE>Resultado da Consulta</TITLE></HEAD><BODY>
<%@ page import="java.sql.*" %>
<H1>Resultado da Consulta</H1>
<jsp:useBean id="consulta" 
class="AgendaEletronica.AgendaEletronica" scope="page" />
<jsp:setProperty name="consulta" property="nome" 
param="nome" />
<H2>Consulta por: <%=request.getParameter("nome")%></H2>
<% ResultSet registro = consulta.consulte(); %>
<table>
581
Exemplo – Consulta.jsp
<%
while (registro.next())
{
%>
<tr>
<td align=right><b>Nome:</b>
<td align=left><%=registro.getString("nome")%>
<tr>
<td align=right><b>Endereço:</b>
<td align=left><%=registro.getString("endereco")%>
<tr>
<td align=right><b>Telefone:</b>
<td align=left><%=registro.getString("telefone")%>
<tr>
<td align=right><b>IP!!:</b>
<td align=left><%=registro.getString("ip")%>
<% }
registro.close();
%>
</table></BODY></HTML>
582
Exemplo – JavaBeans
package agendaEletronica;
import java.sql.*;
public class AgendaEletronica implements java.io.Serializable
{
private static final long serialVersionUID = 1L;
private String nome, endereco, telefone, endIp;
private String mensagem = "NOK", estado = "NOK";
private int codigo, nRegistros;
private boolean status;
ResultSet registro;
private final String url = "jdbc:odbc:Driver={Microsoft 
Access Driver (*.mdb)};DBQ=C:/Users/meslin/My Eclipose 
Workspace/Exemplos/agendaEletronica/Banco/agendaJSP.mdb";
583
Exemplo – JavaBeans – Construtor
public AgendaEletronica()
{
nome = "";
endereco = "";
telefone = "";
endIp = "";
mensagem = "OK";
codigo = -1;
estado = "OK";
status = false;
}
584
Exemplo – JavaBeans – Get&Set
// get & set
// nome
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
// endereço
public String getEndereco() { return endereco; }
public void setEndereco(String endereco) { this.endereco = endereco; }
// telefone
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) { this.telefone = telefone; }
// IP
public String getEndIp() { return endIp; }
public void setEndIp(String endIp) { this.endIp = endIp; }
// status
public boolean getStatus() { return status; }
public String getMensagem() { return mensagem; }
public int getCodigo() { return codigo; }
public String getEstado() { return estado; }
// número de registros alterados
public int getNRegistros() { return nRegistros; }
public void setNRegistros(int registros) { nRegistros = registros; }
// registros da consulta SQL
public ResultSet getRegistro() { return registro; }
public void setRegistro(ResultSet registro) { this.registro = registro; }
585
Exemplo – JavaBeans – Inclusão
Conexão com o Banco de Dados
public boolean proximo()
{
try
{
if (registro.next())
{
setNome(registro.getString("nome"));
setEndereco(registro.getString("endereco"));
setTelefone(registro.getString("telefone"));
setEndIp(registro.getString("ip"));
status = true;}
else
{
registro.close();
status = false;
}
return status;
} 
catch (SQLException e)
{
e.printStackTrace();
status = false;
return false;
}
}
public void fecha()
{
try
{
registro.close();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
586
Exemplo – JavaBeans – Inclusão
Conexão com o Banco de Dados
// realiza a incluisão
public void inclui()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// abre conexão com o banco de dados
Connection con=DriverManager.getConnection (url, "", "");
// inclui o registro e verifica se tudo deu certo
String SQL = "insert into Cadastro (nome, endereco, 
telefone, ip) values 
('"+nome+"','"+endereco+"','"+telefone+"','"+endIp+"')";
Statement stmt = con.createStatement ();
nRegistros = stmt.executeUpdate(SQL);
// fecha a conexão com o banco de dados
con.close();
status = true;
}
587
Exemplo – JavaBeans – Inclusão
Comando SQL
catch (SQLException sqlex)
{
status = false;
}
catch (ClassNotFoundException e)
{
status = false;
}
catch (Exception e)
{
status = false;
}
}
588
Exemplo – JavaBeans – Consulta
Conexão com o Banco de Dados
// realiza a consulta
public ResultSet consulte()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// abre conexão com o banco de dados
Connection con = DriverManager.getConnection (url, 
"", "");
// consulta o banco e verifica se tudo deu certo
String SQL = "select * from Cadastro where nome like 
'%"+nome+"%'";
Statement stmt = con.createStatement ();
registro = stmt.executeQuery(SQL);
// fecha a conexão com o banco de dados
status = true;
return registro;
}
589
Exemplo – JavaBeans – Consulta
Comando SQL
catch (SQLException sqlex)
{
status = false;
}
catch (ClassNotFoundException e)
{
status = false;
}
catch (Exception e)
{
status = false;
}
return null;
}
590
Exemplo – JavaBeans – Exclusão
Conexão com o Banco de Dados
// realiza a remoção
public void apague()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// abre conexão com o banco de dados
Connection con=DriverManager.getConnection (url, "", "");
// exclui o registro e verifica se tudo deu certo
String SQL = "delete from Cadastro where nome = ?";
PreparedStatement comandoSQL = con.prepareStatement(SQL);
comandoSQL.setString(1, nome);
nRegistros = comandoSQL.executeUpdate();
// fecha a conexão com o banco de dados
con.close();
status = true;
}
591
Exemplo – JavaBeans – Exclusão
Comando SQL
catch (SQLException sqlex)
{
mensagem = sqlex.getMessage();
codigo = sqlex.getErrorCode();
estado = sqlex.getSQLState();
status = false;
}
catch (ClassNotFoundException e)
{
status = false;
}
catch (Exception e)
{
status = false;
}
}
592
Exemplo – JavaBeans – Alteração
Conexão com o Banco de Dados
// realiza a alteração
public void altere()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// abre conexão com o banco de dados
Connection con=DriverManager.getConnection (url, "", "");
// exclui o registro e verifica se tudo deu certo
String SQL = "update Cadastro set endereco = 
'"+endereco+"',telefone = '"+telefone+"', ip = '"+endIp+"' 
where nome = '"+nome+"'";
Statement stmt = con.createStatement ();
nRegistros = stmt.executeUpdate(SQL);
// fecha a conexão com o banco de dados
con.close();
status = true;
}
593
Exemplo – JavaBeans – Alteração
Comando SQL
catch (SQLException sqlex)
{
mensagem = sqlex.getMessage();
codigo = sqlex.getErrorCode();
estado = sqlex.getSQLState();
status = false;
}
catch (ClassNotFoundException e)
{
status = false;
}
catch (Exception e)
{
status = false;
}
}
}
594
Perguntas?
595
Exercícios
596
Agenda Eletrônica
� Faça uma agenda eletrônica que armazene os dados 
em um banco de dados. A agenda deverá ter 
opções de:
� Incluir uma nova pessoa 
� Consultar por nome de pessoa 
� Excluir uma pessoa pelo seu nome 
� Atualizar dados de uma pessoa (desafio)
� Dados a serem armazenados na agenda:
� CPF (chave primária) 
� Nome 
� Endereço 
� Telefone 
� Dia do aniversário (numérico) 
� Mês do aniversário (numérico) 
597
Agenda Eletrônica
� Modifique a agenda do item anterior para permitir que uma mesma 
pessoa possa ter mais do que um telefone.
� As agendas devem ser implementadas seguindo os seguintes passos:
� Passo 1: Criar BD
� Passo 2: Criar DSN
� Passo 3: Fazer a inclusão
� Passo 4: Consulta por nome
� Passo 5: Exclusão 
1.usuário digita parte do nome e envia 
2.listar todos os nomes contendo esta parte 
3.usuário seleciona o nome desejado 
4.apagar nome 
� Passo 6: Alteração 
1.usuário digita parte do nome e envia 
2.listar todos os nomes contendo esta parte 
3.usuário seleciona o nome desejado 
4.mostrar formulário do nome já preenchido 
5.permitir modificar
6.atualizar
Taglib e JSTL
JavaServer Pages Standard Tag Library
� JSTL encapsula a funcionalidade do núcleo comum a 
muitas aplicações web como simples tags
� JSTL tem suporte para tarefas comuns e estruturais:
� Iteração e condicionais,
� Tags para manipulação de documentos XML, 
� Tags de internacionalização e 
� Tags SQL.
� O Lançamento de Manutenção JSTL 1,2 alinha com 
o Unified Expression Language (EL), que está sendo 
entregue como parte da especificação de JavaServer 
Pages (JSP) 2.1.
� JSTL 1.2 é parte da plataforma Java EE 5. 599
600
Configurando JSTL
� Versão 1.1:
� Copie jstl.jar e standard.jar para o diretório lib da aplicação
� Versão 1.2:
� Copie jstl-api-1.2.jar e jstp-ompl-1.2.jar para o diretórtio lib da 
aplicação
� Ou melhor, crie uma biblioteca JSTL com estes jar’s
� Obs.: faça download a partir de http://jstl.java.net/
601
Bibliotecas de Tags
� Podem ser personalizadas.
� Acesso a todos os objetos implícitos.
� Reuso de componentes no JSP.
� Podem se comunicar com outras tags. 
� Diminuição de código Java nas páginas.
� Podem ser aninhadas em outras tags.
602
Bibliotecas de Tags
� Utilidades:
� Percorrer uma coleção montando uma tabela.
� Manipular arquivos.
� Paginação de buscas.
603
Componentes
� Dois componentes em uma biblioteca de 
tags: 
� O descritor da biblioteca de tags (TLD).
� Os manipuladores de tag. 
604
O Arquivo TLD
� Um arquivo descritor de bibliotecas (TLD) é 
um documento XML que descreve a 
biblioteca. 
� Um TLD contém informações sobre a 
biblioteca como um todo, sobre cada tag 
contida na biblioteca e é usado pelo container 
JSP para validar essas tags. 
605
Manipuladores de tags
� São objetos Java que executam a ação 
associada a uma tag personalizada. 
� Quando uma requisição é recebida pelo 
container JSP para uma página contendo tags 
personalizadas, a instância do manipulador da 
tag correspondente é obtida. 
� É necessário implementar uma interface 
apropriada dependendo do tipo de 
comportamento da tag 
606
Utilizando Tags
<%@ taglib uri="alo.tld" prefix="exemplo" %>
<html>
<head>
<title>JSP Page</title>
</head>
<body>
<exemplo:helloworld msg="hello world!!">
</exemplo:helloworld>
</body>
</html>
Arquivo
H
elloW
orld.jsp
607
O Arquivo TLD (alo.tld)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.1</tlibversion>
<jspversion>2.0</jspversion>
<shortname>exemplo</shortname>
<tag>
<name>helloworld</name>
<tagclass>tagLib.Exemplo</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>msg</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue></attribute>
</tag>
</taglib>
A Classe Java (Exemplo.java)
package tagLib;
import ...
public class Exemplo extends TagSupport
{
private String msg;
public String getMsg() { return msg; }
public void setMsg(String msg) { this.msg = msg; }
public int doStartTag()
{
JspWriter writer = pageContext.getOut();
try
{
writer.print(msg);
}
catch (IOException e) 
{
e.printStackTrace();
}
return TagSupport.SKIP_BODY;
}
}
608
609
JSTL
� JSP Standard Tag Library
� Provê um conjunto padrão de tags.
� Funcionalidades encapsuladas
� JSTL 1.2
Funcionalidade URI Prefixo padrão Exemplo
Core http://java.sun.com/jsp/jstl/core c <c:tagname ...> 
Processamento XML http://java.sun.com/jsp/jstl/xml x <x:tagname ...> 
Formatação http://java.sun.com/jsp/jstl/fmt fmt <fmt:tagname ...> 
SQL http://java.sun.com/jsp/jstl/sql sql <sql:tagname ...> 
Funções http://java.sun.com/jsp/jstl/functions fn fn:functionName(...)
610
JSTL: Core
� Expressões
� Processamento condicional
� Iterações
� Acesso a recursos baseados em URL cujos 
conteúdos podem ser incluídos ou 
processados pelo JSP
611
Resumo das tags Core
Área Função Tags
Core
Suporte a EL
catch
out
remove
set
Controle de fluxo
choose
when
otherwise
forEach
forTokens
if
Gerenciamento de URL
import
param
redirect
param
url
param
612
Expressions Tags
� <c:out> – Avalia uma expressão e escreve seu resultado no
JspWriter corrente.
� Sintaxe:
<c:out value=“valor” [escapeXml=“{true|false}”] 
[default=“valorDefault”]/>
� Ou
<c:out value=“valor” [escapeXml=“{true|false}”]>
valorDefault
</c:out>
� Onde:
� valor: expressão a ser escrita
� escapeXml: determina se os caracteres <>&’” serão convertidos para o 
formato &???;
� valorDefault: valor que será utiizado se a variável for nula
� Exemplo:
<c:out value="${sessionScope.cart.numberOfItems}"/>
613
Exemplo de <c:out>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Uso de &lt;c:out&gt;</title>
</head>
<body>
<% String texto="uso da tag <p>"; %>
Texto: <c:out value="uso da tag <p>."/><br/>
Texto: <c:out value="uso da tag <p>." escapeXml="false"/><br/>
</body>
</html>
614
Expressions Tags
� <c:set> – Atribui um valor a um atributo em qualquer escopo do JSP (page, 
request, session, aplication).
� Se o atributo não existir, ele é criado
� Sintaxe:
<c:set value=”value”
var=”varName” [scope=”{page|request|session|application}”]/>
� Ou
<c:set var=”varName” [scope=”{page|request|session|application}”]>
body content
</c:set>
� Ou
<c:set value=”value”
target=”target” property=”propertyName”/>
� Ou
<c:set target=”target” property=”propertyName”>
body content
</c:set>
� Onde:
� value: expressão
� var: nome da variável
� scope: escopo
� target: nome do objeto (Javabeans ou Map)
� property: nome da propriedade do objeto target
615
Expressions Tags
� <c:remove> – Remove um objeto em 
qualquer escopo do JSP.
� Sintaxe:
<c:remove var=”varName” 
[scope=”{page|request|session|application}”]/>
� Onde:
� var: nome da variável a ser removida
� scope: escopo da variável
� Exemplo:
<c:remove var="cart" scope="session"/>
616
Expressions Tags – suporte a EL
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>JSTL Core</title>
</head>
<body>
<c:set var="foo" value="página" scope="page" />
<c:set var="foo" value="request" scope="request" />
<c:set var="foo" value="sessão" scope="session" />
<c:set var="foo" value="aplicação" scope="application" />
Valor criado: <c:out value="${foo}" /><br>
Valor criado: <c:out value="${pageScope.foo}" /><br>
Valor criado: <c:out value="${requestScope.foo}" /><br>
Valor criado: <c:out value="${sessionScope.foo}" /><br>
Valor criado: <c:out value="${applicationScope.foo}" /><br>
<c:remove var="foo" scope="page"/>
Valor atual: <c:out value="${foo}" /><br>
</body>
</html>
617
Tags de Desvio Condicional
� <c:if> – Permite a execução condicional do corpo de acordo 
com a avaliação da expressão.
� Sintaxe:
<c:if test=“testCondition”
var=“varName” [scope=“{page|request|session|application}”]/>
� Ou
<c:if test=“testCondition” [var=“varName”] 
[scope=“{page|request|session|application}”]>
body content
</c:if>
� Onde:
� test: condição
� var: valor do resultado do teste
� scope: escopo da variável
<c:if test="${sessionScope.user != null}">
...
</c:if>
618
Tags de Repetição
� <c:forEach> – Permite a iteração em uma coleção 
de objetos.
� Sintaxe:
<c:forEach begin=“inicio” end=“fim” items=“iterável” step=“salto” 
var=“variável” varStatus=“javax.servlet.jsp.jstl.core.LoopTagStatus”>
ações
</c:forEach>
� Exemplo:
<c:forEach var="item" items = "${sessionScope.cart.items}">
<tr>
<td align="right"> 
<c:out value="${item.quantity}"/>
</td> 
</tr>
</c:forEach> 
619
Tags de Repetição
� <c:forEach> – Permite repetições 
determinadas.
� Sintaxe:
<c:forEach [var=”varName”] [varStatus=”varStatusName”] 
begin=”begin” end=”end” [step=”step”]>
body content
</c:forEach>
� Exemplo:
<c:forEach var="i" begin=“0” end=“10” step=“2”>
<c:out var=“i”/>
</c:forEach> 
621
Iteráveis
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Percorrendo Iteráveis</title>
</head>
<body>
<jsp:useBean id="vetores" class="jstl.Vetores" />
<h2>Listagem de 1 em 1</h2>
<c:forEach var="item" items="${vetores.vInt}">
Valor do item: ${item }<br/>
</c:forEach>
<h2>Listagem de 3 em 3 começando em 2 terminando em 10</h2>
<c:forEach var="item" items="${vetores.vInt}" begin="2" end="10" step="3">
Valor do item: ${item }<br/>
</c:forEach>
<h2>Iterando sobre strings</h2>
<c:forTokens items="banana nao tem caroço" delims="aeiou " var="palavra">
${palavra }
</c:forTokens>
</body>
</html>
Vetores.java
package jstl;
import java.util.*;
public class Vetores
{
private List<Integer> vInt;
public Vetores()
{
int [] v = {0,1,2,4,8,16,32,64,128,256,512,1024,8,7,5,2};
vInt = new ArrayList<Integer>();
for (int i : v) vInt.add(i);
}
public List<Integer> getvInt() { return vInt; }
public void setvInt(List<Integer> vInt) { this.vInt = vInt; }
}
622
desvio.jsp
<%@ page language="java"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Desvio Condicional</title>
</head>
<body>
<c:if test="${empty param.nome }">
<form action="<%=request.getRequestURI()%>" method="post">
Nome: <input type="text" name="nome">
<input type="submit" value="Envia">
</form>
</c:if>
<c:if test="${!empty param.nome }">
O seu nome é ${param.nome }<br>
</c:if>
<a href="<%=request.getRequestURI()%>">Continua...</a><br>
<c:forEach var="i" begin="0" end="10" step="2">
${i}
</c:forEach>
</body>
</html>
624
Tags condicionais
� <c:choose> – Permite a execução condicional através das sub 
tags when (similar ao case). Se nenhuma condição for avaliada 
como true o corpo da tag otherwise será avaliado.
<c:choose>
<c:when test="${sessionScope.customer.tipo == 'trial'}> 
... 
</c:when> 
<c:when test="${sessionScope.customer.tipo == 'member'}" >
...</c:when>
<c:otherwise> 
... 
</c:otherwise> 
</c:choose>
625
Tags Condicionais
� A tag <c:choose> pode ser utilizada realizar uma 
construção semelhante ao if-else
<c:choose>
<c:when test="${count == 0} >
No records matched your selection. 
</c:when> 
<c:otherwise> 
<c:out value="${count}"/> 
records matched your selection. 
</c:otherwise> 
</c:choose> 
626
Tags de Gerenciamento de URL
� <c:import>: permite importar dinamicamente um arquivo.
� A URL pode ser um recurso de qualquer servidor
� Sintaxe:
� <c:import url=“url” charEncoding=“codificação” context=“/contexto” 
scope=“” var=“variável” varReader=“objetoDeLeitura”>
� O conteúdo pode ser enviado diretamente para a saída
<c:import url="frases.jsp" />
� Ou para uma variável
<c:import url="frases.jsp" var="palavras" />
� O recurso importado pode receber parâmetros
<c:import url="frases.jsp">
<c:param name="qual" value="3" />
</c:import>
627
Tags de Gerenciamento de URL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Tag &lt;c:import&gt;</title>
</head>
<body>
<h2>Importação direta para a saida</h2>
<c:import url="frases.jsp" />
<h2>Importação para uma variável</h2>
<c:import url="frases.jsp" var="palavras" />
<c:forTokens var="palavra" items="${palavras}" delims=" ">
${palavra }<br/>
</c:forTokens>
<h2>Importação com parâmetros</h2>
<c:import url="frases.jsp">
<c:param name="qual" value="3" />
</c:import>
</body>
</html>
continua
628
Tags de Gerenciamento de URL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String [] frases = 
{
"banana não tem caroço",
"milha avó não toca violão",
"se está chovendo, logo não estou na Lua",
"melancia sem caroço"
};
%>
<c:if test="${!empty param.qual}">
<%=frases[Integer.parseInt(request.getParameter("qual"))] %>
</c:if>
<c:if test="${empty param.qual}">
<%=frases[(int)(Math.random()*frases.length)] %>
</c:if>
Arquivo frases.jsp
629
Tags de Gerenciamento de URL
� <c:url>: constrói uma URL a partir das 
informações fornecidas
� Sintaxe:
<c:url value=“valor” [context=“contexto”] [var=“variável” 
[scope=“{page|request|session|application}”]]/>
� Ou
<c:url value=“valor” [context=“contexto”] [var=“variável” 
[scope=“{page|request|session|application}”]]/>
<c:param name=“nome” value=“valor”/>
</c:url>
� Onde:
� valor: URL a ser processada
� context: nome do contexto relativo a outro container
� var: nome da variável que irá receber a URL
� scope: escopo para a variável
Arquivo url.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Uso de &ltc;:url&gt;</title>
</head>
<body>
Aqui a url não vai aparecer...<br/>
<c:url value="/JSTL/import.jsp" var="variavel" context="/Forum" scope="session">
<c:param name="nome" value="Alexandre Meslin"/>
</c:url>
mas agora com o valor da variável... <c:out value="${variavel}"/><br/>
<p>
Por outro lado, agora ela aparece (está sem o atributo var): 
<c:url value="/JSTL/import.jsp" context="/Forum" >
<c:param name="nome" value="Alexandre Meslin"/>
</c:url>
</body>
</html>
631
Tags de Gerenciamento de URL
� <c:redirect>: envia uma mensagem HTTP de 
redirect (redirecionamento) para o cliente
� Sintaxe:
<c:redirect url=”value” [context=”context”]/>
� Ou
<c:redirect url=”value” [context=”context”]/>
<c:param name=“nome” value=“valor”>
</c:redirect>
� Onde:
� valor: URL a ser processada
� context: nome do contexto relativo a outro container
� var: nome da variável que irá receber a URL
� scope: escopo para a variável
632
Tags de Gerenciamento de URL
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Uso de &lt;c:redirect&gt;</title>
</head>
<body>
<c:redirect url="redirect2.jsp"/>
</body>
</html>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Uso de &lt;c:redirect&gt;</title>
</head>
<body>
<c:redirect url="redirect2.jsp">
<c:param name="parametro" value="valor do parametro"/>
</c:redirect>
</body>
</html>
633
Tag de Gerenciamento de Exceção
� <c:catch>: captura uma exceção 
java.lang.Throwable
� Sintaxe:
<c:catch [var=”varName”]>
nested actions
</c:catch>
634
Tag de Gerenciamento de Exceção
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Uso de &lt;c:catch&gt;</title></head>
<body>
<c:catch var="erro">
<% int i = 10 / 0; %>
</c:catch>
<c:if test="${!empty erro}">
<p>Deu erro!</p>
</c:if>
<c:if test="${empty erro}">
<p>Não deu erro!</p>
</c:if>
<c:catch var="erro">
<c:set var="i" value="${10 / 0 }"/>
</c:catch>
<c:if test="${!empty erro}">
<p>Deu erro!</p>
</c:if>
<c:if test="${empty erro}">
<p>Não deu erro! i = <c:out value="${i }"/></p>
</c:if>
</body>
</html>
642
Perguntas?
643
Exercícios de JSTL e EL
644
Exercícios de JSTL e EL
1. Faça uma página onde o usuário possa informar a cor de 
background e foreground. Envie os dados para uma 
segunda página que simplesmente mostre alguma 
mensagem com estas cores. Use um valor default para o 
caso do usuário não informar alguma cor. Use JSTL e EL
2. Refaça o exercício anterior, proibindo que a cor de 
background seja a mesma da cor de foreground
3. Modifique o exercício anterior fazendo com que a página 
mostre a última cor selecionada pelo usuário caso este não 
informe alguma cor. Se não houver cor anterior, utilize uma 
cor default
4. Idem, mas agora utilize a última cor selecionada por 
qualquer usuário
645
Exercícios de JSTL e EL
1. Faça uma página que cria uma lista de 13 números 
aleatórios. Para gerar os números, utilize 
<%=Math.random()%>
2. Crie uma página JSP que armazene em um bean uma lista 
de nomes e o envie para uma página JSP utilizando 
RequestDispatcher. Na página JSP, coloque o vetor em 
uma lista do tipo <ul>
3. Repita o problema anterior utlizando ArrayList, LinkedList, 
Vector e HashMap
4. Crie uma página JSP que armazene dois vetores em um 
bean: o primeiro com o primeiro nome e o segundo com o 
último nome de pessoas. A sua página JSP deverá construir 
uma tabela com o primeiro nome em uma coluna e o 
segundo em outra coluna
646
Parte 11
� Hibernate
647
Hibernate
� Segundo a Wikipédia:
� O Hibernate é um framework para o 
mapeamento objeto-relacional escrito na 
linguagem Java, mas também é disponível em 
.Net como o nome NHibernate. Este programa 
facilita o mapeamento dos atributos entre uma 
base tradicional de dados relacionais e o modelo 
objeto de uma aplicação, mediante o uso de 
arquivos (XML) para estabelecer esta relação.
� Hibernate é um software livre de código aberto 
distribuído com a licença LGPL.
648
Arquitetura (em alto nível)
649
Modelo do Hibernate
� Hibernate Core
� API’s nativas
� Mapeamento objeto/relacional através de XML
� Hibernate Annotations
� Permite anotações padrão JDK 5.0 em substituição a XML 
(pode ser utilizado em conjunto)
� Hibernate EntityManager
� Interface entre JPA (Java Persistence API) e Java SE/EE
650
JPA (Java Persistence API)
� JPA é parte da especificação EJB 3.0
� JPA é uma API POJO para mapeamento 
objeto/relacional
� JPA suporta
� Anotações Java
� Metadados XML
651
O que é anotação (annotation)?
� Anotação é uma construção especifica do 
Java 5 para incluir informações adicionais ao 
código fonte Java
� Annotations são incluídas dentro de uma 
classe Java
652
Sintaxe de anotações
� @AnnotationName (elemento1 = “valor1”, 
elemento2 = “valor2”)
� @AnnotationName (“valor”)� Pode ser utilizada em
� Classes
� Métodos
� Variáveis
� Parâmetros
� Pacotes
� Anotações (annotations)
Instalação do Hibernate
� No site http://www.hibernate.org/ faça 
download de:
� Hibernate Core
� Hibernate Annotations
� Hibernate EntityManager
� Ou simplesmente faça download do bundle
653
654
Instalação do Hibernate
� Descompacte os arquivos em uma pasta (ou em 
várias)
656
Instalação do Hibernate v3.6
� Crie uma Biblioteca com os seguintes JAR’s
657
Arquivos do Hibernate
� Criar o arquivo hibernate.cfg.xml no diretório
� WEB-INF/src (para projetos web)
� src (para projetos desktop)
� src (para projetos web dinâmicos)
� Criar as classes POJO com anotações para 
mapear o banco de dados (ORM)
658
Exemplo: agenda eletrônica (simples)
� O aplicativo permite cadastrar, alterar, incluir 
e excluir dados (nome, endereço e telefone) 
de pessoas em um banco de dados
� Foi utilizado no exemplo um banco de dados 
MySQL
Banco de dados
� Tabela Cadastro do banco de dados da agenda 
simples (AgendaSimples)
CREATE TABLE `CADASTRO`
(
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NOME` varchar(50) default NULL,
`ENDERECO` varchar(50) default NULL,
`TELEFONE` varchar(50) default NULL,
`IP` varchar(50) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;
659
Cadastro
ID
Nome
Endereco
Telefone
IP
660
Tipos de armazenamento (storage engines)
� A versão 5.0 do MySQL suporta os seguintes 
tipos de storage engines:
� MyISAM: default. Baseado no conceito de 
banco de dados ISAM (Indexed Sequential 
Access Method) da IBM. Não suporta transações 
totalmente
� InnoDB: fornece suporte a transações. 
Desenvolvido por Innobase Ou, da Oracle
� BDB: BerkeleyDB: fornece suporte a transações
� CSV: armazena os dados em uma arquivo 
simples com os campos separados por vírgula
661
Criando uma classe persistente
� Instâncias de classes persistentes são salvas e 
recuperadas de banco de dados
� Nem todas as instâncias de classes persistentes 
estão sempre 100% persistidas. Podem estar no 
estado transiente ou desconectado (detached)
� Classe POJO
� Todas as classes persistentes devem ter um 
construtor default
662
Classe para mapear o banco de dados
package modelo;
public class Pessoa
{
private int id;
private String nome;
private String endereco;
private String telefone;
private String ip;
}
663
Transparência
� Utiliza uma classe POJO – Plain Old Java 
Object
� A classe pode ser utilizada fora do contexto 
de persistência
� Os objetos não contém informações se serão 
persistidos ou não
664
Relação entre POJO e DB
Cadastro
ID
Nome
Endereco
Telefone
IP
Tipo SQL Tipo Java
CHAR java.lang.String
VARCHAR java.lang.String
LONGVARCHAR String
NUMERIC BigDecimal
DECIMAL BigDecimal
BIT Boolean
TINYINT Byte
SMALLINT Short
INTEGER Int
BIGINT Long
REAL Float
FLOAT Double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
BLOB java.sql.Blob
CLOB java.sql.Clob
BOOLEAN boolean
OBJECT java.lang.Object
665
Configurando o Hibernate
� 2 tipos de configuração
� Através de programação (muito chato!)
� XML (a que vamos utilizar)
666
Arquivo hibernate.cfg.xml
� Em “WEB-INF/src” em projetos Tomcat
� Em “Java Resources: src” em projetos Web Dinamicos
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE 
hibernate-configuration 
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property 
name="hibernate.connection.url">jdbc:mysql://MeuServidorDB/AgendaSimples</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">8752</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- List of annotated classes -->
<mapping class="modelo.Pessoa"/>
</session-factory>
</hibernate-configuration>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE 
hibernate-configuration 
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://MeuServidorDB/AgendaSimples
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">8752</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</property>
<mapping class="modelo.Pessoa"/>
<mapping class="modelo.Usuarios"/>
</session-factory>
</hibernate-configuration>
Arquivo hibernate.cfg.xm
l (com
pleto?)
668
Arquivo hibernate.cfg.xml (detalhes)
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://MeuServidorDB/AgendaSimples
</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
� Driver utilizado na conexão, endereço (URL) do banco de dados e nome da classe que 
traduz entre as funcionalidades que o Hibernate disponibiliza para a aplicação e as que o 
banco de dados possui (um tradutor)
� Alguns valores possíveis:
� Microsoft SQL Server
� org.hibernate.dialect.SQLServerDialect
� jdbc:jtds:sqlserver://localhost:1433;cianet 
� org.hibernate.dialect.SQLServerDialect 
� MySQL
� com.mysql.jdbc.Driver 
� jdbc:mysql://localhost:3306/database
� org.hibernate.dialect.MySQLDialect
� Oracle (qualquer versão)
� org.hibernate.dialect.OracleDialect
� jdbc:oracle:thin:@localhost:1521:DB
� oracle.jdbc.OracleDriver
669
Arquivo hibernate.cfg.xml (detalhes)
<property name="hibernate.hbm2ddl.auto">
none
</property>
� Informa ao Hibernate como atualizar schema do 
banco de dados ao iniciar a aplicação
� Valores possíveis:
� create - apenas cria as tabelas e indices, se já tiverem 
sido criados não faz nada
� create-drop - apaga o schema e o recria.
� update - faz sincronismo entre XML de mapeamento e 
banco de dados. 
� none - não faz nada
670
Arquivo hibernate.cfg.xml (detalhes)
<property name="show_sql">
true
</property>
� Informa se o Hibernate deverá mostrar na 
console os comandos SQL.
� Valores possíveis
� true
� false
671
Anotações
� Na classe utilizada para mapear o banco de 
dados
� Utilizada para configurar o mapeamento
� Mais informações em:
� http://docs.jboss.org/hibernate/annotations/3.5/
reference/en/html_single/
672
Anotação @Entity
� Declara a classe como sendo uma entity bean
� Informa que a classe pode ser persistida pelo 
Hibernate
@Entity
public class Pessoa
{
private int id;
private String nome;
private String endereco;
private String telefone;
private String ip;
}
673
Anotação @Table
� Associa a classe a uma tabela do banco de dados� Se @Table for omitido, o nome da tabela será o mesmo da classe
� Restrições (constraints) podem ser definidos através de @Table
� @Table(name="tbl_sky", uniqueConstraints = 
{@UniqueConstraint(columnNames={"month", "day"})}
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
private int id;
private String nome;
private String endereco;
private String telefone;
private String ip;
}
674
Anotação @Id
� Declara qual propriedade é a identidade (chave primária)
� Toda classe persistente precisa ter uma chave 
primária
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
@Id
private int id;
private String nome;
private String endereco;
private String telefone;
private String ip;
}
675
Anotação @GeneratedValue
� Configura como a identidade será gerada
� Alguns valores válidos (definidos pelo EJB3) são:
� AUTO - either identity column, sequence or table depending on the underlying DB 
� TABLE - table holding the id 
� IDENTITY - identity column 
� SEQUENCE - sequence 
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
private int id;
private String nome;
private String endereco;
private String telefone;
private String ip;
}
676
Anotação @GeneratedValue
� O Hibernate suporta várias estratégias para 
geração automática de identidade:
� IDENTITY: suporte para as colunas IDENTITY
� SEQUENCE: utiliza um sequence para a geração 
de chaves
� AUTO: escolhe automaticamente a melhor 
estratégia de geração
677
Anotação @Column
� Utilizada para explicitar a relação entre as 
propriedades de uma classe e colunas de uma 
tabela
@Entity
public class Flight implements Serializable 
{
...
@Column(updatable = false, name = "flight_name", nullable = 
false, length=50)
String name;
...
� A propriedade name é mapeada na coluna 
flight_name, que não pode ser nula, tem um 
tamanho de 50 caracteres e não pode ser atualizada
678
Declarando atributos de colunas
@Column( 
name="columnName"; (1) 
boolean unique() default false; (2) 
boolean nullable() default true; (3) 
boolean insertable() default true; (4) 
boolean updatable() default true; (5) 
String columnDefinition() default ""; (6) 
String table() default ""; (7) 
int length() default 255; (8) 
int precision() default 0; // decimal precision (9) 
int scale() default 0; // decimal scale ) (10)
� (1) name (opcional): o nome da coluna (default: o nome da propriedade)
� (2) unique (opcional): define uma restrição única para a coluna (default: false)
� (3) nullable (opcional): define a coluna como podendo ser nula (default true).
� (4) insertable (opcional): define se a coluna fará parte do comando insert (default true)
� (5) updatable (opcional): define se a coluna fará parte do comando update (default true)
� (6) columnDefinition (opcional): sobrepõe parte do DDL SQL para esta coluna (não 
portável)
� (7) table (opcional): define a tabela destino (default: tabela primária)
� (8) length (opcional): tamanho da coluna (default: 255)
� (9) precision (opcional): número de casas decimais (default: 0)
� (10) scale (opcional): escalamento decimal, quando aplicável (default: 0)
679
Classe POJO com anotações
package modelo;
import javax.persistence.*;
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = "ID")
private int id;
@Column(name = "NOME")
private String nome;
@Column(name = "ENDERECO")
private String endereco;
@Column(name = "TELEFONE")
private String telefone;
@Column(name = "IP")
private String ip;
}
Não se esqueça de declarar os 
métodos de acesso (getters & 
setters)
Problemas conhecidos e suas “soluções”
� Problema
� org.hibernate.MappingException: Unknown 
entity: pacote.Classe
� Solução
� Faltou a anotação @Entity na classe de 
persistência
680
Perguntas?
681
Criando uma agenda
683
Inserindo uma pessoa no banco de dados
� Passos:
� Configurar uma fábrica de sessões
� Obter um sessão da fábrica de sessões
� Iniciar uma transação
� Instanciar uma nova pessoa
� Persistir a nova pessoa
� Commitar a transação
� Esvaziar a sessão
� Fechar a sessão
� Fechar acesso à fábrica de sessões
684
Interface org.hibernate.SessionFactory
� Threadsafe
� Uma fábrica de sessões
� Pode possuir um cache de 2o nível de dados 
reutilizados entre transações no nível de 
processos ou de clusteres
� Deve ser instanciado apenas uma vez ao se 
iniciar o Hibernate
685
Interface SessionFactory
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil 
{
private static final SessionFactory sessionFactory;
static
{
try
{
sessionFactory = new
AnnotationConfiguration().configure().buildSessionFactory();
} 
catch (HibernateException ex) 
{
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() 
{
return sessionFactory;
}
}
A partir da versão 3.6 do 
Hibernate, 
AnnotationConfiguration() 
ficou obsoleto, devemo usar 
agora Configuration()
686
Interface org.hibernate.Session
� A principal interface em tempo de execução entre a aplicação 
Java e Hibernate
� Uma sessão contém uma ou mais transações
� Possui cache de nível 1
� Entidades (classes) mapeadas existem em um dos 4 
seguintes estados:
� Transient: nunca é persistido, não está associado a nenhuma 
Session
� Persistent: associado a uma única Session
� Detached: já persistido mas atualmente desassociado a Sessions
� Removed: um objeto removido diretamente ou através de Cascade
� Instâncias transientes são persistidas através da chamada de 
save(), persist() ou saveOrUpdate()
687
Estados de objetos
688
Interface Session
� Instâncias persistentes podem virar transientes 
através da chamada delete()
� Qualquer instância retornada por get() ou load() é 
persistente
� Instâncias detached podem ser persistidas através 
da chamada de update(), saveOrUpdate(), lock() ou 
replicate()
� Uma Session é serializável se as classes persistentes 
forem serializáveis
689
Interface Session
� Se a Session levantar uma exceção, a transação deve ser revertida (rollback)
� Uma transação típica deve ter o seguinte formato:
Session session = sessionFactory.openSession(); 
Transaction tx; 
try 
{ 
tx = session.beginTransaction(); 
//do some work ... 
tx.commit(); 
} 
catch (Exception e) 
{ 
if (tx!=null) tx.rollback(); 
throw e; 
} 
finally 
{ 
session.flush(); 
session.close(); 
}
690
Usando Session
� Operações de persistência estão disponíveis 
através de um objeto 
org.hibernate.Session
Session.load() Carrega um objeto do banco de dados
Session.get() O mesmo, mas o objeto pode não existir
Session.save() Inclui um novo objeto no banco de dados
Session.delete() Apaga um objeto do banco de dados
Session.find() Procura um objeto através de uma query em
HQL
Session.filter() Separa um subconjunto de uma coleção
Session.flush() Salva modificações no banco de dados
691
Interface org.hibernate.Transaction
� Uma sessão pode conter várias transações
� Uma transação começa com:
Transaction transacao = session.beginTransaction();
� Uma transação bem sucedida termina com:
transacao.commit();
� Uma transação com erro termina com
transacao.rollback();
package agenda;
import org.hibernate.*;
import modelo.Pessoa;
import util.HibernateUtil;
public class NovaPessoa
{
private String nome;
private String endereco;
private String telefone;
private String ip;
// gettes & setters
public void persiste()
{
Session session;
SessionFactory sessionFactory;
Transaction transacao;sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
transacao = session.beginTransaction();
Pessoa pessoa = new Pessoa(nome, endereco, telefone, ip);
session.save(pessoa);
transacao.commit();
session.flush();
session.close();
}
}
Inserção de um
a pessoa
Não se esqueça de 
incluir tratamento 
de erro (try-catch) 
no seu código
O que acontece se alguma 
propriedade de pessoa for 
modificada depois de executar 
session.save(pessoa)?
693
Estados do objeto
694
Inserção de uma pessoa (agora com tratamento de erro)
package agenda;
import modelo.Pessoa;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class NovaPessoa
{
private String nome;
private String endereco;
private String telefone;
private String ip;
private String msgErro;
private boolean status;
Imports e propriedades
695
Inserção de uma pessoa (agora com tratamento de erro)
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public String getEndereco(){ return endereco; }
public void setEndereco(String endereco)
{
this.endereco = endereco;
}
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) 
{
this.telefone = telefone;
}
public String getIp() { return ip; }
public void setIp(String ip) { this.ip = ip; }
public String getMsgErro() { return msgErro; }
public boolean getStatus() { return status; }
Getters & setters
696
Inserção de uma pessoa (agora com tratamento de erro)
public void persiste()
{
Session session;
SessionFactory sessionFactory;
Transaction transacao;
status = true;
try
{
sessionFactory = new
AnnotationConfiguration().configure().buildSessionFactory();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao criar sessionFactory.";
return;
}
SessionFactory
697
Inserção de uma pessoa (agora com tratamento de erro)
try
{
session = sessionFactory.openSession();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao abrir a sessão";
return;
}
try
{
transacao = session.beginTransaction();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao começar uma transação";
return;
}
Início da sessão e da 
transação
698
Inserção de uma pessoa (agora com tratamento de erro)
Pessoa pessoa = new Pessoa(nome, endereco, 
telefone, ip);
try
{
session.save(pessoa);
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao salvar a pessoa";
return;
}
Uma nova pessoa é 
criada e salva no banco 
de dados
699
Inserção de uma pessoa (agora com tratamento de erro)
try
{
transacao.commit();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao dar commit na transacao";
return;
}
try
{
session.flush();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao dar flush";
return;
}
Término da transação 
e sincronização da 
sessão
700
Inserção de uma pessoa (agora com tratamento de erro)
try
{
session.close();
}
catch (HibernateException e)
{
status = false;
msgErro = "*** Erro ao fechar a sessao";
return;
}
}
}
Fim da sessão
701
Consulta ao banco de dados pelo nome
� O nome não é chave primária
� Veremos busca pela chave em remoção e 
alteração
� Passos
� Configurar uma fábrica de sessões
� Obter um sessão da fábrica de sessões
� Criar uma busca usando HQL
� Realizar a busca
� Fechar a sessão
� Fechar acesso à fábrica de sessões
� Retornar os itens encontrados
702
Interface org.hibernate.Query
� Os outros passos são semelhantes ao de inserção
� Uma Query somente existe dentro da Session onde foi criada
� Uma mesma Query pode ser executada diversas vezes
� Para obter uma instância de Query:
Query query = session.createQuery(queryString);
� Paginação pode ser facilmente obtida através dos métodos 
setMaxResults(int max) e setFirstResult(int primeiro)
� O resultado de uma query é uma lista do tipo List:
Iterator<Pessoa> itens = query.list().iterator();
package agenda;
import java.util.*;
import org.hibernate.*;
import util.HibernateUtil;
import modelo.Pessoa;
public class Consulta
{
private String nome;
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public Iterator<Pessoa> consulteNome()
{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
String queryString = "from Pessoa cadastro where nome like '%" + 
nome + "%' order by nome";
Query query = session.createQuery(queryString);
Iterator<Pessoa> itens = query.list().iterator();
session.close();
return itens;
}
}
Nome da classe Nome da TABELA
704
Estados do objeto
705
Altera dados do banco
� Através de parte do nome, é apresentada 
uma lista de possíveis registros
� O usuário seleciona o registro que deseja 
modificar
� É apresentado o registro para que o usuário 
possa fazer a modificação � busca pela 
chave primária
706
Dirty Checking
� O Hibernate percebe que um atributo foi 
modificado
� O atributo (ou entidade) é atualizado 
automaticamente no banco de dados sem a 
necessidade de código explicito
� Somente dentro de uma transação
� Somente para objetos gerenciados por um 
Session
707
Consulta pela chave primária
� Depois de localizar o item a ser alterado 
(busca pelo nome), é realizada uma busca 
pela chave primária selecionada pelo usuário
� Passos:
� Configurar uma fábrica de sessões
� Obter um sessão da fábrica de sessões
� Realizar a busca pela chave primária
� Fechar a sessão
� Fechar acesso à fábrica de sessões
� Retornar os itens encontrados
708
Recuperando uma entidade
� Método get()
� Retorna uma instância que foi persistida de uma entidade a partir de 
um identificador (chave primária)
� Em caso de erro ou não encontrar o objeto, retorna nulo
� Para obter uma instância:
pessoa = (Pessoa) session.get(Pessoa.class, id);
� Método load()
� Semelhante ao método get()
� Se o objeto não for encontrado, levanta a exceção 
ObjectNotFoundException
� Somente deve ser utilizado se a instância existir ou se a sua 
inexistência for realmente um erro fatal – preferível utilizar get()
Busca pela chave prim
ária
package agenda;
import ... 
public class Consulta
{
private Pessoa pessoa = new Pessoa();
public void setId(int id) { pessoa.setId(id); }
public void setNome(String nome) { pessoa.setNome(nome); }
public int getId() { return pessoa.getId(); }
public String getNome() { return pessoa.getNome(); }
public String getEndereco() { return pessoa.getEndereco(); }
public String getTelefone() { return pessoa.getTelefone(); }
public String getIp() { return pessoa.getIp(); }
public void consulteId()
{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
pessoa = (Pessoa) session.get(Pessoa.class, pessoa.getId());
session.close();
}
}
710
Alteração da informação
� Passos:
� Configurar uma fábrica de sessões
� Obter um sessão da fábrica de sessões
� Iniciar uma transação
� Realizar a busca usando a chave primaria
� Modificar a instância devolvida
� Commitar a transação em caso de sucesso (ou 
desfazer em caso de erro)
� Sincronizar a sessão
� Fechar a sessão
� Fechar acesso à fábrica de sessões
package agenda;
import ...
public class Atualiza
{
private Pessoa pessoa = new Pessoa();
public void setId(int id) { pessoa.setId(id); }
public void setNome(String nome) { pessoa.setNome(nome); }
public String getNome() { return pessoa.getNome(); }
publicvoid setEndereco(String endereco) { pessoa.setEndereco(endereco); }
public String getEndereco() { return pessoa.getEndereco(); }
public void setTelefone(String telefone) { pessoa.setTelefone(telefone); }
public String getTelefone() { return pessoa.getTelefone(); }
public void atualiza()
{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Pessoa pessoa = (Pessoa) session.get(Pessoa.class, this.pessoa.getId());
pessoa.setNome(this.pessoa.getNome());
pessoa.setEndereco(this.pessoa.getEndereco());
pessoa.setTelefone(this.pessoa.getTelefone());
transaction.commit();
session.flush();
session.close();
}
}
712
Estados do objeto
713
Remoção de itens
� Passos – a partir de um vetor de identidades
� Criar um SessionFactory
� Obter uma sessão
� Iniciar uma transação (só interessa remover todos ou 
nenhum)
� Para cada id
� Instanciar uma pessoa (só precisa do ID)
� Remove a pessoa
� Commitar a transação (composta por várias remoções)
� Sincronizar o banco
� Fechar a sessão
� Fechar a fábrica
package agenda;
import ...
public class Apaga
{
private int [] id;
public int[] getId() { return id; }
public void setId(int[] id) { this.id = id; }
public void remove()
{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
for (int i = 0; i < id.length; i++)
{
Pessoa pessoa = new Pessoa(id[i]);
session.delete(pessoa);
}
transaction.commit();
session.flush();
session.close();
}
}
715
Estados o objeto
716
Perguntas?
717
Exercícios
718
Agenda Eletrônica
� Modifique a agenda eletrônica já feita 
utilizando Hibernate
Agenda Completa usando Hibernate
720
Tabela do banco de dados
CREATE TABLE `CADASTRO`
(
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NOME` varchar(50) default NULL,
`ENDERECO` varchar(50) default NULL,
`TELEFONE` varchar(50) default NULL,
`IP` varchar(50) default NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM;
721
Projeto no eclipse
723
Detalhe da biblioteca com o Hibernate (versão 3.6)
724
Conector Java
� Inclua também o conector Java para MySQL 
na sua biblioteca ou arraste para dentro de 
WEB-INF/lib
� Você pode baixar o conector diretamente no 
site do mySQL
Arquivo hibernate.cfg.xm
l
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE 
hibernate-configuration 
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://MeuServidorDB/AgendaSimples</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">8752</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="hibernate.connection.pool_size">10</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.use_sql_comments">true</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- List of annotated classes -->
<mapping class="modelo.Pessoa"/>
</session-factory>
</hibernate-configuration>
726
Classe Pessoa
package modelo;
import javax.persistence.*;
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = "ID")
private int id;
@Column(name = "NOME")
private String nome;
@Column(name = "ENDERECO")
private String endereco;
@Column(name = "TELEFONE")
private String telefone;
@Column(name = "IP")
private String ip;
public Pessoa()
{
}
public Pessoa(int id)
{
this.id = id;
}
public Pessoa(String nome, String endereco, String telefone, String ip)
{
this.nome = nome;
this.endereco = endereco;
this.telefone = telefone;
this.ip = ip;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getNome()
{
return nome;
}
public void setNome(String nome)
{
this.nome = nome;
}
public String getEndereco()
{
return endereco;
}
public void setEndereco(String endereco)
{
this.endereco = endereco;
}
public String getTelefone()
{
return telefone;
}
public void setTelefone(String telefone)
{
this.telefone = telefone;
}
public String getIp()
{
return ip;
}
public void setIp(String ip)
{
this.ip = ip;
}
}
package modelo;
import javax.persistence.*;
@Entity
@Table(name = "CADASTRO")
public class Pessoa
{
@Id
@GeneratedValue (strategy=GenerationType.AUTO)
@Column(name = "ID")
private int id;
@Column(name = "NOME")
private String nome;
@Column(name = "ENDERECO")
private String endereco;
@Column(name = "TELEFONE")
private String telefone;
@Column(name = "IP")
private String ip;
}
727
Classe HibernateUtil
package util;
import org.hibernate.*;
import org.hibernate.cfg.*;
public class HibernateUtil
{
private static final SessionFactory sessionFactory;
static
{
try
{
// Create the SessionFactory from hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} 
catch (HibernateException ex) 
{
// Make sure you log the exception, as it might be swallowed
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() 
{
return sessionFactory;
}
}
728
Formulário da Agenda
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
</body>
</html>
729
Formulário da Agenda – Inserção
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
</body>
</html>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>>
730
Formulário da Agenda – Consulta
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
</body>
</html>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" 
method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
731
Formulário da Agenda – Exclusão
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
</body>
</html>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
732
Formulário da Agenda – Alteração
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td>
<input type="texto" name="endereco">
</td>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td><input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
</body>
</html>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" 
method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td>
<input type="text" name="nome">
</td>
</tr>
<tr>
<td>
<input type="submit" value="Envia">
</td>
<td>
<input type="reset" value="Apaga">
</td>
</tr>
</table>
</form>
Consulta
734
Formulário da Agenda – Consulta
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
</body>
</html>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
735
Resultado da Consulta
<%@ page 
language="java" 
import="modelo.Pessoa,java.util.*"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Resultado da Consulta</title>
</head>
<body>
<h1>Resultado da Consulta</h1>
Consultando: <b><%=request.getParameter("nome")%></b>
<hr>
<jsp:useBean id="consulta" class="agenda.Consulta" scope="page">
<jsp:setProperty name="consulta" property="*"/>
</jsp:useBean>
<%
for (Iterator<Pessoa> itens = consulta.consulteNome(); itens.hasNext();)
{
Pessoa pessoa = (Pessoa)itens.next();
%>
<table>
<tr>
<td align="right">ID:</td><td><b><%=pessoa.getId() %></b></td>
</tr>
<tr>
<td align="right">Nome:</td><td><b><%=pessoa.getNome() %></b></td>
</tr>
<tr>
<td align="right">Endereço:</td><td><b><%=pessoa.getEndereco() %></b></td>
</tr>
<tr>
<td align="right">Telefone:</td><td><b><%=pessoa.getTelefone()%></b></td>
</tr>
<tr>
<td align="right">IP:</td><td><b><%=pessoa.getIp() %></b></td>
</tr>
<tr>
<td colspan="2" bgcolor="#000000"></td>
</tr>
</table>
<%
}
%>
<p>
<a href='../index.html'>Início</a>
</body>
</html>
R
esultado da Consulta –
consulta.jsp
<jsp:useBean id="consulta" class="agenda.Consulta" scope="page">
<jsp:setProperty name="consulta" property="*"/>
</jsp:useBean>
<%
for (Iterator<Pessoa> itens = consulta.consulteNome(); itens.hasNext();)
{
Pessoa pessoa = (Pessoa)itens.next();
%>
<table>
<tr><td align="right">ID:</td><td><b><%=pessoa.getId()%></b></td></tr>
<tr><td align="right">Nome:</td><td><b><%=pessoa.getNome()%></b></td></tr>
<tr><td align="right">Endereço:</td><td><b><%=pessoa.getEndereco()%></b></td></tr>
<tr><td align="right">Telefone:</td><td><b><%=pessoa.getTelefone()%></b></td></tr>
<tr><td align="right">IP:</td><td><b><%=pessoa.getIp()%></b></td> </tr>
<tr><td colspan="2" bgcolor="#000000"></td></tr>
</table>
<%
}
%>
Consulta.java –
construtor e getter&
setter
package agenda;
import java.util.*;
import org.hibernate.*;
import util.HibernateUtil;
import modelo.Pessoa;
public class Consulta
{
private Pessoa pessoa;
public void setId(int id) { pessoa.setId(id); }
public void setNome(String nome) { pessoa.setNome(nome); }
public int getId() { return pessoa.getId(); }
public String getNome() { return pessoa.getNome(); }
public String getEndereco() { return pessoa.getEndereco(); }
public String getTelefone() { return pessoa.getTelefone(); }
public String getIp() { return pessoa.getIp(); }
public Consulta()
{
pessoa = new Pessoa();
}
}
Consulta.java –
consulta por nom
e
package agenda;
public class Consulta
{
private Pessoa pessoa;
public Iterator consulteNome()
{
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
String queryString = "from Pessoa cadastro where nome like '%" + 
pessoa.getNome() + "%' order by nome";
Query query = session.createQuery(queryString);
Iterator itens = query.list().iterator();
transaction.commit();
session.close();
return itens;
}
}
Inserção
740
Formulário da Agenda – Inserção
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
</body>
</html>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset"value="Apaga"></td>
</tr>
</table>
</form>
741
Inserção
<html>
<body>
<h1>Inclusão</h1>
<table>
<tr><td align="right">Nome:</td><td><%=request.getParameter("nome") %></td></tr>
<tr><td align="right">Endereço:</td><td><%=request.getParameter("endereco") %></td></tr>
<tr><td align="right">Telefone:</td><td><%=request.getParameter("telefone") %></td></tr>
<tr><td align="right">IP:</td><td><%=request.getRemoteAddr() %></td></tr>
</table>
<jsp:useBean id="pessoa" class="agenda.NovaPessoa" scope="page">
<jsp:setProperty name="pessoa" property="ip" value="<%=request.getRemoteAddr() %>"/>
<jsp:setProperty name="pessoa" property="nome" param="nome"/>
<jsp:setProperty name="pessoa" property="endereco" param="endereco"/>
<jsp:setProperty name="pessoa" property="telefone" param="telefone"/>
</jsp:useBean>
<%
pessoa.persiste(); 
if (pessoa.getStatus()) out.println("Operação realizada com sucesso!");
else out.println(pessoa.getMsgErro());
%>
<p>
</body>
</html>
package agenda;
public class NovaPessoa
{
private String nome;
private String endereco;
private String telefone;
private String ip;
private String msgErro;
private boolean status;
// gettes & setters
public String getNome() { return nome; }
public void setNome(String nome) { this.nome = nome; }
public String getEndereco() { return endereco; }
public void setEndereco(String endereco) { this.endereco = endereco; }
public String getTelefone() { return telefone; }
public void setTelefone(String telefone) { this.telefone = telefone; }
public String getIp() { return ip; }
public void setIp(String ip) { this.ip = ip; }
public String getMsgErro() { return msgErro; }
public void setMsgErro(String msgErro) { this.msgErro = msgErro; }
public boolean getStatus() { return status; }
public void setStatus(boolean status) { this.status = status; }
}
Classe N
ovaPessoa –
contrutor e getter&
setter
Classe N
ovaPessoa –
m
étodo
package agenda;
public class NovaPessoa
{
public void persiste()
{
Session session;
SessionFactory sessionFactory;
Transaction transacao;
Pessoa pessoa=new Pessoa(nome,endereco,telefone,ip);
status = true;
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
transacao = session.beginTransaction();
session.save(pessoa);
transacao.commit();
session.flush();
session.close();
}
}
Exclusão
745
Formulário da Agenda – Exclusão
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
</body>
</html>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
apaga.jsp
<%@ page language="java“ import="java.util.*, modelo.*“ %>
<html>
<head>
<title>Remoção (passo 1/2)</title>
</head>
<body>
<h1>Selecione a entrada do banco</h1>
<jsp:useBean id="consulta" class="agenda.Consulta" scope="page">
<jsp:setProperty name="consulta" property="*"/>
</jsp:useBean>
<form action="apaga2.jsp" method="post">
<table>
<tr>
<th>&nbsp;</th>
<th>Nome</th>
<th>Endereço</th>
<th>Telefone</th>
</tr>
<%
for (Iterator<Pessoa> itens = consulta.consulteNome(); itens.hasNext();)
{
Pessoa pessoa = (Pessoa)itens.next();
%>
<tr>
<td align="center">
<input type="checkbox" name="id" value="<%=pessoa.getId() %>">
</td>
<td><%=pessoa.getNome() %></td>
<td><%=pessoa.getEndereco() %></td>
<td><%=pessoa.getTelefone()%></td>
</tr>
<%
}
%>
<tr>
<td>&nbsp;</td>
<td><input type="submit" value="Remove"></td>
<td><input type="reset" value="Limpa"></td>
</tr>
</table>
</form>
</body>
</html>
apaga2.jsp
<%@ page language="java" %>
<html>
<head>
<title>Remoção (passo 2/2)</title>
</head>
<body>
<h1>Resultado da remoção</h1>
<jsp:useBean id="remove" class="agenda.Apaga">
<jsp:setProperty name="remove" property="*"/>
</jsp:useBean>
<%remove.remove(); %>
</body>
</html>
Apaga.java
package agenda;
public class Apaga
{
private int[] id;
// métodos de acesso
public int[] getId() { return id; }
public void setId(int[] id) { this.id = id; }
public void remove()
{
SessionFactory sessionFactory = 
HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
for (int i = 0; i < id.length; i++)
{
Pessoa pessoa = new Pessoa(id[i]);
session.delete(pessoa);
}
transaction.commit();
session.flush();
session.close();
}
}
Alteração
750
Formulário da Agenda – Alteração
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Agenda Eletrônica Simples</title>
</head>
<body>
<h1>Insere</h1>
<form action="insere/insere.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Consulta</h1>
<form action="consulta/consulta.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Exclui</h1>
<form action="apaga/apaga.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td></tr>
</table>
</form>
</body>
</html>
<h1>Altera</h1>
<form action="atualiza/atualiza.jsp" method="post">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome">
</tr>
<tr>
<td><input type="submit" value="Envia"></td>
<td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
atualiza.jsp
<%@ page language="java" import="modelo.Pessoa,java.util.*“ %>
<html>
<head>
<title>Atualização (passo 1/3)</title>
</head>
<body>
<h1>Selecione a entrada do banco</h1>
<jsp:useBean id="consulta" class="agenda.Consulta" scope="page">
<jsp:setProperty name="consulta" property="*"/>
</jsp:useBean>
<form action="atualiza2.jsp" method="post">
<table>
<tr>
<th>&nbsp;</th><th>Nome</th><th>Endereço</th><th>Telefone</th>
</tr>
<%
for (Iterator<Pessoa> itens = consulta.consulteNome(); itens.hasNext();)
{
Pessoa pessoa = (Pessoa)itens.next();
%>
<tr>
<td align="center">
<input type="radio" name="id" value="<%=pessoa.getId() %>" onclick="javascript:submit()">
</td>
<td><%=pessoa.getNome() %></td><td><%=pessoa.getEndereco() %></td><td><%=pessoa.getTelefone()%></td>
</tr>
<%
}
%>
</table>
</form>
</body>
</html>
atualiza2.jsp
<%@ page language="java" pageEncoding="ISO-8859-1“ import="agenda.Consulta"%>
<html>
<body>
<h1>Atualize os dados</h1>
<jsp:useBean id="consulta" class="agenda.Consulta" scope="page">
<jsp:setProperty name="consulta" property="*"/>
</jsp:useBean>
<%consulta.consulteId();%>
<form action="atualiza3.jsp" method="post">
<input type="hidden" name="id" value="<jsp:getProperty name="consulta" property="id"/>">
<table>
<tr>
<td align="right">Nome:</td>
<td><input type="text" name="nome" value="<jsp:getProperty name="consulta"
property="nome"/>">
</tr>
<tr>
<td align="right">Endereço:</td>
<td><input type="texto" name="endereco" value="<jsp:getProperty name="consulta"
property="endereco"/>">
</tr>
<tr>
<td align="right">Telefone:</td>
<td><input type="text" name="telefone" value="<jsp:getProperty name="consulta"
property="telefone"/>">
</tr>
<tr>
<td><input type="submit" value="Envia"></td><td><input type="reset" value="Apaga"></td>
</tr>
</table>
</form>
</body>
</html>
atualiza3.jsp
<%@ page language="java" %>
<html>
<head>
<title>Atualização (passo 2/3)</title>
</head>
<body>
<h1>Resultado da Atualização</h1>
<jsp:useBean id="atualiza" class="agenda.Atualiza" scope="page">
<jsp:setProperty name="atualiza" property="*"/>
</jsp:useBean>
<%atualiza.atualiza(); %>
<table>
<tr>
<td align="right">Nome:</td>
<td><jsp:getProperty name="atualiza" property="nome"/>
</tr>
<tr>
<td align="right">Endereço:</td>
<td><jsp:getProperty name="atualiza" property="endereco"/>
</tr>
<tr>
<td align="right">Telefone:</td>
<td><jsp:getProperty name="atualiza" property="telefone"/>
</tr>
</table>
</body>
</html>
Atualiza.java –
contrutor e getters &
 setters
package agenda;
import org.hibernate.*;
import modelo.Pessoa;
import util.HibernateUtil;
public class Atualiza
{
private Pessoa pessoa;
public void setId(int id) { pessoa.setId(id); }
public void setNome(String nome) { pessoa.setNome(nome); }
public String getNome() { return pessoa.getNome(); }
public void setEndereco(String endereco) 
{ 
pessoa.setEndereco(endereco); 
}
public String getEndereco() 
{ 
return pessoa.getEndereco(); 
}
public void setTelefone(String telefone) 
{ 
pessoa.setTelefone(telefone); 
}
public String getTelefone() { return pessoa.getTelefone(); }
public Atualiza()
{
pessoa = new Pessoa();
}
}
Atualiza.java –
m
étodo
package agenda;
public class Atualiza
{
private Pessoa pessoa;
public void atualiza()
{
SessionFactory sessionFactory = 
HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = 
session.beginTransaction();
Pessoa pessoa = (Pessoa) session.get(Pessoa.class, 
this.pessoa.getId());
pessoa.setNome(this.pessoa.getNome());
pessoa.setEndereco(this.pessoa.getEndereco());
pessoa.setTelefone(this.pessoa.getTelefone());
transaction.commit();
session.flush();
session.close();
}
}
756
Perguntas?
757
Exercícios
758
Banco de Dados
1. Faça uma página com o conteúdo de acesso restrito. O 
acesso ao conteúdo desta página somente será permitido 
caso o usuário efetue login no sistema (ou seja, faça 
também uma página de login).
2. Faça uma página que possua um contador de acesso 
usando banco de dados.
3. Faça um sistema de controle online de estoque. As 
seguintes operações devem ser implementadas:
� Cadastro de produto – devem ser informados código e descrição
� Compra de itens do fornecedor para o estoque – devem ser 
informados código e quantidade comprada
� Venda de itens do estoque para o consumidor – devem ser 
informados código e quantidade vendida
� Relatório de todo o estoque
759
Parte 12
� Relacionando tabelas
760
Cascade
� Por default, em nenhuma operação é feito o 
Cascade
� O Hibernate permite a configuração do tipo 
de comportamento desejado para cada 
associação
� Tipos de associação:
� one-to-one
� one-to-many
� many-to-many
� many-to-one
761
org.hibernate.annotations.CascadeType
� ALL : habilita todos os tipos de cascateamento
� DELETE : objetos relacionados são removidos após a chamada de 
delete()
� DELETE_ORPHAN : remove um objeto quando excluído de uma coleção
� MERGE : propaga a operação de merge()
� PERSIST : propaga a persistência para os objetos associados
� REFRESH : propaga a operação de refresh()
� REMOVE : propaga a operação de delete() para os objetos associados
� SAVE_UPDATE : objetos transientes são salvos e desconectados são 
sincronizados
762
Associação one-to-one
� O atributo que leva a associação deve conter a 
anotação @OneToOne
763
Associação one-to-one (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, `idFilho` int(11) DEFAULT 
NULL, PRIMARY KEY (`id`), KEY 
`FK5D4F75BF13895C4` (`idFilho`), 
CONSTRAINT `FK5D4F75BF13895C4` 
FOREIGN KEY (`idFilho`) REFERENCES 
`filho` (`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=4 DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB AUTO_INCREMENT=4 
DEFAULT CHARSET=latin1;
Associação one-to-one (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
sessionFactory = HibernateUtil.getSesso...
sessao = sessionFactory.openSession();
for(int i=0; i<3; i++)
{
transacao = sessao.beginTransaction();
Pai pai = new Pai ();
Filho filho = new Filho ();
pai.setName("Pai " + i);
filho.setName("Filho " + i);
pai.setFilho(filho);
sessao.save(pai);
transacao.commit();
}
sessao.close();
764
Associação one-to-one (unidirecional)
@Entity
public class Pai
{@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
sessionFactory = HibernateUtil.getSe...
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.print(pai.getName());
out.print(pai.getFilho().getName());
}
765
766
Associação one-to-one
� O atributo que leva a associação deve conter a 
anotação @OneToOne
� Se o relacionamento for bidirecional os dois 
atributos devem conter a anotação
� Em uma das classes, deve ser adicionada a anotação 
@JoinColumn a propriedade da associação
� Na outra classe, o atributo mappedBy deve ser incluido 
na anotação @OneToOne ou será criado uma chave 
estrangeira nesta classe
767
Associação one-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(mappedBy="filho")
private Pai pai;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, `idFilho` int(11) DEFAULT 
NULL, PRIMARY KEY (`id`), KEY 
`FKFCB0430C6B5AEA50` (`idFilho`), 
CONSTRAINT `FKFCB0430C6B5AEA50` 
FOREIGN KEY (`idFilho`) REFERENCES 
`filho` (`id`)) ENGINE=InnoDB DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB DEFAULT 
CHARSET=latin1;
Associação one-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(mappedBy="filho")
private Pai pai;
}
sessionFactory = HibernateUtil.getSessi...
sessao = sessionFactory.openSession();
for(int i=0; i<3; i++)
{
transacao = sessao.beginTransaction();
Pai pai = new Pai ();
Filho filho = new Filho ();
pai.setName("Pai " + i);
filho.setName("Filho " + i);
pai.setFilho(filho);
// filho.setPai(pai);
sessao.save(pai);
transacao.commit();
}
sessao.close();
768
Filho.setPai(pai) está dentro 
do setFilho() da classe Pai 
como filho.setPai(this)
Associação one-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(mappedBy="filho")
private Pai pai;
}
sessionFactory = HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getName()+" é pai de " );
out.println(pai.getFilho().getName());
out.println(pai.getFilho().getName());
out.println(" é filho de ");
out.println(pai.getFilho().getPai().getName());
}
...
sql = "from Filho";
query = sessao.createQuery(sql);
for(Filho filho: (List<Filho>)query.list())
{
out.println(filho.getPai().getName());
out.println(" é pai de "+ filho.getName());
out.println(filho.getName()+" é filho de ");
out.println(filho.getPai().getName());
} 769
Associação one-to-one (bidirecional)
� Se for necessária a 
inclusão de chave 
estrangeira nas duas 
classes, deve-se omitir 
o atributo mappedBy
� Neste caso, deve-se 
explicitar o 
relacionamento entre 
pai e filho e filho e pai.
pai.setFilho(filho);
filho.setPai(pai);
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Pai pai;
}
770
Sem o atributo 
mappedBy
Associação one-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Filho filho;
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
private Pai pai;
}
CREATE TABLE `PaiOneToOneBidirecional` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`filho_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKFCB0430CDCD848A5` (`filho_id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 
DEFAULT CHARSET=latin1$$
------------------------------------
CREATE TABLE `FilhoOneToOneBidirecional` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`pai_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK95338944D8E70965` (`pai_id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 
DEFAULT CHARSET=latin1$$
771
Associação one-to-one (bidirecional)
sessionFactory = HibernateUtil...
sessao = sessionFactory.openSe...
for(int i=0; i<3; i++)
{
transacao = sessao.beginTra...
Pai pai = new Pai ();
Filho filho = new Filho ();
pai.setName("Pai " + i);
filho.setName("Filho " + i);
pai.setFilho(filho);
filho.setPai(pai);
sessao.save(pai);
transacao.commit();
}
sessao.close();
sessionFactory = HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getName()+" é pai de " );
out.println(pai.getFilho().getName());
out.println(pai.getFilho().getName());
out.println(" é filho de ");
out.println(pai.getFilho().getPai().getName());
}
...
sql = "from Filho";
query = sessao.createQuery(sql);
for(Filho filho: (List<Filho>)query.list())
{
out.println(filho.getPai().getName());
out.println(" é pai de "+ filho.getName());
out.println(filho.getName()+" é filho de ");
out.println(filho.getPai().getName());
}
772
773
Mapeamento um para um (one-to-one)
� Mapeamento usando chave 
primária de mesmo valor
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String name;
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
private Filho filho;
}
--------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB;
CREATE TABLE `filho` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `name` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB;
Associação one-to-many
� O atributo que leva a associação deve contera 
anotação @OneToMany
774
775
Associação one-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinColumn(name="idPai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, 
PRIMARY KEY (`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=5 DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, `idPai` 
int(11) DEFAULT NULL, PRIMARY KEY 
(`id`), KEY `FK7DB75D483AC73BE8` 
(`idPai`), CONSTRAINT 
`FK7DB75D483AC73BE8` FOREIGN 
KEY (`idPai`) REFERENCES `pai` (`id`)) 
ENGINE=InnoDB 
AUTO_INCREMENT=13 DEFAULT 
CHARSET=latin1;
Sem o @JoinColumn, é 
criada uma tabela a mais 
apenas para representar o 
relacionamento
776
Associação one-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinColumn(name="idPai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
sessionFactory = HibernateUtil.getSessionFacto...
sessao = sessionFactory.openSession();
for(int j=0; j<4; j++)
{
// Pai e 3 Filhos
transacao = sessao.beginTransaction();
Pai pai = new Pai ();
pai.setNome("Pai " + j);
sessao.save(pai);
for(int i=0; i< 3; i++)
{
Filho filho = new Filho ();
filho.setNome("Filho "+(i+1)+" do "+j);
pai.addFilho(filho);
}
transacao.commit();
}
sessao.close();
777
Associação one-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinColumn(name="idPai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
sessionFactory = HibernateUtil.get...
sessao = sessionFactory.openSessio...
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
for(Filho filho: pai.getFilhos())
{
out.println(filho.getNome());
}
}
Associação one-to-many
� O atributo que leva a associação deve conter a 
anotação @OneToMany
� Se o relacionamento for bidirecional, a outra classe 
terá uma anotação @ManyToOne.
� Deve ser utilizado o atributo MappedBy em uma das 
classes 
778
779
Associação one-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER, 
mappedBy="pai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Generation
Type.IDENTITY)
private int id;
private String nome;
@ManyToOne(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
private Pai pai;
}
� Script SQL
CREATE TABLE `pai` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`nome` varchar(255) DEFAULT NULL, 
PRIMARY KEY (`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=5 DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`nome` varchar(255) DEFAULT NULL, 
`pai_id` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`), KEY 
`FK5322EB7FB913DB09` (`pai_id`), 
CONSTRAINT `FK5322EB7FB913DB09` 
FOREIGN KEY (`pai_id`) REFERENCES `pai` 
(`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=13 DEFAULT 
CHARSET=latin1;
780
Associação one-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER, 
mappedBy="pai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Generation
Type.IDENTITY)
private int id;
@ManyToOne(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
private Pai pai;
private String nome;
}
sessionFactory = HibernateUtil.getSessionFacto...
sessao = sessionFactory.openSession();
for(int j=0; j<4; j++)
{
// Pai e 3 Filhos
transacao = sessao.beginTransaction();
Pai pai = new Pai ();
pai.setNome("Pai " + j);
sessao.save(pai);
for(int i=0; i< 3; i++)
{
Filho filho = new Filho ();
filho.setNome("Filho "+(i+1)+" do "+j);
pai.addFilho(filho);
}
transacao.commit();
}
sessao.close();
781
Associação one-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Generation
Type.AUTO)
private int id;
private String nome;
@OneToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER, 
mappedBy="pai")
private List<Filho> filhos = new
ArrayList<Filho>();
}
---------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Generation
Type.IDENTITY)
private int id;
@ManyToOne(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
private Pai pai;
private String nome;
}
sessionFactory = HibernateUtil.getSessionF...
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
for(Filho filho: pai.getFilhos())
{
out.println(filho.getNome());
}
}
...
sql = "from Filho";
query = sessao.createQuery(sql);
for(Filho filho: (List<Filho>)query.list())
{
out.println(filho.getNome()); 
out.println(filho.getPai().getNome()); 
}
sessao.close();
Associação many-to-one
� O atributo que leva a associação deve conter 
a anotação @ManyToOne
782
783
Associação many-to-one (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, 
`filho_id` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`), KEY 
`FKA004CB44A1892315` (`filho_id`), 
CONSTRAINT `FKA004CB44A1892315` 
FOREIGN KEY (`filho_id`) 
REFERENCES `filho` (`id`)) 
ENGINE=InnoDB 
AUTO_INCREMENT=25 DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, 
PRIMARY KEY (`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=9 DEFAULT 
CHARSET=latin1;
784
Associação many-to-one (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)private int id;
private String name;
}
sessionFactory = HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
for(int j=0; j<4; j++)
{
transacao = sessao.beginTransaction();
Filho filho = new Filho ();
filho.setNome("Filho" + j);
for(int i=0; i< 3; i++)
{
Pai pai = new Pai ();
sessao.save(pai);
pai.setNome("Pai "+(i+1)+" do filho "+j);
pai.setFilho(filho);
}
transacao.commit();
}
sessao.close();
785
Associação many-to-one (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue
(strategy=GenerationType.AUTO)
private int id;
private String name;
}
sessionFactory = HibernateUtil.getSessi...
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
out.println(pai.getFilho().getNome());
}
Associação many-to-one
� O atributo que leva a associação deve conter 
a anotação @ManyToOne
� Se o relacionamento for bidirecional, a outra 
classe terá uma anotação @OneToMany com 
o atributo MappedBy informando qual o 
atributo que está sendo utilizado para realizar 
o relacionamento
786
787
Associação many-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@OneToMany(mappedBy="filho")
private List<Pai> pais;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, 
`filho_id` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`), KEY 
`FK22B1CE03FE8D0B19` (`filho_id`), 
CONSTRAINT `FK22B1CE03FE8D0B19` 
FOREIGN KEY (`filho_id`) 
REFERENCES `filho` (`id`)) 
ENGINE=InnoDB 
AUTO_INCREMENT=13 DEFAULT 
CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT 
NULL AUTO_INCREMENT, `nome` 
varchar(255) DEFAULT NULL, 
PRIMARY KEY (`id`)) ENGINE=InnoDB 
AUTO_INCREMENT=5 DEFAULT 
CHARSET=latin1;
788
Associação many-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@OneToMany(mappedBy="filho")
private List<Pai> pais;
}
sessionFactory = HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
for(int j=0; j<4; j++)
{
transacao = sessao.beginTransaction();
Filho filho = new Filho ();
filho.setNome("Filho" + j);
for(int i=0; i< 3; i++)
{
Pai pai = new Pai ();
pai.setNome("Pai "+(i+1)+" do filho "+j);
pai.setFilho(filho);
sessao.save(pai);
}
transacao.commit();
}
sessao.close();
789
Associação many-to-one (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@ManyToOne(cascade=CascadeType.
ALL)
private Filho filho;
}
----------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=Genera
tionType.AUTO)
private int id;
private String nome;
@OneToMany(mappedBy="filho")
private List<Pai> pais;
}
sessionFactory = 
HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
out.println(pai.getFilho().getNome());
}
...
sql = "from Filho";
query = sessao.createQuery(sql);
for(Filho filho: (List<Filho>)query.list())
{
out.println(filho.getNome());
for(Pai pai: filho.getPais())
{
out.println(pai.getNome());
}
}
sessao.close();
Associação many-to-many
� O atributo que leva a associação deve conter 
a anotação @ManyToMany
790
791
Associação many-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="Pai_Filho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `nome` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB AUTO_INCREMENT=5 
DEFAULT CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `nome` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB AUTO_INCREMENT=5 
DEFAULT CHARSET=latin1;
CREATE TABLE `pai_filho` ( `Pai_id` int(11) 
NOT NULL, `filhos_id` int(11) NOT NULL, 
KEY `FKFA3094072512125A` (`Pai_id`), KEY 
`FKFA309407C15B9AA6` (`filhos_id`), 
CONSTRAINT `FKFA309407C15B9AA6` 
FOREIGN KEY (`filhos_id`) REFERENCES 
`filho` (`id`), CONSTRAINT 
`FKFA3094072512125A` FOREIGN KEY 
(`Pai_id`) REFERENCES `pai` (`id`)) 
ENGINE=InnoDB DEFAULT 
CHARSET=latin1;
792
Associação many-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="Pai_Filho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
}
sessionFactory = 
HibernateUtil.getSessionFactory();
sessao = sessionFactory.openSession();
List<Pai> pais = new ArrayList<Pai>();
List<Filho> filhos = new ArrayList<Filho>();
for(int i=0; i<4; i++)
{
Pai pai = new Pai ();
pai.setNome("Pai "+i);
pais.add(pai);
Filho filho = new Filho ();
filho.setNome("Filho "+i);
filhos.add(filho);
}
transacao = sessao.beginTransaction();
for(Pai pai: pais)
{
for(Filho filho: filhos)
{
pai.addFilho(filho);
}
sessao.save(pai);
}
transacao.commit();
sessao.close();
793
Associação many-to-many (unidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(name="Pai_Filho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationTy
pe.AUTO)
private int id;
private String nome;
}
sessionFactory = HibernateUtil.getSessi...
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
for(Filho filho: pai.getFilhos())
{
out.println(filho.getNome());
}
}
sessao.close();
Associação many-to-many
� O atributo que leva a associação deve conter 
a anotação @ManyToMany
� Se o relacionamento for bidirecional, pode ser 
necessário utilizar a anotação @JoinTable
para especificar o nome da tabela auxiliar
794
795
Associaçãomany-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinTable(name="PaiFilho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(mappedBy="filhos", 
fetch=FetchType.EAGER)
private List<Pai> pais = new
ArrayList<Pai>();
}
� Script SQL
CREATE TABLE `pai` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `nome` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB AUTO_INCREMENT=5 
DEFAULT CHARSET=latin1;
CREATE TABLE `filho` ( `id` int(11) NOT NULL 
AUTO_INCREMENT, `nome` varchar(255) 
DEFAULT NULL, PRIMARY KEY (`id`)) 
ENGINE=InnoDB AUTO_INCREMENT=5 
DEFAULT CHARSET=latin1;
CREATE TABLE `paifilho` ( `pais_id` int(11) NOT 
NULL, `filhos_id` int(11) NOT NULL, KEY 
`FK9D2F1360EC92EE6A` (`pais_id`), KEY 
`FK9D2F13603FE12E1A` (`filhos_id`), 
CONSTRAINT `FK9D2F13603FE12E1A` 
FOREIGN KEY (`filhos_id`) REFERENCES 
`filho` (`id`), CONSTRAINT 
`FK9D2F1360EC92EE6A` FOREIGN KEY 
(`pais_id`) REFERENCES `pai` (`id`)) 
ENGINE=InnoDB DEFAULT 
CHARSET=latin1;
796
Associação many-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinTable(name="PaiFilho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(mappedBy="filhos", 
fetch=FetchType.EAGER)
private List<Pai> pais = new
ArrayList<Pai>();
}
sessionFactory = HibernateUtil.getSessionFacto...
sessao = sessionFactory.openSession();
List<Pai> pais = new ArrayList<Pai>();
List<Filho> filhos = new ArrayList<Filho>();
for(int i=0; i<4; i++)
{
Pai pai = new Pai ();
pai.setNome("Pai "+i);
pais.add(pai);
Filho filho = new Filho ();
filho.setNome("Filho "+i);
filhos.add(filho);
}
transacao = sessao.beginTransaction();
for(Pai pai: pais)
{
for(Filho filho: filhos)
{
pai.addFilho(filho);
}
sessao.save(pai);
}
transacao.commit();
sessao.close();
797
Associação many-to-many (bidirecional)
@Entity
public class Pai
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(cascade=CascadeType.ALL, 
fetch=FetchType.EAGER)
@JoinTable(name="PaiFilho")
private List<Filho> filhos = new
ArrayList<Filho>();
}
----------------------------------------
@Entity
public class Filho
{
@Id
@GeneratedValue(strategy=GenerationType.
AUTO)
private int id;
private String nome;
@ManyToMany(mappedBy="filhos", 
fetch=FetchType.EAGER)
private List<Pai> pais = new
ArrayList<Pai>();
}
sessionFactory = HibernateUtil.getSessionFacto...
sessao = sessionFactory.openSession();
sql = "from Pai";
query = sessao.createQuery(sql);
for(Pai pai: (List<Pai>)query.list())
{
out.println(pai.getNome());
for(Filho filho: pai.getFilhos())
{
out.println(filho.getNome());
}
}
sql = "from Filho";
query = sessao.createQuery(sql);
for(Filho filho: (List<Filho>)query.list())
{
out.println(filho.getNome());
for(Pai pai: filho.getPais())
{
out.println(pai.getNome()+"<br/>");
}
}
sessao.close();
HQL – Hibernate Query Language
799
Hibernate Query Language
� Hibernate possui uma poderosa linguagem de 
pesquisa (query) proprietária para acesso a 
banco de dados
� HQL é utilizada para realizar pesquisas ou 
filtrar dados de um banco de dados
� HQL é uma versão orientada a objeto de SQL
� Queries HQL são independentes do banco de 
dados
800
Hibernate Query Language
� Case Sensitivity
� HQL é “case-insensitive” ou seja, não diferencia 
maiúculas de minúsculas, exceto:
� Classes Java
� Propriedades Java
801
Hibernate Query Language
� HQL suporta características avançadas como 
paginação e innerjoin e outerjoin
� HQL suporta:
� Funções agregadas (sum(), max(), etc.)
� Ordenação, agrupamento, subqueries
� Ffunções SQL
� A maior parte das palavras reservadas em 
SQL são opcionais em HQL
802
Hibernate Query Language
� Um exemplo de uma query em HQL:
"from Empregado"
� Retorna todos os empregados de um banco de dados na 
forma de um objeto da classe Empregado
� HQL é polimorfico, retornando instâncias de todas as 
subclasses de uma classe
� Cláusulas:
� Select (opcional)
� from (necessário exceto com Session e Filter)
� where (opcional)
� Order By, Group By, Having, ...
803
Escrevendo HQL – cláusula where
� A interface para manipular uma query é definida em org.hibernate.Query 
Query query = session.createQuery("from Empregado");
� A lista de objetos pode ser obtida por
List queryList = query.list();
� A cláusula where permite delimitar a lista de instâncias retornadas. 
� O exemplo a seguir retorna todos os empregados identificados por empId 
(não é chave primária):
"from Empregado where Empregado.id = " + empId
804
Escrevendo HQL – cláusula select
� A cláusula select retorna os objetos em uma List 
através de uma Query
"select id from Empregado"
� Esta query vai retornar os id de todos os 
empregados
"select id from Empregados where 
Empregados.salario > 10000”
� Esta query vai retornar o id de todos os empregados 
que ganham mais do que 10000
805
Escrevendo HQL – queries polimórficas
� HQL é naturalmente polimórfica devido a 
heranças mapeadas
"from Empregado"
� Retorna todas as instâncias de Empregado e 
as suas subclasses também
� Pesquisa HQL polimórficas retornam 
instâncias de todas as classes persistentes 
que implementam a interface ou estendem a 
classe
806
Resumo de HQL – from
� A forma mais simples de query HQL
� Especifica o objeto cuja instância deve ser 
retornada
� Normalmente utilizado em conjunto com 
select
� Sintaxe:
from classe [as object_alias]* object_alias simply 
means another name given to refer to an object 
for convenience. 
� Exemplo:
from comp.Dept as dept
807
Resumo de HQL – from
public List<Usuario> consultaUsername()
{
Session session;
SessionFactory sessionFactory;
Transaction transaction;
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
String queryString = "from Usuario where username='" + 
getUsername() + "'";
Query query = session.createQuery(queryString);
List<Usuario> itens = query.list();
transaction.commit();
session.close();
sessionFactory.close();
return itens;
}
Retorna uma 
lista de 
“Usuario”
808
Resumo de HQL – select
� Especifica o objeto e a propriedade que 
deverão ser retornados pela query
� Utilizado em conjunto com comando from
� Sintaxe:
select [object.]property
� Exemplo:
select dept.mgr from comp.Dept as dept
809
Resumo de HQL – select
public List<String> consultaPassword()
{
Session session;
SessionFactory sessionFactory;
Transaction transaction;
sessionFactory = HibernateUtil.getSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
String queryString = "select username from Usuario where 
password='" + getPassword() + "'";
Query query = session.createQuery(queryString);
List<String> itens = query.list();
transaction.commit();
session.close();sessionFactory.close();
return itens;
}
Retorna uma 
lista de 
“String” 
(“usernames”)
810
Resumo de HQL – where
� Especifica a condição que o objeto deve 
satisfazer para ser retornado como resultado 
da query
� Utilizado em conjunto com select e/ou from
� Sintaxe:
where condition
� Exemplo:
select dept.mgr from comp.Dept as dept where 
dept.emp_no > 10
811
Resumo de HQL – order by
� Especifica a ordem (crescente/decrescente)
� Utilizado junto com o comando from e/ou 
select
� Sintaxe:
order by object0.property0 [asc|desc][, 
object1.property0]...
� Exemplo:
select dept.mgr from comp.Dept as dept order by 
dept.emp_no asc
812
Resumo de HQL – group by
� Especifica o critério de agrupamento 
utilizando propriedades de objetos
� Utilizado junto com from e/ou select
� Sintaxe:
group by object0.property0[, object1.property0]... 
� Exemplo:
select dept.emp_no from comp.Dept as dept group 
by dept.mgr
813
Perguntas?

Mais conteúdos dessa disciplina