JSP.SERVLET0017

33
9 USqnd9 a]Srr As Tags Customizadas são poderosas Você quer dizer que eu enviei, todo este tempo, os scriptlets de escrita para coisas que não posso fazer com a EL e as ações padrões, quando poderia ter usado JSTL? D O Em alguns casos, você precisa de mais do que a EL ou ações-padrão. E se você quisesse fazer um loop através dos dados de um array, exibindo em seguida um item por linha em uma tabela HTML? Você sabe que poderia escrever isso em dois segundos, usando um loop for em um scriptlet. Mas você está tentando evitar os scripts. Sem problema. Quando a EL e as ações-padrão não forem suficientes, você pode usar tags customizadas. Elas são tão fáceis de usar em um JSP quanto as ações-padrão. Melhor ainda, alguém já escreveu boa parte das tags de que você mais provavelmente precisará, e as juntou na JSTL (JSP Standard Tag Library, ou Biblioteca de Tags JSP Padrão). Neste capítulo, aprenderemos a usartags customizadas, e no capítulo seguinte, aprenderemos a criar as nossas próprias tags. este é urn novo ~ 439

Transcript of JSP.SERVLET0017

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 1/33

 

9 USqnd9 a]Srr

As Tags Customizadas são

poderosasVocê quer dizer que eu enviei,

todo este tempo, os scriptlets

de escrita para coisas que não

posso fazer com a EL e as ações

padrões, quando poderia terusado JSTL?

DO

Em alguns casos, você precisa de mais do que a EL ou ações-padrão. E se

você quisesse fazer um loop através dos dados de um array, exibindo em seguida

um item por linha em uma tabela HTML? Você sabe que poderia escrever isso em

dois segundos, usando um loop for em um scriptlet. Mas você está tentando evitar

os scripts. Sem problema. Quando a EL e as ações-padrão não forem suficientes,

você pode usar tags customizadas. Elas são tão fáceis de usar em um JSP quanto

as ações-padrão. Melhor ainda, alguém já escreveu boa parte das tags de que

você mais provavelmente precisará, e as juntou na JSTL (JSP Standard Tag Library,

ou Biblioteca de Tags JSP Padrão). Neste capítulo, aprenderemos a usartags

customizadas, e no capítulo seguinte, aprenderemos a criar as nossas próprias tags.

este é urn novo ~ 439

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 2/33

 

objetivos do exame oficial da Sun

6i

Construir páginas JSP usando

bibliotecas de tags

9.1 Descrever a sintaxe e a semântica da diretiva

'taglib': para uma biblioteca de tags padrãoe para uma biblioteca de Tag Files.

9.2 Dado um objetivo de design, criar a estruturada tag customizada para atingir esse objetivo.

9.3 Identificar a sintaxe da tag e descrever asemântica da ação das seguintes tags JSTLv1.1: (a) tags centrais: out, set, remove ecatch, (b) tags condicionais: if, choose,

when e otherwise, (c) tags de iteração:forEach, e (d) relacionada à URL: url.

Notas sobre a Abrangência:

Todos os objetivos desta seção são cobertos neste

capítulo, embora parte do conteúdo seja coberta

novamente no próximo capítulo (Desenvolvendo

Tags Customizadas).

Instalando a JSTL 1.1

A JSTL 1.1 NÃO faz parte da especificaçãoJSP 2.0! Ter acesso às APIs dos Servlets e JSP

não significa que você tem acesso à JSTL.

Antes de poder usar a JSTL, você precisa

instalar o arquivo 'jstl.jar' no diretório WEBINF/lib do seu aplicativo web. Isso significaque cada aplicativo web precisa de uma cópia.

No Tomcat 5*, a JSTL já se encontra nasaplicações de exemplo que vêm incluídascom o Tomcat, então tudo o que você precisafazer é copiá-Ia de algum diretório para ó seupróprio diretório WEB-INF/lib.

Copie a JSTL dos exemplos do Tomcat de:

webapps/jsp-examplesIWEB-INF /lib/jstl.j ar

webapps/jsp-examplesIWEB-INF /lib/standard.jar

E coloque-a no diretório WEB-INF/lib doseu próprio aplicativo web.

440 capitulo 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 3/33

 

usando JSTL

A EL e as ações"padrão são lilftitadas

o que acontece quando você se choca contra umaparede? Você pode voltar aos scripts, certamente mas você sabe que esse não é o caminho.

Os desenvolvedores normalmente querem ter muito

mais ações-padrão, ou, melhor ainda, querem ter ahabilidade de criar as suas próprias ações.

É para isso que servem as tags cllstomizadas. Emvez de dizer <jsp:setProperty>, você deseja criar algocomo <meu:fazerAlgoCustomizado>. E você pode.

Porém, não é tão fácil assim criar o código deapoio que funciona nos bastidores da tag. Para ocriador de páginas JSP, é muito mais fácil usartags customizadas que escrever scripts. Para oprogramador Java, no entanto, criar o tag handler

(o código Java chamado quando um JSP usa a tag)customizado é mais complicado.

Felizmente, existe uma biblioteca-padrão de tagscustomizadas conhecida como Biblioteca de Tags JSP

Padrão (JSTL 1.1). Uma vez que o seu JSP não deveráestar mesmo executando muita lógica de negócios,é possível que a JSTL (combinada com a EL) sejatudo de que você irá precisar. Ainda assim, poderãoexistir momentos em que você precise de algo como,

por exemplo, uma biblioteca de tags customizadasdesenvolvida especificamente para a sua empresa.

Neste capítulo, você aprenderá como usar astags JSTL centrais, bem como tags customizadasretiradas de outras bibliotecas. No próximo capítulo,aprenderemos como criar as classes que manipularãoas chamadas às tags customizadas, para que vocêpossa desenvolver as suas próprias.

você está aqui ~ 441

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 4/33

 

onde está meu htm/?

o caso do "fMI. desaparecido (reprise)

Na página 384, vimos como EL envia a string bruta de conteúdo diretamente

para o fluxo de resposta:

<div class='tipBox'>

<b>Tip of the Day:</b> <br/> <brj>{pageContent.currentTip} ~div>

Lelrlbra Jts+c?

Irs +~s <b></ b>

'1';6 4pareCiQ.1rIC(llrltl

-I-ex-l-o; irias el'41r1

o.pl'ese.~IJ.Ja.s C61r1(l

fllrIe.spfJ.flJVfJ.j'à3f1t.

es+IJ.VQt.1rI '1t.jl'l-+tJ.

o que desejamos o que conseguimos

Tip of the Day:

<1:»<;,b> tags make things bold!

&!.f:; : D.pl"tsti'/-I-fJ.tl(j

C64>1" <: e

&+.; ~D.pf'eSeif-!-tJ,tll:>

(;"4>11:> >,

Apresentado como

~

<div class~'tipBox'>

<b>Tip af the Day:</b> <br/> <br/>

&lt;b&gt;&lt;/b&gt; tags make things bald!

</div>

APreseotat como

<div class='tipBox'>

<b>Tip af the Day:</b> <br/>

<b></b> tags make things bold!

</div>

o que precisamos é um modo de converter esses sinais de maior

que menor que em alguns navegadores apresentará como sinais

de maior que menor e há dois modos de fazer isto. Ambos usamum método Java estático que converte os caracteres especiaisHTML em seu formato de entidade:

Use uma função EL Use um método assistente Java

<div class~'tipBox'>

<b>Tip af the Day:</b> <br/> <br/>

$(fn:canvEntity(pageCantent.currentTip) )

</div>

<div class='tipBax'>

<b>Tip of the Day:</b> <br/> <br/>

${pageContent.convertedCurrentTip}

!</div>

I I ~-------------------...,ísl-e e t!J lrIe+tJJtJ4SSi'sI-e,,1-e public String getConvertedCurrentTip () (

return HTML.convEntity(getCurrentTip()};

442 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 5/33

 

usando JSTL

Há U'fla 'flatteira 'flelhor: use a tag <o:oUf>

Seja qual for a abordagem usada, é um pouco indistinto o queestá acontecendo ... e você pode ter que escrever esse métodoassistente para todos os seus servlets. Felizmente, há um modo

melhor. A tag <c:out> é perfeita para o serviço. Veja como aconversão funciona:

Você pode declarar explicitat\tet1te a cOt1versão das ettIidades XML

Se você souber ou achar que pode encontrar algumas entidades XML que precisamser exibidas e não apenas apresentadas, poderá usar o atributo escapeXml em c:out.Definir isso para true significa que qualquer XML será convertido em algo que onavegador Web apresentará, sinais de maior que menor que e tudo mais:

\

s••~ ; .fr4J.J ••••••>dfnf..1.l-;Ie ><Ml-... i'$'SI)

g,-!e.fa IJS caNu:fft'ts HrMl-.fQlt'iúélt'i. I\'

escapeXml='true' I>

<div class='tipBox'>

<b>Tip of the Day:</b> <br/> <br/>

<c:aut value='${pageContent.currentTip}' I>

</div> ~ISSIJ : t'efJ.llt'ielfff

-!VIfCllJIfQIi(Jo.Je.

<div class='tipBax'>

<b>Tip af the Day:</b> <br/> <br/>

<c:aut value='${pageCantent.currentTip}'

</div>

Algumas vezes, você deseja exatamente o comportamentooposto. Talvez, esteja construindo uma página que temconteúdo e quer exibir esse conteúdo com a formataçãoHTML. Nesse caso, você poderá desativar a conversão XML:

<div class='tipBax'>

<b>Tip af the Day:</b> <br/> <br/>

<c:out value='${pageContent.rawHTML}' escapeXml='false' I>

</div> I

Ys.f1J : f.lIJÍÁYf .f11f("f.lIt'iIJS1"".1!J>/ 1.1.1f~S... ""'1.1.- '"

aVf.lflf.lJa,; CIJIt'iIJ ffx.flJ.

Você pode declarar explicitat\tet1te NENHUMA

cot1versão das et'ltidades XML

A cot1versão ocorre por padrão

o atributo escapeXmI tem como padrão true, portanto, você pode omiti-Io sequiser. Uma tagc:out sem um atributo escapeXML é exatamente igual a umatag c:out com escapeXML definido para "true".

você está ••.443

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 6/33

 

escapando htm/

< &Itj

>

&gtj

&

&ampj

&#039j

&#034j

l"lã9 exlst~m

fet.suntas ldl9télS

f:Quais caracteres HTML especiais são convertidos?

1\: Acaba que esta conversão é bem simples. Existem

apenas cinco caracteres que requerem o escape: <, >, & e os

dois símbolos de aspas, aspas simples e duplas ". Tudo isso é

convertido nas entidades HTML equivalentes. Por exemplo, <

torna-se &It;, & torna-se &amp etc.

f: No último mês, minha empresa contratou uma consultora Web para fazer uma auditoria

em nosso aplicativo Web. Ela notou que estávamos usando EL em todo lugar para produzir as

strings fornecidas pelos usuários. Ela disse que era um risco de segurança e recomendou queproduzíssemos todas as strings do usuário usando a tag c:out. O que está havendo?

1\: Sua consultora está certa. O risco de segurança ao qual ela está se referindo é chamado de hack

com cruzamento de sites ou script com cruzamento de sites. O ataque é enviado do navegador Web

de um usuárip para outro usando seu aplicativo Web como o mecanismo de envio.

1\: Boa pergunta. Você sabe que uma expressão

EL ${evalsToNull} gera uma string vazia na saída da

resposta assim como <c:out value="$ {evalsToNull}"/>.

Seu aplicativo Web

o cracker fornece um campo de comentário em seu

aplicativo Web, que está armazenado no banco de dados. O

cracker inclui um código JavaScript com vírus no comentário.

"inocente" ;\

O usuário inocente exibe o comentário do cracker, mas

o texto que o cracker forneceu também inclui o código

JavaScript que compromete o sistema do usuário2! . I(JSOf' 4 +fJ.; c:.:)v..,..para

fJ.presePl+o.r õ +eX+1J fÁlJS

usv:rii}S iil<lf'e~e " t.4C~ CIJIt\

crtl;Q.lt\en+c fÁesi+eS ~esseIcrlt\vl:rli) ~e exi;tr fJ.S+f3.5s

<.scri'p+' e 4) c~fÁ";c J~PIaPlQ.ve;tJ.fÁ<':Jrej, fÁ/) tls~fJ.r,i}2,

Isso i'iI<If'efÁe~tle I) CI)~Íjó

J-s s~tJ. litI-hrpre+fJ.fÁl) pe1ô

PlIJ.Vf!dfÁDr IJ.Plvla.PI~1) a+fJ.3ue", J<; uSlIQ.ri'll/.

O que acontecerá se o valor da expressão EL for null?

Mas esse não é o final da história de c:out. A tag c:out

é inteligente e reconhece quando o valor é null e pode

executar uma ação especial. Essa ação é para fornecer

um valor padrão ...

f:

444 capífuio 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 7/33

 

usando JSTL

Os valores t1ullsão apreset1fados como texto em brat1coSuponha que você tenha uma página que dá as boas-vindas dizendo "Hello <user>".

Mas recentemente, os usuários não têm se conectado e a saída parece bem estranha:

EL tlão itftpritftirá tlada se o usuário for tlul!

<b>Hello ${user}.</b>~

Apresentado como

Utfta tag da expressão JSP tlão itftpritftirá tlada se o

usuário for tlul!

<b>Hello <%= user

<b>Hello

%>. </b' -~'""'""Apresentado como

C"II\" &{ tlse" } e <%= tlsel' %,ItJl'o,II\ o,lIfJ.!i'aJ",sCIJII\"

I

__ <_b_>_H_e_l_l_o_._/b_>_ 1 ~

t1efit1aum valor padrão com o atributo defaultSuponha que você queira mostrar a esses usuários anônimos uma mensagem que diz:

"Hello guest" (Olá convidado). Este é um lugar perfeito para usar um valor padrão

com a tag c:out. Simplesmente adicione um atributo default e forneça o valor que

deseja imprimir, caso sua expressão seja avaliada como null:

IL '" Irr5""~(j IIlJ.lól' ffJ.Jl'aó e

l'i1sfl'ltió •••ff!"lel+ó.

Apresentado como

\

<b>Hello

ís-k! l/IJ,!()" se,,: f"óJVjlJ() se "

a+I"I"I;//+., 1I1J,1//e,,1' IJ,lIlJ.llfJ.J"CIJ"'tJ '1//11.

<c:out> fornece Utftatributo default ~<b>Hello <c:out value='${user}' default='guest' />.</b>

Ou você pode fazer assitft:

<b>Hello <c:out value='${user}'>guest</c:out></b>

você está ~ 445

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 8/33

 

a tag <c:forEach>

Fazetldo loops setMscripts

Imagine que você deseja algo que faça um loop através de uma coleção

(por exemplo, um array de itens de um catálogo), que retire um elemento

de cada vez, e que exiba esse elemento em uma linha de uma tabela

gerada dinamicamente. Não é possível programar de antemão a tabelacompleta - você não tem idéia de quantas linhas existirão no momento da

execução e, é claro, você não sabe quais são os valores correspondentes.

A resposta é a tag <c:forEach>. Isto requer um conhecimento bastante

ligeiro sobre as tabelas HTML, mas incluímos aqui notas para os leitores

que não estiverem familiarizados com o tópico.

A propósito, para o exame você precisa saber como usar <c:forEach>com tabelas.

Código do Servlet

String[] movieList = {nAmelie", nReturn of the King", nMean Girls"};

request.setAttribute(nmovieList", movieList);

o que você quer

Movie list:

Amelie

Return af the King

Mean Girls

Em um .JSP, com scripting

<table>

<% String[] items - (String[]) request.getAttribute(nmovieList");

String var-null;

for (int i = O; i < items.length; i++) {

var = items[i];

%>

<tr><td><%= var %></td></tr><% } %>

</table>

446 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 9/33

 

usando JSTL

<c:forEach>

(FaIa.l"ew\lJS s6bl"f eS+4 dtl"e.f-;va

.r flJ.jllb IIl.lJ,tsIJ,dto.PI+ePlIJ Cfi.P,{+VI6)Código JSP

A tag <c:forEach> da JSTL é perfeita para isto ~ ela lhe fornece uma

maneira simples de iterar através de arrays e de coleções.

<%@ taglib prefix="c" uri=''http://java.sun.com/jsp/jstl/core'' %>

<htrnl><body>

<strong> Movie list:</strong>

<br><br>

items="${movieList}" >

~Fa; V'" 11J6Paj;l"lJ,vés dlJ (J.f{,~l i?rf-elt'1J(IJ aft'lbvfõ IIl.6vteLts+) e e;dbe Cl1.dl2

ele",e,,+õ elll. lJIIl.o.PlIJVIJ,Ii1t.IJ..(ís+a. +o.belo.

IJ"'Q ClJlvPltl,</body></htrnl>

<table>

<c:forEach var="movie"

<tr>

<td>${rnovie}</td>

</tr>

</c:forEach>

</table>

Lembrete rápido sobre tabelas HTML

<fI":> si5l1tii'c1J. tible JeIJW (Lti1t.o.

<+d:> Si5l1litcl2 ti!;le /)12+12 (/)e.JIJS de tiIJele.).

<table>

<tr>

<tr>

<tr>

</tr>

</tr>

</tr>

</table>

As tabelas são bem simples. Elas possuem células, organizadas em linhas e

colunas, e os dados são inseridos dentro das células. O esquema é dizer à tabela

quantas linhas e colunas você deseja.

As linhas são definidas com a tag <tr> (Table Row), e as colunas são definidas com atag <td> (Table Data). O número de linhas vem do número de tags <tr>, e o número

de colunas vem do número de tags <td> que você colocar dentro das tags <tr></tr>.

Os dados a serem exibidos são colocados somente dentro das tags <td></td>!

você está li' 447

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 10/33

 

a tag <c:forEach>

(1eseonstruindo <e:forEaeh>

A tag <c:forEach> integra-se perfeitamente a um loop for - a tag repete o

corpo do elemento com a tagfor each na coleção (e estamos usando "coleção",

significando um array, ou Coleção, ou Map, ou String delimitada por vírgulas).

A característica principal é que a tag atribui cada elemento da coleção à variável

que você declara com o atributo varo

f) "tJe+e.

CtJ!f!í';".;

óf/ S+I"'YJ5

dell)"'l-í-ado. ptJl'I1111'5Vlo.s)s tJbI'f!

</) allt11 tJ lótlp #leve

seI" fel+".

items="${movieList}"

>Ií:'

If Val"l-4ve/ ~ve 41"~Q;ePla cada

'iLJ.I.A,JIJ-r't) da ccle{;tJ, f) sev valtu' se

a ClJ.d« r+eN.{itJ,

var="movie"

íA tag <c:forEach>

Stri~g[] ite~s = (string[]) request.getAtribute(nmovieList");

for !(int i =i0; i < items.length; i++)

string movie = items[i];

ot.println(movie);

Obtendo um contador de loops com oatributo opcional varStatus

V4I'S+a+vs CI'I"II.(1<9\14l(lV4 Vikl'l-4l1el

o.f'~a]ePltJ. (I<9\aIYJs+~Cr(l. dejaVax,

sel'vle+ dspds+t.CtJl"f.LtUlP ~S+a+vs.

ConnOMeanGirl

Coun0Return of the King

<table><c:forEach var="movie" items="${movieList)" varStatus="movieLoopCount" >

<tr>

<td>Count: ${movieLoopCount.count}</td>

</tr> ""

<tr><td>${ffiOVie} <br><br></td>~/tr> \</c:forEach> .

</table> 1iil'jQ<9\<fJSaNJ. alie tJ. dfJ.sse

LtJõp~S+P.+lIs +ePlt.a V<9\4

pl"cprled4de CClIPl+ 3ve lhe

f6I"Plf!ffJ. " lIal61' a+vo./ d"

ctJPl-l-lAdtíl' de r+e1'4f';es. (C<l~tJ tl r

fJ!>\ (lJ!>\/tU)P "ól",)

448 capítulo 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 11/33

 

<table>

usando JSTL

Você pode até tMestMOt1it1hartags <c:forEach>

E se você tiver algo como uma coleção de coleções? Ou um array de arrays?

Você pode aninhar tags <c:forEach> para obter estruturas de tabelas mais

complexas. Neste exemplo, colocamos arrays String dentro de uma ArrayList, e

então tomamos a ArrayList um atributo de solicitação. O JSP precisa fazer umloop através da ArrayList para obter cada um dos arrays String, e depois fazer

um loop através de cada array String para exibir os elementos propriamente

ditos do array.

Código do Servlet

String[] moviesl ~ {nMatrix RevolutionsH, nKill BillH, nBoondock SaintsH};

String[] movies2 = {nAmelieH, nReturn of the KingH, nMean GirlsH};

java.util.List movieList = new java.util.ArrayList();

movieList.add(moviesl);

movieList.add(movies2);

request.setAttribute(nmoviesH, movieList);

Código JSP

tJ a.";'f'ibrr/-lJ der (a fJrf'f"I...i'S";'

C<c:forEach var=HlistElementH items=H${movies}H >(. "- ,

<c:forEach var="movie" items="${l.istEl.ement)" >

IlJlJf I <tr> I\"I . L <td>${movie}</td> '-- tlit\ dóS af'f'4~SI .5";'f'I;'<:«(lI!/~I'i'11J </tr> ./ '""

I I </c:forEach> IfJNJ.it\a.ff'i/;(lI'«fJS t:/fJ a.ff'tbv.flJL L vaf' dó Ióóf e~l'i'1ó.</c:forEach>

</table>

Boondock Saints

Amelie

Retum of the King

Mean Girls

você está ~ 449

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 12/33

 

a tag <c:forEach>

<c:forEach var="foo"

</c:forEach>

items="${fooList}" >

1/ UlJfitJ!! fJr

es';": h~N.ij

Cuidado!

x + i;i++) {

$ {lJÃ-tJ/! fJr v~l'i-:vel

es';": fc.l'~ ç/c.

Pode ajudar se você pensar no escopo da

tag como sendo idêntico ao escopo dobloco no bom e velho código lava. Um

exemplo é o loop for que todos vocêsconhecem e amam:

${foo} ~tJk

'A variável "var" temVeja 1&9.como escopo APENAS

a tag!

É isso mesmo, escopo da tag. Ou seja,

não se trata de um escopo abrangente ao

qual você possa vincular atributos como

nos outros quatro - page, request, session,

application. O escopo da tag significa

simplesmente que a variável foi declaradaDENTRO de um loop.

E você já sabe o que isso significa em

termos de lava. Você verá que, para a

maioria das outras tags, uma variáveldefinida com um atributo "var" será

visível a qualquer escopo que você definir

especificamente (usando um atributo

"scope" opcional), OU, a variável usará o

padrão de escopo de página.

Assim, não se engane com código que tenteusar a variável em algum ponto ABAIXO

do fim do corpo da tag <c:forEach>!

for (int i ~ O; i < items.length;

r: Como você sabia que o atributo "varStatus"era uma instância do que quer que fosse, ecomo você sabia que era uma propriedade"count"?

Nã9 exlst~m

fetguntéls Idl9tét8

1\: Eh... nós olhamos na resposta.Está tudo na especificação da JSTL 1.1. Se vocêainda não tiver a especificação, baixe-a AGORA(a introdução deste livro lhe diz onde obter as

especificações abordadas no livro). Ela é Areferência para todas as tags da JSTL, e lhe informatodos os atributos possíveis (sejam eles opcionaisou obrigatórios), o tipo do atributo, e muitos outrosdetalhes sobre o modo de usar a tag.Tudo o que você precisa saber sobre estas tags(para o exame) se encontra neste capítulo. Masalgumas das tags têm algumas outras opções quenão abordamos aqui, então você poderá desejar dar

uma olhada na especificação.

r: Já que você sabe mais do que está dispostoa dizer sobre esta tag ... ela fornece uma maneirade modificar os passos da iteração? Em um loopfor Java real, eu não preciso fazer i++, possofazer i +=3, por exemplo, para obter cada terceiroelemento, em vez de todos os elementos ...

1\: Sem problemas. A tag <c:forEach> possuiatributos opcionais para begin, end (caso vocêdeseje iterar sobre um subconjunto da coleção), e

step, caso você deseje pular alguns elementos.

r: o "c" em <c:forEach> é um prefixoobrigatório?

1\: Bom, é obrigatório usar algum prefixo,certamente; todas as tags e funções EL devem terum prefixo para dar ao Container o namespacepara a tag ou nome de função em questão. Mas

você não PRECISA nomear o prefixo com "c".Esta é apenas a convenção para o conjuntode tags da JSTL conhecidas como "centrais".Recomendamos usar algo diferente de "c"como prefixo sempre que você quiser confundirtotalmente os seus colegas de trabalho.

doSomethin

450 cap,ifu/o 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 13/33

 

usando JSTL

Fazendo utMa inclusão condicional COtM<c:if>

Imagine que você tenha uma página em que os usuários possam ver

comentários deixados por outros usuários. E imagine que os membros

também possam postar comentários, mas visitantes que não são membros

não possam. Você deseja que todos obtenham a mesma página, mas queos membros "vejam" mais informações da página. Você precisa de um

<jsp:include > condicional e, é claro, você não quer fazê-Io com scripts!

o que os membros vêem o que os NÃO-membros vêem

Member Comments

This site rocks.

This sUe is coa!.

This sUe is stupid.

Member Comments

This site rocks.

This sUe is coa!.

This sUe is

Código JSP

<%@ taglib prefix="c" uri=''http://java.sun.com/jsp/jstl/core'' %>

<html><body>

<strong>Member Comments</strong> <br>

<hr>${COmmentList}<hr~ Sy,t'JJ1/"f!.ÔYe'y~ deftJ1aJe~<c: if test=" $ {userType eq 'member' }" > t!.'5y~ pt'J~t'JJ " IJ.-!-ri/;Y+" yser,peJ

~~ eMI J1fJ.$J1f"r~tJ,{;es de /(;51';;~sp: include page="inputComments. jSf" /> '" J" YSy:rl",

</c:1f> \ \</body></html> \

Si'~J sã" aspas sIMPLJ ..S

) eJ1v(JlveI1J~~elt\ber, AJão se

Je ~íle vóce p"Je ílSiJ,rPágina incluída ("inputComments.jsp") I1fJ.$syas

<form action="commentsProcess.jsp" method="post">

Add your comment: <br>

<textarea name-"input" cols="40" rows~"lO"></textarea> <br>

<input name="commentSubmit" type="button" value~"Add Comment">

</form>

você está ." 451

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 14/33

 

a tag <c:if>

Mas, e se você precisar de Ut\1 else1

E se você quiser fazer uma coisa se a condição for verdadeira,e uma outra coisa se a condição for falsa? Em outras palavras,e se quiséssemos exibir ou uma coisa ou outra, mas semque ninguém veja ambas? A tag <c:if> da página anteriorfuncionou bem, porque a lógica era: todos vêem a primeiraparte e, em seguida, se a condição do teste for verdadeira,algo mais é exibido.Mas imagine agora este cenário: você tem um site devenda de carros, e deseja customizar o título que aparece

em cada página, com base em um atributo do usuário

definido anteriormente na sessão. A maior parte da páginaé a mesma, independentemente do usuário, mas cada umvê um título customizado - um que reflita a motivação

pessoal do usuário para comprar (afinal, estamos tentandovender-lhe um carro para ficarmos indecentemente ricos).No início da sessão, um formulário pede ao usuário queescolha o que é mais importante ...

No início da sessão:

he Brakes

ur advanced anti-lock brake system (ABS) is

ngineered to give you the ability to steer even as

ou're stopping. We have the best speed sensors ofcar this size.

Imas1ne um sÍte de uma

emptesa de venda decanos. A ptlmell'a págIna

Pel'Eunta aI.)usuátI9 9 qUeJ-'

acha 111ms lmp(ntante.AssIm C9m9 um lwm! I 1" _? o

vendeuÇ)t. as b~l11as quev p

I' 1 1 f .0êtiam eLaSCal'actetlStlCaSdo catt9 lrã9 cust9m17-m'

a aptesentaçã9 C9m br~"leI' ,,! f ona pte-retenC1a(:[0 usuan9,

• 1 dde l1]9c[9i~le ca a umadas cal'aG'tetÍstkas d9 catt9

pateça ter sld9 telta CÇ)mpessoaIsem

452 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 15/33

 

usando JSTL

A tag <c:if> não funcionará para isto

Não há como fazer exatamente o que queremos usando-se a tag <c:if>,

porque ela não possui um "else". Podemos quase fazê-Io, usando algocomo:

JSP usando <c:if>, mas não funciona corretamente ..•

se lIserR-el ,,';IJ h.1" "(,,t.lI11<1a«as ôpj:;es?

Je eSJi)eclflc;~1"I~ -I-i-l-ulô-pa«l"ãlJ?Jl,t~s6)lIflJ';ô I.~I~~

<c:if test~"${userPref~~'performance'}" >

Now you can stop even if you <em>do</em> drive insanely fast ..

</c:if>

<c:if test~"${userPref~='safety'}ff >

Our brakes won't lock up no matter how bad a driver you are.

</c:if>

<c:if test~"${userPref=~'maintenance'}" >

Lost your tech job? No problem-you won't have to service these brakesfor at least three years.

</c:if>

<!-- continua com o restante da página que TODOS deverão ver -->

A tag <c:it> não funcionará, a não ser que tenhamos CERTEZA de que nunca precisaremos de um

valor-padrão. O que realmente precisamos é de algo como um construtor if/else:*

<html><body><h2>

JSP com script, fazendo o que desejamos

li' fi

Có"sli/(r( ôve usel"Prel +e"J.fj,

stillJ «eli''1MIJ ell<laljvII<I~ôll<le,,+ôfI.,,+el"i'õl" '14 sess';õ.

ç-<% String pref ~ (String) session.getAttribute("userPref");

if (pref.equals("performance")) {

out.println("Now you can stop even if you <em>do</em> drive insanely

fast.");

} else if (pref. equals ("safety")) {

out.println("Our brakes won't lock up, no matter how bad a driver you are.

") ;

else if (pref. equals ("maintenance")) {

out.println(" Lost your tech job? No problem-you won't have to service

these brakes for at least three years.");

else {

// userPref não é nenhuma das opções, então exibe o titulo-padrão

out.println("Our brakes are the best.");

} %>

</h2><strong>The Brakes</strong> <br>

Our advanced anti-lock brake system (ABS) is engineered to give you the ability to

steer even as you're stopping. We have the

best speed sensors of any car this size. <br></body></html>

*Sim, nós concordamos que quase sempre há

uma abordagem melhor do que usar testes if

encadeados. Mas você terá que confiar em nós até

aprender como tudo isso funciona ...

você está ~ 453

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 16/33

 

o tag <c:choose>

I will CHOOSE you WHEN

you are ready to give up

your obsession with Pilotes.

OTHERWISE, 1'11have

to go with Kenny for the

synchronized swim team.

DO

A tag <c:choose> e suas parceiras

<c:whe.,> e <c:otherwise>

<c:choose>

fJrpf!."G.SIJM des.fes )1/4+I'Õ C"l'põS ú"PIdl/il'idõ

õ <.c:ó+l.el'~;;i$e» i"1'tJ.'ód41'. N I

(AJ"i." ~ CólJ'\õI/IJ'\cõlJ'\tJ.mlc$Wi+cl. - 1'i4ó 1.0.

"el'it.1/1J'\fo./I-+t.NV;t.)

<c:when test="${userPref == 'performance'}">

Now you can stop even if you <em>do</em> drive insanely fast.

</c:when>

<c:when test="${userPref == 'safety'}">

Our brakes will never lock up, no matter how bad a driver you are.

</c:when>

<c:when test="${userPref 'maintenance'}">

Lost your tech job? No problem--you won't have to service these brakes

for at least three years.

</c:when>

<c:otherwise>

Our brakes are the best. ~<~--</c:otherwise>

</c:choose>

<!-- o resto da página segue aqui ... -->

Se l'ie"t.vlJ'\ dIJS +es+es <'c:wt.e,,> fIJI'

vel'Jo.detl'ó; ., <'C:ó+td!l'wtse> NJdlll. C<)lJ'\õ

pfJ.dl'':iõ.

454 CB}JítIJ}O 9

AJô+fJ.:AJÂ-o é Õbl'~fJ.+;l'i6 sve ti.+~<'c:ct..,ôse> +el'it.a v",a +~<.c:a+t.eI'Wise>.

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 17/33

 

A tag <e:set> ... 'Imito ",ais legal que a <jsp:setProperty>

A tag <jsp:setProperty> só é capaz de fazer uma coisa: definir a propriedade de um bean.

Mas, e se você quiser definir um valor em um Map? E se quiser criar uma nova entrada em

um Map? Ou, se simplesmente quiser criar um novo atributo no escopo da solicitação?Você tem todas essas possibilidades com <c:set>, mas terá que aprender algumas regrassimples. Set vem em dois sabores: var e target. A versão var serve para definir variáveis

de atributos, e a versão target serve para definir propriedades de beans ou valores de Maps.Cada um dos dois sabores vem com duas variantes: com ou sem um corpo. O corpo de<c:set> é apenas uma outra forma de inserir o valor.

Definindo uma variável de atributo var com <c:set>

OSEM corpo

~ H U

Se Ai/lrfJ /'wver ti*'. o.+l'i911+" tie esc"p" tia sess';tJ ct.o.*'.atitJ lIset'Leve/ JeS+4 +"5 crra tlí'JIÚllptJJ1titJ-se 3l1e tJ 4+l'l'bll+ô valI/e I?:i'cé J1vltJJ.

r -c:set var="userLevel" scope~"session" value~"Cowboy" />

/e

<c:set var="Fido" value="${person.dog}" />

Le*'.!Jl'e-se,; J1atilJ.il!!bal'ra a3tHr ~{.iat1titla +"5 -I-rvel' {.ií'JICtlf'ptl.

<c: set var="userLevel Ir scope="session" >Sheriff, Bartender, Cowgirl

</c:set> J\" /..... () Ctlt'ptl li!í1.vali"tiô e IIsatic I:Ô*'.<I vaieI' tia

eCOMcorpo

Se o valor for avaliado como nulo, a variável seráREMOVIDA! Isso mesmo, removida.

Imagine que para o valor (no corpo da tag ou usando ~ a~ributo value), ,:oc~ use

${person.dog}. Se ${person.dog} avaliar como nulo, (szgnifican_doque nao ;;Rnenhuma person, ou a propriedade dog de pe;son e nu!a), entao: se HO.~ I íSum atributo de variável com um nome "Fido', esse atrzbuto ~e:a remov~ o. \' e

você não especificar um escopo, ele começará olhando na pagzna, ~epOls n~solicitação, etc.) Isto acontece, mesmo se o a~ributo "Fido" tiver szdo defimdooriginalmente como String, Duck ou Broccoll.

você está iP 455

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 18/33

 

a tag <c:set>

Usa"do <c:set> COtM beatls e MapsEste sabor de <C"set> (com as suas d .s~~e apenas para duas coisas' .uas vanantes - com ou sem co o

80 lsso.Y~cê não pode uSá_Io'::r;~~d~des de ?eans e valores de Ja~

arrays. E sImples - você fornece a ele IClOn?r C01sasa listas, nem a .

nome da propriedade/chave e o vaI o objeto (um bean ou um Map) oL ,

Definindo uma propriedade Ouvalor de target com <c:set>

oSEM corpo

GCOMcorpo

o "target" deve avaliar para o OBJETO! Não digite o nome deString "id" do atributo do bean ou Map!

Isto é importante de se lembrar. Na tag <c:set>, o atributo "target" parece funcionarcomo o "id" de <jsp:setProperty >. Até mesmo o atributo "var" na outra versão de<c:set> usa uma String literal que representa o nome do atributo do escopo. MAS. ..não é assim quefunciona com "target"!

Com o atributo "target", você NÃO digita a String literal que representa o nomesob o qual o atributo foi vinculado à página, ao escopo, etc. Em vez disso, o atributo"target" precisa de um valor que resolva para o ALVO REAL. Isso significa umaexpressão EL ou uma expressão de script «%= %», ou algo que ainda não vimos:

<jsp:attribute>.

456 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 19/33

 

usando JSTL

Pomos principais e pegadinhas COtM <c:set>Sim, <c:set> é fácil de usar, mas há algumas questões de quevocê precisa se lembrar:

~ Não é possível ter AMBOS osatributos "var" e "target" ao mesmotempo em um <c:set>.

~ "Scope" é opcional, mas, se não usá10, o padrão é opage scope.

~ Se o "value" for nulo, o atributo

nomeado por "var" será remo"ido!

~ Se o atributo nomeado por "var" nãoexistir, ele será criado, mas apenasse "value" não for nulo.

~ Se a expressão "target" for nula, oContainer gera uma exceção.

~ O "target" serve para inserir uma

expressão que resolva para o ObjetoReal. Se você inserir uma Stringliteral que represente o nome de "id"do bean ou Map, não funcionará.Em outras palavras, "target" nãoserve para o nome do atributo dobean ou Map - e sim, para o próprioobjeto do atributo.

~ Se a expressão "target" não for um

Map, nem um bean, o Containergera uma exceção.

~ Se a expressão "target" for um bean,mas este não tiver uma propriedadeque coincida com "property", oContainer gera uma exceção. Mascuidado, porque a expressão EL porsi mesma NÃO causará uma exceçãose a propriedade não existir. Então,

embora ${fooBean.notAProperty}não cause uma exceção por si mesma(apenas retorna nulo), se essa mesma

"notAProperty" for o valor de umatributo "target", o Container gerauma exceção.

l'lã9 e)Úst~m

Yet.sUntas Idl9télS

Y: Por que eu usaria a versão comcorpo, ao invés da versão sem corpo?Parece que elas fazem exatamente amesma coisa.

1\: Isso é porque elas DE FATO ... fazem a

mesma coisa. A versão com corpo é apenaspara conveniência, quando você desejamais espaço para o valor. Poderia ser umaexpressão longa e complexa, por exemplo, e

colocá-Ia no corpo torna-a mais fácil de ler.

Y: Se eu não especificar um escopo,isso significa que o Container encontraráatributos APENAS dentro do escopo depágina, ou ele faz uma busca começando

com o escopo de página?

1\:Se você não usar o atributo "scope"opcíonal na tag, e estiver usando "var" ou"target", o Container buscará escopos naordem que seria de se esperar - página,depois solicitação, depois sessão, depoisaplicação (contexto).Se você estiver usando a versão "var" semum escopo, e o Container não conseguirachar um atributo com o nome em questão

em nenhum dos quatro escopos, o Containercria um novo atributo no escopo da página.

Y: Por que a palavra "atributo" é tãosobrecarrega da? Ela significa tanto "ascoisas que são colocadas dentro de tags",como "as coisas que são vinculadas aobjetos em um dos quatro escopos".Então, no fim das contas você tem umatributo de uma tag cujo valor é um

atributo da página e...

1\: Tudo bem, já entendemos. Mas é assimque as coisas são. Mais uma vez, ninguémpediu a NOSSA opinião. Nós teríamoschamado os objetos vinculados de algo

como, sei lá, "objetos vinculados".

você está l:> 457

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 20/33

 

a tag <c:remove>

<c:remove> faz setttido

Concordamos com o Dick - usar um set para remover

algo parece errado (mas lembre-se, o set somente remove

quando voéê passa a ele um valor nulo).

A tag <c:remove> é intuitiva e simples:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html><body>

<c:set var="userStatus" scope="request" value-"Brilliant" />

userStatus: ${userStatus} <br>

<c:remove var="u erStatus" scope="request" />

userStatus is now: $ {userStatus t\-()SCl!if6 é 6fd'an41 e CI!i"'''J ~ /

</body></html> seltlfl';J <l eSC<lf<l-f4dI'4<l e<l de fIJ.j1i14.

458

userStatus: Brilliant

userStatus is now:

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 21/33

 

usando JSTL

Teste a sua memória sobre as Tags

Se estiver estudando para o exame, não pule esta parte.

As respostas encontram-se no final do capítulo.

o Preencha o nome do atributo opcional.

<c: forEach var="rnovie" iternS~"${rnOVieListl"l I="foo" >${rnoviel ----------</c:forEach>

o Preencha o nome do atributo que está faltando.

<c: if I ~I~"$ {userPref~=' safety' l" >Maybe you should just walk ...

</c:if>

ePreencha o nome do atributo que está faltando.

<c: set var="userLevel" scope~" session" I ~I"foo" />

oPreencha o nome das ta9s (dois tipos de ta9s diferentes) e o nome do atributo que estáfaltando.

<c:choose>

<c:I II 1 ~"${userPref == 'perforrnance' l">Now you can stop even if you <ern>do</ern> drive insanely fast.

<c: 1 1>Our brakes are the best.

</c:I I></c:choose>

você está ~ 459

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 22/33

 

460

a tag

COIfta <e:ilftport.:> h' '"

de itle/uir eOtlteúdo' a agora n«S IftatleirasAté aqu' t

1, emos usado dConteúdo de um o uas maneiras diferente . .

uma outra m . utro recurso para um JSP M s de,a~IClOnaranerra, usando a JSTL. . as ha alnda

OA diretiva incJude

<%@ includ~ file-aE r, - Header.htmlff %>statlCa- d' .. . a lClOnao Conteúd

atrIbuto file para a p' . o a partir do valor dtradução. agllla atual no momento de o

AA-V açao-padrão <- ._

. ~sp.lncJude><J$P'in 1 d. c u e pag~=ffH d '

• A ea er']Spff />DInamica' d' .atrib . a lClona o Conteúdo .

. ~to page para a páo-in a partIr do valor dosolICitação. ;:, a atual, no momento da

eA t ftc. cM+rtrliJ dcS cv+r<:>sd41'sag JSTL <c:import> i';J(;/vlles; a VI'I de <C:"''''f'4r+:> póde

<c: illlport url="htt . se lacll,li'511:.i"lcl'l1. dI} C.C'1+4(l1er webl• A P'//WWw.Wíckedl 3m ~~

DInamica' d' . Y art .comi sk 1atrib • alCl0na Oconteúdo' Y er/horse.htmlff />

uto URL para a ' . a partIr do valor d

solicitafão. Funcion~a~lll~ atual, no momento da oque a <jsp:inc1ude> p at~ca~ente da mesma fc

, mas e maIS pod °nuaerosa e flexível.

odos eles têm nomes de atributos diferentes!

(E cuidado com a diferença entre "include" e "import".)

Cada um dos três mecanismos para incluir conteúdo a partir de outro

recurso para dentro do seu JSP usa uma palavra diferente para o atributo. A

diretiva include usa file, a <jsp:incZude> usa page, e a tag JSTL <c:import> usa

urI. Isto faz sentido, pensando bem ... mas você precisa memorizar todas as três.

A diretiva servia originalmente para templates estáticos de layout, como headers

HTML. Em outras palavras, um "arquivo". A <jsp:include> servia mais para

conteúdo dinâmico vindo de JSPs, então deram ao atributo o nome "page" para

refletir isso. O atributo para <c:import> recebeu o nome daquilo que você fornece

a ele - uma URL! Lembre-se, os dois primeiros "includes" não podem ir além do

Container atual, mas <c:import> sim.

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 23/33

 

usando JSTL

A <c:ilMport> consegue alcançar o LAVO vE FORA da aplicação web

Com a <jsp:include> ou a diretiva include, é possível incluir apenas páginas que façam parte

da aplicação web atual. Mas agora com a <c:import>, você tem a opção de puxar conteúdo

de fora do Container. Este exemplo simples mostra um JSP no Servidor A importando o

conteúdo de uma URL do Servidor B. No momento da solicitação, o pedaço de HTML doarquivo importado é adicionado ao JSP. O pedaço importado usa uma referência a uma

imagem que também está no Servidor B.

Servidor A, o JSP fazendo a importação

OJSP

<%@ taglib prefix~~cH uri= ~http://java.sun.com/jsp/jstl/coreH %>

<htrnl><body>

<c: ~port url =~http://www.wickedlysmart.com/skyler/horse.htmlH />

<br>

This is rny horse.

</body><htrnl> !

<irng arc=~http://www.wickedlysmart.com/skyler/horse.gifH>

(Mãt:> se es&veja: #;SSIÍM Côll'lô lU, casô !le

II'lec#;~t$II'l<lS de J;,;clvstlD; t:>

deve ser tlII'l /"ft.JII'lePl+ô !le

Vh\41~I;';tl. c<l""'fle+tl. Cõll'l +ft.Js de

/ec!.tl.h\ePi+<l <I,+II'l/> e <b<l!lj»

~ O c{(lIf4i@ ye"", de fi"", sf!,I'Ytil@1'wd

dllf!,I'f.I'1.f-e dó d{( J'

C@I'1#"'" @ +ex.f.tJ,

o arquivo importado

This is my horse.

A resposta

1\

Servidor 8, o conteúdo importado

você está ••. 461

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 24/33

 

a tag

Customizat1do O que você it1clui

Você se lembra quando, no capítulo passado, usamos um

<jsp:inc1ude> para inserir o header do layout (um gráfico com

algum texto), mas queríamos customizar a legenda usada no

header? Usamos <jsp:param> para essa finalidade ...

oO .JSP com o <jsp:include><html><body>

<jsp:include page="Header.jsp">

<jsp:param name="subTitle" value="We take the sting out of SOAP." />

our Web Services Supp rt Group.</em> <br><br>

${initparam.mainEmailJ)

<br>

<em>Welcome to

Contact us at:

</body></html

</jsp:include>

G O arquivo incluído ("Header.jsp")

<em><strong>${param.subTitle}</strong></em> <br>

'f.llVe iaww llOW to make SOM suck less.0Welcome to OUI Web Services Support Group. ~

OContact us at: [email protected] y

462 CBJ-,ítu,'o 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 25/33

 

usando JSTL

Fazet1do O tMestMO eOtM <e:paratM>

Aqui, realizamos a mesma coisa que na página anterior, mas

usando uma combinação de <c:import> e <c:param>. Você

verá que a estrutura é praticamente idêntica à que usamos com

ações-padrão.

oO JSP com o <jsp:include>

<%@ taglib prefix~"c" uri~"http://java.sun.com/jsp/jstl/core" %>

<html><body> r 5 A/ A I Lir eAl\ bIJJ·I"4.JPC1"311fi: /"f(::;O/t./"f <l . ,.~ -n:itI (/AI\ Ccl'pt:>•••<c:import url="Header.jsp" >

<c:param name="subTitle" value="We take the sting out of SOAP." />

</c:import> ~

<br>

<em>Welcome to our Web Services upport Group.</em> <br><br>

CO""CC u' aC, '{iOiCE""m.maiOE]'i11/body></"m1> /

eO arquivo incluído ("Header.jsp")

<img src-"images/Web-Servi s.jpg" > <br>

<em><strong>${param.subTitle}</strong></em> <br>Í-s-l-IJ.p~il1tJ. ",:rt:> se itlt:>titftclJ..

11:rt:>e illYMI'-I-a :u,bl"e

flJ.l'~e-l-l'() ct.e5c(J tiestie"

ltJ.es~<l.

você está ~ 463

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 26/33

 

oCJ

o registro da sessãoaconteceautomaticamente com JSPs, a

não ser que você o desabilite

explicitamente com uma diretiva de

página, que tenha umatributo sessionque diga session="false".

oD

oa

oa

Ele não entendeu a questão...eudisse "garantir". A minha pergunta,na verdade, é: se o cliente não

tiver suporte a cookies, como eufaço para acontecer a reescrita deURL?Comoeu faço para a ID daessão ser adicionada às URLsno

meuJSP?

464 ca(.'ítw'o 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 27/33

 

usando JSTL

A <c:url> para todas as suas tlecessidades de hyperlitlk

Você se lembra da época dos servlets, quando queríamos usar uma sessão?

Primeiro, tínhamos que obter a sessão (ou a existente ou uma nova). Nesse

ponto, o Container sabe que deve associar o cliente desta solicitação com uma

ID particular de sessão. O Container quer usar um cookie - ele quer incluir umcookie único na resposta, para depois o cliente enviar esse cookie de volta a cada

solicitação subseqüente. Exceto por um problema ... o cliente pode ter um browsercom os cookies desabilitados. E aí?

O Container passa automaticamente para a reescrita de URL, caso ele não receba

um cookie do cliente. Porém, com servlets, você AINDA precisa codificar as suas

URLs. Em outras palavras, você ainda tem que dizer ao Container para "anexar a

jsessionid ao final desta determinada URL ..." para cada URL relevante. Bem, você

pode fazer a mesma coisa a partir de um JSP, usando a tag <c:url>.

Reescrita de URL a partir de um servlet

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws IOException,

ServletException {

response.setContentType(~text/html");

PrintWriter out = response.getWriter();

HttpSession session = request.getSession();

out.println(~<html><body>");

out.println(~<a href=\"" + response.encodeURL(~/BeerTest.do") + ~\">click</

a>"); fi: Jut.println(~</body></html>") ~

as l;,f41'1M,I),g';es eX+l'as til), IbfJ. CiJt.L.,

Reescrita de URL a partir de um JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html><body>

This is a hyperlink with URL rewriting enabled.

<a href="<c:url

</body></html>

value='linputComments.jsp' 1>">Click here</a>

~

Is+<; ad!ci""a aJ'ses si""id aê fl;"i/ da I)Jt.L. l'e/a+iO/atiHlIa/lIlI: (se éS cô<;/:teses+rveJ"el8\tiesdt/l+adôs),

você está i<' 465

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 28/33

 

E se a URLprecisar de codiflcação?

Lembre-se de que, em uma solicitação HTTP GET, os parâmetros são anexadosà URL na forma de uma query string. Por exemplo, se um formulário de umapágina HTML tiver dois campos de texto - primeiro nome e sobrenome - a URL

requisitada irá inserir os nomes e os valores dos parâmetros no final da solicitaçãoURL. Mas ... a solicitação HTTPnão funciona corretamente se contiver caracteresnão-seguros (embora a maioria dos navegadores modernos tenha uma forma detentar solucionar isso).

Se você for um desenvolvedor web, isso tudo não é novidade para você, mas,caso seja novato em desenvolvimento web, você precisa saber que as URLsfreqüentemente precisam ser codificadas. A codificação de URL significa substituiros caracteres não-seguros/reservados por outros caracteres, e então, toda a páginaé decodificada novamente no lado do servidor. Por exemplo, não são permitidosespaços em URLs, mas você pode substituir os espaços por um sinal de mais ("+").

O problema é que a <c:url> NÃO codifica automaticamente as suas URLs!

Usando a <c:url> com uma query string

Lembre-se, a tag <c:url> realiza a reescrita de URL, mas não a codificação de URL!

<c: set var="last" value="Hidden Cursar" /> (jse <:l a+l'tbyf4 "pcllmal "aI'; cas"

<< "e C vac~"fic"" vaiue~"C<ano!>ing ~> ~'!J.::~~.:;:':"$;""M<c:url value="/inputComments.jsp?first=${first}&last=${last}" var="inputURL" />

The URL using params is: $ {inputURL} <br>

The URL usign params is: ImyApp/inputComments.

jsp?first=Crouching Pixels&last=Ridden Cursar

O~\,..,â'<:l pctie ",ler

espOJ4s eiOlVA>la UJI!L!

H~a pactê..,ci"4!Pat"~e+l'cs tie '11Ier)

sfl'tJ?5 predslJ.A>lser cotilltcatic.s •••

esplJ.56s;pól' "eveA>lseI'

sybshfil~éS pôr SI#,f).tSie A>lIJJs+),

Usando <c:param> no corpo de <c:url>

Agora a URL se parece com o seguinte:

A-5<lrQeSfQA>léSsft5vr4s;pcl'lpe

<c:pQrQA>l>liMatia cótilltctujâ'o!

.f '\/myApp/inputCamments.jsp?firstName=Crauching+Pixels&lastName=Hidden+Cursor

Isto resolve o nosso problema! Agora, temos tanto a reescrita de URL, como a codificação de URL .

...c- fh\ !HU'l"a<c:url value~"/inputCamments.jsp" var="inputURL" >

<c:param name="firstName" value="${first}" /><c:param name="lastName" value="${last}" />

</c:url>

466 C8,OítiUio 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 29/33

 

usando JSTL

Você NÃO quer que seus cliet1tes vejatlt isto:

E Exception report

~ The server enoountered an internal error o that prevented lt trom fulfitHng thls reuuest

org.apache.jasper~JasperException: !by zero

org. apache. jasper. servlet .JspServletWrapper .s ,erv'ice{JspSarvletWrapper. java: 358)org. apacne. jasper. servlet~JspServl@t:. g,ervice,,"lspFile{JspServlet. java: 30'1)org.apache.jasper.servlet.JspServlet.servicciJspSarvlet.java~248)

javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

java.lang.ArithmeticException: I by zero

org.apache.jsp.ChooseTest_jsp.~jspService(ChooseTest_jsp.java:62)

org.apache.jasper.runtime.HttpJspBase.service<EttpJspBase.java:133)

javax.servlet.hetp.HttpServlet.service(HttpServlet.java:856)

orq. apache. jasper. servlet .JspServleU<1rapp-er ~serv-ice{JspServ1.etWrapper. java~ 311)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301}

org.apache.jasper.servlet.JspServlet~servicB{JspServlet.java.248)

javax.servlet.http~HttpS€rvlet.s€rvice(HttpServlet.java:B56)

I ml !! l T he f úl l s ta ck tr ac e o fl he mo ! ca us e ; s ev ai la bl e 'fi lhe Tomcetlogs.

você está 467

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 30/33

 

páginas de erro

Crie suas próprias pági•.•as de erro

o cara que está surfando pelo seu site não deseja ver o seu stacktrace. E ele também não está com muita vontade de receber um

"404 Not Found" padrão.

Você não pode prevenir todos os erros, certamente, mas você podepelo menos oferecer ao usuário uma página de resposta de erro

mais amistosa (e mais atraente). Você pode elaborar uma página

customizada para manipular os erros, e então usar a diretiva page

para configurá-Ia.

A página de ERRO designada ("errorPage.jsp")

<html><body>

<strong>Bummer.</strong>

<img src="images/bummerGuy.jpg">

</body></html>

<%@ page isErrorPage="true" %>

A página DEFEITUOSA que gera uma exceção ("badPage.jsp")

<html><body>

About to be bad ...

<% int x = 10/0; %>

</body></htm1>

<%@ page errorPage="errorPage.jsp" %>n.5~«lja de~"t'ad6

•• $4Il'cl+fJ.i;;:,

O que ocorre quando você requisita "badPage.jsp"

468 CBp:ftuJo 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 31/33

 

Vai levar uma ETERNIDADE paracolocar diretivas page em todos os meus

JSPs, para especificar qual página deerro eles devem usar. E se eu quisesseuma página diferente para cada erro?Se pelo menos houvesse um jeito de

configurar páginas de erro para toda aaplicação web ...

()O

usando JSTL

Ela não conhece a tag 1111 <error~page>.É possível declarar páginas de erro no DD para a aplicação web

inteira, e você pode até mesmo configurar diferentes páginasde erro para diferentes tipos de exceções, ou diferentes tipos de

códigos de erros HTTP (404,500, etc.).

o Container usa a configuração <error-page> no DD como

padrão, mas se um JSP tiver uma diretiva errorPage, o Containerusa essa diretiva.

você está il>- 469

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 32/33

 

erro de páginas na DD

Configurando páginas de erro no UU

Você pode declarar páginas de erro no DD com base ou no <exception

type>, ou no número do <error-code> HTML. Dessa forma, você pode

exibir ao cliente diferentes páginas de erro específicas ao tipo de problema

que gerou o erro.

Declarando uma página de erro geral

Esta declaração se aplica a tudo na sua aplicação web - não apenas JSPs. Você pode

substituí-Ia em JSPs individuais, adicionando uma diretiva page com um atributo

errorPage.

<error-page>

<exception-type>java.lang.Throwable</exception-type><location>/errorPage.jsp</location>

</error-page>

Declarando uma página de erro para uma exceção mais explícita

Esta declaração configura uma página de erro que só é chamada quando houver uma

ArithmeticException. Se você tiver ao mesmo tempo esta e a declaração geral acima,

qualquer exceção diferente de ArithmeticException continuará caindo na "errorPage.jsp".

<error-page>

<exception-type>java.lang.ArithmeticException</exception-type>

<location>/arithmeticError.jsp</location>

</error-page>

Declarando uma página de erro com base em um código de status HTTP

Isto configura uma página de erro que só é chamada quando o código de status para a

resposta for "404" (arquivo não encontrado).

seI'

ti 3ye S'5"i'/ica ~tle ela

;te. "tre+:l'ló 1'12/"; we!rapp;C6.1'll\Y.I'll\Q barl'Q. (IS+6 :

Ivel'ti4Jell'Ó; Je Q P"5""4 Je el'l'ó se !ulSelJ.l'

e.•.•<'el'l'dr-cóJe) "ti e.•.•<.excep-hó"-+jpe»

<error-page>

<error-code>404</error-code>

<location>/notFoundError.jsp</location>

</error-pag~/} <'Ióca-h,m)

470 cap,ftulo 9

5/8/2018 JSP.SERVLET0017 - slidepdf.com

http://slidepdf.com/reader/full/jspservlet0017 33/33

 

usando JSTL

As págit1as de erro têtM UtM objeto extra: exeeptiot1

Uma página de erro é, em essência, o JSP que manipula a exceção,

de modo que o Container fornece à página um objeto extra para

a exceção. Você provavelmente não desejará exibir a exceção ao

usuário, mas de qualquer forma tem acesso a ela. Em um scriptlet,você pode usar o objeto implícito exception e, a partir de um JSP,

pode usar o objeto implícito EL ${pageContext.exception}. O

objeto é do tipo java.lang.Throwable, então você pode chamar

métodos em um script e, com a EL, pode acessar as propriedades

stackTrace e message.

Uma página de ERRO mais explícita ("errorPage.jsp")

<%@ page isErrorPage="true" %>

<htrnl><body>

<strong>Bummer.</strong><br>

AJ.,+a; ., dje-f., Je eXCí!{Q,6I .J Ii"1OIp11c/r.,tca Ji"sp6I1il1í!1

APíAJ/}S parti p~liras Je

erre ceiOlviOlaJlre+tva pa,e

expllct+()'JJ>,e~ .lei/irMo.:

<%@ pQje l"síNtJ1"'Pf2je=+rve %>

l.JJ>,,v+ras palallrtl,s) c(mlíj{jl'{u'I 1111 "" IVil'\aptJ.j/ira Je erre l1e JlJ/ J1aee e

svllcle,,+e po.ra la3er ceil'\ji'e eC,m+!J.iirf!!rlel'J1ega essa ptJ.j/irlJ.

tJ.C iiv.plicl+6 .li! exce{Q,c!

You caused a ${pageContext.exception} on the server.<br>

<irng src="irnages/bummerGuy.jpg">

</body></htrnl>

O que acontece quando você requisita "badPage.jsp"

Bummer.

You caused ajava.lang.ArithmelicExceplion: / by zero on lhe server.Ao

ve"); V<lCerecde il'\IM"s

Je+alt.es. ~cê prevave1il'\eJ1+e"" I

111M!i"sp<l1111;tll;ara pll.l'lJ. eIISIl6.1'16", ape"as ô

Ao

3l1e IIl)cepvJesse ver ô eXl~""t,16.