You are on page 1of 29

teste preparatrio - respostas

"fausa para

cat

1i!~-~7

1Dado o elemento DD:


47. <jsp-property-group> 48. 49. <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> - lJr l>f'j';" C co.Plcela <) c:lcl./lc Jas eXfl'ess'4es fell> cClrf-o.tPlel' JSP 50. </jsp-property-group>

l...

2..tJ.

.R.I' fiJ.dl'';''J c cl1m-l-o.t#iU' calcl./ltI a f.L.

o que o elemento faz? (Escolha todas as que se aplicam.) O A. Todos os arquivos com o mapeamento da extenso

especificada devem ser tratados pelo container JSP como arquivos que respeitam a sintaxe XML.

O B. Todos os arquivos

com o mapeamento da extenso especificada devem ter seus cdigos EL avaliados pelo container JSP. liZ C. Por padro, NENHUM arquivo com o mapeamento da extenso especificada deve ter seus cdigos Expression Language avaliados pelo container JSP. D. Nada. Esta tag NO reconhecida pelo container. O E. Embora esta tag seja vlida, ela redundante, pois o container j faz isso por padro.

2 Quais
O

das diretivas abaixo representam uma resposta HTTP do tipo "image/svg"? (Escolha todas as que se aplicam.)
page type="image/svg" %> %> %> %> %> - lJr IJf'j';t; /) 4pl'esePl-l-o. ffJ.NI. es=l-a di'l'e-l-tVo..
tJ.

DA. <%@
IiZc.<%@ OD.<%@ O E.<%@

B. <%@ page page page page

mimeType="image/svg" language="image/svg" contentType="image/svg" pageEncoding="image/svg"

s,-.,-I-axe

336

CB{)tLii'O

usando

o JSP

3 Seja o JSP:
1. 2. 3. 4. 5. 6. 7. 8. 9. <%@ page import="java.util.*" %> <html><body> The people who Iike <%= request.getParameter(~hobby") %> are: <br> <% ArrayList aI = (ArrayList) request. <% Iterator it = al.iterator(}; whiIe (it.hasNext()} { %> <%= it.next(} %> <br>

getAttribute(~names"}; %>

10. <% } %> 11. </body></html>

Que tipos de cdigos encontramos nele? (Escolha todas as que se aplicam.)

DA.EL
li2' B. diretiva li2' C. expresso li2' D. template text li2' E. scriptlet

- lJ'; exis.f.e L
expl'fIss;es
114

'1es.f.e J-SP'
fI

Ii...,hll

2) eJ '''5IcJ e!ee..,.f-cs scrip-h""j.

l1a~ !,...,has

3 BJ

t (1"'11 t>s

d"1"eh-vo. #'/0.

",1./1

.f.e""f'II1.f.e.f.ed

P"'I' .f-"d,,'ad

4 Que declaraes
que se aplicam.) li2' A. li2' B. li2' C. li2' D.

sobre o jspInit () so verdadeiras? (Escolha todas as

Ele tem acesso ao ServletConfig. Ele tem acesso ao ServletContext S chamado uma vez. Pode ser anulado.

voc est

337

teste preparatrio - respostas

5 Que tipos de objetos esto disponveis


(Escolha todas as que se aplicam.) ~ A. ServletConfig ~ B. ServletContext CJ C.JspservletConfig CJD.JspservletContext CJE.HttpservletRequest CJ F.HttpServletResponse

para o mtodo j spIni t () ?

- Os JSPs

v/,'all1 stl'vle-l-s

siJ'lf>les e ,til'

lSSti h""'"

acess<Ii

ati; l6e-l-os siJ'lf>les Sel'v1e-I-Coill; e Sel'vle+C<liilh",-I e e Yh<t POtlC<li edo "10 delo de vtlia p41'a !a141'1I10S s<libl't c stillci-l-ases e I"es,os-l-as

6 Dado:
<%@page isELIgnored="true" %>

da Expression Language em todos os JSPs da aplicao. CJ C. O JSP que possui esta diretiva ser tratado pelo container JSP como um arquivo que respeita a sintaxe XML. ~ D. O JSP que possui esta diretiva NO deveria possuir nenhum cdigo da Expression Language avaliado pelo container JSP. E. Esta diretiva apenas cancelar a avaliao da EL se o DD declarar um elemento <el- ignored>true</ el- ignored> com um padro URL que inclui este JSP.

o que acontece? (Escolha todas as que se aplicam.) O A. Nada. A diretiva page NO foi definida. O B. A diretiva anula a avaliao que o container JSP faz do cdigo

16l '''c/llido.

;; es-A} l",col"l"e-l-lI<; <Jl''Ipe p

li till'e-h"II11<;;.Ie-l-" "pe"J"s

Qual declarao referente aos JSPs verdadeira? (Escolha uma.) o j spIni t () pode ser anulado. O B. Apenas o jspDestroy() pode ser anulado. - Le...,bl'e-se O C. Apenas o _jspService () pode ser anulado. I e tl lilctl. tie 'fpe ~ D. O jspInit() e o jspDestroy() podem ser anulados. seI' fl.J1yltlti. E. O j spIni t () , o j spDestroy () e o _j spService () podem ser anulados.

O A. Apenas

tie t/lI1

338

ca(.)itw'o

usando

o JSP

8 Qual das etapas


D D. Instar
Iitr C.

do ciclo de vida do JSP est fora de ordem?

D A. Traduzir o JSP em servlet. D B. Compilar o cdigo-fonte do servlet.


Call _jspService ()

a classe servlet.
jsplnit() jspDestroy()

DE.

-()

Call

F.Call

Quais das variveis implcitas JSP so vlidas? (Escolha todas as que se aplicam.)

DA.
Iitr

stream e P "'';., exls-!--e"" ce""" - /}s efS4es,/} et.ie+<ls 'Ry-lictJ.<lS Cl",Q.,/"s pele ce",+al",el" pal"a 6S J-sPs.

D B. context
c. exception
application

O D. listener
Iitr E.

10

Seja uma solicitao com dois parmetros: um chamado "first", que representa o primeiro nome do usurio, e o outro chamado "last", que representa seu ltimo nome. Qual cdigo scriptlet JSP gera os valores para estes parmetros? Iitr A.
<%

out.println

(request. getParameter

("first"));

D B. D

out.println(request.getParameter("last";

%> %>

<% out.println(application.getlnitParameter("first";

out.println(application.getlnitParameter("last";

C.<% println(request.getParameter("first"; %> %>

println(request.getParameter("last";

DD.<%

println(application.getlnitParameter("first";

println(application.getlnitParameter("last";

voc est

339

teste preparatrio - respostas

11 Dado:
11. Helio 12. Your 13. Your 14. <% if ${user.name}! number address is <c:out value=H${user.phone}HI>. name=HuserH are valid!<% property=HaddrH } %>

is <jsp:getProperty {%>You

I>

(user.isValid(

Quais declaraes so verdadeiras? (Escolha todas as que se aplicam.)


IilA.

As linhas 11 e 12 (e nenhuma outra) contm exemplos de elementos EL. IilB. A linha 14 um exemplo de cdigo scriptlet. C. Nenhuma das linhas deste exemplo contm um template text. O D. As linhas 12 e 13 incluem exemplos de aes-padro JSP. E. A linha 11 demonstra o uso incorreto da EL. Iil F. Todas as quatro linhas deste exemplo seriam vlidas em uma pgina JSP.

- ft pj4 C e5-/-; t"lc,u'l"e-/-a;IUJI"'1/le/-do.5 45 '1pa-/-l"11"t.uflJsslle/WIkIYlf'14k - ft IJPf4 P e5-/-: tIlCIJt'l"ff~ pl"flle a li7t.a 12 1l41Jli7cllllll/WIa4f4rrpaJI"41J JsP, - ft IJPf4 ~ es+: Ii7CIJI"N':+4; plJl"'Il'e 4 f.L i?4 ili7t.4 V:II(J4. 12
Qual tag JSP exibir o parmetro de inicializao de contexto chamado "javax.sql.DataSource"?
O

kx-/-.

<.JsPv 2.0;
("javax. sql.DataSourceH) %> %>

p~.

A.

<%=

application.getAttribute

IilB.<%= OC.<%= O

application.getlnitParameter("javax.sql.DataSourceH) request.getParameter("javax.sql.DataSourceH) contextParam.get("javax.sql.DataSourceH) %> %>

D. <%=

IJft/.g /WIs-/-t'O, 6ls ClJl"I"ff d tJe+ I'''''pll(:l1- appllca+li?


-

ft

13

Quais declaraes sobre desabilitar elementos scripting so verdadeiras? (Escolha todas as que se aplicam.)
<.JSPv2.0; se{itJ

O A. Voc no pode desabilitar scripting via DD. O B. Voc s pode desabilitar scripting no nvel da aplicao.
desabilitar scripting programaticamente, utilizando o atributo de diretiva de pgina isScriptingEnabled. Iil D. Voc pode desabilitar scripting via DD usando o elemento
<scripting-invalid>.

3.3.3)

O C. Voc pode

- ~c s: p"e desdllt+o.l"

ele/WIel'/+tJs SCl"ip-hi75

<JsP-pl"pel"-/-yrllf> pel PP. () ele/WIel7+ psslbNt+a 311e.tesablltk/WIs 5CI"I.,:';:'''5 4'51117S e. Jsps; deltl7,i7,,(tlpaeil";es eie fJ/(Ls pal"IJ.S!N!/WI ,,(esa!;tlt+a,,(as.

340

captuo 7

usando oJSP

14

Em

seqncia, quais so os tipos Java para os seguintes objetos implcitos

JSP:application,out,request,response,session?

o
O

A. java. lang. Throwable java.lang.Object java.util.Map java. util. Set java.util.List B. javax.servlet.ServletConfig java. lang. Throwable java.lang.Object javax.servlet.jsp.PageContext java.util.Map javax.servlet.ServletContext javax.servlet.jsp.JspWriter javax.servlet.ServletRequest javax.servlet.ServletResponse javax.servlet.http.HttpSession D. javax.servlet.ServletContext java.io.PrintWriter javax.servlet.ServletConfig java.lang.Exception javax. servlet.RequestDispatcher "'1J$+~a I) +SiM - IJ: 6pf';a de cada IJtje+1J ,....,.lIet+lJ.

~c.

15

Qual das opes representa um uma classe em um page page page import import JSP?

exemplo

da sintaxe usada para importar

(JsPv2.0jp~, l-t/t/)
%> @%> %> - fJr$ IJpfaes lJr e b $';IJ lnv'lit1asj ape'ltl.S as declIJ.1"4jaes Jav(J, pade'" (J,S+f4js <% . %:>.
11. "'e; f! I) lIPirCI)f!Xf!"'P'1) , "pj44 sli,+tlJ<:e cl)l"l'e+a.

DA. <%
OB.<%@ ~c.<%@ CJD.<% O E.<%@

import="java.util.Date" import="java.util.Date" import="java.util.Date" java.util.Date; %>

P<31'3l1e vrl" el1+l'f! "

- rr

file="java.util.Date"

%>

-fJr

f.

16

Dado

o JSP: isELIgnored="true" %>

1. <%@ page 2. <%@

taglib

uri=~http://java.sun.com/jsp/jsyl/core'' value="LIMOZEEN"/>

pre:fix="c" %> 3. <c:set var="awesomeBand" 4.

${awesomeBand}
- 0pf';a IJ:: (J, expl"f!SS';1) f.L. 'nl)f'lldlJ. p4S$all -h:X+V41"'f!n-h:. e

Qual ser a sada?

~ A.
O O O

$ {awesomeBand}

B. LIMOZEEN

C.

Nenhuma

sada

D. Uma

exceo ser enviada porque todas as diretivastaglibdevem

preceder qualquer diretivapage.

voc est

341

8 JSf sem scdpts

Pginas sem scripts

Fuja do scripting. Ser que seus webdesigners precisam mesmo saber Java? Isso justo? Ser que eles pensam que quem programa em Java para servidores tornar-se-, digamos, designer grfico? E mesmo que a equipe seja s voc, voc quer mesmo um monte de bits e pedaos de cdigos Java nos seus JSPs? Voc sabe o que significa "um pesadelo na hora da manuteno"? Escrever pginas sem scripts no s possvel, como mais fcil e mais flexvel com a nova especificao JSP 2.0, graas nova Expression Language (EL). Padronizada depois do JavaScript e do XPATH, os webdesigners sentir-se-o em casa com a EL. E voc tambm vai gostar (assim que voc se acostumar). Porm, existem algumas armadilhas ... a EL se parece com o Java, mas no . s vezes, a EL se comporta de forma diferente de como comportar-se-ia a mesma sintaxe no Java. Portanto, fique atento!

este um novo

343

objetivos do exame oficial da Sun

Construir pginas JSP usando a Expression Language (EL) e as Aes-padro


7.1 Escrever um cdigo snippet usando variveis de alto nvel na EL. Isto inclui as seguintes variveis implcitas: pageScope, requestScope, sessionScope e applicationScope; param e param Values; header e headerValues; cookies e initParam. 7.2 Escrever um cdigo snippet usando os seguintes operadores EL: property access (o operador".") e collection access (o operador "O"). 7.3 Escrever um cdigo snippet usando os seguintes operadores EL: operadores aritmticos, operadores relacionais e operadores lgicos. 7.4 Para funes EL: escrever um cdigo snippet usando uma funo EL; identificar ou criar a estrutura de arquivos TDL usada para declarar uma funo EL; e identificar ou criar um cdigo exemplo para definir uma funo EL. 8.1 Dado um objetivo de projeto, criar um cdigo snippet usando as seguintes aes-padro: jsp:useBean (com os atributos "id", "scope", "type" e "class"), jsp:getProperty e jsp:setProperty (com todos os atributos combinados).

Notas sobre a Abrangncia:

Todos os objetivos sobre este assunto so abordados completamente neste captulo. E ele bem grande! V devagar neste captulo, pois temos muitos detalhes minuciosos a encarar.

8.2 Dado um objetivo de projeto, criar um cdigo snippet usando as seguintes aespadro: jsp:include, jsp:forward e jsp:param. 6.7 Dado um objetivo de projeto especfico para a incluso de um segmento JSP em outra pgina, escrever um cdigo JSP que use o mecanismo de incluso mais apropriado (a diretiva include ou a ao-padro <jsp:include.

Neste captulo, vamos falar de AMBOS os mecanismos de include: o <jsp:include>, citado no objetivo 8.2, e a diretiva de pgina include, mencionada no objetivo 6.7 (a maioria dos objetivos da seo 6foi abordada no captulo anterior sobre JSPs).

344

JSP sem scripts

Nossa aplicao MVC depettde dos atributos


Lembra na aplicao MVC original da cerveja, o Servlet controlador interagia com o modelo (classe Java com a lgica do negcio) e criava um atributo no escopo da solicitao antes de envi-Ia view JSP. O JSP tinha que receber o atributo do escopo da solicitao e us-Io para gerar a resposta que seria enviada de volta ao cliente. Eis uma olhada rpida e simplificada de como o atributo vai do controlador para a view (imagine que o servlet se comunique com o modelo): Cdigo do servlet (controlador)
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException ("userName") _ usa o f{).,,:!i,:e+ro Je :>o/l'<::l+(u;';e de fef'h<llb.l'i Pb.I't1.Cl'iiu' a.+l"v+o d~ tJ tJSP uSQ.":, S(;;ltCl';"o.g';o31f! esc"1M da

request. setAttribute

String

name

= request. getParameter

("name", name);

<}

RequestDispatcher

view

request.getRequestDispatcher("/result.jsp"); response); ~
t~,:o.*\I~j~Q.a fttu"t<

view. forward (request,

a vlew.

Cdigo JSP (view)


<html><body> Hello <%= request.getAttribute("name") </body></html> %> (t...el>lbl'e-se: as express6es Je sCl'tp+I~5 Use "'*,4 eXft'ess'; o.+t'lbll+/'J e exlbr-Io. Je sct'i'p+'~5 J'lo.resfos+o.. po.t'f!. 6b+ef' <l

SWIt'i

o o.f'5f.1h<fl'l+ ptU'o. " h<H-eJ"

Heno Paul

'\
ef'a

f.I

c VIJ,/{)f' IIl"

n
J'lfJ.h<e

o.+r"bl.ll-"

voc est aqui

iI>

345

atributos non-Strng

Mas, e se o atributo t'lo for ut\ta Strit'lg, e sit\t ut\ta it'lstt'lcia de Persot'l?
E no s uma Person, mas uma Person com uma propriedade "name". Estamos usando o termo "propriedade" na forma do JavaBean* no-enterprise - a classe Person tem o par de mtodos getNameO e setNameO, que de acordo com a especmcao do JavaBean quer dizer que Person tem uma propriedade chamada "name". No se esquea de que a propriedade "name" requer que a primeira letra, "n", seja alterada. Em outras palavras, o nome da propriedade o que voc obtm ao retirar o prefixo "get" ou "set" e transforma em minscula a primeira letra subseqente. Portanto, getName/setName vira simplesmente name.

foo.Person publico String public void setName(String)

o cdigo
public

servlet
void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException

foo.Person p = new foo.Person(); p.setName(~Evan"); request.setAttribute(~person", p); RequestDispatcher view = request.getRequestDispatcher("result.jsp"); view.forward(request, response);

o cdigo

JSP

<htrnl><body> Person is: <%= request.getAttribute(~person") </body></htrnl>

%>

o que

QUEREMOS:

O que CONSEGUIMOS:
Person is: foo. Person@512d66
01.. (;bvtQIllf!"Jff

Person is: Evan

Q eXpl'eSS4lJ

/ ... d,QlIIlJ/I lJ IIIf'T'(;d(;7,aJI'Q(;

,~

+".5-htl'ljQ

d{J 4+1'1"11/1+(;

*Falaremos sobre JavaBeans daqui a pouco, mas por enquanto, tenha em mente que ele s uma classe Java simples, cujos getters e setters obedecem a uma conveno de nomes.

346

JSP sem scripts

PrecisatMos de tMaiscdigo para obter o "atMe de Perso"


Enviar o resultado do getAttributeO para a declarao de exibir/escrever no nos d o que queremos - isto s roda o mtodo toStringO do objeto. E j que a classe Person no anula o ObjecttoStringO que foi herdado, bem, voc sabe o que acontece. Mas ns queremos exibir o name de Person.

o cdigo

JSP

<htrnl><body>

<% foo.Person p = (foo.Person) Person is: <%= p.getName() %>


</body></htrnl> ~ "'-.....

request.getAttribute(~personff);

%>

c 'xi"!;e

<l

t"es;;!-rad<l J

de je+AJo.!t'leO.

OU usando uma expresso


<htrnl><body> Person is: request.getAttribute(~personff .getName()

<%= foo.Person)
</body></htrnl>

%>

o que

RECEBEMOS:

Person is: Evan

Mas a recordamos aquele LEMBRETE ... Aquele que pode ser resumido em "Use Scripts e Morra" Precisamos de outra tcnica.

voc est

347

JavaBean aes padro

Penot1

UtMJavaJeat1,
de beat1

logo, usaretMos

aes-padro

Com duas aes-padro podemos elinllnar todo o script do nosso JSP (lembre-se: o scripting inclui declaraes, scriptlets e expresses) e ainda exibir o valor da propriedade name do atributo person. No se esquea de que name no um atributo - apenas o objeto person um atributo. A propriedade name apenas aquilo que retomado do mtodo getNameO de Person.

Sem aes-padro
<html><body>

(usando scripting)

t aS stw, fllle
//)."/''lil.o

s1-;;'w,os
f-

<% foo.Person p = (foo.Person) Person is: <%= p.getName() %> </body></html>

request.getAttribute(~person");

%>

Com aes-padro
<html><body> <jsp:useBean Person

(sem scripting)

id="person"

class="foo.Person" <jsp:getProperty

scope="request" name="person"

/> property="name" />

created

by

servlet:

</body></html>

348 captulo 8

JSP sem scripts

At1alisat1do a <jsp:use&eat1> e a <jsp:getProperty>


Tudo o que realmente queramos era a funcionalidade do <jsp:getProperty>, pois queramos apenas mostrar o valor da propriedade "name" de person. Mas como o Container saber o que quer dizer "person"? Se tivssemos no JSP apenas a tag <jsp:getProperty>, seria praticamente como se usssemos uma varivel no declarada chamada "person". O Container geralmente no faz idia do que voc est falando, a menos que voc inclua na pgina PRIMEIRO uma <jsp:useBean>. A <jsp:useBean> uma maneira de declarar e inicializar o objeto bean real que voc est usando em <jsp:getProperty>.

Declarando e inicializando um atributo bean com <jsp:useBean>


scope="request"/>

Obtendo o valor da propriedade

de um atributo bean com <jsp:getProperty>

<jsp:getProperty

name="person"

property="name"

/>

~
Itiel1+f-lica IGleJ1h"ftco. " vali;;" tie

T
(w S~1t.J
seffll" 'l"ic ~"
'ltllll'le=
1J.31.1tl

ti ~e-I-6 bellJ1
Ctlll'l

11"lI'IetJa f'l'fl'letJe.Gle

relll, IS+";ftliJJCftiil':

&l.IefS SlIr ti 5eml' e "lI! classe !;ee."l).

tilJl +1JlJ

//

Alc+o.: eS+4 pl"pl'fetJt!tJe J1fttlt: ~yel' fersa"! 1Jip;.cfl"ietiIJ.tie

11t:ll'le

9Sf:I.IS(~5ea,,>.

CCIl'lc fetilJ,jfJ

tJes+tlI +1JlJ. ct.all'la- se 'lll"Xe

Si'''''Plesil'le''rf-e fJ/?:I"Sll'/ tli ttleli'I'/i'tltl.. I CC"X" 11 dllss/?: eal' CIJ,I./SllllJ,-Il'lI'IiI.

voc est

to-

349

<jsp:useBean>

A <jsp:useJea.,>

tatMbtM pode CRIAR UtMbea.,!

Se <jsp:useBean> no puder encontrar um objeto atributo chamado "person", ele pode construir um! parecido com a forma com que request.getSessionO (ou getSession(true)) funciona: ele primeiro procura por algo existente, mas caso no o encontre, ele cria um. Observe o cdigo do servlet gerado e voc ver o que est acontecendo - tem um teste ifl! Ele procura por um bean baseando-se nos valores de id e escopo na tag, e se no encontrar um, ele cria uma instncia da classe especificada em class, atribui o objeto varivel id e a configura como um atributo no escopo que voc definiu na tag.

Esta tag
<jsp:useBean id="person" scope="request" /> class="foo.Person"

Transforma-se neste cdigo no mtodo -JspService()


!JedlJ.t'tJ. (/#\a VlJf'i~';I'el baSfltJ.i'1,;/-se '1 vu.lifJl' foo.Person person

de M,

null; ~
{

i es+tJ. V4t'I{.vel
d
N:flt'4#\ 4 eM.

3ve pet'lO\l-+e 3ve (w+NJ.$ +~s

sev JSP<.tp/clvslve

de

synchronized

(request)

person = (foo.Person) REQUEST _ SCOPE) ;

jspx_page

context.getAttribute(nperson",
AI

.
J

111+a e/;+et'

<)

1J.+t'l!Jv+tJ P/li escilpiJ

\ r v 1I1J.1'1(;.vel il<)c ,;/ef,),lllM. '11<

+~e o.+t'"J,l/l

PageContext.

JlA./tS; se AJ/ttJ I.,wllet' 11#\


if (person

null) { ~

i1<)lO\e esclJp<)", I1tJ

_jspx~age_context.setAttribute(nperson",

person,

PageContext.REQUEST_SCOPE);

:,),lJ.lhle~; lJ.+d!;v-rtJ

c<)p/fljf.lt'e

IJ

11<)';1'<) lIfJe-I-fJ ctJlO\fJ1110\


'"

'1 esc"pfJ ave vlIce tlefi'J'llll.

350 capitulo 8

JSP sem scripfs

Isto pode ser uma coisa ruim - eu no QUERO ter um bean que no tenha seus valores de propriedade configurados! Se o Container cria um bean usando essa tag, o bean no ter valores de propriedade ...

Voc pode usar a <jsp:setProperty>


Mas voc j sabia que onde existe um get geralmente existe um set. A tag <jsp:setProperty> a terceira e ltima ao-padro bean. simples de us-Ia:
<jsp:useBean id="person" class="foo.Person" scope="request" <jsp:setProperty name="person" property="name" value="Fred" />

/>

voc est aqui...

351

<jsp:useBean>

com um

CO!PO

<jsp:useJeat1> pode ter Ui\tcorpo!

Se voc puser seu cdigo set (<jsp:setProperty dentro do corpo de <jsp:useBean>, a configurao da propriedade torna-se condicional! Ou seja, os valores da propriedade sero configurados apenas se um novo bean for criado. Se for encontrado um bean j existente com aquele escopo e id, o corpo da tag nunca ser executado, e assim, a propriedade no ser sobrescrita pelo seu JSP.

Com o corpo de uma <jsP:UseBean>, voc pode ter um Cdigo que rode de forma Condicional.

SOMENTE se o atributo bean no for localizado e um novo bean for criado.

Sei?< a

bfJ./f'I'fJ.! ~

<jsp:useBean

id="person"

class="foo.Person"

scope="page"

>

</jsp:useBean

>
t{VI.l!tJvel'
fJ.

~"rali?<e'1hJ 3i1e' exts+tl'

lecl.a.i?<.rJs 1;;,/" <l eJ'l+l'e der1"vf'a. e Q


I.l

+:'

':'/'5"I,/el1+l'a

<jsp:vse8efJ.'1:>

,/a C(Jl'f" '/e I e Co!JJ)ICI!)!JIrI.-. i/e 5!)


btaJ1 ..,";cfcl' e"'CM+ra.,/c

exeCII+a.,/ se c
e VIVi 'fav., fl:>l'

le,I.fJ.lVien+" '/a +",

a ca/f'p".

'1'1"4'/1:>.

r:

Por que eles no deixam que voc simplesmente especifique argumentos no construtor do bean? Por que afinal voc tem que se preocupar com a configurao de valores extras?

1) Voc TEM que ter um construtor-padro pblico. 2) Voc TEM que nomear os seus mtodos pblicos get e set iniciando com "get" (ou "is", se for booleano) e "set", seguidos pela mesma palavra (getFooO, setFoo()). O nome da propriedade ser obtido retirando-se o "get" e o "set" e trocando para minscula a primeira letra do que restar. 3) O tipo do argumento set e o tipo de retorno do get TM que ser idnticos. isto que define o tipo da propriedade.

A resposta simples: beans no podem TER construtores com argumentos! Bem, como uma classe Java, eles podem, mas quando um objeto tratado como bean, a Lei Bean diz que SOMENTE o construtor-padro pblico do bean ser invocado. Ponto final. Alis, se voc NO tiver um construtor-padro pblico na sua classe bean, tudo isso vai falhar mesmo.

1\:

int getFooO

void setFoo(int

foo)

1\: Que negcio esse de Lei Bean?

r:

a lei que segue a especificaocreakingly-ancient dos JavaBeans. Estamosfalando de JavaBeans,e NO de Enterprise JavaBeans (EJB), que no tem nada a ver (v at a figura).A especificaosimples para JavaBeans no-enterprisedefine o que uma classe precisa para ser um JavaBean. Emboraa especificaoseja, de fato, um tanto complexa,as nicas coisas que voc precisa saber para usar beans com JSP e servletsso estas poucas regras (mostramosapenas aquelas que se aplicam ao que estamos estudandocom servletse JSPs):

4) O nome e o tipo da propriedade derivam do get e set, e NO de um membro na classe. Por exemplo, s porque voc tem uma varivel privada int foo NO significa nada em termos de propriedades. Voc pode dar s suas variveis o nome que bem entender. O nome da propriedade "foo" vem dos mtodos. Em outras palavras, voc tem uma propriedade simplesmente porque voc tem o get e o set. Como voc os implementar fica sob sua responsabilidade. 5) Para uso com JSPs, o tipo da propriedade DEVE ser ou uma String, ou uma primitiva. Caso contrrio, ele ainda poder ser um bean, mas voc no poder confiar apenas nas aespadro e ter que usar scripts.

352 capfuio 8

JSP sem scripts

o servlet

gerado quat1do <jsp:useJeat1> tet\1 Ut\1corpo

simples. O Container coloca o cdigo extra para configurao da propriedade dentro do teste if.

o cdigo

no -ispServiceO

COM o corpo <jsp:useBean>


Pr6cllI'a f~'" illt'la+rlbv+ extsh:Plh: c" PI"lt'le esc"f" " li!
do.

person ~ SCOPE) ; if

(foo.Person)

jspx_page

context.getAttribute(nperson",

"
'"
0.<>

+~.
tJe+ btJ!l"

PageContext.PAGE
'1<>\16

(person person

== null) I

<:

5e "';6 II!Xis-h,.

I}It'lo.l'l"4
"I!Plt.(I"";

<>

crte "'"6i/0. i""S+~ct4. 0.


person,

esc(Jf espedflcad6.
;

= new foo.person();~
context.setAttribute(nperson",

jspx_page

PageContext.PAGE_SCOPE)

voc est

353

referncias polmrfcas

Voc sabe fazer refermcias

politMrficas para beatls?

Quando voc escreve um <jsp:useBean>, o atributo da classe determina a classe do novo objeto (se algum foi criado). Ele tambm determina o tipo da varivel de referncia usada no servlet gerado.

A maneira ATUAL no JSP

<jsp:useBean scope="page"
Servlet gerado

id="person"

class=
() a+ri"!J(J+lI tia elas se "
,~"-

/>

'7tJ.+as reprli!sli!'7+tJ.
Ao.

tJ.

", relere'7'''a f. li -hPfJ tio person

= null;

\{ie+fJ
o atributo de perso~

Ii
if

cdigo

para

recuperar

(person == null) { = new

~--~~ ?

person

Mas ... e se quisermos que o tipo de referncia seja diferente do verdadeiro tipo do objeto? Ns alteraramos a classe Person para tom-Ia abstrata e criaramos uma subclasse concreta Employee. Imagine que queremos que o tipo de referncia seja Person e o novo tipo do objeto seja Employee.

package

foo;

public ab . S ract cl PrlVate St. ass Person rlng name;

I
I

public Void this.name_SetNamerString -name;

public Strin return g getName r) name; . class EmP~oyee publlc . t eTC\plD, private ln

exten d 5 person

ID\int .d setEmp lic vOl pub ID=empID; this.emp

empID)

. etempID \) blic lnt 9 pu return emplD;

354

JSP sem scripts

Adieiot1at1do UlIt atributo ~

a <jsp:useJeat1>
cksseabs+ra+a ~

Com as alteraes que acabamos de fazer na classe Person, estaremos em apuros se o atributo no for localizado: Nosso JSP original

class Person String getNameO void setName(String)

<jsp:useBean

id="person"

class="foo.Person"

scope="page"l>

Tem este resultado


java.lang.lnstantiationError: foo.Person

class Person String getNameO void setName(String)

PerstlP? D.JtlN. ~ ds+ro.h.l

Porque o Container tenta:

f)!;vio.",e#l.f-e)

voc "1" po;;{e el'rar


Ctl,rlY<l1el' o.l1;;{o.

V"'~ ",as

<)

new foo. Person ();+e17:j.~ !;aseo."';;{(l- se 1M 0.+1'1'/11.1+6 ;;(a elas se l7a +tJ.j.

Precisamos transformar o tipo de varivel de referncia em Person, e o objeto, uma instncia da classe Employee. Faremos isso adicionando um atributo type tag. Nosso novo JSP com um type
<jsp:useBean id~"person" type~"foo.Person"

class~"foo.Employee"

scope~"page">

~ null;

) //
o atributo de person

Ii
if

cdigo para recuperar (person == null) { ~ new

----~>-

person

;~---

o type pode ser um tipo de classe, um tipo abstrato ou uma interface qualquer coisa que voc possa usar como um tipo de referncia declarada para o tipo de classe do objeto bean. Voc no pode violar as regras de tipos do Java, claro. Se o tipo da classe no puder ser atribudo ao tipo de referncia, voc est "ferrado". Isso significa que a class deve ser implementao concreta do type.

voc est

li'

355

tipos sem a class

Usai1do

type setlt a class

o que acontece se declaramos um type, mas no uma class? Faz diferena se o tipo abstrato ou concreto?

JSP
<jsp:useBean id="person"

'"

/seht

cllJ.ss) 4pel1lJ.s~7fe
scope~"page"/>

type="foo.Person"

Resultado, caso o atributo person j exista no escopo da "page" Funciona perfeitamente.

Resultado, caso o atributo person NO exista no escopo da "page"


Java. lang. InstantiationException: bean person no encontrado no escopo

'"

AlAo FUAlCZOAlA!!

f:

No seu exemplo, "foo.Person" um tipo abstrato, por isso, BVIO que ele no pode ser instanciado. E se voc alterar o type para "foo.Employee"? Ele vai usar o type para a referncia E o tipo do objeto?

No existe uma regra para preveno que diga: "se voc no encontrar o objeto, use o type para a referncia E para o objeto." No, NO assim que funciona. Observao importante: se for usar o type sem a class, melhor ter CERTEZA de que o bean j esteja armazenado como um atributo - no escopo - e com a id que voc especificou na tag.

1\:

NO! No vai funcionar. Se o Container descobre que o bean no existe e v s um atributo tipo sem uma classe, ele sabe que voc ofereceu a ele apenas METADE do que ele precisa - o tipo de referncia, mas no o tipo do objeto. Ou seja, voc no disse a ele o propsito de criar uma nova instncia!

356 captulo 8

padro para "pageN o na . <jsp:getProperty> , o Cont'amer usa o padro da "page". ' nem na p tag <jsp:useBean>

o a~b~o

s~voce nao especificar um esco

escopo apoma

COtltO

Isto
<jsp:useBean id="person" class="foo.Employee" scope="page"j>

o mesmo que isto


<jsp:useBean id=Hperson" class="foo.Employee"j>

No confunda ~

com class!

Observe este cdigo:


<jsp:useBean id="person" type="foo.Employee" class="foo.person"/>

Prepare-se para reconhecer que ele NUNCAfuncionar!

Voc vai receber um belo:


class for JSP

org.apache.jaSper.JasperException: Unable to compile foo.Person is abstract; cannot be instantiated Person = new foo.Person();

Esteja CERTO de lembrar que:

type = = tipo de referncia class = = tipo do objeto

Ou, explicando de outra forma: type O que voc

DE(LARA (pode ser abstrato) class o que voc INSTANCIA (tem que ser concreto) type x = nova classO

Agora, voc deve estar pensando: "Bem, class sempre classe, mas type no tem que ser _ type pode ser uma interface. Portanto, CLARO que eles usaram 'class' para representar aquilo que SEMPRE tem que ser classe e 'type' para aquilo que pode ser interfaces tambm." E voc estaria certo. Mas voc tambm est pensando, "claro, nem TUDO na especijicap tem o nome mais intuitivo e bvio possvel; portanto, melhor eu ficar esperto". As vezes (como em security <auth-constraint, o nome de uma coisa o oposto do que ela realmente . Porm, neste caso, class classe e type ... tipo.

voc est

exerccos sobre

para Bean

Observe esta ao-padro:


<jsp:useBean value="Fred" </jsp:useBean Name id="person" type="foo.Employee" >

<jsp:setProperty

name-"person"

property="name"

/>
> name="person" property="name"

is: <jsp:getProperty

I>

Person String getNameO oid setName(String)

Agora, imagine que um servlet atue e encaminhe a solicitao ao JSP que possui o cdigo acima. Tente descobrir o que este JSP faria para cada um dos dois exemplos de cdigo servlet. (Respostas no final deste captulo.)

O que acontece se o cdigo do servlet se parecer com:


foo.Person p = new foo.Employee();

p.setName(~Evan"); request.setAttribute(~person", p);

e
A-i>l!;U 116paC6ff

O que acontece se o cdigo do servlet se parecer com:


foo.Person p = new foo.Person();

as classes es.f.';6 n H
f6 ,.)

p.setName(~Evan"); request.setAttribute(~person", p);

358

captuo B

Acabei de pensar numa coisa... suponha que no estejamos usando um servlet controlador e o formulrio HTML v direto ao JSP... existe uma forma em que eu possa usar os parmetros da solicitao para configurar uma propriedade bean, SEM usar script?

b,do direto da solicitao ao JSP setMpassar por UtM servlet ...


Imagine que este seja o nosso formulrio:

<html><body>

It sllcl-l-tl.{ !JI/tiro val


~ tl.JsP.

<form action=~TestBean.jsp">
name: <input type=~text" name~~userName"> ID#: <input type~~text" name=~userID"> <input type="submit"> </form> </body></html>

Sabemos que podemos fazer isso, combinando aes-padro com scripting:


<jsp:useBean id=~person" type=~foo.Person" class=~foo.Employee"/>

<% person.setName(request.getParameter(~userName";

%>

Podemos at mesmo fazer isto, com o scripting DENTRO de uma ao-padro:


<jsp:useBean id=~person" type=~foo.Person" class~~foo.Employee">

<jsp:setProperty name=~person" property=~name" value=~<%= request.qetParameter(~userName") %>" />


</jsp:useBean>
...

Si~

V6Ct!

Sr.t}

Ve'7d6 VlI'ltl

express';e.!JAlr/ttJ
JU.f5JU.O.

dtl.

'9SP:Se.f-R.4pt!J"-Iy> (~f.lese e'7c"Jrf.J"tl de"J-I-rill

d" c"rp<J

de VlI'ltl

-I-~'9sp:vse8ea'7.Sl~ lel"

voc est

usando param

o atributo

paratM d UtMa ajuda

muto simples. Voc pode enviar um parmetro de solicitao direto para um bean, sem scripts, usando um atributo param.

Dentro de TestBean.jsp
<jsp;useBean id~"person" type~"foo.Person" class~"foo.Employee"> param="userName" />

<jsp;setProperty </jsp;useBean>

name~"person"

property~"name"

<html><body> <for.m action="TestBean.jsp"> narne: <input type="textU name="userNamefr> 1D#; <input type="text" name="user1D"> <input type="submit"> </form> </body></html>

360

Mas espere! Ele fica ainda tttelhor...


E tudo que voc tem a fazer ter certeza de que o nome do campo de entrada de dados (o qual se toma o nome do parmetro da solicitao) seja o mesmo que o nome da propriedade no seu bean. A, na tag <jsp:setProperty>, voc no precisar especificar o atributo param. Se voc nomear a propriedade e no especificar um valor ou param, voc estar dizendo ao Container que obtenha o valor do parmetro da solicitao cujo nome seja idntico.

Se alterarmos o HTML para que o nome do campo de entrada de dados coincida com o nome da propriedade:

<html><body> <form action="TestBean.jsp"> name: <input type="text" name="name"> ID#: <input type~"text" name~"userID"> <input type="submit"> </form> </body></html>

Temos que fazer ISTO


<jsp:useBean id="person" type="foo.Person" class="foo.Employee"> I>

<jsp:setProperty </jsp:useBean>

name~"person"

property~"name"

voc est

propriedades

e parmetros

da soieifao

Se voc agetttar, ele MELHORA ainda tMais ...


Observe o que acontece se voc fizer com que TODOS os nomes dos parmetros da solicitao coincidam com os nomes das propriedades do bean. O bean person (que uma instncia de foo.Employee), na verdade possui duas propriedades--name e empID.

Se alterarmos o HTML novamente

A50t'4l.l1rJL.t80S os fat'~e-J.t'os c,,*, os J'lo*,es tias ft'oft'tetlatles

cotJ'lcliJe*, tio betJ.J'I.

<htrnl><body> <form action="TestBean.jsp"> name: <input type="text" name="name"> ID#: <input type~"text" name="empID"> <input type="subrnit"> </forrn> </body></htrnl>

Teremos que fazer isto


<jsp:useBean id="person" type~"foo.Person" class~"foo.Ernployee"> <jsp:setProperty name~"person" property="*" I> </jsp:useBean>

Eu quero que voc faa uma varredura pelos parmetros da solicitao e encontre algum que coincida com os nomes das propriedades do bean, alm de configurar o VALOR das propriedades para que seja igual ao valor do parmetro da solicitao correspondente ...

JSP

Container

362 capitulo 8

As tags do beatl COtlverteiftas propriedades priiftitivas autoiftaticaiftetlte


Se voc j conhece o JavaBeans h algum tempo, isto no surpresa alguma. As propriedades do JavaBeanpodem ser qualquer coisa, mas se forem Strings ou primitivas, todo o esforo feito por voc. Tudo bem - voc mesmo no tem que fazer a anlise e a converso.

Se colocarmos type Employee (em vez de Person)


<html><body> <jsp:useBean id="person" type="foo.Employee" class="foo.Employee" <jsp:setProperty name="person" property="*" /> </jsp:useBean> Person is: <jsp:getProperty name="person" property~"name" /> ID is: <jsp:getProperty name="person" property="empID" /> </body></html> >

Tudo funciona

A ac;9 <:)sp:setl't9peltj>
recebe 9 patmett9 s91lCltac;9,C9n'ette-9 1nt e passa este mt:9d9 set d9 a'Lue1apt9pdedade.
Person is: Kathy 10: 343 ~
A-5,,1""J

a fI"6fl"l'eeiadf! e...,Ib
+a""bJ1.

IVI'/ci'J16t1

voc est

converso prmitva

f etguntas Id'l9tlS r:

N9 ex1st<;;m

Tudo certo, estou considerando que o cdigo do Container esteja fazendo algo como Integer.parselnt("343"). Ou seja, voc no vai receber um NumberFormatException se o usurio digitar algo que no possa ser transformado em int? Por exemplo, se o usurio digitar "trs" no campo 10 do employee?

r:

Se uma propriedade de um bean no tem que ser uma String ou uma primitiva, ento COMO voc configuraria a propriedade sem usar scripts? O valor do atributo da tag ser sempre String, certo?

1\: possvel

1\: Bem pensado. Sim, com certeza algo dar


errado se o parmetro da solicitao para a propriedade emplO no puder ser analisada dentro de um int. Voc precisa validar o contedo do campo para ter certeza de que possui apenas caracteres numricos. Voc pode enviar primeiro os dados do formulrio para um servlet, em vez de envi-Ios direto para o JSP. Mas se voc est determinado a envi-Ios diretamente ao JSP - e voc no quer scripts -, basta usar JavaScript no formulrio HTML para verificar o campo antes de enviar a solicitao. Se voc no sabe JavaScript (que, na verdade, no tem quase NADA a ver com Java), uma linguagem baseada em scripts que roda no lado do cliente. Em outras palavras, no browser. Uma busca rpida na internet por "validao de campo JavaScript" deve trazer alguns scripts que voc pode usar para impedir que usurios entrem com, digamos, alguma coisa diferente de nmeros em um campo de entrada de dados.

(mas seria *muito* trabalhoso) criar uma classe especial, chamada editor de propriedades, que suporte o bean. Ela recebe o valor da sua String e descobre como transform10 em algo que possa ser usado para configurar um tipo mais complexo. Mas, isto parte da especificao JavaBeans, no da especificao JSP. E tambm, se o valor do atributo da tag <jsp:setProperty> for uma expresso, em vez de uma String literal, e SE tal expresso converter um objeto que seja como o tipo da propriedade do bean, a provavelmente funcionar. Se voc passar uma expresso que converta Oog, por exemplo, o mtodo setDog(Oog) do bean Person ser chamado. Mas observe, isto quer dizer que o objeto Oog j deve existir. De qualquer forma, melhor voc NO tentar construir novas coisas no seu JSP! Tentar fugir da criao e configurao de tipos de dados relativamente complexos vai ser difcil sem scripts. (E nada disso cai na prova.)

A converso automtica String-primitiva NO funciona se voc usar scripts! Ela d erro, mesmo que a expresso esteja DENTRO da tag <jsp:setProperty>.
Se voc usar a tag de ao-padro <jsp:setProperty> com a propriedade asterisco, OU simplesmente o nome de uma propriedade sem valor ou sem o atributo param (que significa que o nome da propriedade coincide com o nome do parmetro da solicitao), OU usar um atributo param para indicar que o parmetro da solicitao cujo valor deve ser atribudo propriedade do bean, OU usar um valor literal, a converso automtica de String para int funciona. Cada um dos exemplos abaixo converte automaticamente:
<jsp:setProperty <jsp:setProperty <jsp:setProperty <jsp:setProperty name~"person" name~"person" name~"person" name="person" property~"*" I> I> value="343" property="empID" property="empID" property~"empID"

MAS. .. se voc usar scripts, a converso automtica NO funciona:


<jsp:setProperty name~"person" getParameter ("empID") %>"1> property="empID" value~"<%=

JSP sem scripts

qu?! Sinto-me TO aliviada em descobrir como muito mais fcil usar as tags, em vez de scripts. Os benefcios pra mim so gigantescos.

As tags de aes-padro do bean podem ser mais fceis para quem no programador.
Novamente, os beneficios de usarmos tags no lugar dos scripts tm mais a ver com os webdesigners que com voc (o programador lava). Embora at os programadores lava achem as tags mais fceis de serem mantidas do que os elementos hard-coded do scripting lava. Com as tags relacionadas a bean, o designer precisa apenas das informaes bsicas de identificao (nome do atributo, escopo e o nome da propriedade). verdade, eles tm que conhecer tambm o nome completamente qualificado da classe, mas pelo que consta para eles, isso apenas um nome com pontos (.) dentro. O webdesigner no precisa ter qualquer conhecimento sobre o que acontece por trs disto, e eles consideram beans como registros com campos. voc quem diz aos designers o registro (a classe e o identificador) e os campos (as propriedades). Alm disso, as aes-padro do bean no so to elegantes como poderiam ser. E por isso que nossa histria sobre pginas sem scripts no termina aqui. Continue lendo ...

voc est