Você está na página 1de 99

Introduo a

Java Server Pages


por Christian Cleber Masdeval Braz

Sumrio
I - Fundamentos Bsicos

3
5
10
12
12

A plataforma Web (HTTP)


Tecnologias de contedo dinmico
Aplicaes Web e Java
Como executar servlets e jsp
Web Container Tomcat

II Servlets

16

16
16
17
17
17
18

O que so Servlets?
Ciclo de Vida
Inicializao
Finalizao
Mtodos de Servio
Como criar um http servlet

III Scripts JSP

20

Elementos de criao de scripts


Declaraes
Expresses
Scriptlets
Controle de Fluxo
Comentrios
Diretivas JSP

20
22
23
24
26
30
32

IV Objetos Implcitos

41

Objetos Implcitos
Relacionados a Servlets
Relacionados ao Input/Output
Contextuais
Tratamento de Erros
Aes

41
42
43
48
55
56

V Cookies

61

VI Enviando e-mail com JSP

67

VII Trabalhando com Banco de Dados

71

71
71
72
73
73
74
75

Introduo a API JDBC


Como instalar um driver JDBC
Como estabelecer uma conexo com um banco de dados
Interagindo com banco de dados
Executando consultas
Executando alteraes
Executando stored procedures

A classe ResultSet

76

VIII Java Util

83

Apndice A Tratando Formulrios

87

Apndice B Instalando um container JSP TOMCAT

92

Apndice C HTTP - Hypertext Transfer Protocol

95

I - Fundamentos Bsicos
Este captulo cobre os seguintes tpicos :
-

A plataforma Web (HTTP)


Tecnologias de contedo dinmico
Aplicaes Web e Java
Como executar servlets e jsp
O Web Container Tomcat

A plataforma Web
 Baseada

em HTTP (RFC 2068)

 Protocolo

simples de transferncia de arquivos


 Sem estado (no mantm sesso aberta)
 Funcionamento

simplificado:

Mquina
www.xyz.com

Abre conexo para www.xyz.com:80

Soquete de Servio:80

Cliente
Uma requisio : GET /index.html ...
HTTP
(browser) Uma resposta: HTTP/1.1 200 Ok ...
Fecha conexo

Servidor
HTTP

index.html

Desenvolvido pelo ESMS.C

Cliente e Servidor HTTP


 Servidor

HTTP

 Mapeia

pastas do sistema de arquivos local (ex:


c:\htdocs) a diretrios virtuais (ex: /) acessveis
remotamente (notao URI)
 Interpreta requisies HTTP do cliente (mtodo GET,
POST, HEAD, ...)
 Devolve resposta HTTP sada padro
 Cliente

HTTP

 Envia

requisies HTTP a um servidor. Requisies


contm URI do recurso remoto, cabealho, dados
 Processa respostas HTTP (interpreta cabealhos)
Desenvolvido pelo ESMS.C

Principais m todos H T T P


G ET pede ao servidor um arquivo, inform ando


sua U R I absoluta
 Pode enviar dados porm o tam anho lim itado
 PO ST envia dados ao servidor (com o fluxo de
bytes)
 o m todo preferido quando se est usando
form ulrios para subm isso
 H EA D U sado para obter inform aes do
docum ento. A penas o cabealho retornado
D esen volvid o p elo E SM S.C

Tecnologias do lado Cliente


 As

principais tecnologias para criao de pginas


interativas no lado cliente so:


HTM L
 CSS Cascading Style Sheets
 DHTM L - Dynamic HTM L
 JavaScript
 VBScript
 Plug-ins applest, activeX
 Nenhuma

delas atende completamente a


necessidade das aplicaes web modernas
Desenvolvido pelo ESM S.C

Tecnologias do lado Servidor


 Estendem

as funes bsicas do servidor HTTP:

CGI Common Gateway Interface


 APIs: ISAPI, NSAPI, Apache API, Servlet API
 Scripts:ASP, JSP, Cold Fusion, PHP
 Rodam

do lado servidor, portanto, no dependem


de suporte por parte dos browsers
 Interceptam o curso normal da comunicao


Recebem dados via requisies HTTP (GET e POST)


 Devolvem dados atravs de respostas HTTP
Desenvolvido pelo ESM S.C

O que JSP ?
JSP um acrnimo para Java Server Pages e consiste numa linguagem de script baseada
em java para criao de sites com contedos dinmicos.
Inicialmente as pginas na Web eram apenas pginas estticas, isto , seu contedo no
variava a cada solicitao conforme algum parmetro. Com a sofisticao dos servios
disponibilizados via Web, surgiu a necessidade de disponibilizar informaes com
natureza dinmica (lista de preos atualizados, compras on-line, etc). Isso exigiu que o
servidor web fizesse algum processamento adicional da solicitao a fim de gerar uma
resposta personalizada. Algumas tecnologias para gerao de contedo dinamicamente
so :

CGI Common Gateway


Interface
 Especificao

que determina como construir uma


aplicao que ser executada pelo servidor Web
 Programas CGI podem ser escritos em qualquer
linguagem de programao. A especificao
limita-se a determinar os formatos de entrada e
sada dos dados (HTTP).
 O que interessa que o programa seja capaz de


Obter dados de entrada a


Requisio
partir de uma requisio HTTP
HTTP
 Gerar uma resposta HTTP
CGI
incluindo os dados e cabealho
Desenvolvido pelo ESMS.C

Resposta
HTTP

CGI Common Gateway Interface


O CGI foi primeiro padro para contedo da Web dinmico. Ele um protocolo de
comunicao que o servidor HTTP utiliza para conversao com outro programa. Um
CGI script qualquer programa (PERL, C, Java) que se comunica com o servidor WEB
atravs do protocolo CGI. Um script CGI (como ficou conhecido este mecanismo) um
programa que atende s requisies enviadas por um cliente e a ele repassadas pelo
servidor HTTP.

A Figura abaixo apresenta o funcionamento de uma requisio envolvendo CGI.


Figura 1 Processo do servidor para rodar um programa de CGI

Um CGI tradicional possui algumas ineficincias que limitam sua aplicabilidade em


sistemas Web de grande escala. Uma delas deve-se ao fato de que um programa CGI
roda fora do servidor Web e no como um subprocesso do servidor. Dessa forma um
novo processo deve ser criado cada vez que um programa CGI precisa ser executado, o
que ocasiona um overhead considervel para o servidor. Outro problema que os
programas de CGI so projetados para tratar de apenas uma nica solicitao especfica,
na qual um novo processo criado, as informaes da solicitao so enviadas para ele,
espera-se o processamento, a resposta repassada de volta para o navegador e o
processo finalizado. Com isso fica difcil, por exemplo, dois CGIs compartilharem
recursos, o que otimizaria em muito a performance dos sistemas. fcil imaginar os
problemas de performance ocasionados por este modelo num site que atenda a milhares
de solicitaes simultneas.
Para amenizar estes problemas, os novos sistemas para gerao de contedo dinmico
assumem a forma de mdulos que alavancam as interfaces de programas aplicativos
especficos de servidor, a fim de interagir diretamente com o processo do servidor Web
como um subprocesso do mesmo, evitando assim muito do overhead associado aos
programas CGI convencionais.

APIs do Servidor


Podem substituir totalmente o CGI com vanta-gens






Desvantagens



Melhor interao como servidor


Mltiplos clientes so atendidos por processos internos
(threads)
Muito mais rpidos e eficientes
Em geral dependem de plataforma, fabricante e linguagem
Solues proprietrias

Ex: ISAP (Microsoft), NSAPI (Netscape), etc

Desenvolvido pelo ESMS.C

10

S e r v le t A P I




A P I in d e p e n d e n te d e p la ta f o r m a e p r a tic a m e n te
in d e p e n d e n te d e f a b r ic a n te
C o m p o n e n te s s o e s c r ito s e m J a v a e s e
c h a m a m S e r v le ts
C o m o o s c o m p o n e n te s S A P I p r o p r ie t r io s ,
r o d a m d e n tr o d o s e r v id o r , m a s a tr a v s d e u m a
M q u in a V ir tu a l

D e s e n v o l v id o p e lo E S M S . C

11

Vantagens dos Servlets


 ...

sobre CGI

 Cada

nova requisio inicia um novo thread, no um


novo processo
 Mais integrado ao servidor, rodam como parte deste :
mais facilidade para compartilhar informaes,
recuperar e decodificar dados enviados pelo cliente
 ...

sobre APIs proprietrias

 No

dependem de nico servidor ou sistema


operacional
 Tm toda a API Java disposio

Desenvolvido pelo ESMS.C

12

Servlets e JSP
Servlets so a alternativa Java para CGI Scripts e assim possuem todas as vantagens da
plataforma sua disposio : APIs, multiplataforma, multithreading, OO. Sua
desvantagem que tanto o contedo esttico quanto o dinmico residem no cdigo
fonte do programa, o que acarreta srios problemas de manuteno.
JSP a combinao de HTML com Java dentro de uma mesma pgina (como ASP e
PHP), porm, usando-se tags especiais do tipo HTML que interagem com objetos java
no servidor, podemos introduzir contedo dinmico em qualquer parte da pgina sem
necessidade que cdigo Java bruto aparea. Em princpio, todo o cdigo fora dos tags
HTML puro. Isso possibilita gerar um cdigo mais manutenvel pois permite a
separao do cdigo que se destina a apresentao (HTML e tags) do cdigo
responsvel por gerar o contedo dinmico (tipicamente Java).

Execuo de Servlets
Servidor Web (Host)

Container de Servlet

Cliente

Servidor Web

2 - Carrega Servlet se
necessrio

3 - Cria encadeamento que


vai processar solicitao
(thread)
4 - Thread executa, retorna
resultado e finaliza

Desenvolvido pelo ESMS.C

13

Execuo de Servlets/JSP

Uma pgina JSP tipicamente convertida para um servlet quando de sua compilao,
por isso trataremos a forma de execuo de ambos de forma indistinta.
Um servidor HTTP com suporte a servlets deve possuir um ServletEngine (container
servlet) que o software responsvel por execut-los. Este software corresponde a um
processo em Java separado do servidor HTTP rodando uma JVM e recebe todas as
solicitaes para execuo de um servlet/jsp.
O fluxo para execuo ocorre da seguinte maneira :
1. O servidor HTTP recebe a solicitao para execuo de um servlet/jsp e a repassa,
juntamente com os dados da solicitao, para o container.
2. O container verifica se aquele servlet j est carregado na memria. Se no estiver
ou se houver uma verso mais nova do servlet, o container o carrega. O fato dos
servlets mais recentes j estarem carregados na memria, representa em ganho de
performance.
3. Uma vez inicializado, o servlet estar apto a lidar com centenas de acessos
simultaneamente, disparando para cada acesso uma nova thread para atend-lo
(encadeamento), ao invs de criar um novo processo. As threads so muito menos
custosas do que os processos convencionais, gerando um overhead muito menor
para sua criao e destruio. Elas compartilham a mesma memria que a do
processo pai e assim podem compartilhar recursos como conexes com banco de
dados, dentre outros.
4. Ao trmino do processamento, o resultado enviado de volta para o servidor Web e
apenas a thread encerrada, permanecendo o processo pai (servlet) ainda na
memria.

Problemas dos servlets, CGIs


e APIs
 Para

gerar pginas dinmicas preciso embutir


o HTML dentro de instrues de um programa
out.print(<h1>Servlet</h1>);
for(int num=1; num <= 5 ; i++){
out.print(<p>Pargrafo + num + </p>);
}

 Compromete

a manuteno
 O design acaba ficando a cargo do programador
e no do Web designer
Desenvolvido pelo ESMS.C

14

Soluo: scripts de servidor


 Coloca

a linguagem de programao dentro do


HTML (e no o contrrio)
<h1>Servlet </h1>
<% for(int num=1; num <= 5 ; i++){ %>
<p>Pargrafo + num + </p> <%}%>

O

Web designer pode projetar as pginas em


ferramentas como DreamWeaver
 Pgina fica mais legvel
 Quando houver muita programao, cdigo
pode ser escondido em servlets, JavaBeans, etc
Desenvolvido pelo ESMS.C

15

Scripts de servidor
 Alguns dos mais populares:
 Microsoft

Active Server Pages (ASP)


 Sun Java Server Pages (JSP)
 Macromedia Cold Fusion
 PHP
 As pginas so processadas pelo servidor

apropriado que retorna apenas contedo HTML


para o cliente

Desenvolvido pelo ESMS.C

16

ASP - Active Server Pages

a soluo da Microsoft para criao de pginas dinmicas e suporta mltiplas


linguagens de criao de scripts incluindo PerlScript , JScript e principalmente
VBScript, um subconjunto da linguagem Visual Basic. Grande parte do poder desta
soluo est no fato de ser possvel acessar componentes ActiveX atravs do VBScript.
PHP

uma linguagem de script Open Source que disponibiliza suporte para uma vasta gama
de recursos como acesso a banco de dados, comunicao com servidores de diretrio,
manipulao de arquivos, e-mail , dentre muitos outros.
10

Benefcios de JSP

JSP oferece diversos benefcios como um sistema para gerao de contedo dinmico.
Sendo uma tecnologia baseada em Java, ela se aproveita de todas as vantagens que a
linguagem Java fornece : orientao a objetos, tratamento de excees, gerenciamento
automtico de memria, dentre outros aspectos que conduz a um ganho significativo de
produtividade.
Pelo fato do bytecode de Java compilado ser portvel atravs de todas as plataformas
que possuam uma JVM, o uso de JSP no o restringe a uma plataforma de hardware,
sistema operacional ou software especfico (o que no verdade com o ASP). Pelo fato
de JSP ser neutra a fornecedores, os desenvolvedores e arquitetos de sistemas podem
selecionar melhores solues em todas as etapas de acionamento de JSP.
JSP pode se aproveitar de todas as APIs de Java padro, incluindo aquelas para acesso a
bancos de dados compatveis com muitas plataformas, servios de diretrio,
processamento distribudo, criptografia, etc.
Embora JSP permita que programadores implementem a gerao de contedo dinmico
diretamente em pginas da web, ele tambm inclui um conjunto de tags do tipo HTML
para interagir com objetos Java no servidor. Em especial, estas tags so projetadas para
criar, realizar consultas e modificar JavaBeans no servidor. Ao se aproveitar do suporte
embutido de JSP para JavaBeans, possvel manter uma rgida separao entre a
apresentao dos dados ao usurio final e a implementao do cdigo que gerou estes
dados. Assim, uma manuteno na parte esttica no interfere em qualquer cdigo Java
da programao e vice-versa.
Essa separao promove uma clara diviso de trabalho no desenvolvimento e
manuteno dos sites com contedo dinmico, o que possibilita melhor organizar
equipes de desenvolvimento aproveitando o perfil de cada membro : designers, artistas
grfico, codificadores HTML cuidam da apresentao, enquanto programadores Java
ficam responsveis pela implementao.

Aplicaes Web e Java


 Servlets

e JSP so as solues Java para


estender o servidor e gerar contedo dinmico
 Pginas JSP so traduzidas para servlets e ento
compiladas (o processo de execuo o mesmo)
 Suportam os mtodos de requisio padro
HTTP (GET, POST, etc)
 Interagem com cookies
 Suportam controle de sesso de forma
transparente
Desenvolvido pelo ESMS.C

17

11

Exemplo de um Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SimpleServlet extends HttpServlet{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
PrintWriter out;
response.setContentType(text/html);
out = response.getWriter();
String user = request.getParameter(usuario);
if (user == null) user = World;
out.println(<html><body>);
out.println(<h1>Simple Servlet Output</h1>);
out.println(<p>Hello, + user);
out.println(</body></html>); out.close();
}
Desenvolvido pelo ESMS.C

18

E x e m p lo d e u m J S P e q u iv a le n te
< h tm l> < b o d y >
<%
S tr i n g u s e r = r e q u e s t.g e tP a r a m e te r ( u s u a r io ) ;
if ( u s e r = = n u ll)
u s e r = W o r ld ;
%>
< h 1 > S im p le S e r v le t O u t p u t < /h 1 >
< P > H e llo , < % = u s e r % >
< /b o d y > < /h tm l>
D e s e n v o l v id o p e lo E S M S . C

19

Pgina recebida no brow ser




U rl da requisio



http://servidor/servlet/Sim pleServlet?usuario=R ex
http://servidor/hello.jsp?usuario=R ex

C digo fonte visto no cliente


<htm l><body>
<h1>Sim ple Servlet O utput<h1>
<P>H ello, R ex
</body >
</htm l>
D esen volvid o p elo E SM S.C

20

12

C om o executar Servlets e JSP




Para executar Servlets e JSP preciso im plantlos em um W eb C ontainer


 U m W eb C ontainer pode estar executando com o
parte de um servidor H TT P que o repassa as
requisies destinadas a servlets e JSP
 N este curso usarem os o Tom cat W eb C ontainer,
que pode tanto funcionar conectado a outro
servidor com o usar seu prprio servidor W eb
 E m produo geralm ente acoplado num
servidor de pginas estticas eficiente
D esen volvid o p elo E SM S.C

21

Estrutura do Tomcat
bin
webapps
ROOT
common
classes
lib
conf
logs
work

Executveis (startup.sh , startup.bat)


Contm pastas de contextos
Contexto raiz default
Arquivos comuns a todas aplicaes
Classes utilitrias, beans, servlets
Arquivos JAR
Arquivos de configurao (server.xml)
Logs para todas aplicaes
Contm servlets gerados a partir de JSP
Desenvolvido pelo ESM S.C

22

C om o im plantar um a aplicao
no T om cat


H trs m aneiras


T ransferir os arquivos da aplicao (JSP, servlets)


para contextos j reconhecidos pelo servidor
 C onfigurar um novo contexto (server.xm l)
 Im plantar a aplicao com o um W ebA rchive(W A R )


C ontextos so diretrios devidam ente


configurados que o Tom cat reconhece com o
aplicaes W eb
 D ois contextos default: exam ples e R O O T
D esen volvid o p elo E SM S.C

23

13

Como usar o contexto ROOT


 Para

usar o contexto ROOT:

Copie arquivos JSP, HTM L, imagens, etc em


$TOM CAT_HOM E/webapps/ROOT
 Coloque beans, classes e servlets em
$TOM CAT_HOM E/webapps/ROOT/W EB-IN F/classes
 Acesse

pginas JSP usando

http://servidor:8080/
 Acesse

servlets usando

http://servidor:8080/servlet/
Desenvolvido pelo ESM S.C

24

C om o usar o contexto exam ples




Para usar o contexto exam ples:




C opie arquivos JSP, H TM L, im agens, etc em


$TO M C A T_H O M E/w ebapps/exam ples
 C oloque beans, classes e servlets em
$TO M C A T_H O M E/w ebapps/exam ples/W EB -IN F/classes


A cesse pginas JSP usando


http://servidor/exam ples/pagina.htm l

A cesse servlets usando


http://servidor/exam ples/servlet/pacote.C lass
D esenvolvido pelo E SM S.C

25

Contextos
 Contextos

so quase a mesma coisa que


aplicaes web
 Definem a porta de entrada da aplicao
 Cada nova aplicao requer um novo contexto
(server.xml)
 No Tomcat os contextos esto definidos no
diretrio webapps
 Podemos criar novos contextos dentro do
webapps ou em qualquer outro diretrio
Desenvolvido pelo ESM S.C

26

14

Contextos
 Todo

diretrio de contexto tem uma estrutura


padro
Diretrio raiz (JSP, HTML, imagens, etc)
 Diretrio WEB-INF - possui um arquivo de
configurao padro (web.xml)
 O WEB-INF pode conter dois diretrios
reconhecidos pelo servidor


/WEB-INF/classes onde ficam os servlets e classes


utilitrias
 /WEB-INF/lib onde ficam as bibliotecas JAR que sero
carregadas como parte da aplicao


Desenvolvido pelo ESM S.C

27

Nome do contexto e URL


 Geralmente

o nome do contexto aparece na


URL aps o nome/porta do servidor
http://serv:8080/contexto/subdir/pagina.html
http://serv:8080/contexto/servlet/pacote.Servlet

Na verdade, o nom e a ser usado


(url) para acessar um servlet est
configurado no web.xm l. Neste
exem plo est com o /servlet/* mas
poderia ser qualquer coisa.
Desenvolvido pelo ESM S.C

28

Configurao da Instalao


Para que um contexto possa inicializar corretamente,


deve haver um arquivo web.xm l no diretrio W EBIN F do contexto.
O arquivo web.xm l configura inm eros parmetros
relacionados aplicao
 Inicializao de servlets
 M apeamentos de nomes de servlets
 Inicializao do contexto
 Parm etros de servlets
 ...
Desenvolvido pelo ESM S.C

29

15

Exemplo de web.xml (1/3)


Parmetro que pode ser lido por

<web-app>
qualquer componente
<context-param>
<param-name>tempdir</param-name>
<param-value>/tmp</param-value>
Instncia de
</context-param>
um servlet
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>pacote.myServlet</servlet-class>
<init-param>
Parmetro que pode
<param-name>password</param-name>
ser lido pelo servlet
<param-value>123456</param-value>
</init-param>
Ordem para carga
prvia do servlet
<load-on-startup>1</load-on-startup>
</servlet>
Desenvolvido pelo ESM S.C

30

Exem plo de w eb.xm l (2/3)


...
<servlet-m apping>
<servlet-nam e>m yServlet</servlet-nam e>
<url-pattern>/abacaxi/m yServlet</url-pattern>
</servlet-m apping>
Este um mapeam ento exato. Q uando o
padro abacaxi/m yServlet aparecer na
U R L o servlet a ser cham ado ser o
m yServlet

<servlet-m apping>
<servlet-nam e>m yServlet</servlet-nam e>
<url-pattern>/abacaxi/*</url-pattern>
</servlet-m apping>
M apeamento de caminho. Q uando
o padro abacaxi/* for encontrado
ento m yServlet ser chamado
D esenvolvido pelo E SM S.C

31

Exemplo de web.xml (3/3)


...
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>*.ext</url-pattern>
</servlet-mapping>
Este um mapeamento de extenso.
Qualquer arquivo que aparea na URL
com a extenso ext na solicitao ser
redirecionado para myServlet.

<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Mapeamento default. Este servlet ser
</web-app>

chamado se nenhum outro mapeamento


combinar com a requisio.
Desenvolvido pelo ESM S.C

32

16

II - Servlets

II - S erv lets


E ste c ap tulo co b re o s se g u in tes t pico s :









O q u e so S erv lets?
C iclo d e V ida
In icializa o
F in alizao
M to d o s de S erv io
C o m o criar u m H T T P serv le t

D ese n vo lv id o p elo E S M S.C

33

O q u e so S erv lets H T T P
 E xtenso

java para servidor W eb

 E stendem

javax.servlet.http.H ttpS ervlet


 L idam co m caractersticas tpicas do
H T T P co m o m todos G E T , P O S T ,
C ookies, etc

D ese n volvid o p elo E S M S.C

34

C iclo d e V id a


Q u a n d o o se rv id o r rece b e u m a re q u isi o p o r
u m serv le t, ele a rep assa p ara o co n tain e r q u e :



C a d a req u isio tra ta d a p o r u m m to d o


serv ic e()


C ria u m a in stn cia d a classe d o serv let


C h am a o m to d o d e inicializao in it()

O C o n tain e r cria u m ob je to d e re q u isio


(S erv le tR eq u est) e u m d e resp o sta
(S ertv letR esp o n se) e os p assa co m o p arm etro

Q u a n d o o co n ta in er d ec id ir re m o v er o serv let d a
m e m ria e le o fin aliza ch am an d o d estro y()
D ese n vo lv id o p elo E S M S.C

36

17

Inicializao de um servlet


Tarefa realizada apenas um a vez


 O peraes com uns : carregar parm etros de
inicializao, dados de configurao, etc
 Ex:
A cessa os parm etros de
inicializao
public void init ()
throw s S ervletE xception{
S tring dirIm agens = getInitP aram eter(im agens);
if (dirIm agens == null) {
throw new U navailableE xception(C onfigurao
Incorreta);
} }
D esen volvid o p elo E SM S.C

37

F in a liz a o
O

m to d o d e stro y () c h a m a d o e p o d e se r
u sa d o p a ra lib e ra r re c u rso s, c o m o c o n e x e s
c o m b a n c o d e d a d o s , e tc
 Ex:
p u b lic v o id d e stro y () {
b a n c o .c lo se ();
b a n c o = n u ll;
}

D e se n vo lv id o p e lo E S M S .C

37

Mtodos de Servio
So

os mtodos que implementam


operaes de resposta executadas quando o
cliente envia uma requisio
Todos os mtodos de servio recebem dois
parmetros: um objeto ServletRequest e
outro ServletResponse
Nos servlets HTTP estes mtodos esto
divididos em doPost() e doGet()

Desenvolvido pelo ESMS.C

38

18

Como criar um servlet HTTP


 Crie

uma classe que estenda de HttpServlet e


implemente um ou mais dos seus mtodos de
servio:
import javax.servlet.*;
import javax.servlet.http.*;
import javax.io.*;
public class ServletWeb extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
response.setContentType(text/html);
out.println(<h1>Hello, World!</h1>);
out.close();
}}
Desenvolvido pelo ESMS.C

39

C o m o u sa r d o G e t() e d o P o st()
 U se

d o G e t() p a ra re c e b e r re q u is i e s
GET
 L in k s

c lic a d o s o u U R L d ig ita d a s
d ire ta m e n te
 A lg u n s fo rm u l rio s q u e u sa m G E T
 U se

d o P o st() p a ra re c e b e r d a d o s d e
fo rm u l rio s
 O JS P tra ta in d isc rim in a d a m e n te o s d o is
m to d o s
D e se n v o lv id o p e lo E S M S .C

40

C o m o a cessar p arm etro s d a


so licita o


T an to p a ra G E T co m o p ara P O S T u se
req u e st.g e tP ara m eter()
S trin g p arm etro = req u e st.g etP aram e ter(n o m e );

P arm e tro s c o m o m esm o n o m e p o d e m esta r


rep etid o s, n este c aso , g e tP ara m eter() ir
reto rn ar so m en te a p rim eira o co rrn cia. P a ra
o b ter to d as u se
S trin g [] p aram s =
req u est.g etP aram eterV alu es(n o m e);
D ese n vo lv id o p elo E S M S.C

41

19

Como gerar uma resposta


 Primeiro

preciso obter de response um fluxo

de sada
Writer out = response.getWriter();
 Deve-se

tambm definir o tido de dados a ser


gerado. Isso importante para que o browser
saiba exibir as informaes
response.setContentType(text/html);

 Depois,

pode-se gerar os dados imprimindo-os


no objeto de sada (out) obtido anteriormente
out.println(<h1>Hello, world!</h1>)
Desenvolvido pelo ESMS.C

42

Exerccios

1 Crie um servlet chamado hello.java que deve ler o valor de um parmetro de


inicializao e imprir na tela Hello, <valor do parmetro>!. O parmetro deve se
chamar nome.
a) Abra um editor de texto qualquer e digite o cdigo abaixo:
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class hello extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
response.setContentType(text/html);
out.println(<h1>Hello, + getInitParameter(nome)+</h1>);
}
}
b) Salve o arquivo no seu diretrio de exerccios com o nome hello.Java
c) Entre no prompt de comando e compile o arquivo : javac hello.Java
d) Copie o arquivo hello.class que foi gerado com a compilao para o diretrio WEBINF/classes do seu contexto. Com isso voc est instalando o servlet na sua aplicao.

20

e) Vamos agora configurar o arquivo web.xml com o servlet hello acrescentando o


parmetro de inicializao que este est lendo. Acrescente as seguintes linhas no /WEBINF/web.xml:
<servlet>
<servlet-name>
hello
</servlet-name>
<servlet-class>
hello
</servlet-class>
<init-param>
<param-name>nome</param-name>
<param-value>SEUNOME</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/servlet/hello</url-pattern>
</servlet-mapping>
f) Uma vez tendo alterado o arquivo web.xml, voc deve fazer um reload no contexto.
Para isso o Tomcat disponibiliza uma pgina de gerenciamento que pode ser acesada em
http://servidor:8080/manager/html. Entre nesta pgina, procure pelo seu contexto e
clique em reload.
g) Agora s testar acessando a URL = http://servidor/contexto/servlet/hello

2) Modifique o servlet anterior de forma que este leia o nome do parmetro de


solicitao e no mais dos parmetros de inicializaao. Utilize o mtodo
getParameter() do objeto HttpServletRequest. Teste sua aplicao passando um valor na
URL:
http://servidor/contexto/servlet/hello?nome=<SEUNOME>

21

III - Scripts JSP


Este captulo cobre os seguintes tpicos :
Elementos de criao de scripts
Declaraes
Expresses
Scriptlets
Controle de Fluxo
Comentrios
Diretivas JSP

Vimos que possvel utilizar JavaBeans para mantermos a separao entre apresentao
e implementao e as vantagens que isso proporciona, principalmente em grandes
projetos. No entanto, esta abordagem purista para o desenvolvimento de JSP nem
sempre a mais adequada para todos os casos. Para pginas simples, que precisam ser
implementadas em curto espao de tempo, talvez seja melhor uma abordagem mais
direta e prtica.
Neste captulo, mostraremos como criar pginas JSP que mesclam HTML e cdigo Java
para obteno do contedo dinmico. Estes cdigos so denominados scripts e, apesar
de JSP permitir linguagens alternativas para cri-los, focaremos aqui exclusivamente em
scripts na linguagem Java.

Elementos de Criao de Scripts


Elementos de criao de scripts permitem
que os programadores embutam diretamente
cdigo em uma pgina JSP
Trs tipos de elementos de criao de
scripts :
declaraes
scriptlets
expresses
Desenvolvido pelo ESMS.C

Os elementos de criao de scripts permitem que os programadores embutam cdigo


Java diretamente numa pgina JSP, inclusive cdigo que gera output para aparecer nos
resultados enviados de volta para o usurio.
JSP oferece trs tipos de elementos de criao de scripts : declaraes, scriptlets e
expresses.

22

Hello World !
Para quebrar o gelo, vamos analisar nossa
primeira pgina JSP. Ela l um parmetro da
solicitao e utiliza seu valor para apresentar
uma mensagem na tela.
<html>
<body>
<h1> <%= request.getParameter("text") %> </h1>
</body>
</html>

Desenvolvido pelo ESMS.C

Para construir uma pgina usando JSP, voc geralmente escreve o texto HTML
normalmente e inclui o cdigo entre as tags JSP. As tags normalmente comeam com
"<%" e terminam com "%>". Vamos mostrar uma possibilidade de implementao para
o clssico exemplo do "Hello World :
Ex. helloworld.jsp :
<html>
<body>
<h1><%= request.getParameter("msg") %></h1>
</body>
</html>

Se fizermos http://.../helloworld.jsp?msg=Hello+World receberemos numa pgina


HTML o contedo do parmetro msg,, que foi montado na prpria URL, como resposta
da solicitao. Se voc verificar o cdigo da pgina que apareceu no seu browser, ver o
seguinte:
<html>
<body>
<h1>Hello World </h1>
</body>
</html>

O que aconteceu foi que o servidor JSP executou os comandos entre as tags especiais
"<%" e "%>", gerou e enviou para o browser um cdigo puramente HTML.

23

Declaraes
Servem para definir variveis e mtodos
especficos para uma pgina JSP
Sua sintaxe : <%! declaraes %>
Os mtodos e variveis declarados podem
ser referenciados por outros elementos de
criao de script dentro da mesma pgina
JSP independente da ordem na qual a
declarao ocorre em relao a estes
elementos
Desenvolvido pelo ESMS.C

Declaraes
Declarao de variveis :
<%! int x=0, y; String text = Texto; %>

Declarao de mtodos :
<%! int soma (int x, int y) { return (x + y); } %>

As variveis aqui declaradas so criadas na


inicializao da pgina e seus valores so
compartilhados por todos que a acessarem.Se
uma pessoa mudar o valor de x para 1, todos
que acessarem o servlet depois disso vero x=1
Desenvolvido pelo ESMS.C

10

Os mtodos jspInit e jspDestroy

Estes so mtodos especiais para tratar os eventos de inicializao (jspInit) e finalizao


(jspDestroy) dos servlets. Se o mtodo jspInit() for definido, pode-se garantir que o
container JSP o chame depois que a classe de servlet tenha sido instanciada, mas antes
que a primeira solicitao seja processada. Similarmente, se o mtodo jspDestroy()
estiver definido numa pgina JSP, este ser executado quando o container JSP precisar
descartar a classe de servlet, seja porque o container est sendo desligado, ou porque a
pgina no tenha sido solicitada recentemente e o container precisa liberar recursos (ex.
memria). O formato geral para declar-los :
public void jspInit () { /*Cdigo de Inicializao*/ }
public void jspDestroy () {`/*Cdigo de Finalizao*/ }

24

Expresses
O resultado da avaliao de uma expresso
inserido no output da pgina no lugar da
tag de expresso original
Sua sintaxe : <%= expresso %> (no
requer ; no final)
No h restrio quanto ao tipo de retorno
das expresses
Exs:<%= Mensagem %> --> imprime : Mensagem
<%= msg %> --> imprime o contedo da var. msg
<%= fatorial(0) %> --> imprime o resultado da func
Desenvolvido pelo ESMS.C

11

As declaraes so usadas para adicionar variveis e mtodos a uma pgina JSP, mas
no so capazes de contribuir diretamente para o output da pgina. As expresses em
JSP possuem o objetivo explcito de gerao de output.
Pode-se observar que na sintaxe da expresso no h o ponto e vrgula no final da
mesma. Isso porque o ponto e vrgula em Java um delimitador de instruo e no
isto que estamos criando quando especificamos uma tag de expresso. J que no
possvel acrescentar instrues numa tag de expresso, claro que no se pode incluir
if/then, pois estes correspondem a instrues em Java, como fazer output condicional
utilizando-se uma tag de expresso ? Felizmente Java aceita o operador condicional
tercirio, que retorna um valor baseado no resultado de um teste condicional. A sintaxe
do operador tercirio a seguinte :
test_expr ? true_expr : false_expr
Exemplo :
<%= (hours < 12 ? AM : PM %>

Neste exemplo, hours verificada para determinar se menor que 12. Se sim, o
operador tercirio retorna a cadeia AM, caso contrrio retorna PM. O valor
retornado adicionado ao output da pgina.

25

Scriptlets
So blocos de cdigo executados cada vez
que a pgina JSP processada
Servem para criao de scripts de objetivos
gerais
Sua sintaxe : <% scriptlet %>
Uma varivel definida num scriptlet estar
disponvel para uso em expresses e
scriptlets subseqentes na mesma pgina
Desenvolvido pelo ESMS.C

12

Os scriptlets so utilizados para criao de cdigos arbitrrios, que realizam qualquer


processamento que se queira. Dentro de uma tag de scriptlet possvel declarar
variveis, instanciar objetos, imprimir no output da pgina, enfim, realizar qualquer
codificao vlida com a linguagem de script que est sendo utilizada, no nosso caso
Java.
Vamos analisar o exemplo abaixo :
1 - <html>
2 - <body> <h1>Intruder Alert</h1>
3 - <% GameGrid grid = GameGrid.getGameGrid();
4Recognizer r1 = new Recognizer (grid,0,0);
5Recognizer r2 = new Recognizer (grid,100,100);
6r1.findProgram (Flynn);
7r2.findProgram (Flynn); %>
8 - <h2> Status </h2>
9 - <ul>
10 - <li> Recognizer : <%= r1.statusReport() %>
11 - </ul>
12 - Alert Level : <%= grid.alertLevel() %>
13 - </body>
14 - </html>
Misturado ao cdigo HTML temos o cdigo Java. Na linha 3 a varivel grid recebe uma
instncia da classe GameGrid retornada pelo mtodo getGameGrid(). Nas linhas 4 e 5
novas instncias da classe Recognizer so criadas e atribudas s variveis r1 e r2.
Como os scriptlets so executados toda vez que a pgina solicitada, novas instncias
dessa classe so criadas e atribudas a r1 e r2 a cada nova solicitao. Na linha 10 uma
tag de expresso utilizada para imprimir o retorno do mtodo statusReport() executado
a partir da varivel r1. S foi possvel acessar r1 na linha 10 porque ele foi declarado
num scriptlet anterior a este ponto.
26

Exerccios

1 Criar uma pgina JSP que possua uma varivel soma, do tipo inteiro, inicializada
com 0 e definida numa tag de declarao. Incrementar essa varivel de 10 cada vez que
a pgina for solicitada e imprimir o seu contedo. Criar uma outra varivel sub, tambm
do tipo inteiro, inicializada com 100 e declarada dentro de um scriptlet. Essa varivel
deve ser subtrada de 10 cada vez que a pgina for solicitada. Explique qual est sendo o
comportamento das variveis aps solicitaes simultneas da pgina e o motivo do
mesmo.
2 Fazer uma pgina JSP que receba dois nmeros reais (double) como parmetros
(num e porcent) e execute um mtodo que calcule a porcentagem porcent de num
retornando tambm um double. O resultado deve ser impresso na tela.
Dicas : Para ler o valor de um parmetro utilizar : request.getParameter(nome) que
retorna uma string
Para transformar uma String em um double utilizar : Double.parseDouble
(string) que retorna um double referente a String passada como parmetro

3 Fazer uma pgina JSP que recebe um nmero inteiro como parmetro, calcule seu
fatorial atravs do mtodo fatorial e imprima o resultado na tela. O mtodo fatorial pode
ser como descrito abaixo :
long fatorial (int x ) {
if (x == 0) return 1
else return x * fatorial (x-1) ; }
Dica : Para converter uma String para um nmero inteiro utilizar : Integer.parseInt
(string)

27

Embora j possamos escrever algumas aplicaes em JSP com o que j aprendemos at


agora, elas sero ainda fracas. Um dos grandes potenciais de qualquer linguagem de
programao a utilizao de controles de fluxo (condicionais e loops) para executar
diferentes partes de um programa baseado em testes. Nas prximas pginas
aprenderemos os seguintes tpicos:

Comandos condicionais;
Comandos de loops

Controle de Fluxo
Comandos Condicionais : IF
<html> <body>
<% java.util.Date dateNow = new java.util.Date();
int hourNow = dateNow.getHours(); %>
<% if ((hourNow >= 5) && (hourNow < 13)) { %>
<font face="verdana">Bom Dia!!!</font>
<% } else if ((hourNow >= 13) && (hourNow < 19)) { %>
< font face="verdana">Boa Tarde!!!</font>
<% } else if ((hourNow >= 19) && (hourNow < 24)) { %>
<font face="verdana">Bom Noite!!!</font>
<% } else { %>
<font face="verdana">Boa Madrugada!!!</font>
<% } %>
</body></html>
Desenvolvido pelo ESMS.C

15

Condicionais if contm a palavra-chave if, seguida de um teste booleano, e de uma


instruo (na maioria das vezes um bloco de instrues) para ser executada se o teste for
verdadeiro (exemplo no arquivo if.jsp).

Controle de Fluxo
Comandos Condicionais : switch
<html> <body>
<% java.util.Date dateNow = new java.util.Date();
int monthNow = (dateNow.getMonth()+1); %>
<% String mes;
switch (monthNow){
case 1: mes="Janeiro"; break;
case 2: mes="Fevereiro"; break;
...
case 10: mes="Outubro"; break;
case 11: mes="Novembro"; break;
default: mes="Dezembro"; break;
} %>
<font face="verdana"> Ns estamos em <%= mes %></font>
</body></html>
Desenvolvido pelo ESMS.C

16

28

Na instruo switch, o teste (um tipo primitivo de byte, char, short ou int) comparado
com cada valor em questo. Se um valor coincidente achado, a instruo (ou
instrues) depois do teste executada. Se nenhum valor for encontrado, a instruo
default executada (exemplo no arquivo switch.jsp).

Controle de Fluxo
Comandos de loops : for
<html>
<body>
<% for (int i = 2; i < 8 ; i++) { %>
<font size = <%= i %> > Bom Dia!!! - Fonte: <%= i %>
</font>
<% } %>
</body>
</html>

Desenvolvido pelo ESMS.C

17

O loop for (exemplo no arquivo for.jsp), repete uma instruo ou um bloco de


instrues algum nmero de vezes at que a condio seja satisfeita. Loops for so
freqentemente usados para simples iteraes na qual voc repete um bloco de
instrues um certo nmero de vezes e ento pra; mas voc pode usar loops for para
qualquer espcie de loop. A sintaxe do loop for no Java a seguinte:
for (initialization ; test ; incremet)
{
statements
}
Onde:
initialization - uma expresso que inicia o comeo do loop;
test - o teste que ocorre depois de cada passo do loop;
increment - qualquer chamada de expresso ou funo.

29

Controle de Fluxo
Comandos de loops : while
<html>
<body>
<% int i = 0;
while (i < 8) { %>
<font size = <%= i %>> Bom Dia!!! - Fonte: <% = i %>
</font> <br>
<% i++; } %>
</body>
</html>
Desenvolvido pelo ESMS.C

18

O loop while (exemplo no arquivo while.jsp) usado para repetir uma instruo ou
bloco de instrues at que uma condio particular seja verdadeira. Loops while se
parecem com o seguinte:
while ( condition) {
bodyOfLoop
}
Observe que se a condio inicialmente falsa na primeira vez que testada o corpo do
loop while nunca ser executado. Se voc precisa executar o corpo, pelo menos uma
vez, voc pode usar o cdigo do..while que ser visto a seguir.

Controle de Fluxo
Comandos de loops : do while
<html>
<body>
<% int i = 0;
do { %>
<font size=<%= i %>>Bom Dia!!! - Fonte: <%= i %>
</font> <br>
<% i++;
} while ( i < 8 ); %>
</body></html>

Desenvolvido pelo ESMS.C

19

30

O loop exatamente como o loop while, exceto pelo fato de o loop do executar uma
dada instruo ou bloco at que uma condio seja falsa. A diferena principal entre os
dois que os loops while testam a condio antes de iniciar o loop, tornando possvel
que o corpo do loop nunca seja executado caso a condio seja inicialmente falsa. Os
loops do...while executam pelo menos uma vez antes de testar a condio (exemplo no
arquivo do_while.jsp)
Os loops do...while tem o seguinte formato:
do {
bodyOfLoop
}
while ( condition );
Interrupo de Loops

Em todos os loops (for, while e do), o loop termina quando a condio que voc est
testando atingida. Porm, em algumas situaes voc desejar sair do loop antes do
seu trmino normal. Para isso, voc pode usar as palavras chaves break e continue.

Controle de Fluxo
Interrupo de loops : break
<html>
<body>
<% int j;
for (int i = 1; i < 8 ; i++) {
j = i%5; => j recebe o resto da diviso por cinco
if (j == 0){ break; } %> => se for 0 divisvel por 5 e pra
<font size= <%= i %>> Bom Dia!!! - Fonte: <%= i %>
</font> <br>
<% } %>
</body></html>
Desenvolvido pelo ESMS.C

20

No exemplo acima, o cdigo dentro do loop executado at que a varivel i assuma um


valor que seja divisvel por 5. Quando isso ocorre, o loop finalizado e o programa
continua a ser executado aps o final do cdigo do loop (exemplo no arquivo break.jsp).

31

Controle de Fluxo
Interrupo de loops : continue
<html>
<body>
<% int j;
for (int i = 1; i < 8 ; i++) {
j = i%5;
if (j == 0){ continue; } %> => quando i for divisvel por 5,
a linha no ser impressa
<font size=<%= i %>>Bom Dia!!! - Fonte: <%= i %>
</font><br>
<% } %>
</body>
</html>
Desenvolvido pelo ESMS.C

21

A palavra chave continue pra o loop e comea novamente na prxima iterao.


continue til quando voc quer ter situaes de casos especiais dentro de loop. Esse
cdigo semelhante ao anterior, contudo, ao invs de finalizar a execuo do loop, ele o
reinicia em uma nova iterao. O resultado obtido a gerao de 6 linhas de cdigo
html (a linha cujo teste do if foi verdadeiro, ou seja, onde a varivel i assumiu um valor
divisvel por 5, no foi gerada) (exemplo no arquivo cotinue.jsp).

Comentrios
Dois tipos de comentrios :
Contedo : quando utilizamos o comentrio
HTML dentro da pgina JSP.
Ex : <!-- Comentrio sobre o contedo de x = <%=
x %> -->

JSP : O corpo deste comentrio ignorado.


Serve principalmente para depurao.
Ex : 5! = <%= fact(5) %> <br>
<%-- 6! = <%= fact(6) %> <br> --%>

Comentrio da linguagem de script utilizada. No


caso de java : /* comentrio */ ou // comentrio
Desenvolvido pelo ESMS.C

22

Comentrio de Contedo: esses comentrios so transmitidos de volta para o


navegador como parte da resposta de JSP e so visveis na visualizao do cdigo da
pgina.
Comentrios JSP: no so enviados para o cliente e so visveis apenas nos arquivos
fonte JSP originais. O corpo do comentrio ignorado pelo container JSP.

32

Exerccios :

4 Faa uma pgina JSP que receba como parmetro um nmero inteiro e calcule o
fatorial de 0 at este nmero e imprima os resultados. (Utilize o mtodo para calcular
fatorial dado no exerccio 3)
5 Faa uma pgina que receba o valor de um salrio e uma porcentagem como
parmetros. Calcule a porcentagem especificada sobre o salrio, a qual representa um
aumento do mesmo, utilizando a funo func criada no exerccio 2. Se o resultado for
menor que R$ 400,00 , imprima Voc recebeu um aumento de <aumento> ! Teu
emprego um lixo, sai logo da !, se o resultado for maior que R$ 400,00 e menor que
R$ 2.999,99, imprima Voc recebeu um aumento de <aumento> ! At que teu emprego
no ruin no., mas se o resultado for superior a R$ 2.999,99 imprima Seu novo
salrio de <novo_salario> ! Voc poltico ?.
6 Faa uma pgina JSP que receba trs nmeros inteiros como parmetros : min, max
e div. Deve ser impresso os nmeros de min a max na tela at que se encontre neste
intervalo um nmero divisvel por div e ento o lao deve ser interrompido. Se nenhum
nmero for encontrado, todos os nmeros entre min e max (inclusive) sero impressos.

33

O ltimo tpico que veremos neste captulo trata das diretivas JSP. As diretivas so
usadas para fornecer informaes especiais ao container JSP sobre a pgina quando esta
compilada para servlet. Elas no produzem qualquer output que seja visvel, ao invs
disso, elas geram efeitos colaterais que mudam o modo que o container JSP processa a
pgina. Existem dois tipos principais de diretivas: page e include.

Diretivas JSP
As diretivas so usadas para fornecer
informaes especiais ao container JSP
sobre a pgina quando esta compilada
para servlet. Elas no produzem qualquer
output que seja visvel, ao invs disso, elas
geram efeitos colaterais que mudam o modo
que o container JSP processa a pgina.
Dois tipos : page e include
Desenvolvido pelo ESMS.C

23

Diretivas JSP
Diretiva page : define atributos que afetam
toda a pgina JSP
Sintaxe :
<%@ page attribute1=valor1 attribute2 =
valor2 attribute3= ... %>
ou
<%@ page attribute1 = valor1 %>
<%@ page attribute2 = valor2 %> ...
Desenvolvido pelo ESMS.C

24

34

Diretivas JSP
Atributos da diretiva page :
info : Permite ao autor adicionar uma cadeia de
documentao pgina que sumariza sua
funcionalidade. O valor padro para o atributo
info a cadeia vazia. Pode ser recuperada pelo
mtodo getServletInfo.
Ex :

<%@ page info = Controle de usurios,


Copyright 2002 by ESMS.C %>
Desenvolvido pelo ESMS.C

25

Diretivas JSP
Atributos da diretiva page :
language : Define a linguagem de criao de
scripts da pgina. O padro para este atributo
java.
Ex :

<%@ page language = java %>

Desenvolvido pelo ESMS.C

26

35

Diretivas JSP
Atributos da diretiva page :
contentType : Define o tipo MIME, i.e, o tipo
de informao contida em uma resposta de
HTTP. Os tipos mais comuns para JSP so :
text/html (padro), text/xml e text/plain,
indicando respostas em HTML, XML e texto.
Ex :

<%@ page contentType = text/xml %>

Desenvolvido pelo ESMS.C

27

Diretivas JSP
Atributos da diretiva page :
extends : Identifica a super classe a ser usada
pelo container quando ele est traduzindo a
pgina JSP em um servlet Java. Geralmente
deixamos o prprio container selecionar a super
classe para a pgina pois isso tipicamente
fornece a melhor peformance.

Desenvolvido pelo ESMS.C

28

36

Diretivas JSP
Atributos da diretiva page :
import : Permite especificar quais pacotes
sero importados, estendendo assim o conjunto
de classes que podem ser referenciadas em uma
pgina. o nico atributo que pode se repetir.
Ex :
<%@ page import = java.util.List %> => importa
a classe List
<%@ page import = java.util.* , java.text.* %> =>
importa todas as classes do pacote java.util e
java.text
Desenvolvido pelo ESMS.C

29

Diretivas JSP
Atributos da diretiva page :
session : Indica se uma pgina participa ou no
do gerenciamento de sesso. O valor padro
true. Se a pgina no ir utilizar recursos de
sesso, deve-se pass-lo para false pois isso
resulta em ganho de performance.
Ex :

<%@ page session = false %>

Desenvolvido pelo ESMS.C

30

37

Diretivas JSP
Atributos da diretiva page :
buffer : Controla o uso da sada bufferizada. O
padro um buffer de 8kb.
Ex :

<%@ page buffer=none %> => sem buffer


<%@ page buffer=12kb %> => define um
buffer de 12 kb
Desenvolvido pelo ESMS.C

31

Sada bufferizada

Uma vez que o servidor HTTP tenha comeado a enviar um documento para um
navegador, ele no pode mudar de idia e depois pedir para o navegador no exibir o
contedo enviado. O servidor Web poderia cancelar a transmisso do documento, mas o
navegador exibiria qualquer contedo recebido at ento. Se, a medida que uma
pgina JSP fosse sendo processada o contedo HTML gerado fosse enviado
diretamente para o servidor Web, para este encaminhar a resposta para o
navegador, ocorreriam problemas como :

Numa pgina HTML todo o cabealho (de solicitao e de resposta) deve vir antes
que o corpo da pgina. Nos cabealhos de respostas so definidas informaes como
armazenamento em cache da pgina e, mais importante, dados de cookies. Se uma
pgina JSP quisesse definir cookies, teria que defini-los antes que qualquer output
de JSP fosse gerado para ser enviado como corpo da resposta, ou seja, no incio da
pgina. Se quisssemos por algum motivo gerar contedo do corpo e depois definir
um cookie, seria muito tarde
Outro problema est relacionado a erros de processamento. Se um erro ocorreu no
meio do processamento de uma pgina, todo contedo gerado antes daquele
momento apareceria no navegador seguido da mensagem de erro. No seria possvel
descartar o output anterior e exibir apenas a mensagem de erro, ou encaminhar o
controle para uma pgina especial de tratamento de erros.

Com a bufferizao da sada essas limitaes foram superadas em JSP. Enquanto


uma pgina est sendo processada, o contedo gerado no enviado diretamente
para o navegador. Ao invs disso, este armazenado temporariamente num buffer
de sada. Apenas depois que a pgina inteira tiver sido processada, o output
armazenado no buffer ser enviado para o navegador como corpo de uma resposta de
HTTP do servidor. Isso permite especificar informaes de cabealho em qualquer
ponto da pgina. Torna possvel tambm lidar com erros, pois o contedo gerado como
resposta pode ser descartado (se um erro detectado, todo contedo gerado at ento
pode ser descartado, pois est no buffer, e uma nova resposta pode ser gerada).
38

Diretivas JSP
Atributos da diretiva page :
autoFlush : Tambm controla a sada
buferizada. Se definido como true, quando o
buffer fica cheio seu contedo enviado para o
servidor HTTP para transmisso ao navegador
solicitante. Se definido como false, quando o
buffer fica cheio disparada uma exceo,
interrompendo o processamento e enviando um
erro como resposta. O padro para este atributo
true.
Ex : <%@ page autoFlush=true %>
Desenvolvido pelo ESMS.C

32

Este atributo controla o comportamento do container JSP quando o buffer de sada da


pgina fica cheio. Se estiver definido como true (o padro), o buffer de sada ser
automaticamente esvaziado e seu contedo atual enviado para o servidor HTTP para
transmisso ao navegador da web solicitante. O processamento da pgina ento
continua, com qualquer e todo contedo novo sendo buferizado at que o buffer
novamente fique cheio ou o final da pgina seja alcanado. Uma vez que o buffer
tenha sido esvaziado no mais possvel que a pgina JSP defina cabealhos de
resposta ou encaminhe o processamento para uma pgina JSP diferente.
Caso o atributo esteja definido como false, quando o buffer fica cheio o container ir
disparar uma exceo e exibir uma pgina de erro no navegador que solicitou a pgina.

Diretivas JSP
Atributos da diretiva page :
isThreadSafe : Quando definido para true (o
padro), um novo encadeamento criado para
tratar de cada solicitao para a pgina, de
modo que mltiplas solicitaes para a pgina
sejam tratadas simultaneamente. Caso seja
false, o container ir reponder a cada solicitao sequencialmente, na ordem em que foram
recebidas.
Ex : <%@ page isThreadSafe=true %>
Desenvolvido pelo ESMS.C

33

39

O atributo isThreadSafe usado para indicar se uma pgina capaz de responder a


mltiplas solicitaes simultneas. Quando definido para false, o container JSP
expedir solicitaes destacadas para a pgina sequencialmente, na ordem em que elas
foram recebidas, esperando a solicitao atual terminar seu processamento antes de
iniciar o prximo. Quando estiver definido para true (o padro), um novo encadeamento
(uma nova thread) criado para tratar de cada solicitao para a pgina, de modo que
mltiplas solicitaes sejam tratadas simultaneamente.
Se for possvel, este atributo deve estar definido para true, caso contrrio, a performance
sofrer dramaticamente sempre que mltiplos usurios tentarem acessar a pgina ao
mesmo tempo, j que cada usurio ter que esperar at que todas as solicitaes
anteriormente submetidas tenham sido atendidas antes que o processamento da sua seja
iniciado. Se a pgina estiver com trfego muito pesado, ou sua gerao de contedo for
muito intensa em relao ao processamento, esta espera provavelmente no ser
aceitvel pelos usurios.
Para saber de forma prtica se uma pgina pode estar com este atributo definido como
true, tenha em mente o seguinte :

Vimos que o container JSP cria threads para tratar de solicitaes a uma pgina e
que threads referentes ao mesmo servlet compartilham espao de memria. Isso
pode ser utilizado vantajosamente para fins de melhoria de performance.
A memria compartilhada aquela definida pelas variveis declaradas dentro da
tag <%! %> e, uma vez que seu valor tenha sido modificado, o novo valor ser
visvel a todas as threads do mesmo servlet. Variveis definidas dentro de
scriptlets so locais a cada thread.
A definio de variveis compartilhadas deve ser feita com critrio, pois a
seguinte situao pode ocorrer : imagine que X seja uma varivel compartilhada
e que Joo submeteu o valor 10 para X. No final desta pgina existe o seguinte
cdigo : <%= X %>, que deve imprimir o contedo de X submetido por Joo.
Antes que a thread que estava tratando da solicitao de Joo terminasse seu
processamento (e imprimisse o valor de X), Pedro faz um acesso a essa mesma
pgina submetendo o valor 20 para X. Suponha ento que o sistema operacional
(que o responsvel por definir qual thread estar ocupando o processamento
num dado instante) pra o processamento da thread de Joo e coloca a de Pedro
no lugar. A thread de Pedro muda o valor de X para 20, ocupa o processador por
um tempo e ento retirada pelo sistema operacional que recoloca a thread de
Joo para terminar seu processamento. Quando a thread de Joo chega no
comando para imprimir o contedo de X, ir imprimir 20 e no 10 como havia
submetido Joo, causando um resultado errneo.

Para resolver este tipo de inconsistncia, pode-se passar o atributo isThreadSafe para
false, pois assim garante-se que cada thread seja processada at o seu trmino antes que
outra ganhe o direito de processamento, porm, como j vimos, perde-se totalmente as
otimizaes de performance do container . O mais indicado utilizar recursos como o
synchronized quando houver o potencial para inconsistncias, ou ainda, considerar a
possibilidade de definir a varivel como local (dentro de um scriptlet).

40

Diretivas JSP
Atributos da diretiva page :
errorPage : Define uma pgina alternativa a
ser exibida se um erro (no tratado) ocorrer
enquanto o container estiver processando a
pgina. A pgina de erro deve ser local e
especificada da seguinte forma :
<%@ page errorPage = /webdev/error/error.jsp %>

Desenvolvido pelo ESMS.C

34

Diretivas JSP
Atributos da diretiva page :
isErrorPage : Quando true, define que a
pgina serve como pgina de erro para uma ou
mais pginas JSP. O valor padro para este
atributo false.
Ex : <%@ page isErrorPage = true %>

Desenvolvido pelo ESMS.C

35

Diretivas JSP
Diretiva include : Permite incluir o
contedo de um arquivo em outro. A
diretiva tem o efeito de substituir a si
mesma pelo contedo do arquivo indicado.
O contedo pode ser texto esttico (HTML)
ou comandos JSP, que sero processados
como se fossem parte da pgina original.
Ex : <%@ include file=localURL %>
41
Desenvolvido pelo ESMS.C

36

Exerccios :

<%@ isThreadSafe=true %>


<%!
//classe que implementa um pool de conexes para um banco de dados
DBConectionPool pool = new DBConectionPool();
//a varivel con representa uma conexo para um banco de dados
Conection con = pool.getConection();
//classe que implementa as operaes de insero, deleo e update nas tabelas
DBComands comandos = new BDComands(con);
String Nome, CPF, RG;
%>
<%
Nome = request.getParameter(nome);
CPF = request.getParameter(cpf);
RG = request.getParameter(rg);
Comandos.Insert(Nome,CPF,RG,EMPREGADO);
%>
Com base no cdigo acima, responda as questes de 7 a 10 :
7 As variveis pool e con deveriam estar declaradas dentro do scriptlet ? Por qu ?
8 Esta pgina est suscetvel a produzir resultados inconsistentes? Explique.
9 Caso possa ocorrer algum problema, que mudanas deveriam ser feitas na pgina
para evit-lo.
10 Faz sentido ter uma varivel compartilhada sendo que seu valor est relacionado
com os dados especficos de um usurio ?
11 Crie uma pgina com o atributo buffer = 1kb e o atributo autoFlush = false.
Primeiramente, faa com que ela imprima apenas uma vez a frase Testando a
bufferizacao ! e a execute. Agora modifique-a para que ela imprima a mesma frase
1000 vezes e a execute novamente. Explique o resultado da primeira e da segunda
execuo relacionando-o ao buffer.

42

IV Objetos Implcitos
Este captulo cobre os seguintes tpicos :
Objetos Implcitos
Relacionados a Servlets
Relacionados ao Input/Output
Contextuais
Tratamento de Erros
Aes

Como j vimos anteriormente, podemos criar, dentro de scriptlets na pgina JSP,


instncias de uma classe Java e manipul-las a fim de produzir contedo dinmico. Por
exemplo, podemos criar um objeto de uma classe que acessa uma base de dados e ento
usar mtodos desse objeto para exibir na pgina uma consulta. Ou seja, atravs da
manipulao desse objeto, quer seja acessando seus mtodos ou suas variveis,
podemos gerar contedo na pgina JSP. Alm de objetos como esses, que esto
completamente sobre o controle do programador, o container JSP se encarrega de
instanciar automaticamente, durante a execuo de uma pgina JSP, alguns objetos. Tais
objetos podem ser usados dentro da pgina JSP e so conhecidos como "Objetos
Implcitos", pois sua disponibilidade em uma pgina JSP automtica. Assim como
todo objeto em Java, cada objeto implcito uma instncia de uma classe ou interface e
segue uma API correspondente. Abaixo segue um resumo dos objetos implcitos
disponveis em JSP, suas respectivas classes/interfaces e uma pequena descrio do
objeto.
Objetos implcitos de JSP e suas APIS para aplicaes de HTTP.
Objeto
Classe ou Interface
Descrio
javax.servlet.jsp.HttpJspPage
Instncia de servlet da pgina
page
javax.servlet.ServletConfig
Dados de configurao de servlet
config
javax.servlet.http.HttpServletRequest
Dados de solicitao, incluindo parmetros
request
javax.servlet.http.HttpServletResponse Dados de resposta
response
javax.servlet.jsp.JspWriter
Fluxo de sada para contedo da pgina
out
javax.servlet.http.HttpSession
Dados de sesso especficos de usurio
session
Dados compartilhados por todas as pginas de aplicao
Application javax.servlet.ServletContext
Dados de contexto para execuo da pgina
pageContext javax.servlet.jsp.PageContext
javax.lang.Throwable
Erros no capturados ou exceo
exception

Os nove objetos implcitos fornecidos por JSP podem ser classificados da seguinte
forma:
objetos relacionados ao servlet da pgina (page, config) : Os dois objetos
implcitos de JSP nesta categoria se baseiam na implementao da pgina JSP como
um servlet.
objetos relacionados ao output e input da pgina (request, response, out) : Os
objetos classificados nessa categoria se concentram na entrada e sada (input/output)
de uma pgina JSP.
objetos contextuais (application, session, pageContext) : Os objetos implcitos
dessa categoria fornece pgina JSP acesso ao contexto dentro do qual ela est
respondendo.
objetos resultantes de erros (exception) : Esta ltima categoria dos objetos
implcitos fornece apenas um objeto que usado no tratamento de erros dentro de
uma pgina JSP.
43

Objetos Relacionados a Servlets


Objeto page : O objeto page representa a
prpria pgina JSP ou, mais
especificamente, uma instncia da classe de
servlet na qual a pgina foi traduzida.
Ex :
<%@ page info="Pgina de Teste" %>
Page Info :
<%= ( (javax.servlet.jsp.HttpJspPage)page).getServletInfo()
%>
Esta expresso ir imprimir o valor da cadeia de documentao da pgina
Desenvolvido pelo ESMS.C

38

Objetos Relacionados a Servlets


Objeto config: Contm os dados de
configurao do servlet definidos como
parmetros de inicializao.
Alguns mtodos para recuperar parmetros
de inicializao de servlet:
getInitParameterNames() : Recupera os nomes
de todos os parmetros.
getInitParameter(name) : Recupera o valor do
parmetro nomeado.
Desenvolvido pelo ESMS.C

39

O objeto config uma instncia da interface javax.servlet.ServletConfig. Os valores


para os parmetros de inicializao so especificados atravs do arquivo descritor de
acionamento de uma aplicao da web (no caso do container Tomcat http://
jakarta.apache.org este arquivo o web.xml). Veja o exemplo abaixo :
<%! public void jspInit(){
String username = config.getInitParameter("username");
String password = config.getInitParameter("password"); }%>
Neste exemplo, os valores de nome de usurio e senha foram fornecidos como
parmetros de inicializao e acessados pelo objeto config. Desta forma, no foram
armazenados diretamente na pgina JSP, melhorando a segurana da aplicao.

44

Objetos Relacionados a Input/Output


Objeto request: Representa a
solicitao que acionou o
processamento da pgina atual
fornecendo acesso a todas as
informaes associadas com uma
solicitao HTTP. Os mtodos se
encaixam em 4 categorias:
Desenvolvido pelo ESMS.C

40

O objeto request representa a solicitao que requisitou a pgina. O objeto request


implementa a interface javax.servlet.http.HttpServletRequest (subinterface de
javax.servlet.ServletRequest). um dos mais complexos e mais utilizados na
construo de pginas JSP. Podemos dividir os mtodos desse objeto em quatro
funcionalidades :
Armazenar e Recuperar valores de atributos:
Mtodo
void setAttribute(String key, Object value)
Enumeration getAttributeNames()
Object getAttribute(String key)
void removeAttribute(String key)

Descrio
Associa um valor de atributo com um nome.
Recupera os nomes de todos os atributos associados com o objeto.
Recupera o valor de atributo associado com a chave.
Remove o valor de atributo associado com a chave.

Recuperar parmetros de solicitao e cabealho de HTTP:


Mtodo
Descrio
Enumeration getParameterNames()
Retorna os nomes de todos os parmetros de solicitao.
Retorna os primeiro valor (principal) de um nico parmetro de
String getParameter(String name)
solicitao.
String[] getParameterValues(String name)
Recupera todos os valores para um nico parmetro de solicitao.
Recuperar cabealhos de solicitao e cabealhos de HTTP:
Mtodo
Descrio
Recupera os nomes de todos os cabealhos associados com a
Enumeration getHeaderNames()
solicitao.
Retorna o valor de um nico cabealho de solicitao, como uma
String getHeader(String name)
cadeia.
Enumeration getHeaders(String name)
Retorna todos os valores para um nico cabealho de solicitao.
Retorna o valor de um nico cabealho de solicitao, com um
int getIntHeader(String name)
nmero inteiro.
Retorna o valor de um nico cabealho de solicitao, como uma
long getDateHeader(String name)
data.
Cookies[] getCookies()
Recupera todos os cookies associados com a solicitao.

45

Diversos mtodos da interface que javax.servlet.hhtp.HttpServletRequest:


Mtodo
Descrio
Retorna o mtodo de HTTP (e.g, POST, GET, etc) para a
String getMethod()
solicitao.
String getRequestURI()
Retorna o URL de solicitao (no inclui a cadeia de consulta).
Retorna a cadeia de consulta que segue o URL de solicitao, se
String getQueryString()
houver algum.
Recupera os dados da sesso para a solicitao (i.e, o objeto
HttpSession getSession()
implcito session).
Recupera os dados da sesso para a solicitao (i.e, o objeto
HttpSession getSession(boolean flag)
implcito session), opcionalmente criando-o se ele ainda no existir.
RequestDispatcher
Cria um dispatcher de solicitao para o URL local indicado.
getRequestDispatcher(String path)
Retorna o nome totalmente qualificado do host que enviou a
String getRemoteHost()
solicitao.
String getRemoteAddr()
Retorna o endereo de rede (IP) do host que enviou a solicitao.
String getRemoteUser()
Retorna o nome do usurio que enviou a solicitao, se conhecido.

Exemplo :
<html>
<body>
<h2> Alguns Mtodos do Objeto mplicito Request </h2>
<br><b>Valor do parmetro Nome:</b> <%= " "+request.getParameter("nome") %>
<br><b>Valor do parmetro Idade: </b> <%= " "+request.getParameter("idade") %>
<br><b>URL:</b> <%=" "+ request.getRequestURI()%>
<br><b>Cadeia de consulta:</b> <%= " " + request.getQueryString() %>
<br><b>Cliente:</b> <%= " " + request.getRemoteHost() %>
<br><b>Host da URL:</b ><%= " "+ request.getServerName() %>
</body>
</html>
Acessando o arquivo de exemplo request.jsp da seguinte forma :
http://.../request.jsp?nome=MARIA&idade=60
Retornar a seguinte tela :

Alguns Mtodos do Objeto mplicito Request


Valor do parmetro Nome : MARIA
Valor do parmetro Idade: 60
URL: /jsp_dev/sure/escritorios/request_metodos.jsp
Cadeia de consulta: nome=MARIA&idade=60
Cliente: 10.82.0.122
Host da URL: 10.82.0.220

46

O objeto response representa a resposta que ser enviada de volta para o usurio como
resultado do processamento da pgina JSP. Este objeto implementa a interface
javax.servlet.http.HttpServletResponse
que

uma
subinterface
de
javax.servlet.ServletResponse. Podemos dividir os mtodos desse objeto em quatro
funcionalidades :
Especificar o tipo de contedo e codificao da resposta:
Mtodo
Descrio
Define o tipo MIME e, opcionalmente, a codificao de caracteres
void setContentType(String type)
do contedo da resposta.
Retorna o conjunto de estilos de codificao de caracteres para o
String getCharacterEncoding()
contedo da resposta.
Definir cabealhos da resposta:
Mtodo
void addCookies(Cookie cookie)
boolean containsHeader(String name)

Descrio
Adiciona o cookie especificado.
Verifica se a resposta inclui o cabealho.
Atribui o valor definido pela varivel "value" ao cabealho
void setHeader(String name, String value)
especificado por "name"
Atribui o valor de nmero inteiro especificado por "value" ao
void setIntHeader(String name, int value)
cabealho especificado por "name"
Atribui o valor de data especificado por "value" ao cabealho
void setDateHeader(String name, long date)
especificado por "name"
Adiciona o valor definido por "value" ao cabealho especificado por
void addHeader(String name, String value)
"name"
Adiciona o valor de nmero inteiro especificado por "value" ao
void addIntHeader(String name, int value)
cabealho especificado por "name"
Adiciona o valor de data especificado por "value" ao cabealho
void addDateHeader(String name, long date)
especificado por "name"

Definir cdigos de resposta:


Mtodo
void setStatus(int code)
void sendError(int status, String msg)
void sendRedirect(String url)
Reescrita da URL:
Mtodo
String encodeRedirectURL(String url)
String encodeURL(String url)

Descrio
Define o cdigo de status para a resposta (para circunstncias sem
erro)
Define o cdigo de status e mensagem de erro para a resposta.
Envia uma resposta para o navegador indicando que ele deveria
solicitar um URL alternativo (absoluto)

Descrio
Codifica um URL para uso com o mtodo sendRedirect() para
incluir informaes de sesso.
Codifica um URL usado em um link para incluir informaes de
sesso.

Exemplo 1 :
<%

response.setDateHeader("Expires",0);
response.setHeader("Pragma","no-cache");
if(request.getProtocol().equals("HTTP/1.1"))
{
response.setHeader("Cache-Control","no-cache");
}

%>

47

Este scriplet define vrios cabealhos para evitar que a pgina seja armazenada em
cache por um navegador.
Primeiro definido o cabealho Expires para uma data no passado. Isto indica para o
navegador que o contedo da pgina j expirou, desta forma, no sendo armazenado em
cache.
O valor no-cache para o cabealho Pragma fornecido pela verso 1.0 do protocolo
HTTP para especificar que os navegadores e servidores proxy no devem armazenar em
cache uma pgina.. A verso 1.1 de HTTP substitui este cabealho por um cabealho
Cache-Control mais especfico, mas recomenda a incluso do cabealho Pragma
tambm, para compatibilidade retroativa. Portanto, se a solicitao indicar que o
navegar (ou o servidor proxy) aceita HTTP 1.1, ambos os cabealhos so enviados.
Exemplo 2 : Execute o exemplo response.jsp e analise seu cdigo fonte :
<html>
<head>
<title>
Response
</title>
</head>
<body>
<h1>Exemplo de utilizao do objeto response.</h1>
<% response.sendError(401,"Esta pgina no contm erro algum, mas como foi
configurado no cabealho um cdigo de erro o browser interpreta como se
houvesse ! "); %>

</body>
</html>
Esta pgina bastante simples e seu processamento muito provavelmente no
ocasionaria erro algum. Porm, como foi inserido um cdigo java para setar um cdigo
de erro para pgina, quando esta carregada pelo browser este constata a existncia do
erro 401 cabealho HTTP e imprime a mensagem associada.

48

Objetos Relacionados a
Input/Output
Objeto out: representa o fluxo de sada para
a pgina, cujo contedo ser enviado para o
navegador como o corpo de sua resposta.
Utilizando este objeto, possvel gerar
output dentro do corpo de um scriptlet sem
ter que temporariamente fechar o scriptlet
para inserir contedo esttico ou tags de
expresses (<%= expresso %>) JSP.
Principais mtodos : print() e println()
Desenvolvido pelo ESMS.C

50

Este objeto implcito representa o fluxo de sada para a pgina, cujo contedo ser
enviado para o navegador com o corpo de sua resposta. O objeto out uma instncia da
classe javax.servlet.jsp.JspWriter. Vejamos o exemplo abaixo (arquivo out.jsp) :

Objetos Relacionados a Input/Output


Exemplo sem o uso do objeto out:
<html><body>
<p> Asteriscos gerados fora do
scriplet:
<%

int qt = 0;
while (qt < 5){
qt ++;
%>
*
<% } %>
<br>
<%= "Foram gerados " + qt + "
asteriscos. %>
</body> </html>

Exemplo com o uso do objeto out:


<html><body>
<p> Asteriscos gerados no scriplet:
<%

int qt = 0;
while (qt < 5){
qt ++;
out.print("*");
}
out.print(<br> Foram gerados +
qt + asteriscos
%>
</body> </html>

Desenvolvido pelo ESMS.C

51

Esse objeto muito utilizado para gerar contedo dentro do corpo de um scriptlet, sem
ter que fech-lo temporariamente para inserir contedo de pgina esttico ou tags de
expresso. Contudo, deve-se evitar usar os mtodos print() ou println() (imprime
acrescentando um \n no final) para inserir cadeias de caracteres muito grandes. No
prximo caso, mais aconselhvel fechar o script e inserir o contedo esttico. Veja o
exemplo abaixo:

49

No Aconselhvel:
<%
if(i == 1){

Aconselhvel:
<%
if(i == 1) { %>

out.print("<h6>"+
"<font face='verdana'>"+
"Guga viaja nesta sexta"+
"para a Sua para"+
"jogar"+
"</font>"+
"</h6>");
} %>

<h6>
<font face='verdana'>
Guga viaja nesta sexta
para a Sua para
jogar
</font>
</h6>
<% } %>

Alguns outros mtodos do objeto out so :


Mtodo
Descrio
isAutoFlush()
Retorna true se o buffer de sada for automaticamente esvaziado quando
ele ficar cheio, false se uma exceo for lanada.
getBufferSize()
Retorna o tamanho do buffer de sada (em bytes).
getRemaining()
Retorna o tamanho da poro no usada (em bytes) do buffer de sada.
clearBuffer()
Apaga o contedo do buffer de sada, descartando-o.
clear()
Apaga o contedo do buffer de sada, assinalando um erro se o buffer
tiver sido anteriormente esvaziado.
newLine()
Escreve um separador de linha (especfico de plataforma) para o buffer
de sada.
flush()
Esvazia o buffer de sada, depois esvazia o fluxo de sada.
close()
Fecha o fluxo de sada, se desfazendo de seu contedo.

Objetos Contextuais
Os objetos implcitos dessa categoria
fornecem pgina JSP acesso ao contexto
dentro do qual ela est respondendo. Os trs
objetos implcitos contextuais so:
session
application
pageContext

Desenvolvido pelo ESMS.C

51

Os objetos implcitos nesta categoria fornecem pgina JSP acesso ao contexto dentro
do qual ela est sendo processada. O objeto session, fornece o contexto para a
solicitao qual a pgina est respondendo. Que dados j foram associados com o
usurio individual que est solicitando a pgina ? O objeto application fornece o
contexto no servidor dentro do qual a pgina est rodando. J o objeto page-Context se
concentra no contexto da prpria pgina JSP, fornecendo acesso programtico a todos
50

os outros objetos implcitos. A tabela a seguir traz os mtodos comuns aos quatro
objetos e que so usados para armazenar e recuperar valores de atributos :
Os mtodos comuns a esses trs objetos, bem como ao objeto request, e que so usados
para armazenar e recuperar valores de atributos, esto resumidos na tabela 1:
Tabela 1
Mtodo
void setAttribute(String key, Object value)
Enumeration getAttributeNames()
Object getAttribute(String key)
void removeAttribute(String key)

Descrio
Associa um valor de atributo com um nome.
Recupera os nomes de todos os atributos associados com o objeto.
Recupera o valor de atributo associado com a chave.
Remove o valor de atributo associado com a chave.

Objetos Contextuais
Objeto session : Representa a sesso atual
de um usurio individual.
Persiste enquanto o usurio estiver interagindo com a pgina
Depois de um certo perodo de inatividade a
sesso expira
Principais mtodos :
setAttribute (nome, objeto)
getAttribute (nome)
Desenvolvido pelo ESMS.C

52

O objeto session armazena informaes a respeito da sesso. Um dos principais usos


para o objeto session armazenar e recuperar valores de atributos, a fim de transmitir as
informaes especficas de usurios entre as pginas. Abaixo segue um exemplo que
armazena dados na sesso :
<%
session.setAttribute("nome", request.getParameter(nome));
session.setAttribute(senha, request.getParameter(senha))
%>
Uma vez que um objeto tenha sido armazenado atravs do mtodo setAttibute(), ele
pode ser recuperado - na mesma pgina ou em outra acessada pelo usurio. O cdigo
abaixo ilustra a recuperao do objeto armazenado no cdigo anterior:
<%
String nome = (String) session.getAttribute("nome");
String senha = (String) session.getAttribute("senha");
.....
%>
51

Perceba que o mtodo getAttribute() retorna um objeto da classe Object, portanto,


necessrio fazermos um cast para converter o objeto retornado em uma instncia da
classe desejada.
O objeto session implementa a interface javax.servlet.http.HttpSession. A tabela
abaixo traz os principais mtodos utilizados por esse objeto, alm daqueles descritos
anteriormente:
Mtodo
Object getAttibute(String nome)
String getId()
long getCreationTime()
long getLastAccessedTime()

int getMaxInactiveInterval()
void setMaxInactiveInterval(int
time)
boolean isNew()
boolean invalidate()

Descrio
Recupera o objeto identificado por "nome".
Retorna o Id da sesso.
Retorna a hora na qual a sesso foi criada.
Retorna a ltima vez que uma solicitao associada com a sesso foi recebida.
Retorna o tempo mximo (em segundos) entre solicitaes pelo qual a sesso
ser mantida.
Define o tempo mximo (em segundos) entre solicitaes pelo qual a sesso
ser mantida.
Retorna se o navegador do usurio ainda no tiver confirmado o ID de sesso.
Descarta a sesso, liberando quaisquer objetos armazenados como atributos.

Objetos Contextuais
Objeto application : Representa a aplicao
qual a pgina JSP pertence. Ex:
http:\\server\jsp_dev\index.jsp
http:\\server\jsp_dev\principal.jsp
http:\\server\jsp_dev\tutorial\tutorial.jsp

Seus mtodos retornam informaes sobre o


container, acessam recursos no servidor,
fornecem suporte a log e, principalmente ,
fornecem acesso a parmetros de inicializao da aplicao como um todo.
Desenvolvido pelo ESMS.C

54

Este objeto representa a aplicao qual a pgina JSP pertence. Ele uma instncia da
interface javax.servlet.ServletContext. Os containers JSP tipicamente tratam do
primeiro nome de diretrio em um URL como uma aplicao. Exemplo:

http://server/jsp_dev/index.jsp
http://server/jsp_dev/principal.jsp
http://server/jsp_dev/forum/forum.jsp
http://server/jsp_dev/tutorial/tutorial.jsp

So todos considerados parte da mesma aplicao jsp_dev. Alm dos mtodos descritos
na tabela 1, os mtodos do objeto application podem ser divididos em quatro
funcionalidades :
52

Recuperar informaes de verso do container servlet:


Mtodo
Descrio
String getServerInfo()
Retorna o nome e verso do container servlet.
int getMajorVersion()
Retorna a verso principal da API do servlet para o container servlet.
int getMinorVersion()
Retorna a verso secundria da API do servlet para o container servlet.
Interagir com arquivos e caminhos no servidor:
Mtodo
Descrio
String getMimeType(String
Retorna o tipo MIME para o arquivo indicado, se conhecido pelo servidor.
filename)
Traduz uma cadeia especificando um URL em um objeto que acessa os
URL getResource(String path)
contedos dos URLs, localmente ou na rede.
InputStream
Traduz uma cadeia especificando um URL em um fluxo de entrada para ler
getResourceAsStream(String path) seu contedo.
String getRealPath(String path)
Traduz um URL local em um nome de caminho no sistema de arquivo local.
ServletContext getContext(String
Retorna o contexto de aplicao para o URL local especificado.
path)
RequestDispatcher
Cria um dispacher de solicitao para o URL local indicado.
getRequestDispatcher(String path)
Suporte para log de mensagens:
Mtodo
void log(String message)
void log(String message,
Exception e)

Descrio
Grava a mensagem o arquivo de log.
Grava a mensagem no arquivo de log, junto com a trilha de pilha para a exceo
especificada.

Acessar parmetros de inicializao:


Mtodo
Enumerations getInitParameterNames()
String getInitParameter(String name)

Descrio
Recupera os nomes de todos os parmetros de inicializao.
Recupera o valor do parmetro de inicilizao com o nome dado.

Exemplo :
Um grupo de pginas JSP que residem na mesma aplicao podem fazer uso de
atributos do objeto application para disponibilizar recursos que devem estar disponveis
para todas as pginas da aplicao. Outra utilizao muito frequente para o objeto
application a utilizao de parmetros de inicializao para a aplicao como um todo.
Estas e outras funcionalidades esto ilustradas no cdigo abaixo (arquivo
application.jsp) :
<html>
<body>
<%
//Este trecho de cdigo grava um objeto do tipo String no contexto da aplicao a qual a
//pgina pertence
String aux = "aux e um objeto armazenado no contexto desta aplicacao e pode ser
recuperado por qualquer pagina que pertena a ela ";
application.setAttribute("aux",aux);
%>
<b>Recuperando objetos armazenados no contexto da aplicao (objeto
application) : </b><br>
<%= application.getAttribute("aux") %>
53

<br><br>
<b>Informaoes sobre o container : </b><br>
<%= application.getServerInfo() %>
<br><br>
<b>Caminho no servidor onde est armazenada esta pgina : </b><br>
<%= application.getRealPath("application.jsp") %>
<br><br>
<b>Recuperando parmetros de inicializao : </b><br>
<%= "Usurio : " + application.getInitParameter("username") %><br>
<%= "Senha : " + application.getInitParameter("password") %>
</body>
</html>
Os valores para os parmetros de inicializao, como no objeto Config, so
especificados atravs do arquivo descritor de acionamento de uma aplicao da web, o
Web.xml. Abaixo segue um exemplo de como configurar o arquivo com os parmetros
acima:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<context-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>teste</param-value>
</context-param>
</web-app>
Neste exemplo, como no exemplo de utilizao do objeto Config, os valores de nome de
usurio e senha foram fornecidos como parmetros de inicializao e so acessados pelo
objeto application. A diferena aqui, que estes parmetros esto disponveis para
qualquer pgina que pertena a uma mesma aplicao. J no caso do objeto Config,
estes parmetros s podem ser acessados pela pgina para qual eles foram criados.

54

Objetos Contextuais
Objeto pageContext :
fornece acesso programtico a todos os outros
objetos implcitos.
este acesso especialmente til na perspectiva
de criao de tags personalizadas.
alguns mtodos para recuperar objetos
implcitos so : getPage - retorna o objeto page,
getRequest - retorna o objeto request, getOut retorna o objeto out, getSession - retorna o
objeto session e assim para cada um deles.
Desenvolvido pelo ESMS.C

63

Objetos Contextuais
Objeto pageContext (continuao):
acesso aos atributos dos objetos que lidam com
atributos, isto , aqueles que implementam os
mtodos : setAttribute, getAttributeNames,
getAttibute (key) e removeAttibute (key)
estes objetos e seus respectivos escopos so :

request - REQUEST_SCOPE
session - SESSION_SCOPE
application - APPLICATION_SCOPE
pageContext - PAGE_SCOPE
Desenvolvido pelo ESMS.C

64

Objetos Contextuais
O bjeto pageContext (continuao):
alguns m todos para tratar de atributos so :

setAttribute (key, value, scope)


getA ttribute (key, scope)
removeAttribute (key, scope)
findAttribute (nam e)

O objeto pageContext tambm im plem enta


m todos que possibilitam transferir o
controle da pgina atual para outra e sero
vistos com mais detalhes no tpico Aes.
Desenvolvido pelo ESM S.C

65

55

O objeto pageContext fornece vrias facilidades como gerenciamento de sesses,


atributos, incluses e encaminhamento de requisies de fluxo de resposta. O objeto
pageContext uma instncia da classe javax.servlet.jsp.PageContext. Alm dos
mtodos para lidar com atributos descritos na tabela 1, os principais mtodos desse
objeto podem ser divididos em trs categorias :
Acessar outros objetos implcitos de JSP:
Mtodo
Descrio
Object getPage()
Retorna a instncia de servlet para a pgina atual (objeto implcito page).
ServletRequest
Retorna a solicitao que iniciou o processamento da pgina (objeto implcito
request).
getRequest()
ServletResponse
Retorna a respota para a pgina (objeto implcito response).
JspWriter getOut
Retorna o fluxo de sada atual para a pgina (objeto implcito out).
Retorna a sesso associada com a solicitao da pgina atual, se houver alguma
HttpSession getSession()
(objeto implcito session).
ServletConfig
Retorna o objeto de configurao de servlet (objeto implcito config).
getServletConfig()
ServletContext
Retorna o contexto no qual o servlet da pgina roda (objeto implcito application).
getServletContext()
Para pginas de erro, retorna a exceo passada para a pgina (objeto implcito
Exception getException()
exception).
Envio de solicitaes de uma pgina JSP para outra:
Mtodo
Descrio
void forward(String path)
Encaminha o processamento para um outro URL local dado pela String path.
void include(String path)
Inclui o output do processamento de um outro URL local.
Acessar atributos atravs de mltiplos escopos:
Mtodo
Descrio
void setAttribute(String key, Object obj, int Associa o valor do atributo "obj" com a chave "key" no escopo
scope)
"scope".
Enumeration getAttributeNamesInScope(int Recupera os nomes de todos os atributos associado com "key" no
scope)
escopo "scope".
Recupera o valor de tributo associado com "name" no escopo
Object getAttribute(String name, int scope)
"scope"
Remove o valor de atributo associado com "name" no escope
removeAttribute(String name, int scope)
"scope"
Object findAttribute(String name)
Procura em todos os escopos pelo atributo associado com "name".
Retorna o escopo no qual o atributo associado com "name" est
int getAttributesScope(String name)
armazenado.

Os ltimos dois mtodos listados na tabela anterior permitem a procura, atravs de todos
os escopos definidos, por um atributo associado com uma String passada como
parmetro. Nos dois casos, o objeto pageContext ir realizar uma busca atravs dos
escopos na seguinte ordem: pageContext, request, session e application..
A tabela anterior traz mtodos que recebe parmetros para especificar o escopo. A
classe javax.servlet.jsp.PageContext fornece variveis estticas para representar estes
quatro escopos diferentes. A tabela a seguir resume estas variveis:
Varivel
PAGE_SCOPE
REQUEST_SCOPE
SESSION_SCOPE
APPLICATION_SCOPE

Descrio
Escopo para atributos armazenados no objeto pageContext.
Escopo para atributos armazenados no objeto request.
Escopo para atributos armazenados no objeto session.
Escopo para atributos armazenados no objeto application.

56

O exemplo abaixo ilustra o uso do mtodo "getAttribute" e das variveis estticas


descritas na tabela anterior :
<%
User uPag=(User)pageContext.getAttibute("user",pageContext.PAGE_SCOPE)
//Recupera o object "usuario" do escopo pageContext
User uReq=(User)pageContext.getAttibute("user",pageContext.REQUEST_SCOPE)
//Recupera o object "usuario" do escopo request
User uSes=(User)pageContext.getAttibute("user",pageContext.SESSION_SCOPE)
//Recupera o object "usuario" do escopo session
User uApp=(User)pageContext.getAttibute("user",pageContext.APPLICATION_SCOPE)
//Recupera o object "usuario" do escopo application
%>

Tratamento de Erros
Objeto Exception : tem o propsito de
possibilitar o tratamento de erros em
pginas cujo atributo isErrorPage = true
Principais mtodos so :
getMessage : msg de erro descritiva
printStackTrace(out) : imprime a pilha de
execuo para o fluxo de sada designado
toString() : retorna uma cadeia combinando o
nome da classe da exceo com sua msg de erro
Desenvolvido pelo ESMS.C

61

O objeto exception no est automaticamente disponvel em todas as pginas JSP. Este


objeto est disponvel apenas nas pginas que tenham sido designadas como pginas de
erro, usando o atributo isErrorPage configurado com true na diretiva page. O objeto
exception uma instncia da classe java.lang.Throwable correspondente ao erro no
capturado que fez com que o controle fosse transferido para a pgina de erro. Os
principais mtodos da classe java.lang.Throwable que so utilizados dentro das pginas
JSP so listados na tabela abaixo:
Mtodo
String getMessage()
void
printStackTrace(PrintWri
ter out)

String toString()

Descrio
Retorna a mensagem de erro descritiva associada com a exceo quando ela foi lanada.

Imprime a pilha de execuo em funcionamento quando a exceo foi lanada para o


fluxo de sada especificado pelo parmetro out.
Retorna uma cadeia combinando o nome da classe da exceo com sua mensagem de
erro, se houver alguma.

O trecho abaixo ilustra o uso do objeto exception em uma pgina de erro JSP:

57

<@ page isErrorPage=true %>


<h1>Erro Encontrado</h1>
O seguinte erro foi encontrado:<br>
<b><%= exception %></b><br>
<% exception.printStackTrace(out); %>

Aes
Forward : A ao <jsp:forward> transfere
permanentemente o controle de uma pgina
JSP para um outro local no servidor.
O contedo gerado antes descartado.
Os objetos request e session sero os
mesmos tanto para a pgina original quanto
para a pgina encaminhada.
Consideraes quanto bufferizao
Sintaxe : <jsp:forward page=localHRL />
Desenvolvido pelo ESMS.C

67

Aes
fatorao.jsp
<% x =
request.getParameter(x);

y = Fatora (x);
if (y != null) {
request.setAttribute (y,y);
%>
<jsp:forward
page=recebe_fatoracao.jsp />
<% } %>

recebe_fatoracao.jsp
<% y =
request.getAttribute(y);
%>
Este o contedo de y
passsado na solici- tao pela
pgina fatorao.jsp :

<%= y %>
resposta

Desenvolvido pelo ESMS.C

68

A ao <jsp:forward page=localURL /> usada para transferir permanentemente o


controle de uma pgina JSP para um outro local no servidor, que pode ser um
documento esttico, um CGI, um servlet ou outra pgina JSP. Qualquer contedo
gerado pela pgina atual descartado e o processamento da solicitao comea
novamente no local alternativo.
Quando o controle transferido para uma outra pgina JSP, o container ir
automaticamente atribuir um novo objeto pageContext pgina encaminhada. O objeto
58

request e session, no entanto, sero os mesmos tanto para pgina original quanto para a
pgina encaminhada.
Se necessrio transferir dados de uma pgina para outra, a abordagem tpica
armazenar estes dados na solicitao (como no exemplo do slide) ou na sesso,
dependendo de por quanto tempo a mais os dados sero necessrios. No exemplo acima,
o objeto request foi utilizado para especificar um atributo a mais (y) junto aos
parmetros de solicitao, para transmitir informao adicional de uma pgina para
outra. No h limite para o nmero de parmetros de solicitao que podem ser
especificados desta maneira e nem ao tipo dos mesmos.
Um ponto importante quando da utilizao desta tag, sua interao com a
bufferizao. Quando o processamento de uma solicitao de pgina encontra a tag
<jsp:forward>, todo output gerado at ento deve ser descartado atravs do
esvaziamento do buffer de sada. Se no entanto, o buffer de sada associado com a
solicitao da pgina atual tiver sido esvaziado antes da ao <jsp:forward> ser
executada, a ao ir falhar e uma exceo IllegalStateException ser lanada. Sendo
assim, qualquer pgina que empregue esta tag, deve ser verificada para se certificar que
seu buffer de sada seja grande o suficiente para assegurar que ele no ser esvaziado
antes de qualquer chamada para esta ao. Alternativamente, se a bufferizao de sada
for desabilitada para a pgina , ento qualquer cdigo que possa chamar a ao
<jsp:forward> deve aparecer na pgina antes de qualquer elemento esttico ou dinmico
que gere output.

Aes
Include : A ao <jsp:include> transfere
temporariamente o controle de uma pgina
JSP para um outro local no servidor.
O output da pgina includa colocado no
output da pgina atual que continua seu
processamento.
Sintaxe :
<jsp:include page=localHRL flush=true />

Diretiva include x Ao include


Desenvolvido pelo ESMS.C

69

A ao <jsp:include> permite a incorporao do contedo gerado por outro documento


local no output da pgina atual. Quando uma tag <jsp:include> encontrada, a
solicitao redirecionada do arquivo original para a pgina includa, o container
realiza as tarefas comuns de execuo de uma pgina (carrega o servlet caso necessrio,
recompila caso tenha havido alguma alterao, etc), o output gerado inserido no
output da pgina original e depois o processamento da pgina original continua
normalmente. Sua sintaxe :
<jsp:include page=localURL flush=true />
59

A pgina includa pode ser um documento esttico, um CGI, um servlet ou outra pgina
JSP. Assim como acontece com a ao <jsp:forward>, o atributo page da ao
<jsp:include> suporta valores obtidos em tempo de execuo. O atributo flush controla
se o buffer de sada da pgina original deve ou no ser esvaziado antes que o novo
output comece a ser includo. Geralmente definido como true.
Assim como acontece com pginas acessadas atravs da ao <jsp:forward>, ser
atribudo s pginas includas um novo objeto pageContext e compartilhado os objetos
session e request. Sendo assim, caso seja necessrio passar valores da pgina original
para a includa, deve-se usar um destes objetos.
Diretiva Include x Ao Include

Diretiva Include :

Todas as pginas includas so compiladas juntas criando um nico servlet.


Compartilhamento de variveis entre as pginas (j que na verdade geram um nico
servlet).
Melhor performance tendo em vista que no requer o overhead de despachar a
solicitao para a pgina includa e depois incorporar a resposta no output da pgina
original.
Quando uma pgina includa alterada, para ter efeito a alterao necessrio
realizar forosamente uma alterao na pgina principal, para assim o servlet ser
recompilado.
A pgina a ser includa no pode ser especificada dinamicamente.
Pode incluir apenas pginas estticas ou outra pgina JSP.

Ao Include :

Cada pgina includa um servlet separado, que deve ser carregado e executado
pelo container.
Troca de informaes entre as pginas atravs do objeto session ou request.
Como cada pgina includa um servlet separado, uma alterao em alguma delas
no requer uma alterao forada na pgina principal para a alterao ter efeito
(recompilao automtica).
Menores tamanhos de classe, j que o cdigo correspondente ao arquivo includo
no repetido nos servlets para todas as pginas JSP que fazem a incluso.
Possibilidade de especificar em tempo de execuo a pgina a ser includa.
Pode incluir pginas estticas, CGIs, servlets ou outra pgina JSP.

60

Exerccios :

Objetos request e response


1 Quais os objetos que possibilitam manipular os cabealhos HTTP?
2 Execute o cdigo abaixo e explique o que ele faz.
java.util.Enumeration parameter_names = request.getHeaderNames();
String nome;
while(parameter_names.hasMoreElements())
{
nome = (String) parameter_names.nextElement();
out.println("Parametro " + nome + " = ");
out.println(request.getHeader(nome) + "<br><br>");
}
3 Crie uma pgina chamada origem.jsp que recebe um nmero inteiro como
parmetro, calcula seu fatorial e acrescenta o resultado como atributo da solicitao.
Depois, crie um objeto do tipo javax.servlet.RequestDispatcher. Para isso utilize o
mtodo getRequestDispatcher(<pagina destino>) do objeto request:
javax.servlet.RequestDispatcher dispatcher = request.getRequestDispatcher(XXX);
Para comandar o direcionamento para outra pgina, utilize o mtodo
forward(request,response) do objeto dispatcher. Voc deve redirecionar para uma
pgina local chamada destino.jsp, a qual deve imprimir o resultado do fatoramento.
Perceba como til poder acrescentar atributos na solicitao para trocar informaes
entre pginas.
4 Refaa o exerccio anterior fazendo o redirecionamento utizando o mtodo
sendRedirect(URL) do objeto response ao invs do forward. Veja junto ao instrutor
porque desta forma no funciona e qual a diferena das duas abordagens.
Objeto application
5 Refaa o exerccio 4 porm, ao invs de gravar o resultado do fatorial no objeto
request, grave-o no contexto da aplicao. Modifique a pgina destino.jsp para pegar o
atributo do lugar apropriado. Explique porque desta forma, mesmo fazendo o
redirecionamento atravs do sendRedirect(URL), o valor est acessvel na pgina de
destino.
Objeto out
6 - Faa uma pgina que exiba o status da bufferizao, apresentando qual o tamanho
total do buffer, quantos bytes j foram utilizados e qual a porcentagem livre do mesmo.
7 - O mtodo abaixo simula o jogo do lanamento de uma moeda para depois verificar
se ela caiu no lado da cara ou da coroa. O mtodo retorna uma String com o resultado, e
um exemplo da forma como pode ser utilizado a partir de uma pgina est no quadro
abaixo.

61

<%!
String jogueMoeda(){
String retorno = "";
int i = (int)(Math.random()*10); //um nmero entre 0 e 10
i = i%2;
//resto da divisao de i por 2
if(i==0){
Exemplo de utilizao :
retorno = "cara";
<html>
} else {
<body>
retorno = "coroa";
}
<h1>Deu <%= jogueMoeda() %>!</h1>
return retorno;
}
</body>
%>
</html>

Modifique o cdigo de forma que o mtodo receba como parmetro o nmero de vezes
que ir lanar a moeda. Alm disso, utilize o objeto out para imprimir, a partir do
prprio mtodo, os resultados. A insero deste objeto no mtodo ir causar dois erros
que devem ser tratadados. Algumas dicas para tentar resolv-los so : lembre-se que o
java exige o tratamento de excees em determinadas situaes, os objetos implcitos
no so visveis dentro dos mtodos criados numa pgina JSP e o objeto out da classe
javax.servlet.jsp.JspWriter.
Objeto session
8- Crie uma pgina chamada testanto_sessao.jsp que l o atributo valor da sesso e
imprime seu contedo na tela. Caso este atributo ainda no exista na sesso, deve-se
apresentar uma tela para que seu valor seja informado, com um boto para fazer um
submit para a prpria pgina. O cdigo do formulrio HTML pode ser como o abaixo:
<html>
<body>
<form action=testando_sessao.jsp method=post>
Entre com o valor a ser armazenado na sesso:
<input type=text name=valor size=10> <br>
<input type=submit value=Enviar>
</body>
</html>
Ao Forward e Include
9 - Crie uma pgina que leia um valor numrico passado pelo usurio, multiplique seu
valor por 10, e ento encaminha o processamento utilizando a ao <jsp:forward> para
outra pgina que ir imprimir o resultado.
10 - Numa situao em que queremos utilizar uma pgina que cria inmeros objetos que
sero compartilhados por outras, qual melhor opo, utilizar a diretiva include ou a ao
include ?

62

V - Cookies

IV - Cookies
Mecanismo padro fornecido pelo protocolo
HTTP que permite gravar pequenas
quantidades de dados no lado do usurio
Por razes de segurana, um cookie s pode
ser recuperado pelo servidor que o forneceu
Opcionalmente pode ser tornado acessvel
para outros servidores que compartilham o
mesmo domnio do servidor original
So definidos em cabealhos de resposta e
recuperados em cabealhos de solicitao
Desenvolvido pelo ESMS.C

70

Cookie um mecanismo padro fornecido pelo protocolo HTTP e que permite


gravarmos pequenas quantidades de dados persistentes no navegador de um usurio.
Tais dados podem ser recuperados posteriormente pelo navegador. Esse mecanismo
geralmente usado quando queremos armazenar/recuperar informaes de algum usurio.
Com os cookies, pode-se reconhecer quem entra num site, de onde vem, com que
periodicidade costuma voltar, dentre inmeras outras utilizaes. No Internet Explore
5.1, os cookies ficam armazenados em c:\windows\cookies e no Communicator 4.7,
ficam em c:\arquivos de programas\netscape\users.
Como padro, os cookies expiram to logo o usurio encerra a navegao naquele site,
porm, podemos configur-los para persistirem por vrios dias, at uma data de
expirao especificada. Por razes de segurana, um cookie s pode ser recuperado pelo
servidor que o forneceu. Opcionalmente, um cookie pode ser tornado acessvel para
outros servidores que compartilham o mesmo domnio do servidor original que o gravou
. Eles ainda podem ser restritos a uma hierarquia de diretrios de URL especfico no
servidor, ou servidores, do qual ele acessvel. Cada cookie recebe um nome, e um
servidor pode ento definir mltiplos cookies e fazer a identificao entre eles atravs
dos seus nomes.
Gerenciando Cookies

Como vimos, os cookies esto relacionados a um servidor da web. Quando um usurio


solicita um URL cujo servidor e diretrio correspondam queles de um ou mais de seus
cookies armazenados, o prprio browser se encarrega de enviar os cookies
correspondentes de volta para o servidor na forma de cabealhos de solicitao. Os
cookies so definidos atravs de cabealhos de resposta HTTP.
As pginas JSP acessam os seus cookies associados atravs do mtodo getCookies() do
objeto implcito request. De forma similar, as pginas JSP podem criar ou alterar
cookies atravs do mtodo addCookie() do objeto implcito response. Esses mtodos so
resumidos na tabela abaixo :
63

Objeto Implcito
request
response

Mtodo
getCookies()
addCookie(cookie)

Descrio
retorna uma matriz de cookies acessveis da pgina
envia um cookie para o navegador para armazenagem/modificao

Para ambos os mtodos os cookies so representados como instncias da classe


javax.servlet.http.Cookie. O mtodo getCookies () retorna um array de instncias da
classe Cookie, enquanto o mtodo addCookie() recebe uma instncia dessa classe como
seu argumento.

Como Funcionam os Cookies


grava_cookie.jsp
....
addCookie(x)
...
le_cookie.jsp
....
getCookies()
...

Para gravar um cookie no lado cliente,


usamos recursos de JSP que o definem no
cabealho de resposta. Quando o browser
recebe uma pgina, ele l este cabealho,
identifica os cookies existentes e os grava.
Toda vez que uma pgina submetida
para o servidor web, o browser antes
verifica se h algum cookie referente quele
servidor (ou domnio) e os envia no cabealho
de solicitao. Quando a pgina chega no
servidor, possvel ler este cabealho e
recuperar os cookies enviados.
Desenvolvido pelo ESMS.C

71

A classe Cookie

Manipulando Cookies
Manipulamos um cookie atravs de
instncias da classe Cookie
Construtor :
Cookie cookie = new Cookie("nome" , valor");

Principais Mtodos :

getValue()
getDomain()
getMaxAge()
getName()

- setValue()
- setDomain()
- setMaxAge(int i)

Desenvolvido pelo ESMS.C

72

64

Manipulamos um cookie atravs de instncias da classe javax.servlet.http.Cookie, que


automaticamente inserida no servlet associado que gerado na compilao da pgina
JSP. Essa classe fornece apenas um tipo de construtor que recebe duas variveis do tipo
String, que representam o nome e o valor do cookie :
Cookie cookie = new Cookie("nome" , valor");
Abaixo apresentamos os mtodos fornecidos pela classe Cookie:
Mtodo
getName()
getValue()
getDomain()
getPath()
getSecure()
setValue()
setDomain()
setPath(nome do path)
setMaxAge(inteiro)
setSecure(nome)

Descrio
retorna o nome do cookie
retorna o valor armazenado no cookie
retorna o servidor ou domnio do qual o cookie pode ser acessado
retorna o caminho deURL do qual o cookie pode ser acessado
indica se o cookie acompanha solicitaes HTTP ou HTTPS.
atribui um novo valor para o cookie
define o servidor ou domnio do qual o cookie pode ser acessado
define o caminho de URL do qual o cookie pode ser acessado
define o tempo restante (em segundos) antes que o cookie expire
retorna o valor de um nico cabealho de solicitao como um
nmero inteiro

Depois de construir uma nova instncia, ou modificar uma instncia recuperada atravs
do mtodo getCookies(), importante ter em mente a necessidade de usar o mtodo
addCookie( ) para atualizar no navegador do usurio as alteraes feitas no cookie. Para
apagar um cookie utilizamos a seguinte tcnica : chamamos o mtodo "setMaxAge(0)"
com valor zero e depois mandamos gravar chamando o mtodo "addCookie( )". Isso faz
com que o cookie seja gravado, substituindo o de mesmo nome, e imediatamente (aps
zero segundos) expira.
Os dados do cookie so comunicados atravs do servidor para o navegador atravs de
cabealhos de resposta. Lembre-se que todos os cabealhos devem ser definidos antes
que qualquer contedo de corpo seja enviado para o navegador. Assim, a fim de que o
mtodo addCookie tenha sucesso em uma pgina JSP, ele deve ser chamado antes que o
buffer de sada da pgina seja esvaziado. Isto pode ocorrer quando o buffer fica cheio ou
quando executada uma ao <jsp:include>. O status da bufferizao de sada
portanto, uma considerao importante ao construir pginas JSP que definem cookies.
Definindo um cookie

O primeiro passo ao usar um cookie dentro de uma pgina defini-lo. Isto feito
criando uma instncia da classe Cookie e chamando os mtodos "sets" para definir os
valores de seus atributos.
Vamos ver o seguinte exemplo da pgina addcookie.jsp :
<%
String email = request.getParameter("email");
String cookieName = "cookieJSP";
Cookie cookieJSP = new Cookie(cookieName, email);
cookieJSP.setMaxAge(7 * 24 * 60 * 60); //define o tempo de vida como 7 dias (604800
//segundos)
cookieJSP.setVersion(0); //verso 0 da especificao de cookie
65

cookieJSP.setSecure(false); //indica que o cookie deve ser transferido pelo protocolo


//HTTP padro
cookieJSP.setComment("Email do visitante"); //insere um comentrio para o cookie
response.addCookie(cookieJSP); //grava o cookie na mquina do usurio
%>
<html> <head>
<title>Grava Cookie</title>
</head>
<body>
<h1>Grava Cookie</h1>
Esta pgina grava um cookie na sua mquina.<br>
<a href='readcookie.jsp'>L contedo do cookie</a>
</body> </html>
A pgina que ir fornecer um email que ser gravado pela pgina "addcookie.jsp" pode
ser da seguinte forma :
<html> <body>
<form action="addcookie.jsp">
<input type="text" name="email">
<input type="submit" value="ok">
</body> </html>
No exemplo acima o cookie identificado pelo nome cookieJSP e recebe o valor
passado pelo usurio atravs de um formulrio.
Recuperando um Cookie

A pgina jsp vista anteriormente tem a finalidade de receber um valor (email) passado
atravs de um formulrio de uma pgina html. Este valor armazenado de forma
persistente em um cookie e poder ser acessado pelas outras pginas JSP que
compartilham o domnio e o caminho originalmente atribudos ao cookie. Os cookies
so recuperados atravs do mtodo getCookies() do objeto implcito request. A pgina
abaixo (readcookie.jsp) mostra um exemplo de recuperao do valor de um cookie.
<%
String cookieName = "cookieJSP";
Cookie listaPossiveisCookies[] = request.getCookies();
Cookie cookieJSP = null;
if (listaPossiveisCookies != null) {
//quando no existe cookies associados, o mtodo getCookies() retorna um valor null
int numCookies = listaPossiveisCookies.length;
for (int i = 0 ; i < numCookies ; ++i) {
if (listaPossiveisCookies[i].getName().equals(cookieName)) { //procura pelo cookie
cookieJSP = listaPossiveisCookies[i];
break;
}
}
} %>
<html> <body>
<h1>L Cookie</h1>
66

<% if (cookieJSP != null) { %>


A pagina "addcookie" gravou o seguinte email: <%= cookieJSP.getValue() %>
<% }
else { %>
O cookie no gravou ou o prazo do cookie expirou.
<% } %>
</body> </html>
O primeiro scriptlet nesta pgina recupera os cookies associados quela pgina e depois
tenta encontrar um cookie identificado pelo nome "cookieJSP".
Consideraes finais sobre cookies

Restries Quanto a Utilizao


Restries quanto a utilizao :
o tamanho dos dados armazenados (nome e
valor) no devem ultrapassar 4K
um navegador armazena at 20 cookies por
configurao de domnio e tambm 300 cookies
em geral
o domnio atribudo a um cookie deve ter pelo
menos dois pontos, por exemplo :
www.exemplo.com ou .exemplo.com (se
nenhum especificado, somente o host original
poder l-lo)
Desenvolvido pelo ESMS.C

75

Apesar da praticidade de se utilizar os cookies oferecidos pelo protocolo HTTP,


devemos fazer algumas consideraes quanto a sua utilizao :

o tamanho dos dados armazenados (nome e valor) no devem ultrapassar 4K.


o navegador pode armazenar mltiplos cookies, contanto obedece um certo limite.
Um navegador armazena at 20 cookies por configurao de domnio. O navegador
armazena tambm 300 cookies em geral. Se qualquer um destes dois limites forem
alcanados, espera-se que o navegador exclua cookies menos utilizados.
o domnio atribudo a um cookie deve ter pelo menos dois pontos, por exemplo :
www.exemplo.com ou .exemplo.com. Esta regra existe para evitar a especificao
de cookies que podem ser lidos atravs de um domnio inteiro de alto nvel (.com,
.org, .net, etc). Quando nenhum domnio especificado na criao de um cookie
atravs do mtodo setDomain(nome do domnio), ento ele poder ser lido apenas
pelo host que originalmente o definiu.

67

Exerccios :

1 Explique com suas palavras como os cookies so armazenados no browser do


usurio e como so enviados para o servidor web.
2 Crie uma pgina JSP que grava um cookie chamado datecookie com o valor da data
atual do sistema e expira num prazo de dois dias. Ela deve conter um link para uma
outra pgina que dever apresentar o contedo do cookie ou apresentar uma mensagem
que o cookie no pode ser encontrado ou j expirou. Para obter a data do sistema fazer
java.util.Date data = new Date();
e, para criar um link em HTML :
<a href = pagina.jsp> texto_do_link </a>

68

VI - Enviando Email com JSP


O envio de email nos dias de hoje, para quem utiliza a internet, algo comum e
corriqueiro. bastante comum encontrarmos sites a partir da qual podemos enviar um
email ou enviar aquela pgina html para um amigo. Vale citar o fato que o envio de
email via pginas html/jsp pode ser uma excelente ferramenta para webmasters que
precisam enviar periodicamente mensagem padro para grupos de usurios.
O envio do(s) email(s) efetuado atravs da API JavaMail, que pode ser obtida em :
http://www.javasoft.com/products/javamail/index.html. Neste link, encontram-se todas
as informaes necessrias para a confeco de aplicaes que lidam com emails.
Utilizando esta API voc poder fazer seu prprio WebMail, personalizando-o da forma
como desejar.
Vamos analisar o exemplo abaixo. Neste exemplo construiremos trs arquivos:
1. uma pgina html simples (preencheremail.html);
2. uma pgina JSP (enviaremail.jsp);
O primeiro destes, a pgina html, ter um formulrio com trs objetos do tipo "TEXT",
um do tipo "TEXTAREA" e um boto do tipo "SUBMIT" para enviar o formulrio com
os dados do email.Os dados que forem preenchidos neste formulrio sero tratados pela
pgina JSP enviaremail.jsp que foi definida como o action do formulrio. Abaixo segue
o cdigo da pgina preencheremail.html :
<html>
<body>
<form action="enviaremail.jsp" method"post">
<table border="0" align="center" bgcolor="tan">
<tr>
<td><b>Para..:</b></td>
<td><input type="Text" name="para"></td>
</tr>
<tr>
<td><b>De..:</b></td>
<td><input type="Text" name="de"
value=fale_conosco@ms.previdenciasocial.gov.br></td>
</tr>
<tr>
<td><b>Assunto..:</b></td>
<td><input type="Text" name="assunto"</td>
</tr>
<tr>
<td colspan="2">
<textarea name="mensagem" rows=10 cols=45></textarea>
</td>
</tr>
</table>
<center> <input type="Submit" value="Enviar Email"></center>
</form> </body> </html>

69

Abaixo segue o cdigo da pgina JSP enviaremail.jsp com a lgica de programao


responsvel por criar e enviar o "email" :
<%@page import="javax.mail.*" %>
<%@page import="javax.mail.internet.*" %>
<%@page import="java.util.Date" %>
<%@page import="java.util.Properties" %>
<html>
<body>
<%
try {
//definio do mailserver
Properties props = System.getProperties();
props.put("10.0.134.8", "10.0.134.8");
//obtendo uma sesso de mail
Session mailSession = Session.getDefaultInstance(props, null);
//As duas linhas seguintes de cdigo, colocam no formato de endereos,
//supostamente vlidos, de email os dados passados pelos parmetros to e from.
InternetAddress destinatario = new InternetAddress (request.getParameter("para"));
InternetAddress remetente = new InternetAddress (request.getParameter("de"));
//As linhas de cdigo a seguir, so responsveis por setar os atributos e
//propriedades necessrias do objeto message para que o email seja enviado.
//Inicializao do objeto Message
Message message = new MimeMessage (mailSession);
//Definio de quem est enviando o email
message.setFrom(remetente);
//define o(s) destinatrio(s) e qual o tipo do destinatrio.
//os possveis tipos de destinatrio: TO, CC, BCC
message.setRecipient( Message.RecipientType.TO, destinatario );
//definio do assunto do email
message.setSubject (request.getParameter("assunto"));
//definio do contedo da mesnagem e do tipo da mensagem
message.setContent (request.getParameter("mensagem"), "text/plain");
//Data de envio
message.setSentDate(new Date());
//a linha de cdigo seguinte a responsvel pelo envio do email
Transport.send (message);
out.println("<p> Email enviado com sucesso ! </p>");

70

}
catch (AddressException e) {
out.println("<p>Endereo de Email invlido</p>");
}
catch (MessagingException e) {
out.println("<p>Impossvel enviar o email.</p>");
}
%>
</body>
</html>
No arquivo acima, optamos por levantar as excees na prpria pgina jsp de onde se
envia o email, poderamos ter definido uma pgina de erro para fazer este tratamento.
So dois os possveis erros decorrentes da tentativa de enviar o email :
O cdigo abaixo, ilustra o tratamento da exceo gerada por endereo de email invlido.
catch (AdressException e) {
out.println(<p>Endereo de Email invlido</p>);
}
No trecho de cdigo seguinte, fazemos o tratamento da exceo gerada pelo no envio
da mensagem. Essa exceo pode ser causada por vrios problemas, tais como:
problema no servidor de email, problemas na rede, entre outros.
catch (MessagingException e) {
out.println(<p>Impossvel enviar o email.</p>);
}
Exerccio :

1 Crie uma pgina JSP que , quando executada, l um arquivo texto com uma lista de
e-mails e envia um texto pr-definido para cada e-mail da lista. Se ocorrer algum erro
no decorrer deste processo, este deve ser tratado numa pgina de erro chamada error.jsp.
O cdigo abaixo implementa a funcionalidade de ler um arquivo num formato prdefinido e armazenar seu contedo numa estrutura de dados denominada Properties.
Voc deve increment-lo com o cdigo de envio de e-mail para todos os e-mails
carregados do arquivo lido.
<%@page import="java.util.Properties" %>
<%@page import="javax.activation.*" %>
<%@page import="java.io.*" %>
<%@page import="java.util.*" %>
Properties table; //declarando uma tabela para armazenar os dados do arquivo
table = new Properties(); //instanciando nova tabela de propriedades
/*
Buscando o arquivo a ser inserido na tabela
O arquivo deve ter o seguinte formato:
email1 curso@dataprev.gov.br
email2 .........
71

email3 .........
email4 .........
*/
FileInputStream input;
input = new
FileInputStream(" Caminho completo para o arquivo ");
table.load(input); //Carregando dados do arquivo
input.close(); //Fechando fluxo entrada de dados
//Lao para varrer a estrutura table com os e-mails lidos do arquivo
for(int i=0; i < table.size(); i++) {
//para recuperar o e-mail 1 fazer : table.getProperty("email1); e assim
//sucessivamente para cada e-mail
}

72

VII Trabalhando com Banco de Dados


Este captulo cobre os seguintes tpicos :

Introduo a API JDBC


Como instalar um driver JDBC
Como estabelecer uma conexo com um banco de dados
Interagindo com banco de dados
Executando consultas
Executando alteraes
Executando stored procedures
A classe ResultSet

Hoje em dia, a maioria dos sites da internet que produzem contedo dinmico fazem
uso de algum banco de dados. Gerenciamento de anncios, informaes de usurios,
lista de contato, compras on-line so apenas alguns dos recursos comumente
gerenciados atravs de um banco de dados.
Diferentemente de outras linguagens (PHP, Cold Fusion, etc), JSP no define um
conjunto prprio de comandos para acessar um banco de dados especfico (em PHP por
exemplo, existe um conjunto especfico de comandos para acessar cada banco de dados
diferente, consequentemente, uma pgina projetada para acessar o MySQL tem que ser
refeita se quisermos mudar o banco para Interbase), mas sim utiliza a API JDBC de
java para isso. Como todos os drivers de diferentes fabricantes baseiam sua
implementao nas interfaces e classes definidas nesta API, todos eles implementam o
mesmo conjunto de mtodos (com as mesmas assinaturas). Sendo assim, se quisermos
mudar o banco de dados da nossa aplicao java, basta apenas carregar o driver
referente ao novo banco que tudo continuar funcionando com (quase) nenhuma
alterao no cdigo da aplicao.
Instalando um Driver JDBC

O primeiro passo para se estabelecer uma conexo com um banco de dados utilizando
java obter o driver JDBC do banco em questo. Existe um servio no site da SUN que
rene inmeros drivers de diferentes fabricantes e permite configurar uma consulta para
buscar pelo driver JDBC desejado (http://servlet.java.sun.com/products/jdbc/drivers).
Os drivers geralmente so fornecidos como arquivos com extenso .JAR. Arquivos .jar
so geralmente usados para agrupar todos os arquivos de uma determinada aplicao
Java. Dentro deles pode-se ter desde .class, arquivos html de documentao a arquivos
de udio. Com esse tipo de recurso voc pode criar uma espcie de executvel para
Java, bastando para isso, associar o tipo .jar com o java.exe ou com o javaw.exe
facilitando assim a distribuio de suas aplicaes. Alem disso, arquivos jar podem ser
teis para distribuir conjuntos de pacotes que se prestem a realizar alguma operao.
comum, por exemplo, ver os drivers JDBC(Java Database Connectivity) ou applets
serem distribudos nesse tipo de arquivo. Os arquivos jar usam um padro de
compresso baseado no formato de compresso zip de modo que qualquer aplicativo
que suporte esse formato pode abrir e manipular um .jar.
H vrias maneiras de instalar um Jar para ser usado pela sua aplicao web:

73

A forma mais simples copiar o arquivo para o diretrio


<JAVA_HOME>\jre\lib\ext. Isso torna o arquivo automaticamente visvel ao
jdk e todas as aplicaes, web ou no, iro reconhece-lo.
Outra forma copiar o arquivo para qualquer diretrio na mquina e ento
referenciar seu caminho totalmente qualificado na varivel de ambiente
CLASSPATH. O jdk faz uso dessa varivel para acrescentar as libs a definidas
sua lista de bibliotecas. O incoveniente dessa abordagem que as IDEs de
desenvolvimento geralmente ignoram o CLASSPATH de maneira que voc ter
que adicionar o arquivo jar manualmente ao conjunto de libs reconhecidos pela
sua IDE. Como em cada IDE h uma maneira diferente de se fazer isso, no irei
explicar como faz-lo.
Outra alternativa copiar o arquivo para o diretrio WEB-INF/lib do contexto
que sua aplicao faz parte. Isso faz com que somente a aplicao web dentro
deste contexto tenha acesso ao arquivo Jar.

Mais sobre arquivos Jar pode ser encontrado em:


http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jar.html
Conectando um Banco de Dados

Uma vez instalado o driver JDBC do banco que desejamos utilizar, temos que
configurar as informaes necessrias para estabelecermos uma conexo. Para tanto,
utilizaremos a classe javax.sql.DataSource implementada pelo driver. Essa classe
encapsula todas as informaes necessrias para obtermos uma conexo com um
determinado banco de dados (driver, localizao, usurio, senha, etc), permitindo que
eliminemos as informaes de conexo do cdigo (caso usemos JNDI para registr-lo) e
criando uma interface nica atravs da qual iremos nos referir ao banco desejado. Se por
exemplo mudarmos a base de dados de local ou as informaes de login mudarem, basta
apenas alterarmos suas propriedades com as novas informaes e qualquer cdigo que o
esteja utilizando no precisar ser alterado.
Abaixo seguem alguns exemplos para criao de objetos DataSource :
Para instanciar o objeto, utilizamos o nome de classe totalmente qualificado. Esse nome
vai depender do banco que se deseja acessar. O cdigo abaixo apresenta a definio de
um DataSource para acessar um banco Oracle.
oracle.jdbc.pool.OracleDataSource ds = new oracle.jdbc.pool.OracleDataSource();
ds.setDatabaseName("sart");
ds.setUser("sart");
ds.setPassword("sart");
ds.setPortNumber(1521);
ds.setServerName("10.82.0.205");
ds.setURL("jdbc:oracle:thin:@10.82.0.205:1521:sart");
J o cdigo abaixo apresenta a configurao de um DataSource para acessar um banco
no Interbase.
interbase.interclient.DataSource ds = new interbase.interclient.DataSource();
ds.setServerName("10.82.0.220");
ds.setDatabaseName("/home/httpd/html/portal_ms/portal.gdb");
74

ds.setUser("SYSDBA");
ds.setPassword("masterkey");
Uma vez tendo instanciado apropriadamente um objeto DataSource, podemos usar seu
mtodo getConnection para obtermos uma conexo com o banco que o objeto
referencia.
java.sql.Connection con = ds.getConnection();
Interagindo com Banco de Dados

Uma vez tendo estabelecido uma conexo com um banco de dados (com um usurio
com privilgios suficientes), podemos comandar os mais diversos tipos de operaes
para que este as execute : consultas, alteraes nas informaes das tabelas ou em sua
estrutura, execuo de stored procedures, dentre outras. importante lembrar que,
sempre depois que a conexo for utilizada, esta deve ser fechada com o comando
close().
 Executando consultas

Para comandarmos a execuo de uma consulta utilizamos a classe Statement, cujo


objeto obtido atravs do mtodo createStatement() do objeto Connection como
exemplificado no cdigo abaixo :
java.sql.Statement stm = con.createStatement();
Uma vez obtido um objeto Statement, podemos definir uma consulta e submeter sua
execuo ao banco atravs do mtodo executeQuery(String query) do objeto Statement :
java.sql.ResultSet rs = stm.executeQuery(select * from USERS);
O parmetro query uma String com uma consulta qualquer na linguagem SQL
suportada pelo banco. O mtodo retorna um objeto da classe ResultSet. Falaremos mais
sobre este objeto posteriormente.
Alternativamente classe Statement, podemos utilizar a classe PreparedStatement para
submetermos nossas consultas. As instrues preparadas nos permitem desenvolver um
modelo de consulta SQL que podemos reutilizar para tratar de solicitaes similares,
que diferem, entre cada execuo, apenas em alguns parmetros. Montamos a consulta
deixando as variveis com valores indefinidos, representados por sinais de interrogao
que sero substitudos antes da execuo da consulta. Ao usar instrues preparadas, o
SGBD, a medida do possvel, executa o parser na consulta, realiza otimizaes, cria o
plano de execuo e o armazena para reutilizao sempre que esta consulta for
solicitada, sem a necessidade de executar todos esses passos novamente. Um objeto
dessa classe obtido atravs do mtodo prepareStatement(query) da classe Connection :
java.sql.PreparedStatement pstm = con.prepareStatement(query);
Vejamos o exemplo abaixo :
String query = select nome,dt_nascimento,salario from EMPREGADOS where
dt_admissao > PAR_1 and salario < PAR_2
75

se quisssemos que os valores de dt_nascimento e salario fossem passados em tempo de


execuo utilizando a classe Statement, faramos da seguinte forma
java.sql.Statement stm = con.createStatement();
//Montagem da consulta
String query = select nome, dt_nascimento, salario from EMPREGADOS where
dt_admissao > + data_formato_banco + and salario < +
salario_formato_banco ;
//Execuo da consulta
java.sql.ResultSet rs = stm.executeQuery(query);
e, utilizando PreparedStatement seria
//Montagem da consulta
String query = select nome, dt_nascimento, salario from EMPREGADOS where
dt_admissao > ? and salario < ? ;
//Substituio dos valores
java.sql.PreparedStatement pstm = con.prepareStatement(query);
pstm.setDate(1,java.sql.Date.valueOf(data_formato_JDBC)); // yyyy-mm-dd
pstm.setDouble(2, Double.parseDouble(salario));
//Execuo da consulta
java.sql.ResultSet rs = pstm.executeQuery();
Perceba como a montagem da consulta para execuo atravs de um Statement pode
rapidamente ficar confusa, especialmente com consultas complexas. Outro benefcio da
utilizao de instrues preparadas, e talvez o mais importante, que, quando se insere
um valor com um de seus mtodos setter, no preciso se preocupar sobre a colocao
adequada de aspas em cadeias, com caracteres especiais, insero de valores nulos e
nem com converses de datas e outros valores no formato adequado para seu banco de
dados. J que cada banco de dados pode ter suas prprias peculiaridades de formatao,
especialmente para datas, usar instrues preparadas vai ajudar a distanciar ainda mais
seu cdigo da necessidade de lidar com um banco em particular, tornando sua aplicao
mais genrica e flexvel.
 Executando alteraes

J vimos como executar consultas num banco de dados atravs do mtodo executeQuery
das classes Statement e PreparedStatement, mtodo este que retorna um ResultSet com
o resultado da consulta. Veremos agora como submeter instrues que modificam
valores das tabelas, alteram sua estrutura ou criam novos objetos dentro do banco.
Os comandos SQL para realizar modificaes no contedo de uma tabela so : update,
insert e delete. Essas instrues podem ser submetidas ao banco atravs do mtodo
executeUpdate existente em ambas as classes e que retorna um inteiro com o nmero de
linhas afetadas pela execuo do comando. Vejamos os exemplos :
//Com a classe Statement
java.sql.Statement stm = con.createStatement();
//Montagem da instruo de atualizao

76

String insert = insert into EMPREGADOS values ( + request.getParameter(nome)


+ , + request.getParameter(salario)
+ , +
request.getParameter(dt_admissao) + );
//Execuo da consulta
int x = stm.executeUpdate(insert);
//Com a classe PreparedStatement
//Montagem da consulta
String update = update EMPREGADOS set salario = ? where dt_admissao < ? ;
//Substituio dos valores
java.sql.PreparedStatement pstm = con.prepareStatement(update);
pstm.setDouble(1, Double.parseDouble(request.getParameter(salario)));
pstm.setDate(2, java.sql.Date.valueOf(request.getParameter(data)));
//Execuo da consulta
int x = pstm.executeUpdate();

Quando o comando for uma instruo DDL (Database Definition Language), como a
alterao ou criao de uma tabela, o valor de retorno deste mtodo ser zero. O
exemplo abaixo mostra um comando que cria uma stored procedure dcentro do banco.
String createProcedure = "create procedure SHOW_SUPPLIERS " +
"as " +
"select SUPPLIERS.SUP_NAME,
COFFEES.COF_NAME " +
"from SUPPLIERS, COFFEES " +
"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID "
+ "order by SUP_NAME";
Statement stmt = con.createStatement();
stmt.executeUpdate(createProcedure);
H ainda um terceiro mtodo que executa indiscriminadamente qualquer tipo de
comando e retorna um valor booleano com o status da operao. O mtodo
boolean execute(String) para a classe Statement , e
boolean execute() para a classe PreparedStatement
executa um comando qualquer, tanto de alterao como de consulta, e retorna true se
sua execuo foi bem sucedida e false caso contrrio. Caso o comando seja uma
consulta, possvel utilizar o mtodo getResultSet() de ambas as classes para obtermos
o resultset correspondente. J se o comando for uma alterao, podemos usar o mtodo
getUpdateCount() para sabermos quantos registros foram afetados.
 Executando Stored Procedures

JDBC permite que executemos uma Stored Procedure de um banco de dados a partir de
uma aplicao java. Para isso, devemos criar um objeto da classe
java.sql.CallableStatement, que uma subclasse de PreparedStatement, a partir de uma
conexo estabelecida com o banco :
java.sql.CallableStatement cs = con.prepareCall ("{call SHOW_SUPPLIERS}");

77

No cdigo acima, instanciamos um objeto CallableStatement apto a executar a


procedure que criamos anteriormente. Quando o driver encontra "{call
SHOW_SUPPLIERS}" , ele ir traduzir esta sintaxe no SQL nativo usado pelo banco
para chamar a stored procedure chamada SHOW_SUPPLIERS. Para efetivamente a
executarmos, devemos fazer :
java.sql.ResultSet rs = cs.executeQuery();
O mtodo que deve ser utilizado para executar a procedure depende do contedo da
mesma e est resumido na sequncia abaixo :

executeQuery() : quando a procedure contm apenas um comando que executa uma


consulta retornando apenas um result set
executeUpdate() : quando a procedure executa uma alterao no contedo de uma
tabela ou um comando DDL
excute() : quando a procedure retorna mais de um result set, mais de um update
count ou uma combinao de ambos

Quando for o caso de usar a terceira opo, deve-se usar o mtodo getResultSet() ou
getUpdateCount() para obter o resultado. Para obter todos os resultados usar o mtodo
getMoreResults() que ir posicionar no prximo result set ou update count. Este mtodo
retorna true caso o prximo resultado retorne um result set e, como o mtodo
getUpdateCount() retorna 1 caso no existam mais resultados, pode-se usar a seguinte
expresso como condio de parada num lao para varrer todos os resultados:
((getMoreResults() == false) && (getUpdateCount() == -1))

Tambm possvel passarmos parmetros de entrada ou lermos parmetros de sada de


uma stored procedure. Imaginem uma stored procedure que retorna o prximo valor de
chave primria de uma tabela. Para a executarmos e lermos seu valor de retorno o
cdigo o seguinte :
CallableStatement cs = con.prepareCall("{? = call GetPrimaryKey(XX)}");
cs.registerOutParameter(1, java.sql.Types.INTEGER);
cs.setInt(XX,10);
cs.execute();
return cs.getInt(1);
Primeiro criamos a string que vai representar a chamada procedure com seu parmetro
de retorno e entrada - "{? = Call GetPrimaryKey( [arg1, arg2, ...] )}". Depois dizemos
que o primeiro parmetro da procedure um parmetro de sada e que do tipo inteiro registerOutParameter(1, java.sql.Types.INTEGER) e ento atribumos um valor
apropriado para o parmetro de entrada. Feito isso, basta executarmos a procedure com
o mtodo execute() e ento ler o valor retornado - getInt(1).
 A classe ResultSet

Por ltimo, mas no menos importante, vamos aprender um pouco sobre um dos
componentes mais importantes quando estamos trabalhando com banco de dados, o
result set. Quem j desenvolveu uma aplicao que acessa um banco de dados, com
qualquer tecnologia que seja, j deve ter se deparado com algo similar a classe
ResultSet do java. A grosso modo, um result set uma estrutura de dados em memria,
78

uma matriz que armazena o resultado de uma consulta SQL. Um CURSOR em Oracle
um result set, o componente Query do Delphi representa um result set, uma classe que
implementa a interface ResultSet do java implementa um result set.
Nas aplicaes, muito frequentemente precisamos iterar sobre um result set para
apresentar o resultado de uma consulta, fazer buscas por dados especficos no seu
repositrio sem a necessidade de acessar o banco novamente e, quando a tecnologia
permite, alterar os dados diretamente no result set, alteraes estas que sero
automaticamente replicadas no banco de dados.
A interface ResultSet pertence ao pacote java.sql e foi definida a primeira vez na
especificao 1.0 da API JDBC. Esta primeira proposta bastante limitada, sendo
possvel iterar apenas numa nica direo (para frente) no result set e seus valores so
apenas para leitura porm, suportada pela maioria dos fabricantes de drivers JDBC. A
especificao 2.0 de JDBC trs uma interface ResultSet muito mais funcional e
poderosa. Agora possvel navegar em qualquer direo (para frente ou para trs) no
result set, mover o cursor para uma posio especfica e atualizar valores no prprio
result set ao invs de usar comandos SQL.
Obtendo valores de um ResultSet
Mostraremos nesta sesso como ler o contedo de um objeto ResultSet. Apesar dos
mtodos aqui definidos fazerem parte da especificao 1.0 de JDBC, eles so
equivalentes para a 2.0.
Usamos os mtodos getters do ResultSet para obtermos o valor de uma determinada
coluna. O mtodo get apropriado depende do tipo da coluna em questo. Vejamos o
exemplo abaixo :
String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()){ //este mtodo faz com que o cursor mova-se uma linha para frente
String s = rs.getString("COF_NAME");
float n = rs.getFloat("PRICE");
System.out.println(s + " " + n);
}
O mtodo getString("COF_NAME") retorna o contedo da coluna COF_NAME na
linha onde est posicionado o cursor do result set rs. Este mtodo converte o tipo
VARCHAR de SQL para o tipo String de java. O mesmo acontece na linha
getFloat("PRICE"), onde o valor da coluna PRICE lido e o tipo SQL Float
convertido para o tipo float de java.
possvel referenciar uma coluna pelo seu nome ou pelo seu ndice. Isso
particularmente til quando temos duas colunas com o mesmo nome num result set.
Assim, no exemplo acima os mtodos get ficariam getString(1), para obter o valor da
coluna COF_NAME e getFloat(2) para obter o valor de PRICE.
Existe uma grande variedade de mtodos get para convertemos os diferentes tipos de
dados SQL para tipos da linguagem java. O mtodo getSring pode ser usado para obter
qualquer tipo, convertendo tudo para uma String. Abaixo segue uma tabela com um

79

resumo dos principais mtodos get. Um x significa que o mtodo pode ser usado para
obter aquele tipo e um X significa que o mtodo recomendado para aquele tipo.

T
I
N
Y
I
N
T

S
M
A
L
L
I
N
T

I
N
T
E
G
E
R

B
I
G
I
N
T

D
F
O
R
L
U
E
O
B
A
A
L
L
T
E

D
E
C
I
M
A
L

V
N
A
U
C
R
M B
H
C
E I
A
H
R T
R
A
I
R
C

L
O
N
G
V
A
R
C
H
A
R

B
I
N
A
R
Y

V
A
R
B
I
N
A
R
Y

L
O
N
G
V
A
R
B
I
N
A
R
Y

D
A
T
E

T
I
M
E

T
I
M
E
S
T
A
M
P

getInt

x x X x x x x x x x x x x

getFloat

x x x x X x x x x x x x x

getDouble

x x x x x X X x x x x x x

getBoolean

x x x x x x x x x X x x x

getString

x x x x x x x x x x X X x x x x x x x
X X x

getBytes
getDate

x x x

getTime

x x x

X x

getTimestamp

x x x

x x X

getAsciiStream

x x X x x x

getUnicodeStream

x x X x x x

getBinaryStream
getObject

x x X
x x x x x x x x x x x x x x x x x x x

Scrollable e Updatable ResultSet


Abaixo temos as sintaxes para criao deste objeto atravs de um Statement,
PreparedStatement ou CallableStatement :
connection.createStatement(int resultSetType, int resultSetConcurrency)
connection.preparedStatement(String sql, int resultSetType, int resultSetConcurrency)
connection.prepareCall(String sql, int resultSetType, int resultSetConcurrency)

O parmetro resultSetType define se o ResultSet ir ser navegvel ou no. Os trs


valores possveis so :

ResultSet.TYPE_FORWARD_ONLY : com este parmetro o ResultSet no poder


ser navegvel, ou seja, poderemos somente avanar para frente no objeto.

ResultSet.TYPE_SCROLL_INSENSITIVE : com este parmetro o ResultSet


poder ser navegvel em qualquer direo, para frente e para trs, e ser insensvel a
mudanas feitas por outras transaes ou por outros Statements da mesma transao.
Isto significa que, se o ResultSet for updatable e sofrer uma modificao, uma
leitura no valor modificado ainda no ser visvel.

80

ResultSet.TYPE_SCROLL_SENSITIVE : com este parmetro o ResultSet poder


ser navegvel para qualquer direo, e ser sensvel a mudanas feitas por outras
transaes ou por outros Statements da mesma transao. Isto significa que, se o
ResultSet for updateable e sofrer uma modificao, uma leitura no valor modificado
j ser visvel logo aps.

J o parmetro resultSetConcurrency define se o ResultSet ser editvel ou no. Os dois


valores possveis so:

ResultSet.CONCUR_READ_ONLY: com este parmetro o ResultSet no poder


ser manipulvel, ou seja, no poderemos alterar os valores contidos no ResultSet.

ResultSet.CONCUR_UPDATABLE: com este parmetro o ResultSet poder ser


manipulvel, ou seja, poderemos alterar os valores contidos no ResultSet.

Um ResultSet scrollable tem a capacidade de navegabilidade e de posicionamento. Os


mtodos pertinentes navegao esto resumidos na tabela abaixo :
Mtodo
boolean first()
boolean last()
boolean previous()
boolean absolute(int row)

boolean relative(int offset)

void beforeFirst()
void afterLast()
boolean isFirst()
boolean isLast()
boolean isBeforeFirst()
boolean isAfterLast()
Int getRow()

Descrio
posiciona o cursor na primeira linha do ResultSet e retorna true, caso no exista
linhas, retorna false.
posiciona o cursor na ltima linha do ResultSet e retorna true, caso no exista
linhas, retorna false.
posiciona o cursor para a linha anterior a posio corrente, retorna true caso a
linha seja vlida e false caso contrrio.
posiciona o cursor corrente para a linha especificada pelo parmetro tendo
como referncia o incio e o fim do resultset, retorna true caso a linha valida
ou false caso contrrio. Se o valor for negativo, o cursor mover o valor
especificado a partir do final.
posiciona o cursor corrente para a linha especificada pelo parmetro tendo
como referncia a posio corrente do cursor, retorna true caso a linha valida
ou false caso contrrio.
posiciona o cursor antes da primeira linha.
posiciona o cursor depois da ltima linha.
retorna true caso o cursor corrente est posicionado na primeira linha.
retorna true caso o cursor corrente est posicionado na ltima linha.
retorna true caso o cursor corrente est posicionado antes da primeira linha.
retorna true caso o cursor corrente est posicionado aps a ltima linha.
retorna o nmero da linha corrente do cursor.

Suponhamos um ResultSet rs com 500 linhas e inicialmente posicionado na primeira


linha. Os cdigos abaixo produziriam os seguintes efeitos :
rs.absolute(-1) : move o cursor para a ltima linha, isto , linha 500
rs.absolute(-4) : move o cursor para a linha 497
rs.absolute(4) : move o cursor para a linha 4
rs.relative(-3) : move o cursor para primeira linha
rs.relative(2) : move o cursor para terceira linha

81

Com um ResultSet do tipo updatable podemos executar as operaes de INSERT,


DELETE e UPDATE sem precisar criar os comandos SQL. Utilizando mtodos do
prprio ResultSet, podemos inserir, deletar e alterar seus valores e depois refletir estas
operaes para o banco de dados.
Para realizarmos alteraes (UPDATE) utilizamos os mtodos updateXXX de acordo
com o tipo da coluna que queremos alterar. A tabela abaixo apresenta os principais
mtodos para update :
Mtodo
updateBoolean(String columnName, boolean
x)
updateDate(String columnName, Date x)
updateDouble(String columnName, double x)
updateInt(String columnName, int x)
updateNull(String columnName)
updateObject(String columnName, Object x)
updateString(String columnName, String x)
updateTimestamp(String columnName,
Timestamp x)

Descrio
Atualiza a coluna com um booleano

Atualiza a coluna com uma data


Atualiza a coluna com um double
Atualiza a coluna com um int
Atualiza a coluna com um valor nulo
Atualiza a coluna com um objeto
Atualiza a coluna com uma string
Atualiza a coluna com um Timestamp

Como nos mtodos getters do ResultSet, todos os mtodos acima possuem uma verso
onde, ao invs de passarmos o nome da coluna, passamos o seu ndice no result set.
Uma vez alterado o valor de uma coluna, para que a alterao seja refletida na base de
dados utilizamos o mtodo: updateRow(). Este mtodo propaga a alterao feita no
ResultSet para a linha no banco de dados e efetua o commit.
rs.updateFloat("PRICE", 10.99);
rs.updateRow();
Se uma alterao for efetuada e o cursor se mover daquela linha antes do mtodo
updateRow() ser invocado, a alterao perdida. possvel tambm cancelarmos
alteraes realizadas em uma linha chamando o mtodo cancelRowUpdates().
Para realizarmos inseres (INSERT) utilizamos o mtodo moveToInsertRow(), sendo
o InsertRow uma linha especial dentro do ResultSet diferente das linhas j existentes.
Aps a utilizao deste mtodo, inserimos os dados utilizando o mtodo updateXXX()
apropriado para cada coluna. Se uma coluna que NOT NULL no banco no for
preenchida, ao tentar efetivar a insero ser lanado um erro de SQLException. Para
voltarmos o cursor para a posio que estvamos antes da insero, utilizamos o mtodo
moveToCurrentRow(), que s pode ser chamado se o cursor estiver numa IsertRow.
Depois de terminado o INSERT, utilizamos o mtodo insertRow() para efetuar as
modificaes no banco de dados. O fragmento abaixo apresenta a sequncia completa
desde a criao do objeto Connection at a insero de um registro no result set :
Connection con = ds.getConnection();
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery("SELECT * FROM COFFEES");
uprs.moveToInsertRow();
82

uprs.updateString("COF_NAME", "Kona");
uprs.updateInt("SUP_ID", 150);
uprs.updateFloat("PRICE", 10.99);
uprs.updateInt("SALES", 0);
uprs.updateInt("TOTAL", 0);
uprs.insertRow();
Para fazer a deleo (DELETE) de uma linha do ResultSet, tudo que temos a fazer
posicionar o cursor na linha a ser excluda e ento chamar o mtodo deleteRow().
Consideraes Finais

importante estar ciente que apenas especificar que um ResultSet seja updatable
no garante que ele o seja. Se o driver no suporta result sets atualizveis, ele ir
retornar um apenas para leitura.
A consulta especificada para criao do result set implica se este poder ser
atualizvel. aconselhvel que a consulta sempre inclua os nomes das colunas e no
o * e uma restrio que no pode haver join entre tabelas e esta deve ter ao
memos uma chave primria definida.

83

Exerccios :

Considere um banco de dados que contenha uma tabela chamada EMPREGADO_JSP


com a seguinte estrutura :
COLUNA
COD_EMP
NOME_EMP
SALARIO_EMP
DT_INICIO_EMP

TIPO
NUMBER(4) NOT NULL
VARCHAR(100) NOT NULL
FLOAT
DATE

Com base nos dados acima resolva os exerccios.


1 Faa um pgina JSP com as seguintes funcionalidades :
-

Crie um objeto DataSource para se conectar ao banco. A classe no driver


JDBC do oracle que implementa a interface DataSource :
oracle.jdbc.pool.OracleDataSource
Obtenha uma conexo com o banco utilizando o DataSource criado
Utilizando a classe Statement, crie uma consulta que pegue todo o contedo
da tabela
Utilize o ResultSet retornado para imprimir todas as suas linhas na tela

2 Crie uma pgina que apresenta o resultado de duas consultas :


-

Na primeira, utilizando a classe Statement, obtenha o nome e salrio de


todos os empregados com data de admisso menor que 01/01/2002
Na segunda, utilizando a classe PreparedStatement, obtenha o nome e salrio
de todos os empregados com data de admisso igual ou superior a
01/01/2002.

Dica : Quando possvel, utilize o mtodo java.sql.Date.valueOf (yyyy-mm-dd)


3 Utilizando PreparedStatement, inclua um registro com as suas informaes
funcionais.
Dica : o comando de insero INSERT
valor2,valor3, ...)

INTO <tabela> VALUES (valor1,

4 Faa uma pgina JSP que cria um objeto ResultSet scrollable e updatable com todos
os registros da tabela e realize as seguintes operaes com ele :
-

Imprima quantas linhas tem o result set


Mova o cursor para a linha que tem o seu nome e imprima o n da linha e o
seu salrio
Atualize a informao do seu salrio aumentando-o em 10%
Imprima o novo valor do seu salrio. Voc viu a informao j atualizada ?
Explique.

84

VIII - Java Util


Em projetos de software, freqentemente usamos diversas estruturas de dados. No
seria interessante ter que a cada estrutura necessria termos que implement-la, uma vez
que sempre precisamos de rapidez e agilidade no desenvolvimento. Para auxiliar nosso
desenvolvimento usando estruturas de dados prontas existe um pacote na API da
plataforma Java chamado util. Neste pacote encontram-se vrias estruturas de dados,
utilitrios para manipulao de data e hora, e diversas outras classes utilitrias. Neste
captulo veremos algumas destas classes a saber : as classes Vector e StringTokenizer,
como tambm a interface Enumeration.
A classe Vector implementa um vetor que cresce dinamicamente de acordo com as
necessidades e pode armazenar qualquer tipo de dado. Enumeration no uma classe,
mas sim uma interface. Ela descreve estruturas que devem ser acessadas
sequencialmentes, uma por vez. A classe StringTokenizer til para quebrar a string em
partes menores tambm chamadas de tokens.
A classe Vector

O uso de arrays na maioria das linguagens deve ter o seu tamanho definido no momento
da alocao de espao de memria ocupado por esta estrutura. Por exemplo, se
quisermos usar o array de 50 posies inteiras fazemos :
int myArray[] = new int[50];
Esta instruo aloca 50 inteiros na memria e torna esta rea de memria acessvel
atravs do identificador myArray. No entanto, o que acontece se a nossa lista de inteiros
for maior que 50 posies e eu no consiga conhecer o tamanho no momento da criao
do programa ? Uma alternativa para este problema usar a classe Vector. Esta classe
fornece uma implementao para arrays que podem crescer dinamicamente. O Vector,
como um array, acessa seus elementos atravs de um ndice e fornece diversos mtodos
que auxiliam o seu uso.
Nesta estrutura h um gerenciamento dinmico do tamanho. Ocorre que quando
atingido um limite mximo de ocupao da estrutura, ela inclui mais alguns elementos
para manter a possibilidade de novas inseres. Quando deseja-se usar um Vector para
armazenar grandes quantidades de dados podemos definir seu tamanho inicial, evitando
assim que este reajuste de tamanho seja realizado vrias vezes, uma vez que o tamanho
inicial de um Vector padro baixo (10 elementos).
A classe Vector possui, dentre outros, os seguintes mtodos para a sua utilizao :
Construtores:
Vector()
Cria um Vector de tamanho 10
Vector (int initialCapacity, Cria um vetor com a capacidade inicial e capacidade de
int CapacityIncrement)
incremento especificados
Cria um vetor com o tamanho indicado e capacidade de
Vector(int initialCapacity)
incremento igual a 0

85

Mtodos para insero e excluso:


boolean add(Object obj)
boolean add(int index, Object
obj)

boolean addElement(Object obj)


boolean remove(int index)
boolean remove(Object obj)
void clear()
void removeAllElements()

Alguns mtodos importantes:


boolean isEmpty()

Inclui o objeto obj no fim do Vector


Inclui o objeto no Vector na posio indicada por
index. Caso a posio indicada seja inexistente no
Vector uma exceo do tipo
ArrayIndexOutOfBoundsException
disparada.
Inclui o objeto no fim do Vector incrementa ndo seu
tamanho em 1.
Remove o elemento do ndice index
Remove a primeira ocorrncia do elemento, caso ele
no exista o vetor inalterado
Remove todos os elementos do vetor
Remove todos os elementos do Vector e passa
seu tamanho para 0

int indexOf(Object elem)

retorna se o Vector vazio.


Procura pela primeira ocorrncia do elemento elem.
Retorna -1 se o elemento no for encontrado.

int capacity ()
int size()
Object elementAt(int index)

Retorna a capacidade corrente do vetor


Retorna o nmero de elementos no Vector.
Retorna o elemento do ndice index

Note que todos os objetos que so passados para o Vector so da classe Object. Por
padro, todo objeto em Java herda da classe Object, logo, por herana, voc pode
guardar qualquer objeto dentro de um Vector.
Exemplo:
import java.util.*;
public class Util1 {
private static Vector vetor;
public static void main(String args[]) {
vetor = new Vector();
vetor.add(new Integer(20));
vetor.add(new Double(256.20));
System.out.println("Total : " + vetor.size());
System.out.println("Posio do Inteiro : " + vetor.indexOf(new Integer(20)));
int inteiro = ((Integer) vetor.elementAt(0)).intValue();
double decimal = ((Double) vetor.elementAt(1)).doubleValue();
System.out.println("Inteiro: " + inteiro);
System.out.println("Double : " + decimal);
}
}
86

O programa exemplo acima inclui dois objetos no Vector, imprime o tamanho do


Vector e procura pelo inteiro includo. Note que no podemos incluir um int ou um
double no Vector pelo fato de tipos primitivos em Java no serem objetos. Por isso, foi
usado Integer e Double, classes que representam um inteiro e um nmero de ponto
flutuante respectivamente.
Note que na retirada dos elementos do Vetor o casting deve ser realizado. Isto se deve
ao fato do mtodo elementAt retornar um Object que deve ser "convertido" para a classe
que ele realmente representa.
A Interface Enumeration

Objetos que implementam Enumeration so construdos e retornados por diversas


estruturas, como no Vector mostrado abaixo:
Enumeration enum = v.elements();
O objeto retornado pelo mtodo v.elements() implementa a interface Enumeration, logo,
pode ser identificado atravs da interface. Os objetos que implementam a interface
Enumeration possuem os seguintes mtodos obrigatoriamente :
boolean hasMoreElements()
Object nextElement()

Retorna true se a Enumerao ainda contm elementos a ser


percorrido.
Retorna o prximo objeto da enumerao

O exemplo abaixo ilustra um uso da estrutura Enumeration :


import java.util.*;
public class Exemplo1 {
static Vector vetor;
public static void main( String args[] ) {
vetor.add( "String 1" );
vetor.add( "String 2" );
vetor.add( "String 3" );
Enumeration enum = vetor.elements();
while ( enum.hasMoreElements() )
System.out.println( enum.nextElement() );
}
}
Neste exemplo, o Vector retorna uma enumerao de todos os seus elementos. O while
imprime os elementos da enumerao enquanto ainda existir elementos .
A classe StringTokenizer

Para finalizar o pacote Util, falaremos um pouco do StringTokenizer. A classe


StringTokenizer muito til quando queremos quebrar a String em diversas substrings
delimitadas por uma outra String. Vamos a um exemplo:
87

A String "aaa/bbb/ccc/ddd" pode ser quebrada em quatro Strings "aaa", "bbb", "ccc" e
"ddd" atravs do delimitador "/". A realizao desta separao com o StringTokenizer
mostrado abaixo:
import java.util.*;
public class TokenizerExemplo {
public static void main ( String args[] ) {
StrinTokenizer st = new StringTokenizer( "aaa/bbb/ccc/ddd", "/" );
while ( st.hasMoreTokens() )
System.out.println ( st.nextToken() );
}
}
Como pode ser visto no exemplo acima, a classe StringTokenizer tem um
comportamento muito parecido com a interface Enumeration, de fato ele implementa
esta interface. Abaixo est a descrio desta classe:
H trs construtores para esta classe:

StringTokenizer(String str,
String delimit)
StringTokenizer(String str,
String delimit, boolean
retDelimit)

Cria uma StringTokenizer para a String str com o caractere


de espao como delimitador.
Cria um StringTokenizer com o delimitador definido pela
String delimit.
Cria um StringTokenizer com o delimitador definido pela
String delimit, e caso retDelimit seja true, retorna o
delimitador junto com o mtodo nextToken()

Alguns mtodos teis:


int countTokens()
boolean hasMoreTokens()
String nextToken()

Retorna o nmero de tokens.


Verifica se existem mais tokens na enumerao
Retorna o prximo token da enumerao

StringTokenizer(String str)

88

Apndice A
Tratando Formulrios
Os formulrios so ferramentas teis e muito usados em diversas aplicaes: cadastro de
registros em um banco de dados, validao de um login/senha, envio de email, envio de
dados de um pesquisa, etc. Hoje difcil desenvolver uma aplicao para Web que no
exija o uso de formulrios. Pois bem, na lio de hoje vamos aprender manipular
formulrios em aplicaes JSP.
Apresentamos abaixo um cdigo para mostrar o formato de um formulrio HTML e de
seus objetos.
<html>
<body>
<!-- cabealho do formulrio -->
<form name="nomedoformulario" action="paginajsp.jsp" method="get">
<!-- caixa de texto -->
<input type="text" name="variavel1" size=40 maxlength=40>
<!-- caixa de texto para senha -->
<input type="password" name="variavel2" size=40 maxlength=40>
<!-objeto do tipo radio -->
<input type="radio" name="variavel2" value="valordavariavel">Texto da Varivavel 2
<!-objeto do tipo checkbox -->
<input type="checkbox" name="variavel3" value="xxxxx"> Texto da Varivavel 3
<!-objeto do tipo select -->
<select name="variavel4">
<option value="valor1">Valor 1
<option value="valor2">Valor 2
<option value="valor3">Valor 3
</select>
<!- area de texto -->
<textarea name="variavel5" cols=40 rows=2>
Texto da Variavel 5
</textarea>
<!- objeto hidden, para enviar dados que o usurio no v no formulrio -->
<input type="hidden" name="asd" value="asd">
<!- boto -->
<input type="button" value="textodobotao">
<!- botao de limpar informaes do formulrio -->
<input type="submit" value="limpar">
<!- botao de enviar formulrio -->
<input type="submit" value="ok">
89

<!- imagem colocada para funcionar com botao de envio de formulrio -->
<input type="image" src="pathdaimage/image.gif">
<!- objeto para anexar arquivo -->
<input type="file" name="asdas" accept="asd">
</form>
</body>
</html>

importante fazermos algumas observaes a cerca do cdigo acima :


- no cabealho do formulrio, indicamos atravs de
action="pathdoarquivo/paginajsp.jsp" o arquivo JSP que receber os seus dados.
- cada objeto do formulrio recebe um nome. Deve-se tomar bastante cuidado ao
nomear tais objetos, isto porque, como sabemos, as variveis Java so sensveis a
maiscula/minscula. Portanto, os objetos:
<input name="variavel1" type="text" value="">
<input name="Variavel1" type="text" value="">
so objetos diferentes porque receberam nomes diferentes (variavel1 e Variavel1).
Mostraremos mais um exemplo (bastante simples) de como enviar dados a partir de um
formulrio a uma pgina JSP.
<%-- Arquivo teste.jsp --%>
<html>
<body>
<center><h1> <%= request.getParameter("teste") %> </h1></center>
<form action="teste.jsp" method=get>
<input type="text" name="teste" size=40 maxlength=40><br>
<input type="submit" value="enviar">
</form>
</body>
</html>

A pgina jsp acima, chamada "teste.jsp", contm um formulrio que envia para ela
mesma. O valor digitado em uma caixa de texto ser mostrado como ttulo da pgina.
Observe como fizemos isso:
- a pgina para qual ns enviaremos os dados do formulrio designada no cabealho
do formulrio:
<form action="teste.jsp" method=get>
- o nome do objeto caixa de texto ("teste") usado na expresso
request.getParameter("teste"). Note que se usssemos request.getParameter("Teste")
90

(com T maisculo), a pgina no iria retornar o valor digitado na caixa de texto.


O prximo exemplo formado por dois arquivos. O primeiro contm apenas cdigos
HTML e o segundo contm cdigos HTML e JSP.
Arquivo "envia_ms.htm":
<html>
<body>
<h3>Qual o ms do seu aniversrio?</h3>
<form action="recebe_mes.jsp" method=get>
<select name="mesNasceu">
<option value="1">Janeiro
<option value="2">Fevereiro
<option value="3">Maro
<option value="4">Abril
<option value="5">Maio
<option value="6">Junho
<option value="7">Julho
<option value="8">Setembro
<option value="9">Agosto
<option value="10">Outubro
<option value="11">Novembro
<option value="12">Dezembro
</select>
<input type="submit" value="enviar">
</form>
</body>
</html>

Arquivo "recebe_ms.jsp":
<%@ page import=java.util.Date %>
<%@ page import=java.lang.String %>
<%
String msg = "";
String mesString = request.getParameter("mesNasceu");
int mes = Integer.parseInt(mesString);
Date dateNow = new Date();
int monthNow = dateNow.getMonth() + 1;
mes -= monthNow;

if (mes == 1)
msg = "Falta apenas "+ mes +" ms para o seu aniversrio.";
if (mes == -1)
msg = "Seu aniversrio foi no ms passado";
91

if (mes > 1)
msg = "Faltam "+ mes +" meses para o seu aniversrio.";
if (mes == 0)
msg = "Oba... estamos no ms do seu aniversrio.";
else if (mes < 1)
{
mes *= -1;
msg = "Seu aniversrio foi a "+ mes +" meses atrs.";
}
%>
<html>
<body>
<center>
<h3><%= msg %></h3>
<br><br><br>
<a href="Javascript:history.back(-1)">voltar</a>
</center>
</body>
</html>

O exemplo acima um pouco menos simples que o primeiro. O arquivo "envia_mesjsp" contm um formulrio com um objeto select que envia o ms que a pessoa nasceu.
Aps escolher o ms e clicar no boto "ok", o formulrio chama a pgina
"recebe_ms.jsp" e envia seus dados para ela. Esta segunda pgina um pouco menos
simples que a primeira. Vamos analisar o que ela faz:
- nas primeira linhas utilizamos as tags "page import" para indicar quais classes iremos
utilizar em nossa pgina:
<%@ page import=java.util.Date %>
<%@ page import=java.lang.String %>
- cinco objetos so criados e inicializados.
- Usamos o mtodo "request.getParameter(nomedoparametro)" com a finalidade de
pegar o valor passado para a pgina atravs de algum formulrio ou passando
diretamente em sua URL. O segundo objeto foi inicializado utilizando esse mtodo para
pegar o valor passado pelo formulrio:
String mesString = request.getParameter("mesNasceu");
- O valor passado atravs de um formulrio ou atravs da URL da pgina sempre do
tipo String. Ao inicilizarmos o terceiro objeto, o mtodo
"Integer.parseInt(variavelString)" transformou o valor contido na varivel mesString em
Inteiro : int mes = Integer.parseInt(mesString);
- O penltimo objeto criado do tipo Date (da a importncia de termos importado a
92

classe java.util.Date na primeira linha de nossa pgina). Ele inicializado com a hora
local do servidor. : Date dateNow = new Date();
- Na inicializao do ltimo objeto utilizamos o mtodo "dateNow.getMonth()" que
retorna um inteiro indicando o valor da varivel. Somamos 1 ao valor retornado a partir
desse mtodo porque ele retorna 0 para janeiro, 1 para fevereiro e assim por diante : int
monthNow = dateNow.getMonth() + 1;
- Cinco teste so efetuados dentro de um scriptlet (<% e %>). Eles so usados para
definir o valor que a varivel "msg" ter, ou seja, a partir dos testes, decidiremos qual
mensagem ser exibida na tela.
- Aps efetuar os testes, o texto HTML inserido na pgina.
- Uma expresso (<%= %>) usada para exibir o valor da varivel "msg": <%= msg
%>

93

Apndice B
Instalando um container JSP - TOMCAT
Para executarmos nossas pginas JSP na Web precisamos de um container JSP, um
software que seja capaz de interpretar as pginas e execut-las. Abordaremos de forma
bastante pragmtica os passos necessrios para instalao de um container JSP de
dommio pblico , o Tomcat, para rodar juntamente com o Apache. O site oficial desta
ferramenta e onde podem ser encontradas todas as informaes a seu respeito o
http://jakarta.apache.org/tomcat/index.html

Os passos para instalao do Tomcat 4.1.18 so :


1. Instalao do java
1.1 Baixar o pacote SDK 1.4 de http://java.sun.com/j2se/1.4/download.html
1.2 Descompactar o tar.gz em /usr/local
1.3 Criar um link simblico chamado jdk para /usr/local/j2sdk1.4.1_01
1.4 Editar o /etc/profile acrescentando as seguintes linhas :
JAVA_HOME=/usr/local/jdk
PATH="$PATH:/usr/local/jdk/bin"
Export JAVA_HOME
2. Baixar o pacote jakarta-tomcat-4.1.18.tar.gz de :
http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.1.18/bin/
3. Descompact-lo em /usr/local
4. Criar um link simblico chamado tomcat para /usr/local/jakarta-tomcat-4.1.18/
5. Editar o arquivo /etc/profile acrescentando as seguintes linhas ;

TOMCAT_HOME=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
CLASSPATH=.
export TOMCAT_HOME CATALINA_HOME CLASSPATH
6. Obter o mdulo mod_jk-3.3-ap13-noeapi.so de :
http://jakarta.apache.org/builds/jakarta-tomcat/release/v3.3/bin/linux/i386/ e copi-lo
para dentro de /usr/local/tomcat
6. Renome-lo para mod_jk.so
7. Criar o arquivo mod_jk.conf dentro de /usr/local/tomcat com as linhas :
<IfModule !mod_jk.c>
LoadModule jk_module /usr/local/tomcat/mod_jk.so
</IfModule>
JkWorkersFile "/usr/local/tomcat/workers.properties"
JkLogFile "/usr/local/tomcat/mod_jk.log"
JkMount /examples ajp13
JkMount /examples/* ajp13
JkMount /jsp_dev ajp13
94

JkMount /jsp_dev/* ajp13


8. Criar o arquivo workers.properties em /usr/local com o contedo :
worker.list=ajp12, ajp13
worker.ajp12.port=8007
worker.ajp12.host=localhost
worker.ajp12.type=ajp12
worker.ajp12.lbfactor=1
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp12, ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)jaxp.jar
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)parser.jar
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)jasper.jar
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)servlet.jar
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)webserver.jar
worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar
worker.inprocess.cmd_line=-config
worker.inprocess.cmd_line=$(workers.tomcat_home)$(ps)conf$(ps)jni_server.xml
worker.inprocess.cmd_line=-home
worker.inprocess.cmd_line=$(workers.tomcat_home)
worker.inprocess.jvm_lib=$(workers.java_home)$(ps)jre$(ps)bin$(ps)classic$(ps)jvm.dll
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)inprocess.stderr
worker.inprocess.sysprops=tomcat.home=$(workers.tomcat_home)

9 Editar o arquivo /usr/local/tomcat/conf/server.xml e inserir as linhas logo abaixo de


</Context> :
<Context path="/jsp_dev" docBase="/var/www/default/jsp_dev" debug="0"
reloadable="true" crossContext="true">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="localhost_jsp_dev_log." suffix=".txt"
timestamp="true"/>
</Context>
10 Criar a seguinte estrutura de diretrios abaixo do Document Root do seu servidor
Apache. Neste exemplo o /var/www/default :
/var/www/default/jsp_dev
/var/www/default/jsp_dev/WEB-INF
/var/www/default/jsp_dev/WEB-INF/classes
/var/www/default/jsp_dev/WEB-INF/lib
11 Editar o arquivo /etc/httpd/conf/httpd.conf e incluir como ltima linha deste
arquivo : include /usr/local/tomcat/mod_jk.conf
95

Pronto ! Seu servidor j est apto a processar pginas JSP ,servlets e classes java. Siga
as instrues abaixo para disponibilizar suas aplicaes :

Todas as suas pginas JSP devem ficar em baixo do diretrio jsp_dev


Todas as suas classes, inclusive servlets, devem ficar em baixo de WEBINF/classes
Para que os servlets funcionem, necessrio editar (criar) o arquivo WEBINF/web.xml com as configuraes do seu servlet. Exemplo :
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!-- Define servlets that are included in the jsp_dev application -->
<servlet>
<servlet-name>
login
</servlet-name>
<servlet-class>
login.login
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/servlet/login.login</url-pattern>
</servlet-mapping>
</web-app>

Para inicializar o tomcat fazer : ../tomcat/bin/startup.sh


Para finaliz-lo fazer : ../tomcat/bin/shutdown.sh

96

Apndice C
HTTP - Hypertext Transfer Protocol
O HTTP o protocolo mais usado na Web, mas voc precisar conhec-lo em detalhes
apenas se for desenvolver um browser ou um servidor Web. No entanto, um
conhecimento bsico muito til se voc desenvolve programas CGI ou mesmo se
apenas deseja inserir em suas pginas HTML META Tags do tipo Http Equivalent . Ele
um protocolo do nvel de aplicao para sistemas de informao distribudos,
colaborativos e hipermdia, que tem sido usado na World Wide Web desde 1990. um
protocolo do tipo requisio/resposta. O programa Cliente (normalmente um navegador
- Internet Explorer ou Netscape Navigator so os mais difundidos) envia ao programa
Servidor uma requisio com o seguinte formato:

Request Line contendo:


Request Method
URI (Uniform Resource Identifier): identificao do recurso ao qual o
Request Method deve ser aplicado
Verso do protocolo (atualmente HTTP/1.1)
Mensagem em formato semelhante ao MIME, contendo:
Cabealho da Mensagem ( Header )
Corpo da Mensagem

O programa Servidor responde com :

Status Line contendo:


Verso do protocolo
Cdigo de erro ou de sucesso
Texto descritivo do erro ou sucesso
Mensagem em formato semelhante ao MIME contendo:
Cabealho da Mensagem ( Header )
Corpo da Mensagem

Exemplo de uma Request Line :


GET http://www.absites.com.br/index.html HTTP/1.1

Relao de Request Methods :

OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT
Previso para extenses dos mtodos.

97

O Cabealho de uma mensagem HTTP pode conter um ou mais campos no formato


nome_do_campo:valor_do_campo .
Os campos do Cabealho de uma mensagem de requisio so classificados nos
seguintes grupos:

General Header (dizem respeito mensagem sendo transmitida, e no


entidade sendo transferida).
Request Header (fornecem informaes adicionais sobre a requisio, e a
respeito do prprio cliente, ao servidor).
Entity Header (definem metainformaes a respeito do corpo da mensagem ou
do recurso identificado pela mensagem).

Os campos do Cabealho de uma mensagem de resposta so classificados nos seguintes


grupos:

General Header (dizem respeito mensagem sendo transmitida, e no


entidade sendo transferida).
Response Header (fornecem informaes adicionais a respeito da resposta e do
Servidor).
Entity Header (definem metainformaes a respeito do corpo da mensagem ou
do recurso identificado pela mensagem).

Campos de Cabealho HTTP classificados como General Header

Cache-Control
Connection
Date
Pragma
Trailer
Transfer-Encoding
Upgrade
Via
Warning

Campos de Cabealho HTTP classificados como Request Header

Accept
Accept_Charset
Accept_Encoding
Accept_Language
Authorization
Expect
From
Host
If-Match
If-Modified-Since
If-None-Match
If-Range
If-Unmodified-Since
Max-Forwards
98

Proxy-Authorization
Range
Referer - Endereo (URI) da pgina onde est o link que levou a essa requisio.
TE
User-Agent - Identificao do Navegador (Netscape Navigator, Internet
Explorer, etc.) ou robot que originou a requisio.

Campos de Cabealho HTTP classificados como Entity Header

Allow
Content-Encoding
Content-Language
Content-Length
Content-Location
Content-MD5
Content-Range
Content-Type - Content-Type: text/html; charset=ISO-8859-4
Expires - Data/hora aps a qual a resposta no deve ser obtida de um cache sem
antes verificar no Servidor de origem se esta continua atual.
Last-Modified
Previso para extenses do cabealho.

Campos de Cabealho HTTP classificados como Response Header

Accept-Ranges
Age
ETag
Location - Usado para redirecionar o navegador para uma outra URI.
Proxy_Authenticate
Retry-After
Server
Vary
WWW-Authenticate

HTTP : Cdigos de erro ou sucesso

O primeiro dgito do cdigo define a classe da resposta. Existem 5 valores possveis


para o primeiro dgito :

1XX: Informativo - Requisio recebida, processamento em andamento.


2XX: Sucesso - A ao foi recebida com sucesso, entendida e aceita.
3XX: Redirecionamento - O Cliente deve executar outras aes para que a
requisio seja completada (por exemplo, requisitar uma outra URI).
4XX: Erro do Cliente - A requisio contm erro de sintaxe ou no pode ser
atendida.
5XX: Erro do Servidor - O Servidor no conseguiu atender a uma requisio
aparentemente vlida.

99

Você também pode gostar