Você está na página 1de 63

Apostila de JSTL

Traduo Resumida do Livro JSTL in Action de Shawn Bayern

Prof. Carlos Ribeiro

ndice
1. A LINGUAGEM DE EXPRESSES....................................................................................................................... 4 1.1 Expresses e o tag <c:out> ............................................................................................................................. 4 1.1.1 Qual a Aparncia de uma Expresso............................................................................................................ 5 1.1.2 Onde Expresses Funcionam ....................................................................................................................... 5 1.1.3 Valor Default em <c:out> ........................................................................................................................ 5 1.1.4 Caracteres Especiais e <c:out> ................................................................................................................ 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 <c:if> ................................................................................................................... 13 2.1.1 A Sintaxe Bsica de <c:if> .................................................................................................................... 13 2.1.2 Utilizando <c:if> com Tags HTML....................................................................................................... 13 2.1.3 Tags <c:if> 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 <c:forEach> ........................................................................................ 16 3.2 Iteragindo sobre Strings com <c:forTokens>............................................................................................. 17 3.2.1 Como JSLT Efetua o Parse de Strings ....................................................................................................... 17 3.3 Iterao Avanada com <c:forEach> e <c:forTokens> ....................................................................... 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 <c:import> ............................................................................................................ 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 <c:redirect> ............................................................................................................ 28 4.3 Formatando URLs com <c:url> ................................................................................................................... 28 4.3.1 Formatando URLs com <c:url> ............................................................................................................ 28 4.3.2 Porque Utilizar <c:url> ......................................................................................................................... 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 <sql:setDataSource> ................................................. 30 5.2.1 Cuidado com <sql:setDataSource> ................................................................................................ 32 5.3 Executando Queries com <sql:query> ....................................................................................................... 32 5.3.1 Executando uma Query de Banco de Dados .............................................................................................. 33 5.3.2 Lendo o Resultado de uma Query .............................................................................................................. 33

5.3.3 Limitando o Tamanho do Resultado de uma Query................................................................................... 36 5.4 Modificando Dados com <sql:update> ..................................................................................................... 36 5.4.1 Uso Simplificado do Tag <sql:update> .............................................................................................. 37 5.4.2 Medindo o Efeito de um Tag <sql:update> ........................................................................................ 37 5.5 Utilizando <sql:param> com Queries Ajustveis........................................................................................ 38 5.5.1 Queries Modelos (Templates) .................................................................................................................... 38 5.5.2 Utilizando <sql:param>........................................................................................................................ 38 5.5.3 Parmetros do Tipo Date com <sql:dateParam> ............................................................................... 40 5.6 Gerenciando Transaes com <sql:transaction> .................................................................................. 40 5.6.1 O Tag <sql:transaction>............................................................................................................................. 40 5.6.2 Nveis de Isolamento.................................................................................................................................. 42 6. FORMATAO..................................................................................................................................................... 43 6.1 Imprimindo Nmeros com <fmt:formatNumber> .................................................................................... 43 6.1.1 Uso Bsico de <fmt:formatNumber>................................................................................................. 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 <fmt:parseNumber> ............................................................................................... 46 6.3.1 Porque Efetuar o Parse de Nmeros........................................................................................................... 47 6.3.2 Como <fmt:parseNumber> Funciona por Default ............................................................................. 47 6.3.3 Modificando as Regras de Parse de <fmt:parseNumber> .................................................................. 48 6.4 Lendo Datas com <fmt:parseDate>.......................................................................................................... 49 6.4.1 Como <fmt:parseDate> Funciona por Default .................................................................................. 50 6.4.2 Modificando Como <fmt:parseDate> 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 <c:catch> ......................................................................................................... 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

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:
<%= request.getParameter("nomeusuario") %>

A linguagem de expresses JSTL torna bem mais simples a construo de pginas. 1.1 Expresses e o tag <c:out> O tag <c:out> nos permite imprimir o resultado de uma expresso. O tag <c:out> possui a mesma funcionalidade de uma expresso (<%= contedo %>) 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 <c:out> so: Atributo
value default escapeXml

Descrio

Obrigatrio Default
Nenhum 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 &amp;.

Por default, <c:out> imprime o que quer que aparea no seu atributo value. Por exemplo:
<c:out value="Al Mundo!"/>

Naturalmente, isto s faz sentido se o atributo value contiver uma expresso na linguagem de expresses JSTL.

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:
<c:out value="${1 + 2}"/>

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:
<p>Oi ${nomeusuario}</p>

Expresses JSTL tambm no possuem significado especial como valor de um atributo de um tag HTML.
<a href="${link}" />

Neste caso o texto ${link} no interpretado como uma expresso JSTL. 1.1.3 Valor Default em <c:out> No exemplo abaixo, se a expresso falhar por exemplo, no caso do valor da varivel nomeusuario no ser encontrado ser impresso ninguem.
<c:out value="${nomeusuario}" default="Ninguem"/>

Esta uma outra forma de especificar um valor default:


<c:out value="${nomeusuario}"/> Ninguem </c:out>

1.1.4 Caracteres Especiais e <c:out> Por default, o tag <c:out> com caracteres com significados especiais em HTML e XML so substitudos (scaped) pelas entities references correspondentes. Por exemplo, se uma varivel possui o valor <o>, ao ser impressa com o tag </c:out>, ser produzido o seguinte resultado:
&lt;o&gt;

Logo, um browser HTML ir exibir o texto <o>. Se <c:out> no fizesse estas substituies, o browser receberia os caracteres <o> - 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 <c:out>, pode-se utilizar com segurana <c:out> como valor de um atributo de um tag HTML, conforme vem abaixo:
<input type="text" name="usuario" value="<c:out value="${param.usuario}"/>" />

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 <c:out>. Para obter este efeito basta designar o valor false para o atributo escapeXml.
<c:out value="${texto}" escapeXml="false"/>

Isto pode ser til caso se deseje acrescentar ao texto tags HTML como <b>, <i>, 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.

Como recuperar o valor de uma varivel em determinado escopo: Exemplo de Expresso


${pageScope.usuario} ${requestScope.usuario} ${sessionScope.usuario} ${applicationScope.usuario}

Significado
Varivel 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:
<c:out value="${session.usuario}"/>

1.2.2 Operaes envolvendo Variveis JSTL suporta os seguintes operadores matemticos em expresses: Operador
+ * / ou div % ou mod

Descrio
Adio Subtrao Multiplicao Diviso Resto

Exemplo
${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 sintaxes

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

PageContext 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 Valor
BASIC 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 aconteceu

Comparaes 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 le; >= ou ge.

Para 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 Expresses
<c:out value="Oi ${usuario.primeironome} ${usuario.ultimonome}" />

embora a combinao abaixo produza o mesmo resultado:


Oi <c:out value="${usuario.primeironome}" /> <c:out value="${usuario.ultimonome}" />

Esta habilidade de utilizar mltiplas expresses interessante em outros tags da biblioteca JSTL.

10

Salvando Dados com <c:set> Muitos tags JSTL podem criar varivies com escopo. O mais bsico <c:set>. Atributo
value var scope

Descrio
A expresso a ser calculada O nome da varivel com escopo O escopo da varivel

Obrigatrio Default
No Sim No Contedo do corpo Nenhum page

Os 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:
<c:set var="quatro" value="${3 + 1}" />

Para que esta varivel tenha escopo de sesso ser preciso fazer o seguinte:
<c:set var="quatro" scope="session" value="${3 + 1}" />

Utilizando o Corpo do Tag Se voc escrever um tag <c:set> 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 <c:set> til O tag <c:set> til, em primeiro lugar, quando desejamos avaliar alguma coisa uma nica vez, para que possamos reutiliz-la diversas vezes. Um outro uso seria:
<c:set var="email" scope="session" value="${param.email}" />

Neste caso, outras pginas na mesma sesso do usurio podero referenciar o email assim:
${sessionScope.email}

11

Removendo Dados com <c:remove> Atributos do tag <c:remove>: Atributo


var scope

Descrio

Obrigatrio Default
Nenhum qualquer

O nome da varivel com escopo a Sim remover O escopo da varivel a ser No removida

Exemplo:
<c:remove var="email" scope="session" />

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.

12

2. CONTROLANDO O FLUXO COM CONDIES 2.1 Condies Sim-No com <c:if> 2.1.1 A Sintaxe Bsica de <c:if> Atributos do tag <c:if>: Atributo
test var scope

Descrio

Obrigatrio

Default
Nenhum Nenhum page

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

O atributo test do tag <c:if> aceita qualquer expresso boleana:


<c:if test="${usuario.niveleducacional == 'doutorado'}"> Dr. </c:if> <c:out value="${usuario.nome}"/>

Neste caso ser impresso o nome do usurio precedido do texto Dr., caso se trate de um doutor. 2.1.2 Utilizando <c:if> com Tags HTML Pode-se utilizar o tag <c:if> em qualquer lugar de uma pgina HTML. Exemplo:
<font size="2" <c:if test="${usuario.niveleducacional == 'doutorado'}"> color="red" </c:if> > <c:out value="${usuario.nome}"/> </font>

13

Caso o nvel educacional seja diferente de 'doutorado' obteremos:


<font size="2"> Nome </font>

2.1.3 Tags <c:if> Aninhados Exemplo:


<c:if test="${erro1 or erro2}"> <ul> <c:if test="${erro1}"> <li> Ocorreu o erro 1. </c:if> <c:if test="${erro2}"> <li> Ocorreu o erro 2. </c:if> </ul> </c:if>

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:
<c:if test="${sessionScope.flags.errors.serious.erro1}" var=erro1> Salva a varivel Um erro srio ocorreu. </c:if> [ ... um corpo de pgina grande ...] <c:if test="${erro1}"> Usa a varivel Desde que um erro srio ocorreu, seus dados no foram slavos. </c:if>

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 <c:if> apenas para salvar o valor da varivel definida em var, neste caso <c:if> no precisar ter um corpo, conforme vem abaixo:
<c:if test="${sessionScope.flags.errors.serious.erro1}" var="erro1"/>

14

Outros tags, mais adiante na pgina podero utilizar a varivel erro1. 2.2 Condies Mutuamente Exclusivas JSTL suporta condies mutuamente exclusivas atravs de trs tags: <c:choose>, <c:when>, e
<c:otherwise>.

Exemplo: Neste exemplo apenas uma das quatro mensagens ser exibida.
<c:choose> <c:when test="${erro1}"> <li>Ocorreu o erro 1.</li> </c:when> <c:when test="${erro2}"> <li>Ocorreu o erro 2.</li> </c:when> <c:when test="${erro3}"> <li>Ocorreu o erro 3.</li> </c:when> <c:otherwise> <li>Nenhum erro ocorreu.</li> </c:otherwise> </c:choose>

O tag <c:when> no possui o atributo var, mas ele pode utilizar uma varivel boleana criada anteriormente por um tag <c:if>.

15

3. CONTROLANDO O FLUXO COM ITERAES 3.1 A Iterao de Propsito Geral com <c:forEach> O tag <c:forEach> 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 <c:forEach> 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 <c:forEach> 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 <c:forEach>. Exemplo:
<p>Lamento, mas voc possui as seguintes doenas:<p> <ul> <c:forEach items="${usuario.condicoesDeSaude}" var="doenca"> <li><c:out value="${doenca}"/></li> </c:forEach> </ul>

Este tag <c:forEach> efetua um loop sobre todos os itens da propriedade condicoesDeSaude da varivel usuario. Os atributos do tag <forEach> para iterao bsica vem abaixo: Atributos
items var

Descrio

Obrigatrio

Default
Nenhum Nenhum

Uma coleo sobre a qual ocorrer a No iterao. Nome do atributo que expor o item No corrente.

16

3.2 Iteragindo sobre Strings com <c:forTokens> O tag <c:forTokens> efetua um loop sobre tokens (substrings de um string maior delimitados por um caracter especfico) . Os atributos do tag <forTokens> para iterao bsica vem abaixo: Atributos
items delims var

Descrio

Obrigatrio

Default
Nenhum

String de entrada sobre o qual No ocorrer a iterao Caracter delimitador que separa os tokens Nome do atributo que expe o token No corrente

Nenhum

Exemplo:
<c:forTokens items="a;b;c;d" delims=";" var="corrente"> <li><c:out value="${corrente}"/></li> </c:forTokens>

Produzir a seguinte sada:


<li>a</li> <li>b</li> <li>c</li> <li>d</li>

3.2.1 Como JSLT Efetua o Parse de Strings Diversos caracteres delimitadores consecutivos so tratados como um nico delimitador.
<c:forTokens items="a;;b;;c;;d" delims=";" var="corrente"> <li><c:out value="${corrente}"/></li> </c:forTokens>

Logo, este cdigo produz a mesma lista exibida acima.

17

3.3 Iterao Avanada com <c:forEach> e <c:forTokens> 3.3.1 Efetuando um Loop Sobre Parte de uma Coleo Ambos <c:forEach> e <c:forTokens> aceitam 3 parmetros opcionais para suportar o loop sobre parte de uma coleo. Atributos
begin end step

Descrio

Obrigatrio

Default
0 ltimo item 1

O item que inicia o loop. No (0=primeiro; 1=segundo, etc.) O item que encerra o loop. No Passo da iterao. No

Exemplo:
<c:forTokens items="a;b;c;d;e" delims=";" var="letra" begin="2" end="4"> <li><c:out value="${letra}"/></li> </c:forTokens>

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:
<c:forEach begin="1" end="5" var="corrente"> <c:out value="${corrente}"/> </c:forEach>

O exemplo acima produzir a seguinte sada: 12345 Em <c:forTokens> o atributo items obrigatrio. Se voc deseja iteragir sobre nmero, utilize apenas <c:forEach>. Como a maioria dos atributos JSLT, os atributos begin e end aceitam expresses.

18

3.3.3 Status do Loop Assim como o atributo var em <c:forEach> e <c:forTokens>, 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 Tipo
index count first last nmero nmero boolean boolean

Descrio
O 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:
<c:forTokens items="a;b;c;d;e" delims=";" var="letra" begin="0" end="4" step="2"> <c:out value="${letra}"/> </c:forTokens> 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 = true

3.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 <c:forEach> para gerar nmeros automaticamente.

19

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:set var="totalDeItens" scope="session" value="100"/> <c:set var="porPagina" scope="session" value="20"/> <c:forEach var="inicioDaFaixa" begin="0" end="${totalDeItens - 1}" step="${porPagina}"> <a href="?inicio=<c:out value="${inicioDaFaixa}"/>"> [ <c:out value="${ inicioDaFaixa }"/> <c:out value="${ inicioDaFaixa + porPagina - 1}"/> ] </a> </c:forEach> <c:forEach var="corrente" varStatus="status" begin="${param.inicio}" end="${param.inicio + porPagina - 1}"> <c:if test="${status.first}"> <ul> </c:if> <li><c:out value="${corrente}"/></li> <c:if test="${status.last}"> </ul> </c:if> </c:forEach>

3.4.1 Entendendo o Exemplo Dois tags <c:set> 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.
<c:set var="totalDeItens" scope="session" value="100"/> <c:set var="porPagina" scope="session" value="20"/> totalDeItens

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

porPagina

20

Agora 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.
<c:forEach var="inicioDaFaixa" begin="0" end="${totalDeItens - 1}" step="${porPagina}"> <a href="?inicio=<c:out value="${inicioDaFaixa}"/>"> [ <c:out value="${ inicioDaFaixa }"/> <c:out value="${ inicioDaFaixa + porPagina - 1}"/> ] </a> </c:forEach>

Observe que um link como


<a href="?inicio=20">

provoca 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.
<c:forEach var="corrente" varStatus="status" begin="${param.inicio}" end="${param.inicio + porPagina - 1}"> <c:if test="${status.first}"> <ul> </c:if> <li><c:out value="${corrente}"/></li> <c:if test="${status.last}"> </ul> </c:if> </c:forEach>

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.

21

3.4.2 Utilizando varStatus no Exemplo Com o cdigo abaixo, as linhas mpares sero impressas com um tipo de letra na cor vermelha.
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:set var="totalDeItens" scope="session" value="100"/> <c:set var="porPagina" scope="session" value="20"/> <c:forEach var="inicioDaFaixa" begin="0" end="${totalDeItens - 1}" step="${porPagina}"> <a href="?inicio=<c:out value="${inicioDaFaixa}"/>"> [ <c:out value="${ inicioDaFaixa }"/> <c:out value="${ inicioDaFaixa + porPagina - 1}"/> ] </a> </c:forEach> <c:forEach var="corrente" varStatus="status" begin="${param.inicio}" end="${param.inicio + porPagina - 1}"> <c:if test="${status.first}"> <ul> </c:if> <c:if test="${status.count % 2 == 0}"> <font color=red> </c:if> <li><c:out value="${corrente}"/></li> <c:if test="${status.count % 2 == 0}"> </font> </c:if> <c:if test="${status.last}"> </ul> </c:if> </c:forEach>

22

4. IMPORTANDO TEXTO 4.1 Incluindo Texto com o Tag <c:import> Para recuperar contedo de uma pgina JSP local ou proveniente de outro servidor, voc pode utilizar o tag <c:import>. s vezes voc deseja apenas imprimir a informao recuperada, mas <c:import> 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 <c:import>: Atributos
url context var scope

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

Obrigatrio
Sim No No No

Default
Nenhum Contexto corrente Nenhum Page

Exemplo de <c:import> com um caminho relativo para o url:


<c:import url="cabecalho.html">

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 tag
<img src="/imagens/foto.jpg"/>

ento 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:
<c:import url="cabecalho.html"/>

23

Supondo 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:
<c:import url="/target/target.jsp"/>

Agora suponha que target.jsp esteja localizada em um servidor web diferente. Neste caso, a nica forma de recuperar o arquivo utilizando <c:import> atravs do seguinte URL:
<c:import url="http://www.servidor.com/diretorio/target.jsp"/>

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 <c:import>.
<c:import context="/outra" url="/diretorio/target.jsp"/>

4.1.2 Salvando Informaes para Uso Posterior Por default, <c:import> recupera informao de um URL e a imprime imediatamente na sua pgina. Isto exatamente o que <jsp:include> 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:
<c:import url="http://legal.com/copyright-notice.html" var="copyright"/> <c:out value="${copyright}"/> ... Mais contedo ... <c:out value="${copyright}"/>

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

24

O Tag <c:param> O tag <c:param> um tag filho opcional do tag <c:import> (e de alguns outros tags JSTL). Quando ele aparece ele diz para <c:import> para enviar um parmetro de requisio para a pgina que ele est carregando. A tabela abaixo mostra os atributos do tag <c:param>: Atributos
name value

Descrio
Nome do parmetro Valor do parmetro

Obrigatrio
Sim No

Default
Nenhum Corpo

Exemplo: Como enviar um parmetro para a pgina target.jsp.


<c:import url="http://www.servidor.net/aplicacao/target.jsp"/> <c:param name="param" value="valor"/> </c:import>

Este cdigo causa o envio de uma requisio HTTP do tipo GET, assim:
http://www.servidor.net/aplicacao/target.jsp?param=valor

Observaes: 1. <c:param> 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 <c:import> - 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.

25

4.1.4 Exemplos de Import O exemplo abaixo mostra como padronizar a aparncia dos cabealhos das pginas de uma aplicao atravs do uso de <c:import>. Exemplo 1: Customizao com <c:param> 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:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <table width="100%"> <tr> <td align="left" bgcolor="#888888"> <big><font color="#FFFFFF"> <c:out value="${param.titulo}"/> </font></big> </td> <td align="right"> <small> Exemplo de Aplicao com Import </small> </td> </tr> </table> <hr />

Cdigo da pagina1.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <html> <body> <c:import url="cabecalho.jsp"> <c:param name="titulo" value="Benvindo Pgina 1"/> </c:import> <h4>Informaes da Pgina 1</h4> Texto da <b>Pagina 1</b>. </body> </html>

26

Cdigo da pagina2.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <html> <body> <c:import url="cabecalho.jsp"> <c:param name="titulo" value="Bevindo Pgina 2"/> </c:import> <font color="pink"> <h4>Informaes da Pgina 2</h4> Esta a <b>pgina 2</b>. <br/> Uma verso aboiolada da pgina 1. </font> </body> </html>

No exemplo abaixo, a pgina origem.jsp importa destino.jsp, e ambas enviam dados uma da outra. Exemplo 2: Customizao sem <c:param> Cdigo de origem.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:set var="entrada" scope="request" value="TEXTO DE ENTRADA" /> Chamando destino.jsp... <hr /> <c:import url="destino.jsp" /> <hr /> origem.jsp recebeu de volta: <c:out value="${requestScope.saida}" />

Cdigo de destino.jsp:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> destino.jsp recebeu: <c:out value="${requestScope.entrada}" /> <c:set var="saida" scope="request" value="TEXTO DE SADA" />

27

4.2 Redirecionando com <c:redirect> A tabela abaixo mostra os atributos do tag <c:redirect>: Atributos
url context

Descrio

Obrigatrio

Default
Nenhum Contexto Corrente

URL que receber o redirecionamento Sim / seguida do nome da aplicao web No local

Exemplo 1: Redirecionando para uma pgina no mesmo diretrio da origem.


<c:when test="${param.acao == 'comprar'}"> <c:redirect url="comprar.jsp"/> </c:when>

Exemplo 2: Redirecionando para uma pgina em outro contexto, isto , em outra aplicao:
<c:redirect context="/aplic" url="/comprar.jsp"/>

Quando o atributo context fornecido, o valor de ambos os atributos (context e url) devem comear com uma /. Exemplo 3: Assim como o <c:import>, <c:redirect> tambm permite o uso de <c:param> dentro dele para enviar um parmetro de requisio para a pgina que ir receber o redirecionamento:
<c:redirect context="/aplic" url="/comprar.jsp"/> <c:param name="estoque" value="IBM"/> </c:redirect>

4.3 Formatando URLs com <c:url> 4.3.1 Formatando URLs com <c:url> A funo do tag <c:url> imprimir um URL (ou armazen-lo em uma varivel com escopo). A tabela abaixo mostra os atributos do tag <c:url>: Atributos
value context var scope

Descrio
URL 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 final

Obrigatrio
Sim No No No

Default
Nenhum Contexto corrente Nenhum Page

28

Assim como o <c:import> e <c:redirect>, tambm possvel incluir tags <c:param> no corpo de um tag <c:url>. fcil utilizar <c:url>. Simplesmente o insira na sua pgina sempre que voc quiser imprimir um URL. Com freqncia voc desejar inserir <c:url> no meio de um tag HTML, como no exemplo abaixo:
<a href="<c:url value="comprar.jsp"> <c:param name="HD" value="Quantum"/> </c:url>">Compre um HD Quantum</a>

4.3.2 Porque Utilizar <c:url> 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 <c:url> 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 <c:url> efetua estes ajustes para voc.

Em tags HTML como o que vem abaixo, o URL referencia o diretrio info na raiz do servidor web:
<a href="/info/copyright.txt">Leia as informaes de Copyright</a>

Mas em um tag JSTL como o que vem abaixo, o URL aponta para o diretrio info abaixo da raiz da sua aplicao web:
<c:import url="/info/copyright.txt">

Para que uma imagem seja localizada na pasta imagens da sua aplicao web utilize o tag <c:url>, assim:
<img src="<c:url value="/imagens/logo.gif"/>"/>

Voc pode utilizar o atributo context do tag <c:url> para criar um URL para uma pgina em outra aplicao web existente no seu container JSP. O tag <c:url> tambm til quando se deseja salvar um URL (utilizando os atributos var e scope) e utiliz-lo diversas vezes na sua aplicao.

29

5. 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 <sql:setDataSource> 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 <sql:setDataSource>. Em muitas aplicaes grandes, o tag <sql:setDataSource> 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 <sql:setDataSource> 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.

30

A tabela abaixo mostra os atributos do tag <sql:setDataSource>: Atributos


dataSource driver url user password var scope

Descrio
Um 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 default

Obrigatrio Default
No No No No No No No Nenhum Nenhum Nenhum Nenhum Nenhum Nenhum page

Para preparar conexes para um banco Oracle, poderamos utilizar o seguinte tag:
<sql:setDataSource driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@sbd:1521:orcl" user="jstl01" password="jstl01" scope="session" />

O atributo scope o tag <sql:setDataSource> 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
<sql:setDataSource> para estabelecer uma conexo default, voc pode utiliz-la para expor

uma varivel com escopo que representa o banco. Voc pode fazer isto adicionando um atributo var:
<sql:setDataSource driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@sbd:1521:orcl" user="jstl01" password="jstl01" var="bancoUm" scope="session" />

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 <sql:setDataSource> 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 <sql:setDataSource> para definir um novo default. Aps termos exposto bancoUm, podemos tornar este banco o default para escopo de requisio, assim:

31

<sql:setDataSource dataSource="${bancoUm}" scope="request" />

Note 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 <sql:setDataSource> O tag <sql:setDataSource> 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 <sql:query> O objetivo do tag <sql:query> expor uma varivel com escopo que representa o resultado de uma query de banco de dados. A tabela abaixo mostra os atributos do tag <sql:setDataSource>: Atributos
sql dataSource startRow maxRows var scope

Descrio
O 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 resultado

Obrigatrio Default
No No No No Sim No Corpo Ver seo 5.2 0 (a 1 linha) ver seo x.x Nenhum Page

Se voc fornecer uma varivel com escopo para o atributo dataSource, ento o tag <sql:query> 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 <sql:setDataSource>, ou voc pode recuperar uma varivel com escopo de requisio, sesso ou aplicao proveniente de cdigo Java. Neste caso o tag <sql:query> teria a seguinte sintaxe:

32

<sql:query dataSource="${sessionScope.bancoUm}" ... />

Se voc no utilizar o atributo dataSource, ento o tag <sql:query> 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:
<sql:query var="resultado"> SELECT * FROM CLIENTES <sql:query>

Exemplo 2:
<sql:query var="resultado" sql="SELECT * FROM CLIENTES" />

Exemplo 3:
<sql:query var="resultado" sql="${query}" />

Exemplo 4: Recuperando a query de um documento XML


<sql:query var="resultado"> <x:out select="$doc/query/queryCliente" /> <sql:query>

Observao: Estes exemplos assumem que um banco defaut est corretamente definido. Se um banco default no foi definido com <sql:setDataSource>, 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 <sql:query> 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).

33

Acessando Metadata Supondo que voc utilizou um tag <sql:query> 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 <sql:query> foi truncada. Veja o item 5.4.

A varivel do tag <sql:query> 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:
<sql:query var="usuariosEspertos"> SELECT NOME, QI FROM USUARIOS WHERE QI > 120 <sql:query> <table> <c:forEach items="${usuariosEspertos.rows}" var="row"> <tr> <td><c:out value="${row.NOME}"/></td> <td><c:out value="${row.QI}"/></td> </tr> </c:forEach> <table>

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.

34

Exemplo:
<sql:query var="usuariosEspertos"> SELECT NOME, QI FROM USUARIOS WHERE QI > 120 <sql:query> <table> <c:forEach items="${usuariosEspertos.rowsByIndex}" var="row"> <tr> <td><c:out value="${row[0]}"/></td> <td><c:out value="${row[1]}"/></td> </tr> </c:forEach> <table>

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 <sql:query> utilizando um atributo com escopo de requisio. Exemplo:
<c:forEach items="${requestScope.resultado.rowsByIndex}" var="row" varStatus="s"> <c:if test="${s.first}"> <h4>Relao de Usurios Espertos</h4> <table border="1"> <tr> <c:forEach items="${requestScope.resultado.columnNames}" var="col"> <th><c:out value="${col}"/></th> </c:forEach> </tr> </c:if> <tr> <c:forEach items="${row}" var="valor"> <td><c:out value="${valor}"/></td> </c:forEach> </tr> <c:if test="${s.last}"> </table> </c:if> </c:forEach>

35

5.3.3 Limitando o Tamanho do Resultado de uma Query Como limitar em 20 linhas o resultado de uma query:
<sql:query var="empregados" maxRows="20"> SELECT NOME, SALARIO FROM EMPREGADOS WHERE SALARIO > 2000 <sql:query>

Para ser informado que que a resposta da query foi truncada voc utilizar a propriedade limitedByMaxRows da varivel exposta por <sql:query>, assim:
<sql:query var="empregados" maxRows="20"> SELECT NOME, SALARIO FROM EMPREGADOS WHERE SALARIO > 2000 <sql:query> <c:if test="${empregados.limitedByMaxRows}"> O resultado da sua query retornou empregados demais. Por favor, seja mais especfico da prxima vez. <c:if>

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):
<sql:query var="clientes" startRow="2"> SELECT NOME, SALARIO FROM CLIENTES <sql:query>

Se a tabela s possuir duas linhas, ento ser atribuda varivel clientes uma coleo vazia. 5.4 Modificando Dados com <sql:update> 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 <sql:update> que poder ser utilizado sem problemas em aplicaes relativamente pequenas.

36

5.4.1 Uso Simplificado do Tag <sql:update> Atravs do tag <sql:update> possvel emitir comandos Insert, Update, Delete, Create
Table, etc.

A tabela abaixo mostra os atributos do tag <sql:update>: Atributos


sql dataSource var scope

Descrio
O 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 afetadas

Obrigatrio Default
No No No No Corpo Ver seo 5.2 Nenhum Page

Exemplo 1:
<sql:update> INSERT INTO EMPREGADOS(NUMERO, NOME, PESO) VALUES(1, 'Joo Carlos', 80) </sql:update>

Exemplo 2:
<sql:update sql="DELETE FROM EMPREGADOS WHERE NUMERO = 1"/>

5.4.2 Medindo o Efeito de um Tag <sql:update> Voc pode utilizar o atributo var do tag <sql:update> para saber qual foi a quantidade de linhas afetadas pelo tag. Exemplo 1:
<sql:update var="n"> DELETE FROM EMPREGADOS WHERE SALARIO > 2000 </sql:update> <p>Foram removidos <c:out value="${n}"/> empregados, todos com salrio maior do que 2000,00 reais.</p> <c:if value="${n == 0}"> Nenhum empregado foi removido. </c:if>

37

5.5 Utilizando <sql:param> com Queries Ajustveis 5.5.1 Queries Modelos (Templates) possvel utilizar o tag <c:out> para completar parte de uma query:
<sql:query var="resultado"> SELECT * FROM CLIENTES WHERE NOME = <c:out value='"${nomeCliente}"'/> </sql:query>

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 <c:out> para construir comandos SQL. 5.5.2 Utilizando <sql:param> 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 <sql:param>. Este tag deve ser acrescentado como filho dos tags <sql:query> e de <sql:update>. A tabela abaixo mostra o atributo do tag <sql:param>: Atributos
value

Descrio
Valor do parmetro

Obrigatrio Default
No Corpo

Exemplo 1:
<sql:query var="resultado"> SELECT * FROM CLIENTES WHERE NOME = ? AND ENDERECO = ? AND IDADE = ? <sql:param value="${page.nomeusuario}"/> <sql:param value="${param.endereco}"/> <sql:param value="${idade}"/> </sql:query>

38

Quando um tag possui vrias interrogaes, ele deve ter exatamente um tag <sql:param> para cada interrogao, na ordem em que as interrogaes aparecem. Exemplo 2:
<sql:update> INSERT INTO EMPREGADOS (NUMERO, NOME, SALARIO) VALUES (?, ?, ?) <sql:param value="${param.numero}"/> <sql:param value="${param.nome}"/> <sql:param value="${param.salario"/> </sql:update>

Exemplo 3:
<sql:update> UPDATE EMPREGADOS SET SALARIO = ? WHERE NUMERO = ? <sql:param value="${param.salario"/> <sql:param value="${param.numero}"/> </sql:update>

Exemplo 4: Se o tag <sql:param> no contiver um atibuto value, o tag ir utilizar o contedo de seu corpo. Logo, possvel produzir um valor utilizando outros tags.
<sql:update> UPDATE EMPREGADOS SET SALARIO = ? WHERE NUMERO = ? <sql:param> <x:out select="$doc/empregados/empregado/salario"/> </sql:param> <sql:param value="${param.numero}"/> </sql:update>

39

5.5.3 Parmetros do Tipo Date com <sql:dateParam> 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 <sql:param>. Vai depender do driver que voc estiver utilizando. Para ter certeza de que voc conseguir adicionar datas s suas queries, JSTL prov o tag <sql:dateParam> cujos atributos so relacionados absixo: Atributos
value type

Descrio

Obrigatrio Default
Nenhum timestamp

A data que ir substituir a ? Sim Um dos seguintes valores: time, No date, ou timestamp

O 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:
<sql:query> SELECT * FROM USUARIOS WHERE DATA_NASC < ? <sql:dateParam value="${dataNasc}"/> </sql:query>

5.6 Gerenciando Transaes com <sql:transaction> 5.6.1 O Tag <sql:transaction> JSTL suporta transaes atravs do tag <sql:transaction>. Este tag age como o tag pai dos tags <sql:update> e <sql:query>. Ou todos os tags filhos de <sql:transaction> 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 <sql:transaction> permite que tags <sql:query> participem de uma transao. Note que qualquer texto vlido, tags JSTL, ou outro contedo JSP, pode aparecer dentro de um tag <sql:transaction>. Se um erro fatal ocorrer em qualquer lugar dentro deste bloco por exemplo, se voc decidir recuperar um arquivo com <c:import> 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 de

40

operaes que no so de banco de dados. Tenha em mente apenas que <sql:transaction> 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 <sql:transaction>: Atributos
dataSource isolation

Descrio

Obrigatrio Default
Ver seo 5.2 Ver seo 5.6.2

Quem prov a conexo de banco No de dados Nvel de isolamento das No transaes

O tag <sql:transaction> determina qual banco de dados ser utilizado da mesma forma que <sql:query> e <sql:update>. 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 <sql:setDataSource> ou por cdigo Java. Quando um tag <sql:transaction> 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 <sql:query> e <sql:update> filhos de <sql:transaction>. Por exemplo, considere o seguinte tag:
<sql:update sql="${comando}"/>

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 <sql:transaction>, ele utiliza o banco definido para seu pai <sql:transaction>. Exemplo:
<sql:transaction dataSource="${database}"> <sql:update> UPDATE CONTAS SET SALDO = SALDO - ? WHERE NUMERO = ? <sql:param value="${param.valor}"/> <sql:param value="${param.contaDebitada}"/> </sql:update> <sql:update> UPDATE CONTAS SET SALDO = SALDO + ? WHERE NUMERO = ? <sql:param value="${param.valor}"/> <sql:param value="${param.contaCreditada}"/> </sql:update> </sql:transaction>

41

5.6.2 Nveis de Isolamento A mostra o valores possveis <sql:transaction>, e seus respectivos significados: Nveis de Isolamento Dirty Reads?
read_uncommited read_commited repeatable_read serializable --Evita Evita Evita ----Evita Evita

tabela

abaixo

do

atributo

isolation

do

tag

Nonrepeatable reads? Phantom reads?


------Evita

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

42

6. 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:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

6.1 Imprimindo Nmeros com <fmt:formatNumber> 6.1.1 Uso Bsico de <fmt:formatNumber> 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:
<fmt:formatNumber value="${valor}"/>

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 <fmt:formatNumber>: Atributos
value type

Descrio

Obrigatrio
No No No No No No No No No No No No

Default
Corpo number Nenhum Nenhum true Nenhum Nenhum Nenhum Nenhum Nenhum Nenhum page

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

43

6.1.2 Diferentes Formas de Imprimir um Nmero Suponha que sua empresa produz um tag que imprime um nmero, como o seguinte:
<minhaEmpresa:imprimeFrete/>

Para formatar a sada a ser impressa:


<fmt:formatNumber> <minhaEmpresa:imprimeFrete/> <fmt:formatNumber/>

6.1.3 Armazenando um Nmero em vez de Imprimi-lo Para armazenar um nmero na varivel numero, com escopo de sesso:
<fmt:formatNumber value="${valor}" var="numero" scope="session"/>

6.1.4 Imprimindo Diferentes Tipos de Nmeros Percentuais:


<fmt:formatNumber value="24" type="percent"/>

Valor Monetrio:
<fmt:formatNumber value="78.74901" type="currency"/>

6.1.5 Agupamento de Milhar


<fmt:formatNumber value="500000.01" groupingUsed="true"/>

6.1.6 Controlando Quantos Dgitos Devem Ser Impressos


<fmt:formatNumber value="0.1" minIntegerDigits="1" minFractionDigits="2" maxFractionDigits="2"/>

44

6.1.7 Utilizando Padres Um caso especial difcil de solucionar sem a utilizao de padres o uso da notao cientfica:
<fmt:formatNumber value="52577" ir imprimir: 52.577E3 pattern="###.##E0"/>

6.2 Imprimindo Datas A tabela abaixo mostra os atributos do tag <fmt:formatDate>: Atributos
value type dateStyle timeStyle timeZone pattern var scope

Descrio
A 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 var

Obrigatrio
Sim No No No No No No No

Default
Nenhum date default default Ver 6.5 Nenhum Nenhum page

O atributo value do tag <fmt:formatDate> deve apontar para uma varivel do tipo date. No h como interpretar Strings como data. Esta a tarefa do tag <fmt:parseDate>, 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 <fmt:parseDate> para produzir uma varivel do tipo Date. Voc tambm pode produzir uma data utilizando o tag <useBean>, assim:
<jsp:useBean id="umaData" class="java.util.Date"/>

Este tag cria uma varivel com escopo de pgina denominada umaData que armazena a data corrente. Exemplo:
<jsp:useBean id="umaData" class="java.util.Date"/> <fmt:formatDate value="${umaData}"/>

45

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

Significado
Ano 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 / PM

Exemplo
02 2002 04 abril 07 Sexta-feira 21 21 9 09 4 04 6 06 PM

Exemplo:
<jsp:useBean id="umaData" class="java.util.Date"/> Data: <fmt:formatDate value="${umaData}" pattern="dd/MM/yyyy"/><br> Hora: <fmt:formatDate value="${umaData}" pattern="hh:mm:ss"/>

6.3 Lendo Nmeros com <fmt:parseNumber> JSTL possui dois tags que nos auxiliam na leitura de nmeros e datas: <fmt:parseNumber> e <fmt:parseDate>. O tag <fmt:parseNumber> 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.

46

A tabela abaixo mostra os atributos do tag <fmt:parseNumber>: Atributos


value type integerOnly pattern parseLocale var scope

Descrio
O 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 var

Obrigatrio Default
No No No No No No No Corpo number false Nenhum Ver 6.3.2 Nenhum page

6.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 <sql:update> e <sql:param>, 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 <fmt:formatNumber> preciso efetuar o seu parse com <fmt:parseNumber>. s vezes (embora raramente) voc possui um String como 500,000 mas necessita de um nmero para ser utilizado em tags como <c:forEach> (como valor dos atributos begin, end, e step), <sql:query> (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 <fmt:parseNumber> Funciona por Default O tag <fmt:parseNumber> 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 <fmt:parseNumber> 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.

47

Por exemplo, considere o formulrio HTML abaixo:


<form method="post" action="parseNumber.jsp"> Qual o seu nmero favorito? <input type="text" name="favorito" size="10"/><br/> <input type="submit" value="Enviar"/> </form>

A pgina JSP abaixo mostra como tratar este formulrio:


<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <p>Voc digitou "<c:out value="${param.favorito}"/>". </p> <fmt:parseNumber var="fav" value="${param.favorito}"/> <p>Aparentemente este nmero corresponde ao nmero <c:out value="${fav}"/>.</p> <p>Se voc multiplicar este nmero por 2 e somar 1, voc obtm <c:out value="${fav * 2 + 1}"/>, certo?</p>

6.3.3 Modificando as Regras de Parse de <fmt:parseNumber> Os demais atributos de <fmt:parseNumber> permitem que voc modifique as regras que sero utilizadas por default. Ignorando Dgitos Fracionrios
<fmt:parseNumber var="numero" value="50.05" integerOnly=true/>

Modificando o Locale Como ignorar o Locale informado pelo Browser:


<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <html> <body> <h4>Utilizando o Locale Referente aos EUA</h4> <fmt:setLocale value="en_US"/> <fmt:parseNumber var="numero1" value="50,05"/> <fmt:parseNumber var="numero2" value="50,05" integerOnly="true"/>

48

<p>O parse de 50,05 corresponde ao nmero <c:out value="${numero1}"/> sem formatao. <p>O parse de 50,05 corresponde ao nmero <fmt:formatNumber value="${numero1}"/> com formatao. <p>O parse de 50,05 - removendo a parte fracionria - corresponde ao nmero <fmt:formatNumber value="${numero2}" /> com formatao. <h4>Utilizando o Locale Referente ao Brasil</h4> <fmt:setLocale value="pt_BR"/> <fmt:parseNumber var="numero1" value="50,05"/> <fmt:parseNumber var="numero2" value="50,05" integerOnly="true"/> <p>O parse de 50,05 corresponde ao nmero <c:out value="${numero1}"/> sem formatao. <p>O parse de 50,05 corresponde ao nmero <fmt:formatNumber value="${numero1}"/> com formatao. <p>O parse de 50,05 - removendo a parte fracionria - corresponde ao nmero <fmt:formatNumber value="${numero2}" /> com formatao. </body> </html>

6.4 Lendo Datas com <fmt:parseDate> A tabela abaixo mostra os atributos do tag <fmt:parseDate>: Atributos
value type pattern parseLocale timeZone var scope

Descrio

Obrigatrio

Default
Corpo date Nenhum Ver 6.3.2 Ver 6.5 Nenhum page

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

49

Os atributos value, var, scope e parseLocale funcionam exatamente como no tag <fmt:parseNumber>. 6.4.1 Como <fmt:parseDate> Funciona por Default O funcionamento do tag <fmt:parseDate> 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 <fmt:formatDate> formata uma data. As regras de parse so bastante restritivas. Logo, o tag
<fmt:parseDate value="Aug 24, 1981"/>

ir funcionar para o locale English, mas


<fmt:parseDate value="Aug 24, 1981"/>

causar um erro pois falta a vrgula. Este comportamento torna o default muito pouvo til. 6.4.2 Modificando Como <fmt:parseDate> Efetua o Parse de Datas O tag <fmt:parseDate> 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:
<fmt:parseDate var="umaData" value="26/05/1990" pattern="dd/MM/yyyy"/>

50

7. 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:
<input type="checkbox" name="lingua" value="ingles" /> <input type="checkbox" name="lingua" value="espanhol" /> <input type="checkbox" name="lingua" value="frances" />

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 <c:forEach> para efetuar um loop sobre os parmetos individuais nesta coleo, para trat-los um de cada vez. 7.1.1 O Formulrio HTML
<form method="post" action="checkbox.jsp"> <p>Por favor selecione as lnguas que voc conhece:</p> <p>Ingls <input type="checkbox" name="lingua" value="Ingls" /> <p>Espanhol <input type="checkbox" name="lingua" value="Espanhol" /> <p>Francs <input type="checkbox" name="lingua" value="Francs" /> <p><input type="submit" value="Enviar" /></p> </form>

51

7.1.2 Um Manipulador de CheckBox Simples Segue abaixo a pgina JSP manipuladora do formulrio HTML acima:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:choose> <c:when test="${not empty paramValues.lingua}"> As lnguas que voc conhece so: <ul> <c:forEach items="${paramValues.lingua}" var="idioma"> <li><c:out value="${idioma}"/></li> </c:forEach> </ul> </c:when> <c:otherwise> Voc no selecionou nenhuma caixa de verificao. </c:otherwise> </c:choose>

Na verdade no um problema efetuar um loop sobre um parmetro inexistente. O tag <c:forEach> 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 <c:choose>. H outras maneiras de garantir que os tags <ul> e </ul> sero impresos apenas quando a lista tiver pelo menos um item. Exemplo:
<c:forEach items="${paramValues.lingua}" var="idioma" varStatus="s"> <c:if test="${s.first}"> <ul> </c:if> <li><c:out value="${idioma}"/></li> <c:if test="${s.last}"> </ul> </c:if> </c:forEach>

52

7.1.3 Tratando Alguns CheckBoxes de Forma Especial Com o tag <c:forEach> possvel utilizar expresses para referenciar o item corrente idioma, neste caso para tomar decises sobre como tratar cada item individualmente. Exemplo:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <c:choose> <c:when test="${not empty paramValues.lingua}"> As lnguas que voc conhece so: <ul> <c:forEach items="${paramValues.lingua}" var="idioma"> <c:choose> <c:when test="${idioma == 'Ingls'}"> <font size="+2"> </c:when> <c:otherwise> <font size="-2"> </c:otherwise> </c:choose> <li><c:out value="${idioma}"/></li> </font> </c:forEach> </ul> </c:when> <c:otherwise> Voc no selecionou nenhuma caixa de virificao. </c:otherwise> </c:choose>

Para atualizar o banco de dados quando a pgina carregada com a lngua Inglesa selecionada, poderamos executar o cdigo abaixo:
<sql:update> UPDATE idiomas set ingles = ingles + 1 </sql:update>

53

7.2 Lendo Datas 7.2.1 O Formulrio HTML


<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <html> <body> <form method="post" action="trataData.jsp"> Por favor, entre com a data de seu nascimento: <p> <select name="dia"> <c:forEach begin="1" end="31" var="dia"> <option><c:out value="${dia}"/></option> </c:forEach> </select> <select name="mes"> <option value="01">Janeiro</option> <option value="02">Fevereiro</option> <option value="03">Maro</option> <option value="04">Abril</option> <option value="05">Maio</option> <option value="06">Junho</option> <option value="07">Julho</option> <option value="08">Agosto</option> <option value="09">Setembro</option> <option value="10">Outubro</option> <option value="11">Novembro</option> <option value="12">Dezembro</option> </select> <select name="ano"> <c:forEach begin="1930" end="2003" var="ano"> <option><c:out value="${ano}"/></option> </c:forEach> </select> <input type="submit" value="Enviar" /> </form> </body> </html>

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.

54

7.2.2 Tratando o Formulrio e Lendo a Data Segue abaixo o cdigo fonte da pgina manipuladora do formulrio:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <fmt:parseDate var="umaData" parseLocale="pt_BR" value="${param.dia}/${param.mes}/${param.ano}" pattern="d/MM/yyyy"/> <p> Voc nasceu <fmt:formatDate value="${umaData}" dateStyle="full"/>. <p> Voc nasceu em <fmt:formatDate value="${umaData}" dateStyle="short"/>. <p> Voc nasceu em <fmt:formatDate value="${umaData}" pattern="dd/MM/yyyy"/>.

Observe que no tag <fmt:parseDate> 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:
<sql:update> UPDATE usuarios SET data_nasc = ? <sql:param value="${umaData}"/> </sql:update>

55

7.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 <c:catch> 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 <c:catch> 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 <c:catch>: Atributos
var

Descrio
Varivel que expe informaes sobre o erro

Obrigatrio
No

Default
Nenhum

Erros que acontecem no corpo de um tag <c:catch> no fazem com que seja abortada toda a execuo da pgina. Estes erros abortam apenas o resto do corpo do tag <c:catch>. Se voc utilizar <c:catch> 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 <c:catch>. 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

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <html> <body> <p>Voc digitou "<c:out value="${param.numero}"/>". </p> <c:catch var="erro"> <fmt:parseNumber var="num" value="${param.numero}"/> <p>Multiplicando <c:out value="${num}"/> por dois e somando 1 d <c:out value="${num * 2 + 1}"/>. </p> </c:catch> <c:if test="${not empty erro}"> Erro: o que voc digitou no um nmero. </c:if> </body> </html>

Para adicionar o tratamento de erro a esta pgina adicionamos o tag <c:catch> 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 <fmt:parseNumber>, ento as demais linhas de cdigo dentro do tag <c:catch> 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 <c:catch var="erro"> 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 <c:catch>. As variveis criadas pelo tag <c:catch> 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:
<c:out value="${erro.message}"/>

ou simplesmente:
<c:out value="${erro}"/>

Esta ltima opo inclui algumas outras informaes tcnicas sobre o erro que ocorreu.

57

7.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 <jsp:forward> na sua pgina). Para declarar uma pgina de erro, voc deve utilizar a diretiva <%@ page errorPage=destino %>, 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:
<%@ page isErrorPage="true" %>

Esta linha indica ao container JSP que ele pode utilizar esta pgina como pgina de erro. Note que voc pode utilizar o tag <c:catch> 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 <c:catch>. Criando uma Pgina de Erro Listagem da pgina de erro:
<%@ page isErrorPage="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <h4>Erro!</h4> <p>Algo ruim ocorreu em uma das suas pginas:</p> <p><c:out value="${pageContext.exception.message}"/></p>

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 <c:catch>. Listagem da pgina que contm um erro:
<%@ page errorPage="paginaDeErro.jsp" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <fmt:parseDate value="abcd"/>

58

7.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:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %> <html> <body> <h1>Servio de Correio Eletrnico Tabajara</h1> <c:if test="${param.enviado}"> <c:if test="${empty param.nome}" var="semNome" /> <c:if test="${empty param.email}" var="semEmail" /> <c:if test="${empty param.idade}" var="semIdade" /> <c:catch var="erroIdade"> <fmt:parseNumber var="idadeNumerica" value="${param.idade}" /> <c:if test="${idadeNumerica < 13}" var="abaixo13" /> </c:catch> <c:if test="${not empty erroIdade}" var="idadeInvalida" /> <c:if test="${not (semNome or semEmail or semIdade or idadeInvalida or abaixo13)}">

59

<c:set value="${param.nome}" var="nome" scope="request"/> <c:set value="${param.email}" var="email" scope="request"/> <c:set value="${param.idade}" var="idade" scope="request"/> <jsp:forward page="obrigado.jsp" /> </c:if> </c:if> <form method="post"> <p> Obrigado por assinar o servio de correio eletrnico Tabajara.<br/> Ao submeter suas informaes no formulrio abaixo, voc comear a receber "de grtis" todo tipo de "spam" que voc sempre quis. </p> <input type="hidden" name="enviado" value="true" /> <p> Digite seu nome: <input type="text" name="nome" value="<c:out value="${param.nome}"/>" /> <br /> <c:if test="${semNome}"> <small><font color="red"> Erro: Voc deve digitar seu nome </font></small> </c:if> </p> <p> Digite seu endereo de e-mail: <input type="text" name="email" value="<c:out value="${param.email}"/>" /> <br /> <c:if test="${semEmail}"> <small><font color="red"> Erro: Voc deve digitar seu endereo de e-mail </font></small> </c:if> </p> <p> Digite sua idade: <input type="text" name="idade" size="3" value="<c:out value="${param.idade}"/>" /> <br /> <c:choose> <c:when test="${semIdade}"> <small><font color="red"> Erro: Voc deve digitar sua idade </font></small> </c:when>

60

<c:when test="${idadeInvalida}"> <small><font color="red"> Erro: No fui capaz de decifrar sua idade </font></small> </c:when> <c:when test="${abaixo13}"> <small><font color="red"> Erro: Se manca garoto!!! Voc muito jovem para assinar o servio <br> de e-mail Tabajara. Aqui tem besteira demais para voc! <br> Por favor, cresa e tente novamente. </font></small> </c:when> </c:choose> </p> <input type="submit" value="Assinar" /> </form> </body> </html>

Esta pgina comea com lgica de validao de dados. Primeiramente o tag <c:if> 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 <c:if test="${empty param.nome}" var="semNome" /> 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 <c:catch>. O cdigo abaixo,
<c:catch var="erroIdade"> <fmt:parseNumber var="idadeNumerica" value="${param.idade}" /> <c:if test="${idadeNumerica < 13}" var="abaixo13" /> </c:catch>

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 o

61

campo 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 <c:choose> uma vez que trs mensagens de erro diferentes podem ser emitidas. Para campos do tipo <input type=text> podemos utilizar o atributo value para fornecer um valor para o campo, assim:
<input type="text" name="nome" value="<c:out value="${param.nome}">

Para outros tipos de campos de entrada de dados caixas de seleo, botes de rdio, e caixas de confirmao mais complicado designar valores default. Para uma caixa do tipo <select>, no basta especificar um atributo value para o valor default. Voc deve adicionar o atributo selected=selected ao tag <option> correto. Voc pode fazer isto comparando o valor do parmetro com os valores do tag <option> que voc est prestes a imprimir. Por exemplo:
<select name="Idioma"> <option value="Ingls" <c:if test="${param.lingua == 'Ingls'}"> selected="selected" </c:if> >Ingls</option> <option value="Francs" <c:if test="${param.lingua == 'Francs'}"> selected="selected" </c:if> >Francs</option> </select>

O atributo selected=selected ser impresso apenas para o valor correto. Botes de rdio e caixas de confirmao funcionam da mesma forma, mas em vez de adicionar o atributo selected=selected, voc adiciona o atributo checked=checked. Para campos do tipo <textarea>, simplesmente insira o valor desejado no corpo da <textarea>:
<textarea name="observao"><c:out value="${param.obs}"/><textarea>

Observe que o tag form no possui um atributo action, indicando que a mesma pgina JSP deve receber a requisio quando este formulrio for submetido.

62

A pgina JSP abaixo exibida quando no detectado mais nenhum erro nos campos do formulrio:
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <html> <body> <font face="arial"> <h4> Excelente! Os seguintes dados foram recebidos e esto corretos: </h4> <ul> <li>Nome: <c:out value="${requestScope.nome}" /> <li>E-Mail: <c:out value="${requestScope.email}" /> <li>Idade: <c:out value="${requestScope.idade}" /> </ul> </font> </body> </html>

63