JSTL
-
Upload
amanda-figueiredo -
Category
Documents
-
view
1.011 -
download
1
Transcript of JSTL
Apostila de JSTL
Traduo Resumida do Livro JSTL in Action de Shawn Bayern
Prof. Carlos Ribeiro
ndice1. A LINGUAGEM DE EXPRESSES....................................................................................................................... 4 1.1 Expresses e o tag ............................................................................................................................. 4 1.1.1 Qual a Aparncia de uma Expresso............................................................................................................ 5 1.1.2 Onde Expresses Funcionam ....................................................................................................................... 5 1.1.3 Valor Default em ........................................................................................................................ 5 1.1.4 Caracteres Especiais e ................................................................................................................ 6 1.2 Variveis com Escopo e a Linguagem de Expresses......................................................................................... 6 1.2.1 Sintaxe Bsica para Acessar Variveis com Escopo .................................................................................... 6 1.2.2 Operaes envolvendo Variveis ................................................................................................................. 7 1.3 Parmetros de Requisio e a Linguagem de Expresses ................................................................................... 7 1.4 Expresses mais Poderosas ................................................................................................................................. 7 1.4.1 Diferentes formas de Acessar Propriedades ................................................................................................. 7 1.4.2 Acessando Outros Dados Atravs da Linguagem de Expresses................................................................. 8 2. CONTROLANDO O FLUXO COM CONDIES .............................................................................................. 13 2.1 Condies Sim-No com ................................................................................................................... 13 2.1.1 A Sintaxe Bsica de .................................................................................................................... 13 2.1.2 Utilizando com Tags HTML....................................................................................................... 13 2.1.3 Tags Aninhados .......................................................................................................................... 14 2.1.4 Os Atributos var e scope ....................................................................................................................... 14 2.2 Condies Mutuamente Exclusivas .................................................................................................................. 15 3. CONTROLANDO O FLUXO COM ITERAES ............................................................................................... 16 3.1 A Iterao de Propsito Geral com ........................................................................................ 16 3.2 Iteragindo sobre Strings com ............................................................................................. 17 3.2.1 Como JSLT Efetua o Parse de Strings ....................................................................................................... 17 3.3 Iterao Avanada com e ....................................................................... 18 3.3.1 Efetuando um Loop Sobre Parte de uma Coleo...................................................................................... 18 3.3.2 Efetuando um Loop Sobre Nmeros .......................................................................................................... 18 3.3.3 Status do Loop ........................................................................................................................................... 19 3.4 Um Exemplo de Loop ....................................................................................................................................... 19 3.4.1 Entendendo o Exemplo .............................................................................................................................. 20 3.4.2 Utilizando varStatus no Exemplo............................................................................................................... 22 4. IMPORTANDO TEXTO ........................................................................................................................................ 23 4.1 Incluindo Texto com o Tag ............................................................................................................ 23 4.1.1 Recuperando Dados de URLs .................................................................................................................... 23 4.1.2 Salvando Informaes para Uso Posterior ................................................................................................. 24 4.1.3 Efetuando Comunicao com Pginas Importadas .................................................................................... 24 4.1.4 Exemplos de Import ................................................................................................................................... 26 4.2 Redirecionando com ............................................................................................................ 28 4.3 Formatando URLs com ................................................................................................................... 28 4.3.1 Formatando URLs com ............................................................................................................ 28 4.3.2 Porque Utilizar ......................................................................................................................... 29 5. PGINAS COM ACESSO A BANCOS DE DADOS ........................................................................................... 30 5.1 Quando Utilizar o Suporte JSTL a Bancos de Dados........................................................................................ 30 5.2 Criando uma Conexo de Banco de Dados com ................................................. 30 5.2.1 Cuidado com ................................................................................................ 32 5.3 Executando Queries com ....................................................................................................... 32 5.3.1 Executando uma Query de Banco de Dados .............................................................................................. 33 5.3.2 Lendo o Resultado de uma Query .............................................................................................................. 33
2
5.3.3 Limitando o Tamanho do Resultado de uma Query................................................................................... 36 5.4 Modificando Dados com ..................................................................................................... 36 5.4.1 Uso Simplificado do Tag .............................................................................................. 37 5.4.2 Medindo o Efeito de um Tag ........................................................................................ 37 5.5 Utilizando com Queries Ajustveis........................................................................................ 38 5.5.1 Queries Modelos (Templates) .................................................................................................................... 38 5.5.2 Utilizando ........................................................................................................................ 38 5.5.3 Parmetros do Tipo Date com ............................................................................... 40 5.6 Gerenciando Transaes com .................................................................................. 40 5.6.1 O Tag ............................................................................................................................. 40 5.6.2 Nveis de Isolamento.................................................................................................................................. 42 6. FORMATAO..................................................................................................................................................... 43 6.1 Imprimindo Nmeros com .................................................................................... 43 6.1.1 Uso Bsico de ................................................................................................. 43 6.1.2 Diferentes Formas de Imprimir um Nmero .............................................................................................. 44 6.1.3 Armazenando um Nmero em vez de Imprimi-lo...................................................................................... 44 6.1.4 Imprimindo Diferentes Tipos de Nmeros................................................................................................. 44 6.1.5 Agupamento de Milhar .............................................................................................................................. 44 6.1.6 Controlando Quantos Dgitos Devem Ser Impressos ................................................................................. 44 6.1.7 Utilizando Padres ..................................................................................................................................... 45 6.2 Imprimindo Datas ............................................................................................................................................. 45 6.2.1 Utilizando Padres ..................................................................................................................................... 46 6.3 Lendo Nmeros com ............................................................................................... 46 6.3.1 Porque Efetuar o Parse de Nmeros........................................................................................................... 47 6.3.2 Como Funciona por Default ............................................................................. 47 6.3.3 Modificando as Regras de Parse de .................................................................. 48 6.4 Lendo Datas com .......................................................................................................... 49 6.4.1 Como Funciona por Default .................................................................................. 50 6.4.2 Modificando Como Efetua o Parse de Datas ......................................................... 50 7. TAREFAS COMUNS............................................................................................................................................. 51 7.1 Tratando Parmetros do tipo CheckBox ........................................................................................................... 51 7.1.1 O Formulrio HTML.................................................................................................................................. 51 7.1.2 Um Manipulador de CheckBox Simples.................................................................................................... 52 7.1.3 Tratando Alguns CheckBoxes de Forma Especial ..................................................................................... 53 7.2 Lendo Datas ...................................................................................................................................................... 54 7.2.1 O Formulrio HTML.................................................................................................................................. 54 7.2.2 Tratando o Formulrio e Lendo a Data ...................................................................................................... 55 7.3 Tratando Erros................................................................................................................................................... 56 7.3.1 Capturando Erros com ......................................................................................................... 56 7.3.2 Enviando Erros para uma Pgina de Erro .................................................................................................. 58 7.4 Validando Entrada de Dados............................................................................................................................. 59 7.4.1 Diferentes Tipos de Validao de Formulrios .......................................................................................... 59 7.4.2 Tarefas Relacionadas Validao de um Formulrio ................................................................................ 59
3
1. A LINGUAGEM DE EXPRESSES JSTL utiliza uma linguagem denominada uma expression language para simplificar o acesso informao. Antes de JSTL era necessrio conhecer Java para produzir determinadas pginas JSP. Por exemplo, para se descobrir o que um usurio digitou em uma caixa de texto denominada nomeusuario era necessrio programar o seguinte cdigo:
A linguagem de expresses JSTL torna bem mais simples a construo de pginas. 1.1 Expresses e o tag O tag nos permite imprimir o resultado de uma expresso. O tag possui a mesma funcionalidade de uma expresso () JSP. Quando tags JSTL aparecem em uma pgina, eles no so enviados para o browser. A classe Java que implementa o tag customizado l os atributos do tag e produz um efeito especfico. Neste caso, simplesmente imprime um texto. Os atributos de so: Atributovalue default escapeXml
Descrio
Obrigatrio DefaultNenhum Nenhum True
A expresso (na linguagem de expresses Sim JSTL) a ser calculada A expresso a ser calculada se value No falhar Se algum caracter deve ser substitudo No (scaped); Por exemplo, para imprimir o caracter & como &.
Por default, imprime o que quer que aparea no seu atributo value. Por exemplo:
Naturalmente, isto s faz sentido se o atributo value contiver uma expresso na linguagem de expresses JSTL.
4
1.1.1 Qual a Aparncia de uma Expresso Uma expresso comea com ${ e termina com }; Tudo o que aparece no meio tratado como uma expresso. Exemplo:
Neste caso ser impresso o valor 3. Todos os tags JSTL funcionam assim. Na maioria dos casos, quando uma expresso aparece em um atributo de um tag JSTL, esta expresso calculada. O resultado desta avaliao fornecido ao tag como o valor do atributo. 1.1.2 Onde Expresses Funcionam Em JSTL 1.0, expresses possuem um significado especial apenas dentro de atributos de tags JSTL. No se pode escrever:Oi ${nomeusuario}
Expresses JSTL tambm no possuem significado especial como valor de um atributo de um tag HTML.
Neste caso o texto ${link} no interpretado como uma expresso JSTL. 1.1.3 Valor Default em No exemplo abaixo, se a expresso falhar por exemplo, no caso do valor da varivel nomeusuario no ser encontrado ser impresso ninguem.
Esta uma outra forma de especificar um valor default: Ninguem
5
1.1.4 Caracteres Especiais e Por default, o tag com caracteres com significados especiais em HTML e XML so substitudos (scaped) pelas entities references correspondentes. Por exemplo, se uma varivel possui o valor , ao ser impressa com o tag , ser produzido o seguinte resultado:
Logo, um browser HTML ir exibir o texto . Se no fizesse estas substituies, o browser receberia os caracteres - sem as substituies o que faria o browser interpretar estes caracteres como um tag HTML desconhecido. Normalmente este mecanismo de substituio dos caracteres especiais funciona exatamente como se deseja. Como este mecanismo tambm substitui as aspas simples e as aspas duplas que ocorrem dentro de , pode-se utilizar com segurana como valor de um atributo de um tag HTML, conforme vem abaixo:
Se esta substituio no ocorresse automaticamente, a linha acima provocaria um erro. Em alguns casos raros, voc pode desejar desligar este mecanismo de substituio de caracteres especiais de . Para obter este efeito basta designar o valor false para o atributo escapeXml.
Isto pode ser til caso se deseje acrescentar ao texto tags HTML como , , etc. 1.2 Variveis com Escopo e a Linguagem de Expresses 1.2.1 Sintaxe Bsica para Acessar Variveis com Escopo Em certo sentido, a linguagem de expresses JSTL lida com variveis com escopo. Uma expresso como ${usuario} significa a varivel com escopo denominada usuario. Quando um nome de uma varivel com escopo aparece sozinho em uma expresso como em ${usuario} isto faz com que a linguagem de expresso procure por esta varivel em todos os escopos possveis, na seguinte ordem: pgina, requisio, sesso e aplicao.6Como recuperar o valor de uma varivel em determinado escopo: Exemplo de Expresso${pageScope.usuario} ${requestScope.usuario} ${sessionScope.usuario} ${applicationScope.usuario}SignificadoVarivel usuario em escopo de pgina. Varivel usuario em escopo de requisio. Varivel usuario em escopo de sesso. Varivel usuario em escopo de aplicao.Para uma pgina poder imprimir o nome do usurio armazenado no objeto sesso:1.2.2 Operaes envolvendo Variveis JSTL suporta os seguintes operadores matemticos em expresses: Operador+ * / ou div % ou modDescrioAdio Subtrao Multiplicao Diviso RestoExemplo${10 ${10 ${10 ${10 ${10 + * / % 2} 2} 2} 2} 2}1.3 Parmetros de Requisio e a Linguagem de Expresses Para apontar para um parmetro de requisio utilizando a linguagem de expresso, utilize simplesmente ${param.nome}. Se um parmetro de requisio possui diversos valores ser necessrio utilizar ${paramValues.nome} em vez de ${param.nome}. Utilizando paramValues lhe permite recuperar uma coleo de todos os parmetros com um determinado nome. 1.4 Expresses mais Poderosas 1.4.1 Diferentes formas de Acessar Propriedades Vimos anteriormente que possvel utilizar o ponto (.) para acessar um membro de uma coleo no ordenada. Por exemplo, para obter a propriedade telefone da varivel usuario possvel escrever ${usuario.telefone}. Tambm possvel acessar propriedades de colees no ordenadas utilizando a sintaxe com colchetes ([]), assim como com listas ordenadas. A razo de JSTL utilizar duas sintaxes7diferentes porque Java Script tambm utiliza estas sintaxes. Por outro lado, se uma propriedade utiliza um caracter especial como ponto ou hfem, pode-se utilizar a notao com colchetes. por exemplo, uma propriedade denominada meu-endereco poderia ser acessada assim: ${usuario[meu-endereco]}. Observe as aspas em torno do nome da propriedade. Se voc no utilizar aspas com colchetes, ocorrer o seguinte:${usuario.telefone} sempre recupera o telefone do usurio. ${usuario[info]} esta expresso primeiramente procura pelo valor da varivel info para em seguida utilizar seu valor para obter uma propriedade de usuario.1.4.2 Acessando Outros Dados Atravs da Linguagem de Expresses Cookies JSTL no nos permite criar cookies, uma vez que esta uma tarefa do cdigo Java sendo executado em um servidor. No entanto, se voc sabe que existe um cookie denominado corPreferida, possvel acess-lo atravs da expresso ${cookie.corPreferida}. Cabealhos (Headers) Cabealhos so dados que servidores web e browsers utilizam para se comunicar. Os cabealhos contm informaes como: o tipo do browser, informaes sobre a localizao da mquina cliente, etc. Browsers enviam informaes sobre seu fabricante e modelo para os servidores atravs de um cabealho denominado User-Agent. Para acessar esta informao pode ser utilizada a expresso:${header["User-Agent"]}Parmetros de Inicializao Assim como variveis com escopo, os programadores de cdigo java (back-end) podem designar informaes denominadas context initialization parameters. Para acessar um parmetro de inicializao utilize a seguinte sintaxe:${initParam.headerUrl}8PageContext A varivel que pode ser acessada com ${pageContext} permite que voc acesse algumas informaes detalhadas sobre o ambiente corrente da pgina. Expresso Descrio Exemplo de ValorBASIC djdavis /jstl n/a ${pageContext.request O tipo de autenticao .authType} utilizado pela pgina, se aplicvel ${pageContext.request O ID do usurio, se o .remoteUser} servidor efetua autenticao ${pageContext.request O nome da sua Web .contextPath} Application ${pageContext.request Uma coleo ordenada .cookies} contendo todos os cookies recebidos pela pgina ${pageContext.request O mtodo HTTP .method} utilizado para enviar a requisio ${pageContext.request O query string da .queryString} pgina ${pageContext.request O URL utilizado para .requestURL} acessar a pgina ${pageContext.session true, se a sesso .new} nova; false, caso contrrio ${pageContext.Servlet Informao sobre seu Context.serverInfo} container JSP ${pageContext.excepti Para uma pgina on.message} designada como errorPage, uma descrio do erro que ocorreu.GET p1=valor1&p2=valor2 http://server/app/pagin a.jsp true Apache Tomcat/5.0.0 Algo muito ruim aconteceuComparaes Voc pode utilizar a linguagem de expresses para produzir valores boleanos, como no exemplo abaixo:${2 == 2}Os operadores possveis so: == ou eq; != ou ne; < ou lt; > ou gt; = ou ge.9Para comparar valores de variveis deve ser utilizada a seguinte sintaxe:${usuario.peso gt usuario.qi}Pode-se verificar se um parmetro de requisio possui um determinado valor:${param.mes eq "Maio"}Verificando se uma Varivel Existe Pode-se utilizar a palavra-chave empty para determinar se um determinado parmetro existe.${empty param.mes}ser true apenas se o parmetro mes no tiver sido especificado no formulrio ou se seu valor for um string vazio. Verificar ......... Operadores Boleanos e Parnteses O operadores relacionais so: and, or e not ou &&, || e !. Exemplos:${(param.mes == 5) or (param.mes == 6 and param.dia == 25)} ${not empty param.mes}Mltiplas Expressesembora a combinao abaixo produza o mesmo resultado:Oi Esta habilidade de utilizar mltiplas expresses interessante em outros tags da biblioteca JSTL.10Salvando Dados com Muitos tags JSTL podem criar varivies com escopo. O mais bsico . Atributovalue var scopeDescrioA expresso a ser calculada O nome da varivel com escopo O escopo da varivelObrigatrio DefaultNo Sim No Contedo do corpo Nenhum pageOs atributos var e scope so os nicos atributos de tags JSTL com os quais no se pode utilizar expresses. Por exemplo, no se pode escrever: var=${usuario}. Este cdigo criar uma varivel com escopo chamada literalmente ${usuario}. Exemplo de designao de valor a uma varivel com escopo de pgina:Para que esta varivel tenha escopo de sesso ser preciso fazer o seguinte:Utilizando o Corpo do Tag Se voc escrever um tag sem um atributo value, ser atribudo varivel o valor que estiver no corpo do tag. Todo o espao em branco no incio e no final do corpo removido. Quando til O tag til, em primeiro lugar, quando desejamos avaliar alguma coisa uma nica vez, para que possamos reutiliz-la diversas vezes. Um outro uso seria:Neste caso, outras pginas na mesma sesso do usurio podero referenciar o email assim:${sessionScope.email}11Removendo Dados com Atributos do tag : Atributovar scopeDescrioObrigatrio DefaultNenhum qualquerO nome da varivel com escopo a Sim remover O escopo da varivel a ser No removidaExemplo:Quando o scope no especificado todos os escopos so pesquisados, sendo removida a varivel quando ela for encontrada em um dos quatro escopos possveis. Se a varivel no for encontrada, nada acontecer.122. CONTROLANDO O FLUXO COM CONDIES 2.1 Condies Sim-No com 2.1.1 A Sintaxe Bsica de Atributos do tag : Atributotest var scopeDescrioObrigatrioDefaultNenhum Nenhum pageCondio a ser avaliada. Se true, Sim processa o corpo, caso contrrio, no processa. Nome do atributo que receber um No valor boleano Escopo do atributo que recebe o No valor boleanoO atributo test do tag aceita qualquer expresso boleana: Dr. Neste caso ser impresso o nome do usurio precedido do texto Dr., caso se trate de um doutor. 2.1.2 Utilizando com Tags HTML Pode-se utilizar o tag em qualquer lugar de uma pgina HTML. Exemplo: 13Caso o nvel educacional seja diferente de 'doutorado' obteremos: Nome 2.1.3 Tags Aninhados Exemplo:
Ocorreu o erro 1. Ocorreu o erro 2. 2.1.4 Os Atributos var e
scope Estes atributos so utilizados para criar e expor uma varivel
com escopo que outros tags podem utilizar. Neste caso, no entanto,
esta varivel boleana. Exemplo: Salva a varivel Um erro srio
ocorreu. [ ... um corpo de pgina grande ...] Usa a varivel Desde
que um erro srio ocorreu, seus dados no foram slavos. Neste
exemplo, quando o primeiro tag alcanado, a expresso no atributo
test avaliada, e o resultado armazenado em uma varivel com escopo
de pgina denominada erro1. Deste momento em diante o valor desta
varivel no mudar, mesmo que o valor de
sessionScope.flags.errors.serious.erro1 seja alterado. Se voc
utilizar o tag apenas para salvar o valor da varivel definida em
var, neste caso no precisar ter um corpo, conforme vem
abaixo:14Outros tags, mais adiante na pgina podero utilizar a
varivel erro1. 2.2 Condies Mutuamente Exclusivas JSTL suporta
condies mutuamente exclusivas atravs de trs tags: , , e.Exemplo:
Neste exemplo apenas uma das quatro mensagens ser exibida. Ocorreu
o erro 1. Ocorreu o erro 2. Ocorreu o erro 3. Nenhum erro ocorreu.
O tag no possui o atributo var, mas ele pode utilizar uma varivel
boleana criada anteriormente por um tag .153. CONTROLANDO O FLUXO
COM ITERAES 3.1 A Iterao de Propsito Geral com O tag um tag JSTL
para controle de loops de propsito geral. Como vimos anteriormente,
a linguagem de expresses pode retornar uma coleo de itens. O tag
nos permite percorrer praticamente qualquer coleo de itens que a
linguagem de expresses capaz de retornar. Para cada item em uma
coleo, o corpo do tag ser processado uma vez, e o item corrente ser
exposto atravs de uma varivel de pgina com escopo cujo nome
especificado pelo atributo var de . Exemplo:Lamento, mas voc possui
as seguintes doenas: Este tag efetua um loop sobre todos os
itens da propriedade condicoesDeSaude da varivel usuario. Os
atributos do tag para iterao bsica vem abaixo: Atributositems
varDescrioObrigatrioDefaultNenhum NenhumUma coleo sobre a qual
ocorrer a No iterao. Nome do atributo que expor o item No
corrente.163.2 Iteragindo sobre Strings com O tag efetua um loop
sobre tokens (substrings de um string maior delimitados por um
caracter especfico) . Os atributos do tag para iterao bsica vem
abaixo: Atributositems delims
varDescrioObrigatrioDefaultNenhumString de entrada sobre o qual No
ocorrer a iterao Caracter delimitador que separa os tokens Nome do
atributo que expe o token No correnteNenhumExemplo: Produzir a
seguinte sada:a b c d3.2.1 Como JSLT Efetua o Parse de Strings
Diversos caracteres delimitadores consecutivos so tratados como um
nico delimitador. Logo, este cdigo produz a mesma lista exibida
acima.173.3 Iterao Avanada com e 3.3.1 Efetuando um Loop Sobre
Parte de uma Coleo Ambos e aceitam 3 parmetros opcionais para
suportar o loop sobre parte de uma coleo. Atributosbegin end
stepDescrioObrigatrioDefault0 ltimo item 1O item que inicia o loop.
No (0=primeiro; 1=segundo, etc.) O item que encerra o loop. No
Passo da iterao. NoExemplo: Esta iterao ir exibir as letras c, d, e
e os tokens com ndices 2,3, e 4. 3.3.2 Efetuando um Loop Sobre
Nmeros Se voc no especificar o atributo items (que opcional), ento
os atributos begin e end devero estar presentes. Exemplo: O exemplo
acima produzir a seguinte sada: 12345 Em o atributo items
obrigatrio. Se voc deseja iteragir sobre nmero, utilize apenas .
Como a maioria dos atributos JSLT, os atributos begin e end aceitam
expresses.183.3.3 Status do Loop Assim como o atributo var em e , o
atributo varStatus permite que voc crie uma varivel com escopo que
pode ser acessada dentro do loop. Se var=corrente, o item corrente
exposto dentro do loop atravs de uma varivel com escopo de pgina
denominada corrente. Da mesma forma, se varStatus=s, criada uma
varivel com escopo de pgina denominada s que contm informaes sobre
a iterao corrente. A tabela abaixo mostra propriedades teis desta
varivel. Propriedades Tipoindex count first last nmero nmero
boolean booleanDescrioO ndice do tem corrente da coleo. A posio da
volta corrente na iterao, comeando com 1. Se a iterao atual a
primeira. Se a iterao atual a ltima.Exemplo: Letra 'a' index = 0
count = 1 first = true last = false Letra 'c' index = 2 count = 2
first = false last = false Letra 'e' index = 4 count = 3 first =
false last = true3.4 Um Exemplo de Loop Vamos escrever uma pgina
exemplo que permita o usurio paginar atravs de informaes. Como
ainda no vimos como recuperar informaes de arquivos XML e de bancos
de dados, no poderemos exibir dados reais. Logo, utilizaremos o tag
para gerar nmeros automaticamente.19 [ ] 3.4.1 Entendendo o
Exemplo Dois tags foram utilizados para configurar o comportamento
da nossa pgina. Evidentemente estes valores poderiam ser designados
atravs de parmetros de requisio, ou atravs de um outro meio
qualquer. totalDeItensRepresenta o nmero total de itens que
gostaramos que o usurio fosse capaz de percorrer. A quantidade de
resultados que devem ser exibidos para o usurio de cada
vez.porPagina20Agora podemos imprimir a seo no topo da pgina. Esta
seo ter sempre a mesma aparncia, independentemente da faixa
escolhida pelo usurio. Estes dados dependem apenas de duas variveis
que configuram o comportamento da nossa pgina: totalDeItens e
porPagina. [ ] Observe que um link comoprovoca o envio de uma
requisio para a pgina corrente, contendo um parmetro inicio com o
valor 20. Logo, quando o usurio seleciona uma faixa especfica, o
parmetro inicio ir indicar o incio da faixa que o usurio deseja.
Este parmetro pode ser acessado atravs da expresso ${param.inicio},
conforme vem no cdigo abaixo. Quando nenhuma faixa
selecionada isto , se o parmetro inicio vazio comeamos com o nmero
0. Isto acontece em funo do valor default definido para o parmetro
begin, quando o valor deste parmetro no existe.213.4.2 Utilizando
varStatus no Exemplo Com o cdigo abaixo, as linhas mpares sero
impressas com um tipo de letra na cor vermelha. [ ] 224.
IMPORTANDO TEXTO 4.1 Incluindo Texto com o Tag Para recuperar
contedo de uma pgina JSP local ou proveniente de outro servidor,
voc pode utilizar o tag . s vezes voc deseja apenas imprimir a
informao recuperada, mas tambm permite que voc armazene o texto
recuperado em uma varivel com escopo em vez de impri-la. A tabela
abaixo mostra os atributos do tag : Atributosurl context var
scopeDescrioO url que se deseja recuperar e importar na pgina. /
seguida do nome de uma aplicao web local. Nome do atributo para
expor o contedo String do url. Escopo do atributo que ir expor o
contedo String do url.ObrigatrioSim No No NoDefaultNenhum Contexto
corrente Nenhum PageExemplo de com um caminho relativo para o
url:URLs relativos em JSTL funcionam da mesma forma como URLs
relativos em HTML. URLs que comeam por uma / possuem um significado
diferente para tags JSTL do seu significado em HTML. Em HTML, se
voc utilizar o tagento o arquivo foto.jpg vir do diretrio imagens
na raiz de todo o servidor web. Este diretrio armazena imagens que
so compartilhadas por pginas estticas e dinmicas. Por outro lado,
se utilizarmos este mesmo URL como entrada de um tag JSTL, a imagem
ser procurada no diretrio imagens na raiz da aplicao web de pgina
JSP. Observe que um servidor web geralmente possui diversas
aplicaes web. 4.1.1 Recuperando Dados de URLs Para importar uma
pgina residente no diretrio corrente:23Supondo que a pgina atual,
source.jsp, est em um diretrio denominado source e que a pgina
target.jsp est em um diretrio denominado target, ambos os diretrios
na raiz da aplicao web corrente, para source.jsp importar
target.jsp seria preciso:Agora suponha que target.jsp esteja
localizada em um servidor web diferente. Neste caso, a nica forma
de recuperar o arquivo utilizando atravs do seguinte URL:Importando
de Outra Aplicao Web possvel recuperar arquivos de outra aplicao
web especificando o nome da outra aplicao web utilizando o atributo
context do tag .4.1.2 Salvando Informaes para Uso Posterior Por
default, recupera informao de um URL e a imprime imediatamente na
sua pgina. Isto exatamente o que faz, e na maioria das vezes o que
voc deseja. No entanto, voc pode desejar importar uma pgina e
incluir seu texto diversas vezes, conforme vem abaixo: ... Mais
contedo ... 4.1.3 Efetuando Comunicao com Pginas Importadas s vezes
no suficiente apenas recuperar uma pgina. Se a pgina gerada
dinmicamente, voc pode desejar customizar sua sada. Primeiramente
possvel utilizar o tag para enviar parmetros de requisio para a
pgina. E em segundo lugar, se voc est importando um URL relativo
para uma pgina da mesma aplicao, voc pode utilizar os objetos
request, session, e application para se comunicar com a pgina de
destino. O escopo de pgina o nico no compartilhado. Alm disso,
quando se importa uma pgina de um mesmo container JSP, todos os
parmetros de requisio da pgina de origem so passados
automaticamente para a pgina de destino.24O Tag O tag um tag filho
opcional do tag (e de alguns outros tags JSTL). Quando ele aparece
ele diz para para enviar um parmetro de requisio para a pgina que
ele est carregando. A tabela abaixo mostra os atributos do tag :
Atributosname valueDescrioNome do parmetro Valor do
parmetroObrigatrioSim NoDefaultNenhum CorpoExemplo: Como enviar um
parmetro para a pgina target.jsp. Este cdigo causa o envio de uma
requisio HTTP do tipo GET,
assim:http://www.servidor.net/aplicacao/target.jsp?param=valorObservaes:
1. permite o envio de simples parmetros de comunicao, que possuem a
forma nome=valor. Parmetros de requisio so flexveis mas podem
representar apenas texto e suportam comunicao em apenas um sentido
(da origem para o destino). 2. Em contraste com os parmetros de
requisio, as variveis com escopo que podem ser acessadas tanto pela
origem como pelo destino de um tag - podem incluir estruturas de
dados arbitrrias. Elas suportam comunicao em dois sentidos, no
entanto, s funcionam quando a pgina de destino pertence mesma
aplicao web da origem.254.1.4 Exemplos de Import O exemplo abaixo
mostra como padronizar a aparncia dos cabealhos das pginas de uma
aplicao atravs do uso de . Exemplo 1: Customizao com Nosso exemplo
utiliza trs pginas: pagina1.jsp Uma primeira pgina exemplo.
pagina2.jsp Uma segunda pgina exemplo. cabecalho.jsp Uma pgina JSP
que imprime imformao de cabealho que utilizada por ambas as pginas.
Cdigo de cabecalho.jsp: Exemplo de Aplicao com Import Cdigo da
pagina1.jsp: Informaes da Pgina 1 Texto da Pagina 1. 26Cdigo da
pagina2.jsp: Informaes da Pgina 2 Esta a pgina 2.
Uma verso aboiolada da pgina 1. No exemplo abaixo, a pgina
origem.jsp importa destino.jsp, e ambas enviam dados uma da outra.
Exemplo 2: Customizao sem Cdigo de origem.jsp: Chamando
destino.jsp... origem.jsp recebeu de volta: Cdigo de destino.jsp:
destino.jsp recebeu: 274.2 Redirecionando com A tabela abaixo
mostra os atributos do tag : Atributosurl
contextDescrioObrigatrioDefaultNenhum Contexto CorrenteURL que
receber o redirecionamento Sim / seguida do nome da aplicao web No
localExemplo 1: Redirecionando para uma pgina no mesmo diretrio da
origem. Exemplo 2: Redirecionando para uma pgina em outro contexto,
isto , em outra aplicao:Quando o atributo context fornecido, o
valor de ambos os atributos (context e url) devem comear com uma /.
Exemplo 3: Assim como o , tambm permite o uso de dentro dele para
enviar um parmetro de requisio para a pgina que ir receber o
redirecionamento: 4.3 Formatando URLs com 4.3.1 Formatando URLs com
A funo do tag imprimir um URL (ou armazen-lo em uma varivel com
escopo). A tabela abaixo mostra os atributos do tag :
Atributosvalue context var scopeDescrioURL base para imprimir ou
armazenar / seguido do nome da aplicao web local Nome do atributo
para expor o URL final Escopo do atributo para expor o URL
finalObrigatrioSim No No NoDefaultNenhum Contexto corrente Nenhum
Page28Assim como o e , tambm possvel incluir tags no corpo de um
tag . fcil utilizar . Simplesmente o insira na sua pgina sempre que
voc quiser imprimir um URL. Com freqncia voc desejar inserir no
meio de um tag HTML, como no exemplo abaixo:Compre um HD
Quantum4.3.2 Porque Utilizar A primeira razo pelo fato de ser mais
fcil construir um link que passa parmetros para a pgina de destino.
Duas outras razes so:Freqentemente URLs necessitam ser reescritos
para preservar a sesso de um usurio por vrias pginas. O tag
reescreve os URL (acrescentando o ID da sesso) automaticamente. Voc
pode desejar ajustar URLs relativos a contextos para que eles
apontem para a raiz da sua aplicao web, e no para todo o servidor.
Isto , se um URL comea com uma /, ele mapeado para o diretrio raiz
da sua aplicao web, e no para a raiz do servidor. O tag efetua
estes ajustes para voc.Em tags HTML como o que vem abaixo, o URL
referencia o diretrio info na raiz do servidor web:Leia as
informaes de CopyrightMas em um tag JSTL como o que vem abaixo, o
URL aponta para o diretrio info abaixo da raiz da sua aplicao
web:Para que uma imagem seja localizada na pasta imagens da sua
aplicao web utilize o tag , assim:Voc pode utilizar o atributo
context do tag para criar um URL para uma pgina em outra aplicao
web existente no seu container JSP. O tag tambm til quando se
deseja salvar um URL (utilizando os atributos var e scope) e
utiliz-lo diversas vezes na sua aplicao.295. PGINAS COM ACESSO A
BANCOS DE DADOS 5.1 Quando Utilizar o Suporte JSTL a Bancos de
Dados A maioria das grandes aplicaes para a Web baseadas em Java no
so construdas inteiramente de pginas JSP. Muitas aplicaes contm
servlets para tratar as requisies provenientes dos usurios.
Servlets podem invocar diretamente qualquer lgica que uma aplicao
necessite, e ento passar a requisio do usurio para uma pgina JSP.
Em um ambiente como este pginas JSP apenas exibem informaes
formatadas. Se uma aplicao utiliza pginas JSP apenas para exibir
informaes, e no para tratar lgica de aplicao, ento estas pginas JSP
no necessitam acessar bancos de dados. Se voc est trabalhando em um
projeto onde os programadores Java tratam todos os acessos a bancos
de dados, voc no precisar utilizar os tags JSTL de acesso a banco
de dados. Em vez disso, voc ir provavelmente utilizar JavaBeans ou
tags customizados construdos pelos programadores. Porque um
componente de apresentao deveria conhecer onde os dados esto
mantidos? Esta abordagem explica a popularidade de frameworks de
aplicaes baseados em servlets. No entanto, para pequenas aplicaes,
prottipos, ou projetos onde voc o nico desenvolvedor, os tags JSTL
de acesso a banco de dados so bastante teis. 5.2 Criando uma Conexo
de Banco de Dados com Os tags JSTL de acesso a bancos de dados
necessitam saber qual banco de dados deve ser utilizado, e o tag
que fornece esta informao o . Em muitas aplicaes grandes, o tag no
necessrio, pois desenvolvedores Java gerenciam todas as conexes de
banco de dados. Estes desenvolvedores podem designar um banco de
dados default de tal forma que voc nunca precise se preocupar com
esta questo. Ou eles podem te passar uma varivel com escopo como
entrada para os tags JSTL de banco de dados. No entanto, para
pequenas aplicaes, ou para as aplicaes onde todo o gerenciamento de
acesso a banco de dados efetuado por pginas JSP em vez de por cdigo
Java, o tag bastante til. Este tag aceita como atributos todas as
informaes necessrias para efetuar uma conexo com um banco de dados.
Com esta informao, voc pode fazer duas coisas: 1. Voc pode decidir
expor uma varivel com escopo que represente o banco de dados. 2.
Voc pode definir um banco de dados (set up a database) toda vez que
um usurio se logar, declarar este banco de dados como default na
sesso do usurio, e nunca se preocupar com isto novamente.30A tabela
abaixo mostra os atributos do tag : AtributosdataSource driver url
user password var scopeDescrioUm banco de dados existente a ser
utilizado O nome da classe Java do driver JDBC O URL para acesso a
um banco via JDBC Nome do usurio Senha do usurio Nome da varivel
que representa o banco Escopo da varivel ou um novo
defaultObrigatrio DefaultNo No No No No No No Nenhum Nenhum Nenhum
Nenhum Nenhum Nenhum pagePara preparar conexes para um banco
Oracle, poderamos utilizar o seguinte tag:O atributo scope o tag ir
definir um novo banco de dados para a scope=request sesso do
usurio. Poderamos ter especificado ou scope=application. Observe
que um conjunto de pginas pode utilizar um banco com escopo de
aplicao enquanto outro conjunto utiliza um banco com escopo de
sesso. Se a sua aplicao trabalha com vrios bancos de dados, em vez
de utilizar para estabelecer uma conexo default, voc pode utiliz-la
para exporuma varivel com escopo que representa o banco. Voc pode
fazer isto adicionando um atributo var:Este tag expe uma varivel
com escopo denominada bancoUm. Um outro tag pode expor uma varivel
diferente denominada bancoDois. Se um cdigo Java, ou um tag que voc
utilizou, criou uma varivel com escopo que aponta para um banco de
dados, voc pode informar o nome desta varivel em outros tags para
definir um novo default. Aps termos exposto bancoUm, podemos tornar
este banco o default para escopo de requisio, assim:31Note que
quando voc utiliza os atributos url, driver, user, e password, voc
pode deixar de informar todos eles, exceto o url. Voc pode deixar
de informar o driver porque, s vezes, um administrador de sistema
pode prometer para voc que o driver j estar registrado. Voc pode
omitir user ou a password caso seu banco no exija estas informaes.
5.2.1 Cuidado com O tag no implementa um pool de conexes, isto ,
apenas abre uma nova conexo com o banco de dados que ser utilizada
pela pgina JSP. Logo, o uso deste tag ineficiente para aplicaes
necessitam suportar muitos usurios. Uma soluo mais eficiente seria
a designao, atravs de cdigo Java, de um pool de conexes default
para as pginas JSP. 5.3 Executando Queries com O objetivo do tag
expor uma varivel com escopo que representa o resultado de uma
query de banco de dados. A tabela abaixo mostra os atributos do tag
: Atributossql dataSource startRow maxRows var scopeDescrioO
comando sql SELECT a ser executado O provedor de uma conexo de BD A
linha do resultado que deve ser retornada Quantidade mxima de
linhas a retornar Nome da varivel que deve expor o resultado Escopo
da varivel que deve expor o resultadoObrigatrio DefaultNo No No No
Sim No Corpo Ver seo 5.2 0 (a 1 linha) ver seo x.x Nenhum PageSe
voc fornecer uma varivel com escopo para o atributo dataSource,
ento o tag ir se conectar ao banco de dados utilizando esta varivel
fornecida. Voc pode expor uma varivel com escopo para o atributo
dataSource atravs do tag , ou voc pode recuperar uma varivel com
escopo de requisio, sesso ou aplicao proveniente de cdigo Java.
Neste caso o tag teria a seguinte sintaxe:32Se voc no utilizar o
atributo dataSource, ento o tag ir tentar encontrar um banco
default. Mais adiante veremos como configurar um banco de dados
default. 5.3.1 Executando uma Query de Banco de Dados Exemplo 1:
SELECT * FROM CLIENTES Exemplo 2:Exemplo 3:Exemplo 4: Recuperando a
query de um documento XML Observao: Estes exemplos assumem que um
banco defaut est corretamente definido. Se um banco default no foi
definido com , e se as suas pginas no possuem um banco default
definido por um programador Java, ento ser necessrio utilizar o
atributo dataSource para estes exemplos funcionarem. 5.3.2 Lendo o
Resultado de uma Query O tag no exibe o resultado da query. O
objetivo deste tag simplesmente executar a query e armazenar o
resultado em uma varivel com escopo definida por var e scope. Esta
varivel com escopo possui uma srie de propriedades. Estas
propriedades nos permitem acessar duas coisas sobre o resultado: Os
dados na tabela Informaes sobre os dados (metadata).33Acessando
Metadata Supondo que voc utilizou um tag para criar uma varivel
denominada resultado, as seguintes propriedades podem ser
recuperadas a respeito deste resultado: resultado.rowCount nos
permite recuperar a quantidade de linhas no resultado.
resultado.columnNames retorna uma lista de nomes de colunas.
resultado.limitedByMaxRows indica se a quantidade de linhas
retornada pelo tag foi truncada. Veja o item 5.4.A varivel do tag
nos permite acessar dados atravs de duas propriedades: rows e
rowsByIndex. Ambas as propriedades expem colees. Geralmente voc ir
desejar percorrer estas colees para imprimir os resultados. A
diferena entre rows e rowsByIndex que durante cada loop voc acessa
os dados em rows utilizando os nomes de colunas, e acessa dados em
rowsByIndex utilizando os nmeros das colunas. Exemplo: SELECT NOME,
QI FROM USUARIOS WHERE QI > 120 Embora tenhamos escrito
${row.NOME}, tambm poderamos ter escrito ${row.nome}. A propriedade
rows nos perimte acessar valores de colunas individuais em cada
linha, por nome. E a propriedade rowsByIndex nos permite acessar
valores para cada linha, por nmero. Ambos os atributos so colees de
colees, mas columnNames uma simples coleo que nos permite acessar
nomes de colunas por nome. Para utilizar rowsByIndex, necessrio
escrever um loop similar. Mas em vez de referenciar row.NOME e
row.QI, preciso utilizar row[0] e row[1]. Esta abordagem pode ser
interessante se voc no conhece os nomes das colunas.34Exemplo:
SELECT NOME, QI FROM USUARIOS WHERE QI > 120 possvel, em um nico
loop, combinar dados e metadata para produzir um cabealho
conveniente. Esta abordagem til quando se deseja escrever uma pgina
genrica para tratar diversas queries. Por exemplo, voc pode
escrever uma pgina genrica denominada imprimeQuery.jsp e incluir
esta pgina, enviando para ela o resultado de um tag utilizando um
atributo com escopo de requisio. Exemplo: Relao de Usurios Espertos
355.3.3 Limitando o Tamanho do Resultado de uma Query Como limitar
em 20 linhas o resultado de uma query: SELECT NOME, SALARIO FROM
EMPREGADOS WHERE SALARIO > 2000 Para ser informado que que a
resposta da query foi truncada voc utilizar a propriedade
limitedByMaxRows da varivel exposta por , assim: SELECT NOME,
SALARIO FROM EMPREGADOS WHERE SALARIO > 2000 O resultado da sua
query retornou empregados demais. Por favor, seja mais especfico da
prxima vez. Programadores Java podem designar um valor default para
o atributo maxRows das suas pginas, mas voc sempre poder efetuar o
override deste valor. Se voc quer garantir que o resultado de sua
query no ser truncado, atribua 1 a maxRows. O Atributo startRow A
query abaixo retorna todas as linhas da tabela de clientes exceto
as duas primeiras linhas (as linhas cujos nmeros so 0 e 1): SELECT
NOME, SALARIO FROM CLIENTES Se a tabela s possuir duas linhas, ento
ser atribuda varivel clientes uma coleo vazia. 5.4 Modificando
Dados com Novamente cabe salientar que grandes aplicaes so mantidas
mais facilmente quando pginas JSP no acessam bancos de dados
diretamente, deixando esta tarefa para cdigo Java em JavaBeans ou
para tags customizados. No entanto, JSTL prov o tag que poder ser
utilizado sem problemas em aplicaes relativamente pequenas.365.4.1
Uso Simplificado do Tag Atravs do tag possvel emitir comandos
Insert, Update, Delete, CreateTable, etc.A tabela abaixo mostra os
atributos do tag : Atributossql dataSource var scopeDescrioO
comando sql UPDATE a ser executado O provedor de uma conexo de BD
Nome da varivel que deve expor a quantidade de linhas afetadas
Escopo da varivel que deve expor a quantidade de linhas
afetadasObrigatrio DefaultNo No No No Corpo Ver seo 5.2 Nenhum
PageExemplo 1: INSERT INTO EMPREGADOS(NUMERO, NOME, PESO) VALUES(1,
'Joo Carlos', 80) Exemplo 2:5.4.2 Medindo o Efeito de um Tag Voc
pode utilizar o atributo var do tag para saber qual foi a
quantidade de linhas afetadas pelo tag. Exemplo 1: DELETE FROM
EMPREGADOS WHERE SALARIO > 2000 Foram removidos empregados,
todos com salrio maior do que 2000,00 reais. Nenhum empregado foi
removido. 375.5 Utilizando com Queries Ajustveis 5.5.1 Queries
Modelos (Templates) possvel utilizar o tag para completar parte de
uma query: SELECT * FROM CLIENTES WHERE NOME = E se o usurio
digitar: SERGIO' OR NOME 'SERGIO Neste caso, o final da query
ser:WHERE NOME = 'SERGIO' OR NOME 'SERGIO'Logo, no uma boa idia
utilizar para construir comandos SQL. 5.5.2 Utilizando JSTL permite
que voc evite estes problemas utilizando uma sintaxe especial
emprestada de JDBC. Utilizando esta sintaxe voc pode escrever uma
query template e deixar de fora todas as partes no conhecidas,
colocando interrogaes (?) nos seus lugares. Voc poder preencher
estas interrogaes utilizando o tag . Este tag deve ser acrescentado
como filho dos tags e de . A tabela abaixo mostra o atributo do tag
: AtributosvalueDescrioValor do parmetroObrigatrio DefaultNo
CorpoExemplo 1: SELECT * FROM CLIENTES WHERE NOME = ? AND ENDERECO
= ? AND IDADE = ? 38Quando um tag possui vrias interrogaes, ele
deve ter exatamente um tag para cada interrogao, na ordem em que as
interrogaes aparecem. Exemplo 2: INSERT INTO EMPREGADOS (NUMERO,
NOME, SALARIO) VALUES (?, ?, ?) Exemplo 3: UPDATE EMPREGADOS SET
SALARIO = ? WHERE NUMERO = ? Exemplo 4: Se o tag no contiver um
atibuto value, o tag ir utilizar o contedo de seu corpo. Logo,
possvel produzir um valor utilizando outros tags. UPDATE EMPREGADOS
SET SALARIO = ? WHERE NUMERO = ? 395.5.3 Parmetros do Tipo Date com
Considere o comando SQL abaixo:SELECT * FROM USUARIOS WHERE
DATA_NASC < ?Neste caso, se voc tiver uma varivel com escopo
representando uma data (mais adiante veremos como criar esta
varivel com escopo), talvez no seja possvel utilizar esta varivel
com . Vai depender do driver que voc estiver utilizando. Para ter
certeza de que voc conseguir adicionar datas s suas queries, JSTL
prov o tag cujos atributos so relacionados absixo: Atributosvalue
typeDescrioObrigatrio DefaultNenhum timestampA data que ir
substituir a ? Sim Um dos seguintes valores: time, No date, ou
timestampO atributo value requer uma expresso que aponte para uma
varivel com escopo que armazene uma data, e o atributo type permite
que voc descreva mais precisamente como o banco deve tratar o
valor: apenas armazena a hora do dia (time), uma data (date), ou
ambos data e hora (timestamp). Exemplo: SELECT * FROM USUARIOS
WHERE DATA_NASC < ? 5.6 Gerenciando Transaes com 5.6.1 O Tag
JSTL suporta transaes atravs do tag . Este tag age como o tag pai
dos tags e . Ou todos os tags filhos de so bem sucedidos, ou todos
falham juntos. Sua transao pode ser formada por um update seguida
de uma query, seguida de outro update baseado na query
intermediria. Esta a razo pela qual o tag permite que tags
participem de uma transao. Note que qualquer texto vlido, tags
JSTL, ou outro contedo JSP, pode aparecer dentro de um tag . Se um
erro fatal ocorrer em qualquer lugar dentro deste bloco por
exemplo, se voc decidir recuperar um arquivo com e este arquivo no
for encontrado ento toda a transao ser interrompida e sofrer um
rollback imediato. Este processo permite a voc amarrar o sucesso de
uma operao de bano de dados ao sucesso de40operaes que no so de
banco de dados. Tenha em mente apenas que efetua o rollback apenas
das operaes de banco de dados. Ele no apaga, por exemplo, variveis
com escopo criadas ao longo da execuo deste bloco. A tabela abaixo
mostra os atributos do tag : AtributosdataSource
isolationDescrioObrigatrio DefaultVer seo 5.2 Ver seo 5.6.2Quem
prov a conexo de banco No de dados Nvel de isolamento das No
transaesO tag determina qual banco de dados ser utilizado da mesma
forma que e . Ele pode utilizar seu atributo dataSource ou, caso no
seja especificado, se basear em um banco de dados default, que pode
ter sido estabelecido por ou por cdigo Java. Quando um tag aparece
na sua pgina, ele imediatamente inicia uma transao de banco de
dados. Esta transao utiliza uma conexo de banco de dados, e esta
conexo fornecida, por default para todos os tags e filhos de . Por
exemplo, considere o seguinte tag:Este tag normalmente utilizaria o
banco de dados default, uma vez que nenhum atributo dataSource foi
especificado. Mas quando este tag aparece dentro de um tag , ele
utiliza o banco definido para seu pai . Exemplo: UPDATE CONTAS SET
SALDO = SALDO - ? WHERE NUMERO = ? UPDATE CONTAS SET SALDO = SALDO
+ ? WHERE NUMERO = ? 415.6.2 Nveis de Isolamento A mostra o valores
possveis , e seus respectivos significados: Nveis de Isolamento
Dirty Reads?read_uncommited read_commited repeatable_read
serializable --Evita Evita Evita ----Evita
EvitatabelaabaixodoatributoisolationdotagNonrepeatable reads?
Phantom reads?------EvitaEsta tabela mostra os quatro nveis de
isolamento possveis e os tipos de leituras indesejveis que eles
probem. Uma dirty read (leitura suja) aquela capaz de recuperar
linhas ainda no comitadas por outros usurios. Uma nonrepeatable
read (leitura sem repetio) ocorre quando o mesmo comando SELECT
retorna diferentes resultados quando executado mais de uma vez
dentro de uma mesma transao. E uma phantom read (leitura fantasma)
como uma nonrepeatable read, mas envolve novas linhas adicionadas a
uma tabela que aparecem no segundo SELECT (enquanto, uma
nonrepeatable read pode afetar dados existentes). Voc poderia
pensar que serializable o melhor nvel de isolamento, uma vez que
evita todos os problemas. No entanto, este nvel de isolamento
provoca uma queda no desempenho considervel.426. FORMATAO Neste
captulo veremos uma coleo de tags JSTL que auxiliam na leitura e
escrita de nmeros e datas. Tdos os tags introduzidos neste captulo
vm da biblioteca fmt de tags JSTL. Para utilizar qualquer dos
exemplos apresentados neste captulo ser preciso acrescentar no topo
da pgina a seguinte diretiva:6.1 Imprimindo Nmeros com 6.1.1 Uso
Bsico de O uso mais simples deste tag imprime o nmero utilizando a
melhor suposio sobre o formato que o usurio deseja ver. Browsers
podem transmitir informaes sobre seus locale essencialmente, o
local e os formatos preferidos para nmeros, datas e outros dados.
Exemplo:Se voc est utilizando o Internet Explorer, voc pode
experimentar diferentes locais modificando no painel de controle as
opo referente ao pas/lngua. A tabela abaixo mostra alguns atributos
do tag : Atributosvalue typeDescrioObrigatrioNo No No No No No No
No No No No NoDefaultCorpo number Nenhum Nenhum true Nenhum Nenhum
Nenhum Nenhum Nenhum Nenhum pageO nmero a ser formatado Se deve ser
impresso: numbers, currency ou percentage currencyCode ISO-4217
currency code currencySymbol Smbolo monetrio (como $) groupingUsed
Se deve haver agrupamento de milhar maxIntegerDigits Nmero mximo de
dgitos inteiros minIntegerDigits Nmero mnimo de dgitos inteiros
maxFractionDigits Nmero mximo de dgitos fracionrios
minFractionDigits Nmero mnimo de dgitos fracionrios pattern Padro a
ser utilizado var Varivel que deve expor o nmero formatado como um
String scope Escopo da varivel var436.1.2 Diferentes Formas de
Imprimir um Nmero Suponha que sua empresa produz um tag que imprime
um nmero, como o seguinte:Para formatar a sada a ser impressa:
6.1.3 Armazenando um Nmero em vez de Imprimi-lo Para armazenar um
nmero na varivel numero, com escopo de sesso:6.1.4 Imprimindo
Diferentes Tipos de Nmeros Percentuais:Valor Monetrio:6.1.5
Agupamento de Milhar6.1.6 Controlando Quantos Dgitos Devem Ser
Impressos446.1.7 Utilizando Padres Um caso especial difcil de
solucionar sem a utilizao de padres o uso da notao cientfica:6.2
Imprimindo Datas A tabela abaixo mostra os atributos do tag :
Atributosvalue type dateStyle timeStyle timeZone pattern var
scopeDescrioA data a ser impressa Se deve ser impresso: data,
timeou ambos Estilo pr-formatado para data (full, short) Estilo
pr-formatado para hora Time zone a ser utilizado Padro explcito a
ser utilizado Varivel que deve expor a data formatada como um
String Escopo da varivel varObrigatrioSim No No No No No No
NoDefaultNenhum date default default Ver 6.5 Nenhum Nenhum pageO
atributo value do tag deve apontar para uma varivel do tipo date.
No h como interpretar Strings como data. Esta a tarefa do tag , que
ser examinado mais adiante. Voc pode obter uma data de algumas
formas. possvel recuperar uma data de um banco de dados, de cdigo
Java, ou voc pode utilizar o tag para produzir uma varivel do tipo
Date. Voc tambm pode produzir uma data utilizando o tag ,
assim:Este tag cria uma varivel com escopo de pgina denominada
umaData que armazena a data corrente. Exemplo: 456.2.1 Utilizando
Padres O atributo pattern nos permite especificar exatamente como
uma data deve aparecer. A tabela abaixo mostra os caracteres mais
teis que voc pode utilizar em um pattern: Caracter(es)yy yyyy MM
MMMM dd EEEE H HH h hh m mm s ss aSignificadoAno com dois dgitos
Ano com 4 dgitos Ms com dois dgitos Ms por extenso Dia com dois
dgitos Dia da semana por extenso Hora com 1 dgito no padro 24h Hora
com 2 dgitos no padro 24h Hora com 1 dgito no padro 12h Hora com 2
dgitos no padro 12h Minuto com 1 dgito Minuto com 2 dgitos Segundo
com 1 dgito Segundo com 2 dgitos AM / PMExemplo02 2002 04 abril 07
Sexta-feira 21 21 9 09 4 04 6 06 PMExemplo: Data:
Hora: 6.3 Lendo Nmeros com JSTL possui dois tags que nos auxiliam
na leitura de nmeros e datas: e . O tag especfico para casos nos
quais necessrio interpretar nmeros mais complicados. Por exemplo,
se o usurio digita 50.000 (incluindo o ponto) ou se voc l - de um
arquivo XML ou de um banco de dados - valores que incluem vrgulas
ou espaos em branco> Nestes casos, voc no pode tratar estes
valores como nmeros; preciso primeiramente efetuar o parse destes
valores.46A tabela abaixo mostra os atributos do tag :
Atributosvalue type integerOnly pattern parseLocale var
scopeDescrioO String que deve sofrer o parse Como efetuar o
parse(number, currency, ou percent) Se a parte fracionria deve ser
descartada Informaes mais detalhadas de como efetuar o parse do
nmero Locale a ser utilizado em vez do default Varivel que deve
expor o nmero aps o parse (como um nmero) Escopo da varivel
varObrigatrio DefaultNo No No No No No No Corpo number false Nenhum
Ver 6.3.2 Nenhum page6.3.1 Porque Efetuar o Parse de Nmeros Na
maioria das pginas voc provavelmente no necessitar efetuar o parse
de nmeros. Voc sentir a necessidade de efetuar o parse de nmeros
nas seguintes situaes: Voc necessita salvar um valor numrico em um
banco de dados utilizando e , mas tudo o que voc tem um String como
500.000,00. Voc deseja normalizar a exibio de nmeros isto , fazer
com que todos sejam exibidos com a mesma aparncia. Mas alguns de
seus nmeros podem vir de usurios ou bancos de dados diferentes, e
aparecem de formas diferentes. Antes de poder passar um nmero para
o tag preciso efetuar o seu parse com . s vezes (embora raramente)
voc possui um String como 500,000 mas necessita de um nmero para
ser utilizado em tags como (como valor dos atributos begin, end, e
step), (como valor dos atributos startRow ou maxRows), e etc. Voc
necessita efetuar uma operao matemtica sobre um nmero digitado pelo
usurio ou recuperado de algum lugar.6.3.2 Como Funciona por Default
O tag recebe o nmero que deve sofrer o parse atravs do seu atributo
value ou atravs do seu corpo. Aps efetuar o parse, o valor
resultante armazenado na varivel com escopo indicada ou impresso
sem nenhuma formatao especial. Quando o tag utilizado para efetuar
o parse de um nmero digitado pelo usurio (ou recuperado de algum
outro local) ele assume, por default, que os usurios podero entrar
com valores com formataes do pas/lngua do usurio.47Por exemplo,
considere o formulrio HTML abaixo: Qual o seu nmero favorito?
A pgina JSP abaixo mostra como tratar este formulrio: Voc digitou
"". Aparentemente este nmero corresponde ao nmero . Se voc
multiplicar este nmero por 2 e somar 1, voc obtm , certo?6.3.3
Modificando as Regras de Parse de Os demais atributos de permitem
que voc modifique as regras que sero utilizadas por default.
Ignorando Dgitos FracionriosModificando o Locale Como ignorar o
Locale informado pelo Browser: Utilizando o Locale Referente aos
EUA 48O parse de 50,05 corresponde ao nmero sem formatao. O parse
de 50,05 corresponde ao nmero com formatao. O parse de 50,05 -
removendo a parte fracionria - corresponde ao nmero com formatao.
Utilizando o Locale Referente ao Brasil O parse de 50,05
corresponde ao nmero sem formatao. O parse de 50,05 corresponde ao
nmero com formatao. O parse de 50,05 - removendo a parte fracionria
- corresponde ao nmero com formatao. 6.4 Lendo Datas com A tabela
abaixo mostra os atributos do tag : Atributosvalue type pattern
parseLocale timeZone var scopeDescrioObrigatrioDefaultCorpo date
Nenhum Ver 6.3.2 Ver 6.5 Nenhum pageO String que deve sofrer o
parse No Como efetuar o parse(time, date, ou No ambos) Pdro a ser
utilizado ao efetuar o No parse de uma data O locale que deve ser
utilizado, em No vez do default O time zone a ser aplicado data No
Varivel que deve expor a data aps o No parse (como um nmero) Escopo
da varivel var No49Os atributos value, var, scope e parseLocale
funcionam exatamente como no tag . 6.4.1 Como Funciona por Default
O funcionamento do tag assim como outros tags de formatao e de
parse, dependente do locale default do browser do usurio. Sem
nenhum atributo alm de value, ele efetua o parse de uma data da
mesma forma como formata uma data. As regras de parse so bastante
restritivas. Logo, o tagir funcionar para o locale English,
mascausar um erro pois falta a vrgula. Este comportamento torna o
default muito pouvo til. 6.4.2 Modificando Como Efetua o Parse de
Datas O tag possui o atributo pattern, que a forma mais til de
utilizar este tag. O atributo pattern aceita um padro de data com a
mesma sintaxe vista na seo 6.2.1 e efetua o parse de acordo com
este padro. Exemplo:507. TAREFAS COMUNS 7.1 Tratando Parmetros do
tipo CheckBox Parmetros de CheckBox so especiais uma vez que o
mesmo nome pode ser mapeado a diversos valores. Suponha que uma
pgina HTML possui os seguintes tags: Se o usurio clicar nas trs
caixas, o parmetro lngua ter os trs valores: Ingls, Espanhol e
Francs. Voc pode acessar uma coleo que contm todos estes valores
atravs da expresso ${paramValues.nome} onde nome o nome do parmetro
que voc deseja (lingua, neste caso). Voc pode utilizar o tag para
efetuar um loop sobre os parmetos individuais nesta coleo, para
trat-los um de cada vez. 7.1.1 O Formulrio HTML Por favor selecione
as lnguas que voc conhece: Ingls Espanhol Francs 517.1.2 Um
Manipulador de CheckBox Simples Segue abaixo a pgina JSP
manipuladora do formulrio HTML acima: As lnguas que voc conhece
so: Voc no selecionou nenhuma caixa de verificao. Na verdade
no um problema efetuar um loop sobre um parmetro inexistente. O tag
simplesmente no far nada. O raciocnio o seguinte: uma coleo
inexistente como uma coleo com zero elementos, logo faz sentido
efetuar uma iterao zero vezes. No entanto, como desejamos enviar
uma mensagem caso o usurio no selecione nenhuma lngua, foi
acrescentado o tag . H outras maneiras de garantir que os tags
e sero impresos apenas quando a lista tiver pelo menos um item.
Exemplo: 527.1.3 Tratando Alguns CheckBoxes de Forma
Especial Com o tag possvel utilizar expresses para referenciar o
item corrente idioma, neste caso para tomar decises sobre como
tratar cada item individualmente. Exemplo: As lnguas que voc
conhece so: Voc no selecionou nenhuma caixa de virificao.
Para atualizar o banco de dados quando a pgina carregada com a
lngua Inglesa selecionada, poderamos executar o cdigo abaixo:
UPDATE idiomas set ingles = ingles + 1 537.2 Lendo Datas 7.2.1 O
Formulrio HTML Por favor, entre com a data de seu nascimento:
Janeiro Fevereiro Maro Abril Maio Junho Julho Agosto Setembro
Outubro Novembro Dezembro Note que embora a pgina acima gere um
simples formulrio de entrada de dados HTML, no se trata de uma
pgina HTML esttica. Nesta pgina h um campo de formulrio esttico
(mes), e dois campos gerados dinamicamente: dia e ano.547.2.2
Tratando o Formulrio e Lendo a Data Segue abaixo o cdigo fonte da
pgina manipuladora do formulrio: Voc nasceu . Voc nasceu em . Voc
nasceu em .Observe que no tag foi includo o atributo parseLocale
para fazer com que o parse ocorra com base no locale
portugus/Brasil em vez de utilizar o locale do browser. Assim, a
data sofrer o parse corretamente e ser armazenada na varivel data.
Para provar que a data realmente passou pelo processo de parse
mandamos imprimi-la utilizando o estilo full que exibe o dia da
semana correspondente. Naturalmente poderamos ter feito outras
coisas com a data alm de apenas imprimi-la, como vem no exemplo
abaixo: UPDATE usuarios SET data_nasc = ? 557.3 Tratando Erros
Quando voc utiliza tags JSTL, existem basicamente trs coisas que
voc pode fazer com os erros:Evitar pensar neles. Quando voc faz
isso, qualquer erro que ocorra em sua pgina faz com que a execuo da
pgina falhe. Nestes casos, geralmente o container JSP prov
informaes sobre o tipo de erro que ocorreu. Esta abordagem boa
enquando voc est debugando a pgina, mas parece pouco profissional
para os usurios. Utilizar o tag para capturar e at mesmo tentar
recuperar erros dentro da mesma pgina. Fazendo isto voc ganha em
flexibilidade, mas pode tornar as pginas muito complicadas. Por
outro lado, voc poder descartar um erro significativo. Utilizar uma
facilidade que JSP prov conhecida como error page (geralmente
escrita como errorPage). Uma errorPage JSP uma pgina que voc pode
projetar para tratar erros de diversas pginas. Uma vantagem desta
pgina de erro que ela permite que o mesmo comportamento seja
utilizado para um conjunto de pginas. Basta apontar todas elas para
uma mesma pgina de erro e definir o que esta pgina deve fazer
quando um erro ocorre.7.3.1 Capturando Erros com Este tag permite
que voc capture o erro para descart-lo ou para armazenar informaes
sobre ele para uso posterior. A tabela abaixo mostra o nico
atributo do tag : AtributosvarDescrioVarivel que expe informaes
sobre o erroObrigatrioNoDefaultNenhumErros que acontecem no corpo
de um tag no fazem com que seja abortada toda a execuo da pgina.
Estes erros abortam apenas o resto do corpo do tag . Se voc
utilizar sem um atributo var, todos os erros que ocorrerem no corpo
do tag sero ignorados e a execuo da pgina ir prosseguir. Se uma
pgina possui um contador que atualiza seu valor em um banco de
dados, a atualizao deste contador poder estar envolta em um tag .
Neste caso, caso o banco de dados esteja fora dor ar, a pgina ser
executada, sem o contador. A seguir ser apresentado um exemplo onde
o usurio digita um nmero inteiro que dever passar pelo processo de
parse. Se o processo de parse no for bem sucedido, ser apresentada
uma mensagem de erro.56 Voc digitou "". Multiplicando por dois e
somando 1 d . Erro: o que voc digitou no um nmero. Para adicionar o
tratamento de erro a esta pgina adicionamos o tag em torno dos tags
que podem provocar erros. Este tag garante que nenhum erro que
ocorra ser percebido pelo container JSP. Observe que se um erro
ocorre durante o processo de parse, isto , durante a execuo de ,
ento as demais linhas de cdigo dentro do tag no sero executadas.
este comportamento faz sentido: se o valor digitado no um nmero, no
faz sentido efetuar operaes aritmticas com ele. A coisa mais til
que se pode fazer com a varivel criada com o tag verificar se ela
est empty. Neste caso, se erro est Empty, ento nenhum erro ocorreu.
Caso contrrio teremos certeza de que um erro ocorreu dentro do
bloco . As variveis criadas pelo tag possuem pelo menos uma
propriedade til: message, que contm alguma informao que descreve o
erro que ocorreu. Esta propriedade til se voc quer que o usurio
tenha uma idia do erro que ocorreu. Para incluir informaes sobre o
erro ocorrido, o seguinte tag pode ser utilizado:ou
simplesmente:Esta ltima opo inclui algumas outras informaes tcnicas
sobre o erro que ocorreu.577.3.2 Enviando Erros para uma Pgina de
Erro Quando um erro alcana o container JSP, o container exibe, por
default, a sua prpria mensagem de erro. No entanto, voc pode
modificar este comportamento utilizando uma pgina de erro JSP.
Quando sua pgina possui uma pgina de erro, o usurio recebe um
forward para esta pgina de erro sempre que um erro ocorre (como se
voc tivesse manualmente includo um tag na sua pgina). Para declarar
uma pgina de erro, voc deve utilizar a diretiva , onde destino o
nome da pgina de erro, por exemplo, paginaDeErro.jsp. Esta pgina de
erro uma pgina JSP normal. A nica diferena que ela deve incluir a
seguinte linha:Esta linha indica ao container JSP que ele pode
utilizar esta pgina como pgina de erro. Note que voc pode utilizar
o tag e a pgina de erro na mesma pgina JSP. A pgina de erro receber
o forward apenas se um erro ocorrer e no for capturado pelo bloco .
Criando uma Pgina de Erro Listagem da pgina de erro: Erro! Algo
ruim ocorreu em uma das suas pginas: Note como utilizamos a
expresso ${pageContext.exception.message} para imprimir informaes
sobre o erro que ocorreu. A varivel pageContext.exception a varivel
com escopo que armazenada pelo bloco . Listagem da pgina que contm
um erro: 587.4 Validando Entrada de Dados 7.4.1 Diferentes Tipos de
Validao de Formulrios A primeira coisa a compreender sobre validao
que, em grandes aplicaes para a web, no funo das pginas JSP efetuar
validao de entrada de dados, especialmente me uma aplicao que
utiliza Struts ou um outro framework para prover a separao do
trabalho e implementao. Em uma aplicao deste tipo, a funo das
pginas JSP apenas apresentar e formatar a informao. O cdigo Java
executado no back-end cuida do resto. Os tags JSTL disponveis para
validao incluem coisas como: Verificar se o usurio digitou algo em
um campo de um formulrio (ou o deixou em branco). Garantir que se
um campo foi preenchido um outro tambm deveria ter sido (ou no).
Comparar um nmero digitado pelo usurio com uma faixa de
valores.7.4.2 Tarefas Relacionadas Validao de um Formulrio A seguir
ser apresentada uma pgina JSP responsvel pela validao dos campos de
um formulrio de entrada de dados exibido por esta mesma pgina JSP.
Esta pgina exibida repetidamente, at que todos os campos do
formulrio tenham sido informados corretamente. Exemplo: Servio de
Correio Eletrnico Tabajara 59 Obrigado por assinar o servio de
correio eletrnico Tabajara.
Ao submeter suas informaes no formulrio abaixo, voc comear a
receber "de grtis" todo tipo de "spam" que voc sempre quis. Digite
seu nome:
Erro: Voc deve digitar seu nome Digite seu endereo de e-mail:
Erro: Voc deve digitar seu endereo de e-mail Digite sua
idade:
Erro: Voc deve digitar sua idade 60 Erro: No fui capaz de decifrar
sua idade Erro: Se manca garoto!!! Voc muito jovem para assinar o
servio
de e-mail Tabajara. Aqui tem besteira demais para voc!
Por favor, cresa e tente novamente. Esta pgina comea com lgica de
validao de dados. Primeiramente o tag utilizado para determinar se
esta pgina est respondendo a um formulrio ou exibindo o formulrio
pela primeira vez. Em seguida os parmetros enviados a esta pgina so
validados. O tag designa true a uma varivel com escopo de pgina
denominada semNome, se param.nome no possui um valor significativo.
Para testar se o usurio digitou um nmero no campo idade utilizamos
o elemento . O cdigo abaixo, designa uma varivel com escopo de
pgina denominada erroIdade caso ocorra um erro durante o processo
de parse. Em seguida, caso nenhum erro tenha ocorrido, efetuamos um
forward para a pgina seguinte. Observe que antes do forward, so
designados valores para trs variveis com escopo de request para que
a pgina seguinte possa recuperar seus valores. Se o forward no
acontecer, ento o formulrio ser exibido. Neste caso, um campo
hidden designa o valor true para o61campo enviado para indicar que
o formulrio est sendo submetido pelo usurio em vez de solicitado
pela primeira vez. Os campos do formulrio (nome, email e idade)
recebem os valores dos parmetros enviados pgina, e para cada campo,
se um erro detectado, uma mensagem em vermelho impressa. No caso do
campo idade, foi utilizado o tag uma vez que trs mensagens de erro
diferentes podem ser emitidas. Para campos do tipo podemos utilizar
o atributo value para fornecer um valor para o campo,
assim: