Você está na página 1de 99

Introduo a Java Server Pages

por Christian Cleber Masdeval Braz

Sumrio
I - Fundamentos Bsicos A plataforma Web (HTTP) Tecnologias de contedo dinmico Aplicaes Web e Java Como executar servlets e jsp Web Container Tomcat 3 3 5 10 12 12 16 16 16 17 17 17 18 20 20 22 23 24 26 30 32 41 41 42 43 48 55 56 61 67 71 71 71 72 73 73 74 75
2

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

III Scripts JSP Elementos de criao de scripts Declaraes Expresses Scriptlets Controle de Fluxo Comentrios Diretivas JSP IV Objetos Implcitos Objetos Implcitos Relacionados a Servlets Relacionados ao Input/Output Contextuais Tratamento de Erros Aes V Cookies VI Enviando e-mail com JSP VII Trabalhando com Banco de Dados 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 VIII Java Util Apndice A Tratando Formulrios Apndice B Instalando um container JSP TOMCAT Apndice C HTTP - Hypertext Transfer Protocol

76 83 87 92 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:
Abre conexo para www.xyz.com:80 Cliente Uma requisio : GET /index.html ... HTTP (browser) Uma resposta: HTTP/1.1 200 Ok ... Fecha conexo
Desenvolvido pelo ESMS.C

Mquina www.xyz.com
Soquete de Servio:80 Servidor HTTP

index.html
3

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 4

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 5

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 6

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 7

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
Melhor interao como servidor Mltiplos clientes so atendidos por processos internos (threads) Muito mais rpidos e eficientes

Desvantagens
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) 1

Container de Servlet Servidor Web


1

Cliente
5

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)


<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

Parmetro que pode ser lido por

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 <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

padro abacaxi/m yServlet aparecer na U R L o servlet a ser cham ado ser o m yServlet

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. <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

Qualquer arquivo que aparea na URL com a extenso ext na solicitao ser redirecionado para myServlet.

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

Ciclo de Vida
Quando o servidor recebe uma requisio por um servlet, ele a repassa para o container que:
Cria uma instncia da classe do servlet Chama o mtodo de inicializao init()

Cada requisio tratada por um mtodo service()


O Container cria um objeto de requisio (ServletRequest) e um de resposta (SertvletResponse) e os passa com o parmetro

Quando o container deecidir remover o servlet da memria ele o finalizaz chamando destroy()
Desenvolvido pelo ESM S.C 35

17

Inicializao de um servlet
Tarefa realiza uma vez Operaes comuns : carregar parmetros de inicializao, dados de configurao, etc Ex: Acessa os parmetros de
public void init () inicializao throws ServletException{ String dirImagens = getInitParameter(imagens); if (dirImagens == null) { throw new UnavailableException(Configurao Incorreta); } }
Desenvolvido pelo ESM S.C 36

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 s e 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 s e 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 acessar p arm etro s d a so licitao


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 7

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 9

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: <% Exemplo com o uso do objeto out: <html><body> <p> Asteriscos gerados no scriplet: <%

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

Desenvolvido pelo ESMS.C

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() 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.

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

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) 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.

String toString()

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);

recebe_fatoracao.jsp <% y = request.getAttribute(y); %>


Este o contedo de y passsado na solici- tao pela pgina fatorao.jsp :

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

<%= y %>
resposta
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.
L O N G V A R C H A R L O N G V A R B I N A R Y

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

B I N A R Y

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 getFloat getDouble getBoolean getString getBytes getDate getTime getTimestamp getAsciiStream getUnicodeStream getBinaryStream getObject

x x X x x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x x x x x x x x x X x x x x x x x x x x x x x X X x x x x x x x X X x x x x x x x x x x x x X x x x x x X x x x x x X x x x x 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()

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

Alguns mtodos importantes: boolean isEmpty()


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

retorna se o Vector vazio. Procura pela primeira ocorrncia do elemento elem. Retorna -1 se o elemento no for encontrado. 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) 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

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