apostila jsp

Upload: sandoval-bento-da-silva

Post on 08-Jul-2015

76 views

Category:

Documents


0 download

TRANSCRIPT

Introduo a Java Server Pagespor Christian Cleber Masdeval Braz

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

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

3

I - Fundamentos BsicosEste 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 WebBaseada 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 conexoDesenvolvido pelo ESMS.C

Mquina www.xyz.comSoquete de Servio:80 Servidor HTTP

index.html3

Cliente e Servidor HTTPServidor HTTPMapeia 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 HTTPEnvia requisies HTTP a um servidor. Requisies contm URI do recurso remoto, cabealho, dados Processa respostas HTTP (interpreta cabealhos)Desenvolvido pelo ESMS.C 4

4

Principais m todos H T T PG 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 retornadoD esen volvid o p elo E SM S.C 5

Tecnologias do lado ClienteAs 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 modernasDesenvolvido pelo ESM S.C 6

Tecnologias do lado ServidorEstendem 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 comunicaoRecebem dados via requisies HTTP (GET e POST) Devolvem dados atravs de respostas HTTPDesenvolvido pelo ESM S.C 7

5

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 InterfaceEspecificao 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 deObter dados de entrada a Requisio partir de uma requisio HTTP HTTP Gerar uma resposta HTTP CGI incluindo os dados e cabealhoDesenvolvido pelo ESMS.C

Resposta HTTP

8

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

6

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 ServidorPodem substituir totalmente o CGI com vanta-gensMelhor interao como servidor Mltiplos clientes so atendidos por processos internos (threads) Muito mais rpidos e eficientes

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

7

Vantagens dos Servlets... sobre CGICada 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 proprietriasNo 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 ServletsServidor Web (Host) 1

Container de Servlet Servidor Web1

Cliente5

2 - Carrega Servlet se necessrio 3 - Cria encadeamento que vai processar solicitao (thread) 4 - Thread executa, retorna resultado e finaliza

4

Desenvolvido pelo ESMS.C

13

8

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 APIsPara gerar pginas dinmicas preciso embutir o HTML dentro de instrues de um programaout.print(Servlet); for(int num=1; num < 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 serU rl da requisiohttp://servidor/servlet/Sim pleServlet?usuario=R ex http://servidor/hello.jsp?usuario=R ex

C digo fonte visto no cliente Sim ple Servlet O utput H ello, R ex D esen volvid o p elo E SM S.C 20

12

C om o executar Servlets e JSPPara 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 eficienteD esen volvid o p elo E SM S.C 21

Estrutura do Tomcatbin 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 JSPDesenvolvido pelo ESM S.C 22

C om o im plantar um a aplicao no T om catH trs m aneirasT 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 TD esen volvid o p elo E SM S.C 23

13

Como usar o contexto ROOTPara 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 usandohttp://servidor:8080/

Acesse servlets usandohttp://servidor:8080/servlet/Desenvolvido pelo ESM S.C 24

C om o usar o contexto exam plesPara 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 usandohttp://servidor/exam ples/pagina.htm l

A cesse servlets usandohttp://servidor/exam ples/servlet/pacote.C lassD esenvolvido pelo E SM S.C 25

ContextosContextos 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 diretrioDesenvolvido pelo ESM S.C 26

14

ContextosTodo diretrio de contexto tem uma estrutura padroDiretrio 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 aplicaoDesenvolvido pelo ESM S.C 27

Nome do contexto e URLGeralmente o nome do contexto aparece na URL aps o nome/porta do servidorhttp://serv:8080/contexto/subdir/pagina.html http://serv:8080/contexto/servlet/pacote.ServletNa 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 InstalaoPara 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) qualquer componente tempdir /tmp Instncia de um servlet myServlet pacote.myServlet Parmetro que pode password ser lido pelo servlet 123456 Ordem para carga prvia do servlet 1 Desenvolvido pelo ESM S.C 30

Parmetro que pode ser lido por

Exem plo de w eb.xm l (2/3)... m yServlet /abacaxi/m yServlet Este um mapeam ento exato. Q uando o m yServlet /abacaxi/* M apeamento de caminho. Q uandoo padro abacaxi/* for encontrado ento m yServlet ser chamadoD 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)... myServlet *.ext Este um mapeamento de extenso. myServlet / Mapeamento default. Este servlet ser 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 letsE 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 PE xtenso java para servidor W eb E stendem javax.servlet.http.H ttpS ervlet L idam co m caractersticas tpicas do H T T P co m o m todos G E T , P O S T , C ookies, etc

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

34

C iclo d e V id aQ u a n d o o se rv id o r rece b e u m a re q u isi o p o r u m serv le t, ele a rep assa p ara o co n tain e r q u e :C ria u m a in stn cia d a classe d o serv let C h am a o m to d o d e inicializao in it()

C a d a req u isio tra ta d a p o r u m m to d o serv ic e()O C o n tain e r cria u m ob je to d e re q u isio (S erv le tR eq u est) e u m d e resp o sta (S ertv letR esp o n se) e os p assa co m o p arm etro

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

17

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

F in a liz a oO 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 ServioSo 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 HTTPCrie 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(Hello, World!); 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 GETL 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 sD e se n v o lv id o p e lo E S M S .C 40

C o m o a cessar p arm etro s d a so licita oT 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 seS 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 respostaPrimeiro preciso obter de response um fluxo de sadaWriter out = response.getWriter();

Deve-se tambm definir o tido de dados a ser gerado. Isso importante para que o browser saiba exibir as informaesresponse.setContentType(text/html);

Depois, pode-se gerar os dados imprimindo-os no objeto de sada (out) obtido anteriormenteout.println(Hello, world!)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, !. 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(Hello, + getInitParameter(nome)+); } } 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: hello hello nome SEUNOME hello /servlet/hello 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=

21

III - Scripts JSPEste 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 expressesDesenvolvido 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.

Desenvolvido pelo ESMS.C

8

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 "". Vamos mostrar uma possibilidade de implementao para o clssico exemplo do "Hello World : Ex. helloworld.jsp :

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: Hello World

O que aconteceu foi que o servidor JSP executou os comandos entre as tags especiais "", 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 : 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 elementosDesenvolvido pelo ESMS.C 9

Declaraes Declarao de variveis :

Declarao de mtodos :

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=1Desenvolvido 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 : (no requer ; no final) No h restrio quanto ao tipo de retorno das expresses Exs: --> imprime : Mensagem --> imprime o contedo da var. msg --> imprime o resultado da funcDesenvolvido 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 :

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 : Uma varivel definida num scriptlet estar disponvel para uso em expresses e scriptlets subseqentes na mesma pginaDesenvolvido 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 - 2 - Intruder Alert 3 - 8 - Status 9 -

  • 10 -
  • Recognizer : 11 -

12 - Alert Level : 13 - 14 - 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 = 5) && (hourNow < 13)) { %> Bom Dia!!! = 13) && (hourNow < 19)) { %> < font face="verdana">Boa Tarde!!! = 19) && (hourNow < 24)) { %> Bom Noite!!! Boa Madrugada!!! 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 Ns estamos em 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 Bom Dia!!! - Fonte:

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 Bom Dia!!! - Fonte:
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 Bom Dia!!! - Fonte:

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 j recebe o resto da diviso por cinco if (j == 0){ break; } %> => se for 0 divisvel por 5 e pra Bom Dia!!! - Fonte:
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 => quando i for divisvel por 5, a linha no ser impressa Bom Dia!!! - Fonte:
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 :

JSP : O corpo deste comentrio ignorado. Serve principalmente para depurao. Ex : 5! =

Comentrio da linguagem de script utilizada. No caso de java : /* comentrio */ ou // comentrioDesenvolvido 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 ! 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 ! At que teu emprego no ruin no., mas se o resultado for superior a R$ 2.999,99 imprima Seu novo salrio de ! 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 includeDesenvolvido pelo ESMS.C 23

Diretivas JSP Diretiva page : define atributos que afetam toda a pgina JSP Sintaxe : ou ...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 :

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 :

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 :

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 : => importa a classe List => importa todas as classes do pacote java.util e java.textDesenvolvido 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 :

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 :

=> sem buffer => define um buffer de 12 kbDesenvolvido 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 : 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 : 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 : , 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 :

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 :

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 : 41Desenvolvido pelo ESMS.C 36

Exerccios :

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 ImplcitosEste 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 : Esta expresso ir imprimir o valor da cadeia de documentao da pginaDesenvolvido 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 : 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 : Alguns Mtodos do Objeto mplicito Request
Valor do parmetro Nome:
Valor do parmetro Idade:
URL:
Cadeia de consulta:
Cliente:
Host da URL: 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 RequestValor 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 :

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 : Response Exemplo de utilizao do objeto response.

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 () 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/OutputExemplo sem o uso do objeto out: Asteriscos gerados fora do scriplet: PAR_1 and salario < PAR_275

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 :MtodoupdateBoolean(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 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 UtilEm 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 FormulriosOs 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. Texto da Varivavel 2 Texto da Varivavel 3 Valor 1 Valor 2 Valor 3 Texto da Variavel 5 89

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

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: - 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": Qual o ms do seu aniversrio? Janeiro Fevereiro Maro Abril Maio Junho Julho Setembro Agosto Outubro Novembro Dezembro

Arquivo "recebe_ms.jsp": 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."; } %>


voltar

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