Escolar Documentos
Profissional Documentos
Cultura Documentos
Java
Java
Sumrio
I - Fundamentos Bsicos
3
5
10
12
12
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
20
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
67
71
71
71
72
73
73
74
75
A classe ResultSet
76
83
87
92
95
I - Fundamentos Bsicos
Este captulo cobre os seguintes tpicos :
-
A plataforma Web
Baseada
Protocolo
simplificado:
Mquina
www.xyz.com
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
HTTP
Mapeia
HTTP
Envia
Principais m todos H T T P
HTM L
CSS Cascading Style Sheets
DHTM L - Dynamic HTM L
JavaScript
VBScript
Plug-ins applest, activeX
Nenhuma
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 :
Resposta
HTTP
APIs do Servidor
Desvantagens
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
sobre CGI
Cada
No
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
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.
Compromete
a manuteno
O design acaba ficando a cargo do programador
e no do Web designer
Desenvolvido pelo ESMS.C
14
O
15
Scripts de servidor
Alguns dos mais populares:
Microsoft
16
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.
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
U rl da requisio
http://servidor/servlet/Sim pleServlet?usuario=R ex
http://servidor/hello.jsp?usuario=R ex
20
12
21
Estrutura do Tomcat
bin
webapps
ROOT
common
classes
lib
conf
logs
work
22
C om o im plantar um a aplicao
no T om cat
H trs m aneiras
23
13
http://servidor:8080/
Acesse
servlets usando
http://servidor:8080/servlet/
Desenvolvido pelo ESM S.C
24
25
Contextos
Contextos
26
14
Contextos
Todo
27
28
Configurao da Instalao
29
15
<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
<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
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Mapeamento default. Este servlet ser
</web-app>
32
16
II - Servlets
II - S erv lets
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
33
O q u e so S erv lets H T T P
E xtenso
E stendem
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 :
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
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
38
18
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
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 );
41
19
de sada
Writer out = response.getWriter();
Deve-se
Depois,
42
Exerccios
20
21
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.
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>
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>
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); } %>
10
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
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
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
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>
17
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>
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
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
Comentrios
Dois tipos de comentrios :
Contedo : quando utilizamos o comentrio
HTML dentro da pgina JSP.
Ex : <!-- Comentrio sobre o contedo de x = <%=
x %> -->
22
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 :
25
Diretivas JSP
Atributos da diretiva page :
language : Define a linguagem de criao de
scripts da pgina. O padro para este atributo
java.
Ex :
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 :
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.
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 :
30
37
Diretivas JSP
Atributos da diretiva page :
buffer : Controla o uso da sada bufferizada. O
padro um buffer de 8kb.
Ex :
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.
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
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
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 %>
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 %>
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 :
42
IV Objetos Implcitos
Este captulo cobre os seguintes tpicos :
Objetos Implcitos
Relacionados a Servlets
Relacionados ao Input/Output
Contextuais
Tratamento de Erros
Aes
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
38
39
44
40
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.
45
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 :
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"
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) :
int qt = 0;
while (qt < 5){
qt ++;
%>
*
<% } %>
<br>
<%= "Foram gerados " + qt + "
asteriscos. %>
</body> </html>
int qt = 0;
while (qt < 5){
qt ++;
out.print("*");
}
out.print(<br> Foram gerados +
qt + asteriscos
%>
</body> </html>
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>
<% } %>
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
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
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
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
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.
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 :
65
55
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
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
String toString()
Descrio
Retorna a mensagem de erro descritiva associada com a exceo quando ela foi lanada.
O trecho abaixo ilustra o uso do objeto exception em uma pgina de erro JSP:
57
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
68
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 />
69
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 :
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 :
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
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
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)
72
64
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
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
75
67
Exerccios :
68
69
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
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
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
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
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
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))
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
80
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.
81
Descrio
Atualiza a coluna com um booleano
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 :
TIPO
NUMBER(4) NOT NULL
VARCHAR(100) NOT NULL
FLOAT
DATE
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 :
-
84
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
int capacity ()
int size()
Object elementAt(int 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
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)
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>
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
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
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
Pronto ! Seu servidor j est apto a processar pginas JSP ,servlets e classes java. Siga
as instrues abaixo para disponibilizar suas aplicaes :
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:
OPTIONS
GET
HEAD
POST
PUT
DELETE
TRACE
CONNECT
Previso para extenses dos mtodos.
97
Cache-Control
Connection
Date
Pragma
Trailer
Transfer-Encoding
Upgrade
Via
Warning
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.
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.
Accept-Ranges
Age
ETag
Location - Usado para redirecionar o navegador para uma outra URI.
Proxy_Authenticate
Retry-After
Server
Vary
WWW-Authenticate
99