You are on page 1of 107

Bi dch mn Lp trnh Java

Nhm sinh vin thc hin:


1. Th Hoi Thu
2. Nguyn Duy Hng
3. inh Nht Duy
4. Hong Th Qunh Trang
5. Nguyn Th Hng Nhung
6. Hong Th Thanh Huyn
7. Nguyn Vn Mnh
8. Phm Th Hng
9. Hong Hng Sn

15.
To ty chnh cc thnh phn giao din ngi dng v
tu chnh i tng khc
JavaServer Faces cng ngh cung cp mt b c bn ca tiu chun, thnh phn
giao din ngi dng ti s dng UI cho php xy dng nhanh chng v d dng giao
din ngi dng cho cc ng dng web. Nhng thnh phn ch yu l bn mt-nmt cc yu t trong HTML 4 Nhng thng mt ng dng i hi mt thnh phn c
chc nng b sung hoc yu cu mt thnh phn hon ton mi. JavaServer Faces cng
ngh cho php m rng tiu chun cc thnh phn tng cng chc nng ca h hoc
to ra cc thnh phn ty chnh. Mt giu h sinh thi ca th vin thnh phn ca bn
th ba c xy dng trn kh nng m rng ny, nhng n nm ngoi phm vi ca
hng dn ny kim tra chng. Mt tm kim web cho "JSF Component Libraries"l
mt im khi u tt tm hiu thm v kha cnh quan trng ca vic s dng Cng
ngh JavaServer Faces.
Ngoi vic m rng cc chc nng ca cc thnh phn tiu chun, mt thnh phn
nh vn c th mun cho mt tc gi trang kh nng thay i s xut hin ca thnh
phn trn trang web hoc thay i hnh vi ca ngi nghe. Ngoi ra, cc thnh phn nh
vn c th mun lm cho mt thnh phn cho mt loi khc nhau ca loi thit b ca
khch hng, chng hn nh l mt in thoi thng minh hoc my tnh bng thay v mt
my tnh bn. Kch hot bng cch linh hot JavaServer Faces kin trc, mt nh vn
thnh phn c th tch ring nh ngha ca hnh vi thnh phn t s xut hin ca mnh
bng cch chuyn giao vic cung cp cc thnh phn vo mt b ti ta ring bit. Bng
cch ny, mt nh vn thnh phn c th xc nh hnh vi ca mt thnh phn ty chnh
mt ln nhng to ra nhiu kt xut ha, trong s nh ngha mt cch khc nhau
lm cho cc thnh phn cho mt loi c bit ca thit b khch hng.
Javax.faces.component.UIComponent l mt lp Java c trch nhim i din cho
mt phn khp kn ca giao din ngi dng trong yu cu x l vng i.N c thit
k i din cho ngha ca cc thnh phn; cc hnh nh i din ca cc thnh phn
l trch nhim ca cc javax.faces.render.Renderer. C th c nhiu trng hp ca cng
mt thnh phn lp UI trong bt k JavaServer Faces cho xem, cng nh c th c nhiu
trng hp ca bt k lp Java trong bt k chng trnh Java c.

JavaServer Faces cng ngh cung cp kh nng to ra cc thnh phn ty chnh


bng cch m rng cc lp thnh phn UI , lp c s cho tt c cc thnh phn giao din
ngi dng chun.Mt thnh phn ty chnh c th c s dng bt c ni no mt
thnh phn bnh thng c th c s dng, chng hn nh trong mt thnh phn tng
hp. Mt thnh phn UI c xc nh bi hai ci tn: component-family, xc nh mc
ch chung ca cc thnh phn (u vo hoc u ra, v d), v thnh phn kiu cho cc
mc ch c th ca mt thnh phn, chng hn l mt lnh vc u vo vn bn hoc
mt nt lnh.
Mt b ti to l mt thnh phn tr gip cho thnh phn UI giao dch vi cch c
th thnh phn lp UI s xut hin trong mt loi thit b c th ca khch hng.kt xut
ha l xc nh bi hai ci tn: b ti to nh v b ti to loi. Mt b dng c lm l
mt x vo mt nhm c bit ca kt xut ha c t, v b ti to nh xc
nh nhm. Hu ht JavaServer Faces th vin thnh phn cung cp ca mnh lm cho b
dng c.
Mt i tng javax.faces.view.facelets.Tag l mt thnh phn tr gip cho thnh
phn UI v b ti to cho php tc gi trang bao gm mt th hin ca mt thnh phn
UI trong mt JavaServer Faces xem.Mt th i din cho mt s kt hp c th ca thnh
phn loi v b ti to loi.B ti to, v t kha kt hp vi thng tin v cch thnh
phn, kt xut ha, v cc th tng tc.
Chng ny s dng cc thnh phn hnh nh bn t trng hp nghin cu
sch ca Duke v d gii thch lm th no bn c th to ra cc thnh phn ty chnh
n gin, kt xut ha ty chnh, v kt hp cc th ty chnh, v chm sc ca tt c
cc chi tit khc lin quan n s dng cc thnh phn v trnh biu din trong mt ng
dng. Xem Chng 57, "Nh sch Duke Trng hp nghin cu V d " bit thm
thng tin v v d ny.
Chng ny cng m t lm th no to cc i tng ty chnh khc: chuyn
i ty chnh, nghe ty chnh, v xc nhn ty chnh. N cng m t lm th no lin
kt thnh phn gi tr v trng hp cc i tng d liu v lm th no rng buc
i tng ty chnh c qun l ti sn. Cc ch c cp y:
Xc nh Cho d bn cn mt phn ty chnh hoc b ti to
Hiu v d hnh nh bn
Cc bc to mt phn ty chnh
To Lp hc phn ty chnh

Ra y thc cho mt b ti to
Thc hin mt s kin
X l s kin cho cc thnh phn ty chnh
Xc nh m kha phn ty chnh trong mt m t t kha th vin
S dng mt phn ty chnh
To v s dng mt chuyn i ty chnh
To v s dng mt xc nhn tu chnh
Gi tr phn ng sch v trng hp qun l thuc tnh
chuyn i ng, thnh gi, v xc nhn qun l thuc tnh

15.1 Xc nh Cho d bn cn mt phn ty chnh hoc ti to


JavaServer Faces thc hin h tr mt tp rt c bn ca cc thnh phn v kt
xut ha lin quan. Phn ny s gip bn quyt nh xem bn c th s dng tiu
chun thnh phn v kt xut ha trong ng dng ca bn cn mt phn ty chnh
hoc ty chnh b ti to.

15.1.1 Khi s dng mt phn ty chnh


Mt lp thnh phn xc nh tnh trng v hnh vi ca mt thnh phn giao din
ngi dng. hnh vi ny bao gm chuyn i gi tr ca mt thnh phn nh du
thch hp, xp hng s kin trn cc thnh phn, xc nhn vic thc hin, v bt c hnh
vi khc lin quan n cch cc thnh phn tng tc vi cc trnh duyt v vng i yu
cu ch bin .Bn cn phi to ra mt thnh phn ty chnh trong cc trng hp sau y.
Bn cn phi thm hnh vi mi cho mt thnh phn tiu chun, chng hn nh to ra
mt loi b sung ca s kin (v d, thng bo mt phn khc ca trang mt ci g
thay i trong thnh phn ny nh l mt kt qu ca s tng tc ngi dng).
Bn cn phi c mt hnh ng khc nhau trong vic x l yu cu ca cc gi tr ca
mt thnh phn t nhng g c sn trong bt k ca cc thnh phn tiu chun hin hnh.
Bn mun tn dng li th ca mt kh nng HTML c cung cp bi trnh duyt
mc tiu ca bn, nhng khng c JavaServer Faces tiu chun thnh phn tn dng li
th ca nng lc theo cch bn mun, nu tt c. Phin bn hin ti khng cha thnh

phn tiu chun cho cc thnh phn HTML phc tp, chng hn nh khung; Tuy nhin, v
s m rng ca cc thnh phn kin trc, bn c th s dng JavaServer Phi i mt vi
cng ngh to ra cc thnh phn nh th ny. Nghin cu trng hp sch ca Duke
to ra thnh phn ty chnh tng ng vi cc bn v cc th HTML khu vc.
Bn cn phi lm cho khch hng khng phi HTML i hi thm cc thnh phn
khng h tr HTML. Cui cng, HTML tiu chun lm b s cung cp h tr cho tt c
cc thnh phn HTML tiu chun. Tuy nhin, nu bn ang mun em n cho mt
khch hng khc nhau, chng hn nh mt chic in thoi, bn c th cn to ra cc
thnh phn ty chnh i din cho cc iu khin h tr duy nht ca khch hng. V
d, mt s kin trc thnh phn cho cc khch hng khng dy bao gm h tr cho m,
m khng c sn trn mt khch hng HTML.Trong trng hp ny, c l bn cng cn
mt b ti to ty chnh cng vi cc thnh phn, hoc bn c th ch cn mt ty chnh
renderer.Bn khng cn phi to ra mt thnh phn ty chnh trong cc trng hp sau
y.
Bn cn phi tp hp cc thnh phn to ra mt thnh phn mi c ring ca mnh
hnh vi c o. Trong tnh hung ny, bn c th s dng mt thnh phn tng hp
kthp hin c thnh phn tiu chun. bit thm thng tin v cc thnh phn tng hp,
xem tng hp cc thnh phn v Chng 14, "tng hp cc thnh phn: nng cao ch
v mt v d ".
Bn ch cn thao tc d liu trn cc thnh phn hoc thm ng dng c thchc nng
cho n. Trong tnh hung ny, bn nn to mt thuc tnh c qun l cho iu nymc
ch v gn n vo cc thnh phn tiu chun ch khng phi l to ra mt ty chnh
thnh phn. Xem Qun l u trong JavaServer Faces Cng ngh cho hn thng tin v
ht qun l.
Bn cn phi chuyn i d liu ca mt thnh phn cho mt loi khng c h tr
bi b ti to ca n.Xem S dng chuyn i tiu chun bit thm thng tin
vchuyn i mt d liu thnh phn ca.
Bn cn phi thc hin xc nhn trn cc d liu thnh phn. Xc nhn tiu chun v
xc nhn ty chnh c th c thm vo mt thnh phn bng cch s dng cc th
xcnhn t trang. Xem S dng xc nhn tiu chun v To v s dng mt xc nhn ty
chnh bit thm thng tin v xc nhn d liu ca mt thnh phn.
Bn cn phi ng k lng nghe s kin trn cc thnh phn. Bn c th ng k s
kin nghe trn cc thnh phn bng cch s dng f: valueChangeListener v f:
ActionListener th, hoc bn c th ch vo mt phng php x l s kin trn mt bean

c qun l bng cch s dng thnh phn hoc thuc tnh valueChangeListener. xem
Thc hin mt s kin nghe v vit phng php qun l thuc tnh bit thm thng
tin.

15.1.2 Khi s dng mt b ti to tu chnh


Mt b ti to, to ra cc nh du hin th mt thnh phn trn mt trang web,
cho php bn tch ng ngha ca mt thnh phn t xut hin ca n. bng cch gitch
ny, bn c th h tr cc loi thit b khc nhau ca khch hng vi cng mt loi kinh
nghim ca tc gi. Bn c th ngh ra mt b ti to nh l mt "b chuyn i khch
hng." n to u ra ph hp cho tiu dng v hin th ca khch hng v chp nhn u
vo t khch hng khi ngi dng tng tc vi cc thnh phn . Nu bn ang to ra
mt thnh phn ty chnh, bn cn phi m bo, trong s nhng th khc, m lp thnh
phn ca bn thc hin cc hot ng ny l trng tm v cc thnh phn:
Gii m: Chuyn i cc thng s yu cu gi n gi tr a phng ca thnh phn
M ha: Chuyn i gi tr hin ti a phng ca cc thnh phn vo nh du tng
ng i din cho n trong phn ng JavaServer Faces c im k thut h tr hai m
hnh lp trnh x l m ha v gii m.
Thc hin trc tip: Lp thnh phn chnh thc hin vic gii m v m ha.
Thc hin phn quyn: Cc i biu lp thnh phn thc hin m ha v gii m cho
mt b ti to ring bit. Bng cch y quyn hot ng cc b ti to, bn c ty
chn lin kt ca bn thnh phn ty chnh vi kt xut ha khc nhau bn c th
lm cho cc thnh phn trn khch hng khc nhau. Nu bn khng c k hoch lm
cho mt thnh phn c bit vo khch hng khc nhau, n c th l n gin cho cc
lp thnh phn x l cc khung cnh. Tuy nhin, mt b ti to ring bit cho php bn
duy tr s tch bit v ng ngha t xut hin.ng dng sch ca Duke tch kt xut
ha t thnh phn, mc d n m ch n HTML 4 trnh duyt web. Nu bn khng chc
chn liu bn s cn s linh hot c cung cp bi kt xut ha ring bit nhng bn
mun s dng phng php tip cn trc tip thc hin n gin, bn thc s c th s
dng c hai m hnh. Lp thnh phn ca bn c th bao gm mt s m cung mc nh,
nhng n c th giao kt qu ca mt b ti to nu c.

15.1.3 Thnh phn, b ti to, v kt hp t kha


Khi bn to ra mt thnh phn ty chnh, bn c th to ra mt b ti to ty chnh
i vi n. kt hp cc thnh phn vi cc b ti to v tham kho cc thnh

phn t trang, bn cng cn c mt th ty chnh.Mc d bn cn phi vit thnh phn


ty chnh v b ti to, khng c nhu cu vit m cho mt th ty chnh (gi l x l
th).Nu bn ch nh cc thnh phn v kt hp b ti to, Facelets to ra b x l th t
ng.Trong nhng trng hp him hoi, bn c th s dng mt b ti to ty chnh vi
mt thnh phn tiu chun ch khng phi hn mt phn ty chnh. Hoc bn c th s
dng mt th ty chnh m khng c mt renderer hay thnh phn. Phn ny a ra v d
v nhng tnh hung ny v tm tt l g cn thit cho mt thnh phn ty chnh, b ti
to, v m kha .Bn s s dng mt b ti to ty chnh m khng c mt thnh phn
ty chnh nu bn mun thm mt s xc nhn pha my khch trn mt thnh phn tiu
chun.Bn s thc hin m xc thc vi mt ngn ng kch bn pha my khch, chng
hn nh JavaScript, v sau lm cho JavaScript vi cc b ti ta ty chnh. Trong tnh
hung ny, bn cn mt ty chnh t kha i vi cc b ti to x l th ca n c
th ng k cc b ti to trn thnh phn tiu chun.Thnh phn ty chnh cng nh kt
xut ha ty chnh cn th ty chnh lin quan n chng. Tuy nhin, bn c th c
mt th ty chnh m khng c mt b ti to ty chnh hoc ty chnh thnh phn. V
d, gi s rng bn cn phi to mt v ty chnh m yu cu cc thuc tnh thm trn th
xc nhn.Trong trng hp ny, cc th ty chnh tng ng xc nhn mt ty chnh
v khng mt thnh phn ty chnh hoc b ti to ty chnh. Trong mi trng hp,
bn vn cn phi kt hp cc th ty chnh vi mt i tng pha my ch.
Bng 15-1 tm tt nhng g bn phi hoc c th kt hp vi mt thnh phn ty
chnh, b ti to ty chnh, hoc th ty chnh.
Ty chnh khon mc
Thnh phn ty chnh
Ty chnh b ti to
T kha JSF ty chnh

Phi c

Cn c
Ty chnh b ti to hoc
Ty chnh t kha
tiu chun b ti to
Thnh phn ty chnh hoc
Ty chnh t kha
tiu chun thnh phn
i tng mt s my Thnh phn ty chnh hoc
ch nh mt thnh phn, tiu chun thnh phn lin
mt b ti to ty chnh quan n mt ty chnh b
hoc xc nhn ty chnh
ti to

15.2 V d bn hnh nh
Nh sch Duke bao gm mt hnh nh ty chnh bn thnh phn trn trang
index.xhtml. Bn hnh nh ny s hin th mt la chn su u sch. Khi ngi dng
nhp mt trong nhng u sch trong bn hnh nh, ng dng i n mt trang hin
th danh hiu cun sch cng nh thng tin v mt cun sch c la chn c trng.

Cc trang web cho php ngi ngi s dng thm hai cun sch (hoc khng c) vo
gi mua hng.

15.2.1 Ti sao s dng JavaServer Faces Cng ngh Thc hin


mt hnh nh ?
Cng ngh JavaServer Faces l mt khung l tng s dng cho vic thc hin
hnh thc ny bn hnh nh bi v n c th thc hin cng vic m phi c thc
hin trn my ch m khng yu cu bn to ra mt bn hnh nh pha my ch.
Nhn chung, bn hnh nh pha khch hng c a thch hn bn hnh nh
pha my ch cho nhiu l do. Mt l do l bn hnh nh pha khch hng cho php
trnh duyt cung cp thng tin phn hi ngay lp tc khi ngi dng v tr chut ln mt
im nng. mt l do l bn hnh nh pha khch hng thc hin tt hn bi v h
khng yu cu vng quanh chuyn i n my ch. Tuy nhin, trong mt s trng hp,
bn hnh nh ca bn c th cn phi truy cp vo my ch ly d liu hoc thay
i s xut hin ca iu khin khng dng, nhim v mt bn hnh nh pha khch
hng khng th lm.
Bi v hnh nh bn thnh phn ty chnh s dng cng ngh JavaServer Faces,
n c tt nht ca c hai phong cch ca bn hnh nh: N c th x l cc b phn
ca ng dng cn phi c thc hin trn my ch trong khi cho php cc phn khc
ca ng dng c thc hin trn cc mt hng.

15.2.2 Tm hiu v render HTML


Di y l mt phin bn rt gn ca phn hnh thc ca trang HTML l cc ng
dng cn phi lm:
<form id="j_idt13" name="j_idt13" method="post"
action="/dukesbookstore/index.xhtml" ...>
...
<img id="j_idt13:mapImage"
src="/dukesbookstore/javax.faces.resource/book_all.jpg?ln=images"
alt="Choose a Book from our Catalog"
usemap="#bookMap" />

...
<map name="bookMap">
<area alt="Duke"
coords="67,23,212,268"
shape="rect"
onmouseout="document.forms[0]
['j_idt13:mapImage'].src='resources/images/book_all.jpg'"
onmouseover="document.forms[0]
['j_idt13:mapImage'].src='resources/images/book_201.jpg'"
onclick="document.forms[0]['bookMap_current'].value='Duke';
document.forms[0].submit()"
/>
...
<input type="hidden" name="bookMap_current">
</map>
...
</form>
Th img lin kt mt hnh nh (book_all.jpg) vi bn hnh nh tham chiu
trong bn gi tr thuc tnh.
Th bn xc nh bn hnh nh v cha mt b cc th khu vc.
Mi th khu vc xc nh mt khu vc ca bn hnh nh. Khi r chut,thot
chut, v chon thuc tnh xc nh cc m JavaScript c thc hin khi nhng s kin
xy ra. Khi ngi dng di chuyn chut qua mt khu vc, cc chc nng lin quan khi r
chut vi khu vc hin th bn vi khu vc ny c nh du. Khi ngi dng di
chuyn chut ra khi mt khu vc, chc nng thot chut s hin th li hnh nh ban
u.Nu ngi dng nhp vo mt khu vc, chc nng chon chut t gi tr ca th u
vo ID ca khu vc c la chn v trnh trang.

Th u vo i din cho mt iu khin n m cc ca hng gi tr ca hin ti


khu vc c la chn gia trao i khch hng my ch cc thnh phn pha my
ch cc lp hc c th ly gi tr. Cc i tng pha my ch ly gi tr ca trang bn
v thit lp min a phng trong V d javax.faces.context.FacesContext theo khu vc
l la chn.

15.2.3 Tm hiu v trang Facelets


Di y l mt hnh thc vit tt ca trang Facelets rng bn hnh nh s dng
thnh phn to ra cc trang HTML c hin th trong phn trc. N s dng ty
chnh ca hng sch: bn v sch: khu vc th i din cho cc thnh phn ty
chnh:
<h:form>
...
<h:graphicImage id="mapImage"
name="book_all.jpg"
library="images"
alt="#{bundle.ChooseBook}"
usemap="#bookMap" />
<bookstore:map id="bookMap"
current="map1"
immediate="true"
action="bookstore">
<f:actionListener
type="dukesbookstore.listeners.MapBookChangeListener" />
<bookstore:area id="map1" value="#{Book201}"
onmouseover="resources/images/book_201.jpg"
onmouseout="resources/images/book_all.jpg"

targetImage="mapImage" />
<bookstore:area id="map2" value="#{Book202}"
onmouseover="resources/images/book_202.jpg"
onmouseout="resources/images/book_all.jpg"
targetImage="mapImage"/>
...
</bookstore:map>
...
</h:form>

Cc thuc tnh alt ca h: graphicImage bn th vo chui a ho "Chn mt t t


Catalog ca chng ti ".
F: ActionListener th trong ca hng sch: im tag bn mt lp ngi nghe cho
mt s kin hnh ng. Phng php processAction ca ngi nghe t cun sch ID
cho bn khu vc c la chn vo bn phin. Cch s kin ny c x l c
gii thch X l s kin cho cc thnh phn ty chnh.
Thuc tnh hnh ng ca hiu sch: th bn xc nh mt chui kt qu hp
l, "hiu sch", m theo quy nh ngm gi cc ng dng trang bookstore.xhtml.
bit thm thng tin v nh hng, xem Configuring Navigation Rules..
Cc thuc tnh trc tip ca hiu sch: th bn c thit lp ng, m ch ra
rng vic thc hin javax.faces.event. ActionListener mc nh nn thc hin trong giai
on p dng gi tr Yu cu ca vng i yu cu x l, thay v ch i cho giai on
Gi ng dng. Bi v yu cu t cch nhn bn khng cn bt k xc nhn, chuyn
i d liu, hoc i tng pha my chcp nht, n lm cho tinh thn b qua trc
tip n giai on gi ng dng.
Thuc tnh hin ti ca ca hng sch: th bn c thit lp mc nh khu
vc, l bn 1(cun sch nm u ca ti: Growing Up trn Star7, bi Duke).
Ch rng cc hiu sch: th khu vc khng cha bt k ca JavaScript, phi
hp, hoc hnh dng d liu c hin th trn trang HTML. JavaScript c to ra bi

lp dukesbookstore.renderers.AreaRenderer. R chut v thot chut gi tr thuc tnh


cho hnh nh c np khi nhng s kin xy ra. Lm th no JavaScript c to ra
c gii thch biu m ha.
Cc phi hp, hnh dng v vn bn thay th d liu thu c thng qua gi tr
thuc tnh, c gi tr lin quan n mt thuc tnh trong phm vi p dng. Gi tr ny
thuc tnh l mt ht, m cc ta , hnh dng v d liu c. Lm th no nhng ht lu
tr trong phm vi p dng c gii thch thm trong phn tip theo.

15.2.4 Cu hnh Data Model


Trong mt ng dng JavaServer Faces, d liu nh cc ta ca mt im truy
cp ca mt bn hnh nh c ly t cc thuc tnh gi tr thng qua mt ht. Tuy
nhin, hnh dng v ta ca mt im truy cp cn c xc nh vi nhau v cc ta
c gii thch khc nhau ty thuc vo hnh dng cc im truy cp. Bi v gi tr
ca mt thnh phn ch c th c lin kt vi mt ti sn, thuc tnh gi tr khng th
cp n c hai hnh dng v ta .
gii quyt vn ny, cc ng dng ng gi tt c cc thng tin ny trong mt
b ImageAreaobjects. Nhng i tng c khi to vo phm vi p dng bi ht qun
l c s (xem phn 16.4.1, "S dng thnh phn qun l ht"). y l mt phn ca vic
k khai qun l ht cho ht ImageArea tng ng vi cc im truy cp Nam M:
<managed-bean eager="true">
...
<managed-bean-name>Book201</managed-bean-name>
<managed-bean-class>
javaeetutorial.dukesbookstore.model.ImageArea
</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
...
<property-name>shape</property-name>
<value>rect</value>
</managed-property>
<managed-property>
...
<property-name>alt</property-name>
<value>Duke</value>

</managed-property>
<managed-property>
...
<property-name>coords</property-name>
<value>67,23,212,268</value>
</managed-property>
</managed-bean>
bit thm thng tin v khi to ht qun l vi cc c s to bean c qun
l, xem phn tp tin cu hnh ng dng ti nguyn.
Cc thuc tnh gi tr ca th bookstore:area tham kho cc ht trong phm vi p
dng, nh trong th bookstore:area t index.xhtml:
<bookstore:area id="map1" value="#{Book201}"
onmouseover="resources/images/book_201.jpg"
onmouseout="resources/images/book_all.jpg"
targetImage="mapImage" />
tham chiu cc gi tr ht ImageArea m hnh i tng t cc lp thnh phn, bn
thc hin mt phng php getValue trong lp thnh phn. Phng php ny gi l
super.getValue.
Lp
cha
ca
tut-install/examples/case-studies/dukesbookstore/src/java/dukesbookstore/components/AreaComponent.java, UIOutput, c mt
phng php getValue lm cng vic tm kim cc i tng ImageArea lin quan n
AreaComponent. Lp AreaRenderer, cn phi lm cho cc gi tr alt, shape v coords t
i tng ImageArea, gi phng thc getValue ca AreaComponent ly i tng
ImageArea.
ImageArea iarea = (ImageArea) area.getValue();
ImageArea l ht n gin, v vy bn c th truy cp vo hnh dng, ta , v cc gi
tr vn bn thay th bng cch gi phng php accessor thch hp ca ImageArea.
Creating the Renderer Class gii thch lm th no lm iu ny trong lp
AreaRenderer.

15.2.5 Tm tt ca cc lp hnh nh bn ng dng.


Bng 15-2 tm tt tt c cc lp cn thit thc hin hnh nh bn thnh phn
Lp

Chc nng
Javax.faces.event.Actionevent ch ra mt
AreaComponent c chn t
MapComponent
Lp xc nh AreaComponent m tng
ng vi th khch hng bookstore:area.
Lp xc nh MapComponent m tng
ng vi th khch hng bookstore:area.
This javax.faces.render.Renderer thc hin
quyn rendering cho AreaComponent.
Ht lu tr cc hnh dng v ta
ca hospot
Hnh ng nghe cho cc MapComponent.

AreaSelectedEvent
AreaComponent
MapComponent
AreaRenderer
ImageArea
MapBookChangeListener

15.3 Bc to mt thnh phn ty chnh


Bn c th p dng cc bc sau y trong khi pht trin thnh phn ty chnh ca
ring bn.
1. to ra mt lp thnh phn ty chnh no sau y:
a. s thay th cc phng php getFamily tr v gia nh thnh phn, l
c s dng tm kim renderers m c th khin cc thnh phn
b. bao gm m ti to hoc i biu mt b ti to (gii thch trong bc 2)
c. cho php cc thnh phn thuc tnh chp nhn biu hin mt hng i mt s
kin trn cc thnh phn nu cc thnh phn to ra s kin
d. lu v khi phc li nh nc thnh phn
2. i biu v mt trnh
rendering. lm iu ny:

kt

xut nu thnh

a. to
ra mt lp
hc b
javax.faces.render.Renderer.

ti

phn ca

to ty

bn khng x

l cc

chnh bng cch m

rng

b. ng k b ti to Kit render.
3. ng k cc thnh phn.
4. to mt trnh x l s kin nu thnh phn ca bn to ra s kin.
5. to ra mt m t th vin t kha (tn min) xc nh cc t kha ty chnh.
Xem ng k mt thnh phn ty chnh v ng k mt b ti to tu
chnh vi mt b khin cho thng tin v ng k thnh phn ty chnh v ti
to phn. Phn bng cch s dng mt thnh phn ty chnh tho lun v lm th
no s dng thnh phn ty chnh trong mt trang JSP c ch r phi i mt vi.

15.4 To thnh phn ty chnh cho cc lp.


Nh gii thch trong khi s dng mt thnh phn ty chnh, mt lp thnh
phnxc nh trng thi v hnh vi ca mt thnh phn giao din ngi dng. Thng tin
xc nh bao gm cc thnh phn loi, nhn dng, v gi tr a phng. Bao gm
cc hnh vi c xc nh bi thnh phn lp.
Cc ty chn sau:
Decoding (chuyn i cc thng s yu cu cc thnh phn a phng gi tr)
Encoding (chuyn i gi tr a phng vo nh du tng ng)
tit kim ca cc thnh phn
Cpnht gi tr ht vi gi tr a phng
Ch bin xc nhn gi tr a phng
m s kin
Cc lp javax.faces.component.UIComponentBase xc nh hnh vi mc nh ca
mt tng lp thnh phn. Tt c cc lp hc i din cho cc thnh phn tiu chun m
rng t UIComponentBase. Cc lp thm nh ngha hnh vi ca ring ca h, nh lp
hc thnh phn ty chnh ca bn s lm.
Lp thnh phn ty chnh ca bn phi hoc m rng UIComponentBase trc tip
hoc m rng mt lp i din cho mt trong cc thnh phn tiu chun. Cc lp
nm trong gi javax.faces.component, v tn ca h bt u vi giao din ngi dng.
.

Nu thnh phn ty chnh ca bn phc v mc ch tng t nh mt thnh phn


tiu chun, bn nn m rng thnh phn tiu chun thay v trc tip m rng
UIComponentBase.
V d, , gi s bn mun to mt thnh phn c th chnh sa trnh n. N lm
cho thnh phn m rng UISelectOne ch khng phi l UIComponentBase bi v bn c
th s dng li hnh vi c nh ngha trong ISelectOne. Cc chc nng mi, bn
cn phi xc nh lm cho trnh n c th chnh sa.
Cho d bn quyt nh c thnh phn m rng UIComponentBase hoc mt thnh
phn tiu chun, bn cng c th mun thnh phn ca bn thc hin mt
hoc nhiu cc giao din hnh vi ny c nh ngha trong cc gi phn mm
javax.faces.component:
ActionSource: ch ra rng cc thnh phn c th bn mtjavax.faces.event.ActionEvent
ActionSource2: m rng ActionSource v cho php cc thnh phn thuc tnh tham
kho cc phng php x l s kin hnh ng s dng biu thc phng
php nh c xc nh bi EL
EditableValueHolder: m rng ValueHolder v xc nh cc tnh nng b sung cho
cc thnh phn c th chnh sa, chng hn nh xc nhn v pht ra cc s kin thay i
gi tr.
NamingContainer: nhim v mi thnh phn bt ngun t lc thnh phn ny c mt
ID duy nht.
StateHolder: biu th rng mt thnh phn c nh nc phi c lu gi yu cu
ValueHolder: ch ra rng cc thnh phn duy tr mt gi tr a phng cng nh
cc ty chn truy cp vo d liu m hnh
Nu thnh phn ca bn m rng UIComponentBase, n s t ng thc hin ch
StateHolder. Bi v tt c cc thnh phn trc tip hoc gin tip m rng
UIComponentBase, tt c u thc hin StateHolder. Bt k thnh phn no thc
hinStateHolder cng thc hin giao din StateHelper, m ko di StateHolder v nh
ngha mt bn nh hp ng m lm cho n d dng cho cc thnh phn lu
v khi phc li mt ci nhn mt phn c bn.
Nu thnh phn ca bjan m rng mt trong cc thnh phn tiu chun khc, n
cng c th thc hin giao din hnh vi kahsc ngoi StateHolder. Nu thnh phn ca bn
m rng UICommand, n s t ng thc hin ActionSource2. Nu thnh phn m rng

UIOutput hoc mt trong cc lp thnh phn m rng UIOput, n s t ng thc


hin ValueHolder. Nu thnh phn ca bn m rng UIInput, n t ng thc
hin EditableValueHolder v ValueHolder. Xem JSP c ch r phi i mt vi ti
liu API tm hiu nhng g cc lp thnh phn khc thc hin.
Bn cng c th lm cho cc thnh phn ca bn mt cch r rng thc hin mt
giao din hnh vi m khng c thnh phn m rng tiu chun c th. V d, nu bn c
mt thnh phn m rng UIInput v bn mun n chy s kin hnh ng, bn phi lm
cho n mt
cch
r
rng thc
hin ActionSource2 bi
v mt
thnh
phn UIInput khng t ng thc hin giao din ny.
Hnh nh bn ca hiu sch Duke v d c hai thnh phn lp: AreaComponent
v MapComponent. Cc lp MapComponent m rng UICommand v do thc
hin ActionSource2, c ngha l n c th chy s kin hnh ng khi ngi dung
nhp vo bn . Cc lp hc AreaComponent m rng cc thnh phn tiu chun
UIOutput. Cc ch thch @FacesComponent ng k cc thnh phn vi vic thc hin
phi i mt vi JSP c ch r:
@FacesComponent("DemoMap")
public class MapComponent extends UICommand {...}
@FacesComponent("DemoArea")
public class AreaComponent extends UIOutput {...}
Lp MapComponent i din cho cc thnh phn tng ng vi bookstore:map
tag:
<bookstore:map id="bookMap"
current="map1"
immediate="true"
action="bookstore">
...
</bookstore:map>

Lp AreaComponent i din cho cc thnh phn tng ng vi bookstore:area tag:


<bookstore:area id="map1" value="#{Book201}"
onmouseover="resources/images/book_201.jpg"
onmouseout="resources/images/book_all.jpg"
targetImage="mapImage"/>

MapComponent c mt hoc nhiu trng hp AreaComponent con. Hnh vi ca


n bao gm cc hnh ng sau y:
Ly gi tr ca khu vc c chn hin thi
Xc nh cc thuc tnh tng ng vi gi tr ca cc thnh phn
To ra mt s kin khi ngi dng nhp vo bn hnh nh
Hng i s kin ny
Lu trng thi ca n
Rendering HTML bn t kha v th u vo ca HTML
MapComponent i
MapRenderer.

biu phi

hp HTML bn

v u

vo th vo lp

AreaComponent l b rng buc mt ht mua cc hnh dng v cc ta


trong vng bn hnh nh. Bn s thy nh th no tt c cc d liu ny c truy
cp thng qua cc biu hin gi tr trong vic to ra cc lp hc b ti to. Hnh vi
ca AreaComponent bao gm nhng iu sau y:
Ly hnh dng v phi hp d liu t u
thit lp gi tr ca th n id ca thnh phn ny
Rendering khu vc th, trong c JavaScript cho khi r chut, onmouseout,
v chc nng t ng trt
Mc d cc tc v ny thc s c thc hin bi AreaRenderer, AreaComponent
phi phn b cc nhim v AreaRenderer. Xem u thc Rendering mt chng
trnh kt xut cho bit thm thng tin
Phn cn li ca phn ny m t cc tc v m MapComponent thc hin cng
nh cc m ha v gii m MapRenderer. X l s kin cho cc thnh phn ty chnh chi
tit MapComponent x l s kin.

15.4.1 Ch nh thnh phn.


Nu lp thnh phn ty chnh ca bn i biu rendering, n cn ghi ln cc
getFamily phng php ca UIComponent tr v cc nh danh ca mt gia nh
thnh phn, c s dng ch mt thnh phn hoc tp hp cc thnh phn c

th c tr li bi mt b ti to hoc thit lp cc renderers. Gia nh thnh


phn c s dng cng vi b ti to phn loi tm kim renderers m c
th khin cc thnh phn:
public String getFamily() {
return ("Map");
}
Cc thnh phn nh danh gia nh, bn , phi ph hp vi xc nh bi cc
thnh phn-gia nh t c dng li trong thnh phn v ti to cc cu hnh trong tp
tin ti nguyn cu hnh ng dng. ng k mt b ti to tu chnh vi mt
Render Kit gii thch lm th no xc nh thnh phn gia nh trong cu hnh b ti
to.
ng k mt thnh phn ty chnh gii thch lm th no xc nh thnh
phn gia nh trong cu hnh thnh phn.

15.4.2 Thc hin m ha


Trong giai on a ra phn ng, JSP c ch r phi i mt vi thc hin qu
trnh phng php m ha ca tt c cc thnh phn v ca renderers kt hp trong ch
xem.
Cc phng php m ha chuyn i gi tr hin ti a phng ca cc thnh
phn vo cc nh du tng ng m i din cho n trong cc phn ng.
Lp UIComponentBase nh ngha mt tp hp cc phng hp nh du Hin
th: encodeBegin, encodeChildren, v encodeEnd. Nu cc thnh phn c thnh phn
con, bn c th cn phi s dng nhiu hn mt trong nhng phng php ny hin
th cc thnh phn; Nu khng, tt c rendering nn c thc hin trong encodeEnd.
Ngoi ra, bn c th d dng phng php encodeALL, bao gm tt c cc phng php.
Bi v MapComponent l mt thnh phn cha ca AreaComponent, cc khu vc th phi
c tr li sau khi bt u bn th v trc th bn kt thc. thc hin vic
ny, cc lp MapRenderer m th u trong encodeBegin v phn cn li ca th bn
trong encodeEnd.
JSP c ch r phi i mt vi phng php invokes phng php encodeEnd
B ti to ca AreaComponent sau khi n invokes ca MapRenderer encode bt
u phng php v trc khi n invokes ca MapRenderer encodeEnd phng php.
Nu mt thnh phn cn phi thc hin cc rendering cho thnh phn con ca
n, n hin iu ny trong cc phng php encodeChildren.

Di y l nhng phng php encodeBegin v encodeEnd ca MapRenderer:


@Override
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
if ((context == null)|| (component == null)) {
throw new NullPointerException();
}
MapComponent map = (MapComponent) component;
ResponseWriter writer = context.getResponseWriter();
writer.startElement("map", map);
writer.writeAttribute("name", map.getId(), "id");
}
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
if ((context == null) || (component == null)){
throw new NullPointerException();
}
MapComponent map = (MapComponent) component;
ResponseWriter writer = context.getResponseWriter();
writer.startElement("input", map);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("name", getName(context,map), "clientId");
writer.endElement("input");
writer.endElement("map");
}
Nhn thy rng encodeBegin m ch cc t kha bt u bn . Phng php
encodeEnd hin th hnh nh u vo t kha v t kha kt thc ca bn .
Cc phng php m ha chp nhn mt i s UIComponent v mt i s
javax.faces.context.FacesContext. V d FacesContext cha tt c thng tin kt hp vi
yu cu hin ti. Cc i s UIComponent l cc thnh phn cn phi c tr li. Phn
cn
li
ca
phng
php
nh
du
cho
trng
hp
javax.faces.context.ResponseWriter, vit ra cc nh du phn ng hin ti. iu
ny v c bn lin quan n vic i qua tn nhn HTML v cc thuc tnh tn cho trng
hp ResponseWriter nh dy, ly cc gi tr ca thuc tnh thnh phn, v i qua cc gi
tr ny th hin ResponseWriter.

Phng
php startElement mt mt chui (tn ca th) v cc thnh
phn
th tng
ng (trong trng
hp ny, bn
). (Gi thng
tin ny cho trng
hpResponseWriter s gip cng c thit k-thi gian bit nhng phn nh du c to
ra c lin quan n thnh phn .)
Sau khi gi startElement, bn c th gi writeAttribute hin th thuc tnh ca
th.
Phng php writeAttribute a tn ca thuc tnh gi tr ca n v ten ca mt
thuc tnh tng ng thnh phn hoc thuc tnh tng ng thnh phn c cha thuc
tnh.
Cc tham s cui cng c th c null, v n s khng c tr li.
Gi tr thuc tnh tn ca th bn ly bng cch s dng phng php getId ca
UIComponent, m tr v cc thnh phn nh danh duy nht. Gi tr thuc tnh tn ca
th u vo ly bng cch s dng phng php getName (FacesContext,
UIComponent) ca MapRenderer.
Nu bn mun thnh phn ca bn thc hin hin th bao
gm cc dng sau trong phng php m ha kim tra xem c mt b ti to lin quan
n thnh phn ny:
if (getRendererType() != null) {
super.encodeEnd(context);
return;
}
Nu c mt b th hin, phng php ny invokes superclass encodeEnd phng
php, m thc hin cng vic ca vic tm kim b ti to. Lp MapComponent i
biu rendering tt c MapRenderer, do , n khng cn phi kim tra c sn
renderers.
Trong mt s thnh phn ty chnh cc lp hc m rng thnh phn tiu
chun, bn c th cn phi thc hin cc phng php khc ngoi encodeEnd.
V d, nu bn cn truy xut gi tr ca cc thnh phn t cc thng s yu
cu, bn cng phi thc hin phng php gii m.

15.4.3 Thc hin gii m


Trong giai on p dng gi tr yu cu, vic thc hin JSP c ch r phi i
mt vi qu trnh phng php gii m ca tt c cc thnh phn trong cy. Phng php
gii m mt thnh phn gi tr a phng t cc yu cu tham s v s dng mt

javax.faces.convert.Converter thc
hp vi lp thnh phn.

hin chuyn

i gi

tr cho mt loi l ph

Mt lp thnh phn ty chnh hoc ti to ca n phi thc hin phng php gii
m ch nu n phi ly gi tr a phng hoc nu n cn n hng i s kin. Cc
thnh phn hng i s kin ny bng cch gi in thoi queueEvent.
y l phng php gii m ca MapRenderer:
@Override
public void decode(FacesContext context, UIComponent component) {
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
MapComponent map = (MapComponent) component;
String key = getName(context, map);
String value = (String) context.getExternalContext().
getRequestParameterMap().get(key);
if (value != null)
map.setCurrent(value);
}
}
Phng php gii m u tin c tn ca trng u vo n bng cch gi
getName (FacesContext, UIComponent). Sau s dng tn l cha kha cc yu
cu tham s bn ly gi tr hin ti ca lnh vc u vo. Gi tr ny i din
cho khu vc c chn hin thi. Cui cng, n l tp hp gi tr ca thuc tnh hin
ti ca lp MapComponent vi gi tr ca lnh vc u vo.

15.4.4 Cho php cc thnh phn thuc tnh chp nhn biu
hin
Gn nh tt c cc thuc tnh ca cc tiu chun JSP c ch r phi i mt
vi th c th chp nhn biu hin, cho d h ang biu thc gi tr hoc phng
php biu hin. khuyn co rng bn cng cho php cc thuc tnh thnh phn ca
bn chp nhn biu thc bi v n mang li cho bn s linh hot hn khi bn vit trang
Facelets.
kch hot cc thuc tnh chp nhn biu hin, lp thnh phn phi thc hin
getter v setter phng php cho cc thuc tnh thnh phn. Nhng phng php ny c
th s dng tin nghi c cung cp bi giao din StateHelper lu tr v

ly khng ch l cc gi tr cho nhng thuc tnh ca cc thnh phn trn yu cu nhiu.


Bi v MapComponent m rng UICommand, cc lp UICommand lm cc cng
vic nhn cc trng hp ValueExpression vMethodExpression lin kt vi mi thnh
phn trong s cc thuc tnh m n h tr. Tng t, cc lp hc UIOutput
AreaComponent m rng ly c cc trng hp ValueExpression cho cc thuc
tnh c h tr.
Cho c hai thnh phn, n gin getter v setter phng php lu tr v ly cha
kha gi tr v cc thuc tnh, nh th hin trong on m ny t AreaComponent:
enum PropertyKeys {
alt, coords, shape, targetImage;
}
public String getAlt() {
return (String) getStateHelper().eval(PropertyKeys.alt, null);
}
public void setAlt(String alt) {
getStateHelper().put(PropertyKeys.alt, alt);
}
...
Nu bn c mt lp thnh phn ty chnh m rng UIComponentBase, bn
s cn phi thc
hin cc phng
php nhn cc trng
hp ValueExpression v
MethodExpression lin kt vi cc thuc tnh c kch hot chp nhn biu
hin.V d, bn c th bao gm mt phng php c ValueExpressioninstance cho cc
thuc tnh ngay lp tc:
public boolean isImmediate() {
if (this.immediateSet) {
return (this.immediate);
}
ValueExpression ve = getValueExpression("immediate");
if (ve != null) {
Boolean value = (Boolean) ve.getValue(
getFacesContext().getELContext());
return (value.booleanValue());
} else {
return (this.immediate);
}

}
Cc thuc tnh tng ng vi cc thuc tnh phn chp nhn phng php biu
thc phi chp
nhn v tr
li mt i
tng MethodExpression. V d, nu
MapComponent m rng UIComponentBase thay v UICommand, n s cn phi cung
cp mt thuc tnh hnh ng m tr v v chp nhn mt i tng MethodExpression:
public MethodExpression getAction() {
return (this.action);
}
public void setAction(MethodExpression action) {
this.action = action;
}

15.4.5 Lu tr v khi phc trng thi


Nh m t trong iu kin cho thnh phn thuc tnh chp nhn biu hin, s
dng cc c s giao din StateHelper cho php bn lu cc thnh phn nh nc cng
mt lc bn thit lp v ly gi tr thuc tnh. Thc hin StateHelper cho php mt
phn nh nc lu tr; n tit kim ch l nhng thay i trong bang k t khi yu
cu ban u, khng phi ton b tiu bang, v nh nc y c th c khi phc
trong giai on phc hi xem. Thnh phn cc lp m thc hin StateHolder c
th mun thc
hin cc saveState(FacesContext) v restoreState
(FacesContext, i
tng) cc phng php gip vic thc hin phi i mt vi JSP c ch r lu
v khi phc trng thi ca cc thnh phn trn yu cu nhiu.
lu mt tp hp cc gi tr, bn c th thc hin phng php saveState
(FacesContext).
Phng php ny c gi l trong giai on a ra phn ng, trong nh nc
ca cc phn ng c lu ch bin tip theo yu cu. y l mt gi phng
php t MapComponent, ch c mt thuc tnh hin ti:
@Override
public Object saveState(FacesContext context) {
Object values[] = new Object[2];
values[0] = super.saveState(context);
values[1] = current;
return (values);
}

Thnh phn cc lp m StateHolder


thc hin c th hn
saveState(FacesContext) thc hin v restoreState (FacesContext, i tng) gip
JavaServer Faces thc hin lu v khi phc trng thi ca cc thnh phn qua nhiu yu
cu.
lu mt tp hp cc gi tr, bn c th thc hin phng php
saveState(FacesContext). Phng php ny c gi trong giai on Render Response,
trong trng thi ca cc phn ng c lu x l yu cu tip theo. y l mt
phng php gi nh t MapComponent, ch c mt thuc tnh:
@Override
public Object saveState(FacesContext context) {
Object values[] = new Object[2];
values[0] = super.saveState(context);
values[1] = current;
return (values);
}
Phng php ny khi to mt mng, s t chc trng thi lu. Tip theo n s
lu li tt c cc trng thi lin kt vi cc thnh phn.
Mt thnh phn thc hin StateHolder cng c th cung cp mt s thc hin cho
restoreState (FacesContext, Object), khi phc li trng thi ca cc thnh phn lu
vi phng php saveState(FacesContext). restoreState (FacesContext, Object) phng
php c gi l khi phc giai on, trong JavaServer Faces kim tra cho d l
bt k trng thi c lu trong thi gian cui cng a ra phn ng giai on v cn
phi c khi phc chun b cho postback tip theo.
y l mt phng php gi thit restoreState (FacesContext, Object) t
MapComponent:
public void restoreState(FacesContext context, Object state) {
Object values[] = (Object[]) state;
super.restoreState(context, values[0]);
current = (String) values[1];
}
Phng php ny c mt FacesContext v mt Object th hin, i din cho cc
mng ang nm gi cc trng thi cc thnh phn. Phng php ny t cc thuc tnh
thnh phn cc gi tr c lu trong cc i tng mng.

Trong bt k trng hp no bn thc hin nhng phng php ny trong lp


thnh phn, bn c th s dng javax.faces.STATE_SAVING_METHOD xc nh trong
cc trin khai m t ni bn mun trng thi c lu: my khch hoc my ch.
Nu trng thi c lu trn my khch, ton b trng thi tr li cho trng n
trn trang. Theo mc nh, trng thi c lu trn my ch.
Cc ng dng web trong nghin cu ca Duke's Forest lu trng thi xem ca h
trn cc my khch.
Trng thi trn my khch s dng nhiu bng thng cng nh cc ngun lc my
khch nhiu hn, trong khi lu n trn my ch s dng ti nguyn my ch hn. Bn
cng c th mun lu trng thi trn my khch nu bn mong i ti khon ca bn
v hiu ha cookie.

15.5 Phn quyn render n mt Trnh kt xut


C MapComponent v AreaComponent y thc tt c mt b ti to ring bit.
Phn thc hin m ha gii thch lm th no MapRenderer thc hin cc m ha cho
MapComponent. Phn ny gii thch chi tit qu trnh u thc mt b ti to bng cch s
dng AreaRenderer, m thc hin cc rendering cho AreaComponent.
biu din s y thc, bn thc hin cc tc v ny.
To lp b ti to.
ng k b ti to phn vi mt b nh bng cch s dng ch thch @FacesRenderer
(hoc bng cch s dng ng dng cu hnh tp tin ti nguyn, nh c din t trong
ng k mt ti to tu chnh vi mt Kit Render).
Xc nh loi b ti to ch thch FacesRenderer.

15.5.1 To lp Trnh kt xut


Khi biu din ti to mt u thc, bn c th y thc tt c m ha v gii m
ti to, hoc bn c th chn lm mt phn ca n trong thnh phn lp. Cc lp
AreaComponent i din lp m ha cc lp AreaRenderer.
B ti to lp bt u vi mt ch thch @FacesRenderer:
@FacesRenderer(componentFamily = "Area", rendererType = "DemoArea")
public class AreaRenderer extends Renderer {

Cc ch thch @FacesRenderer ng k lp b ti to vi JavaServer Faces c


ch r thc hin nh l mt lp ti to. Xc nh cc ch thch thnh phn cng nh cc
loi b ti to.
thc hin cc biu din cho AreaComponent, AreaRenderer phi thc hin mt
phng php encodeEnd. Phng php encodeEnd AreaRenderer ly hnh dng, Ta ,
v gi tr vn bn thay th lu tr trong ImageArea l rng buc AreaComponent. Gi
s rng cc t kha khu vc hin ang c thc hin c gi tr thuc tnh cc gi tr ca
"book203". Dng sau t encodeEnd c gi tr ca cc thuc tnh "book203" t trng
hp FacesContext:
ImageArea ia = (ImageArea)area.getValue();
Gi tr thuc tnh l trng hp ImageArea, c hnh dng, coords, v alt gi tr lin
quan n trng hp AreaComponent book203. Cu hnh m hnh d liu m t cc kho
ng dng nhng gi tr ny lm th no.
Sau khi ly i tng ImageArea, phng php lm cho cc gi tr hnh dng,
coords, v alt bi ch cn gi cc phng php lin quan n accessor v i qua cc tr
li gi tr cho trng hp ResponseWriter, nh th hin bi cc dng m, vit trong hnh
dng v ta :
writer.startElement("area", area);
writer.writeAttribute("alt", iarea.getAlt(), "alt");
writer.writeAttribute("coords", iarea.getCoords(), "coords");
writer.writeAttribute("shape", iarea.getShape(), "shape");
Phng php encodeEnd cng gn JavaScript cho onmouseout, khi r chut, v
onclick. Trang Facelets cung cp nhu cu ch l ng dn n nhng hnh nh l
c np trong mt hnh ng khi r chut hoc onmouseout:
<bookstore:area id="map3" value="#{Book203}"
onmouseover="resources/images/book_203.jpg"
onmouseout="resources/images/book_all.jpg"
targetImage="mapImage"/>
Cc lp AreaRenderer s n JavaScript cho nhng hnh ng ny, nh hin
th trong m sau y t encodeEnd. JavaScript AreaRenderer to ra cho hnh ng nhiu
cp b gi tr ca trng n vi gi tr ca cc khu vc hin nay ca thnh phn ID v gi
trang.
sb = new StringBuffer("document.forms[0]['").append(targetImageId).
append("'].src='");

sb.append(
getURI(context,
(String) area.getAttributes().get("onmouseout")));
sb.append("'");
writer.writeAttribute("onmouseout", sb.toString(), "onmouseout");
sb = new StringBuffer("document.forms[0]['").append(targetImageId).
append("'].src='");
sb.append(
getURI(context,
(String) area.getAttributes().get("onmouseover")));
sb.append("'");
writer.writeAttribute("onmouseover", sb.toString(), "onmouseover");
sb = new StringBuffer("document.forms[0]['");
sb.append(getName(context, area));
sb.append("'].value='");
sb.append(iarea.getAlt());
sb.append("'; document.forms[0].submit()");
writer.writeAttribute("onclick", sb.toString(), "value");
writer.endElement("area");
Bng cch gi trang, m ny gy ra vng i JavaServer Faces c ch r phi
i mt tr li giai on Restore View. Giai on ny tit kim bt k thng tin trng thi,
trong c gi tr ca n trng, do mt cy thnh phn yu cu mi c xy dng.
Gi tr ny l ly bng phng php gii m ca cc lp hc MapComponent. iu ny
gii m phng php gi l JavaServer Faces c ch r trong yu cu p dng gi tr
giai on m sau giai on Restore View.
Ngoi cc phng php encodeEnd, AreaRenderer c mt kin trc rng. iu ny c
s dng to ra mt th hin ca AreaRenderer n c th c thm vo render Kit.
Cc ch thch @FacesRenderer ng k lp b ti to vi JavaServer Faces c ch r
thc hin nh l mt lp ti to. Xc nh cc ch thch thnh phn cng nh cc loi b
ti to.

15.5. 2 Xc nh Loi Trnh kt xut


Trong giai on a ra phn ng, JSP thc hin cuc gi cc getRendererType
phng php ca cc thnh phn x l th xc nh b ti to gi, nu c mt.
Bn xc nh loi kt hp vi b ti to phn trong cc yu t rendererType ca cc Ch
thch @FacesRenderer cho AreaRenderer cng nh trong cc phn t b ti to kiu s
th th vin m t.

15.6 Thc hin mt Event Listener

Cng ngh JSF h tr s kin hnh ng v thay i gi tr cho cc thnh phn


Hnh ng s kin xy ra khi ngi dng kch hot mt thnh phn thc hin
javax.faces.component.ActionSource. nhng s kin ny c i din bi cc lp
javax.faces.event.ActionEvent.
Thay i gi tr s kin xy ra khi ngi dng thay i gi tr ca mt thnh phn
thc hin javax.faces.component.EditableValueHolder. Nhng s kin ny i din bi
lp javax.faces.event.ValueChangeEvent.
Mt cch x l s kin l thc hin cc lp thch hp. Cc lp x l cc s
kin hnh ng trong mt ng dng phi thc hin cc giao din
javax.faces.event.ActionListener. Thnh gi tng t nh vy, x l s thay i gi tr s
kin phi thc hin giao din javax.faces.event.ValueChangeListener.
Phn ny gii thch lm th no thc hin cc lp hai thnh gi.
x l s kin c to ra bi thnh phn ty chnh, bn phi thc hin mt s
kin nghe v x l s kin theo cch th cng hng i s kin ny trn cc thnh phn.
Xem X l s kin cho cc thnh phn ty chnh cho bit thm thng tin.
Lu : Bn khng cn phi to ra mt ActionListener thc hin x l mt s
kin kt qu ch trong iu hng mt trang v khng thc hin bt k ng dng c th
khc. Xem mt phng php x l menu thng tin v lm th no qun l trang
chuyn hng.

15.6.1 Thc hin Value-Change Listeners


Mt javax.faces.event.ValueChangeListener thc hin phi bao gm mt phng
php processValueChange(ValueChangeEvent). Phng php ny x l cc s kin xc
nh thay i gi tr v c kch hot bi vic thc hin JSP c ch r khi xy ra s
kin thay i gi tr. Trng hp th vin ValueChangeEvent c v cc gi tr mi ca
cc thnh phn s kin.
Trong trng hp nghin cu ca Duke Bookstore, NameChanged thc hin ng
k vo cc thnh phn UIInput tn trn trang bookcashier.xhtml. iu ny i vo phm vi
phin tn ngi dng nhp vo trong lnh vc tng ng Bookreceipt.xhtml sau ly
tn t phm vi phin lm vic:
<h:outputFormat title="thanks"
value="#{bundle.ThankYouParam}">
<f:param value="#{sessionScope.name}"/>
</h:outputFormat>

Khi bookreceipt.xhtml c np, n s hin th tn bn trong tin nhn:


"Thank you, {0}, for purchasing your books from us."
y l mt phn ca vic thc hin NameChanged:
public class NameChanged extends Object implements ValueChangeListener {
@Override
public void processValueChange(ValueChangeEvent event)
throws AbortProcessingException {
if (null != event.getNewValue()) {
FacesContext.getCurrentInstance().getExternalContext().
getSessionMap().put("name", event.getNewValue());
}
}
}
Khi ngi dng nhp tn trong lnh vc, mt s kin thay i gi tr c to ra,
v cc processValueChange(ValueChangeEvent) phng php ca thnh gi
NameChanged thc hin. Phng php ny u tin c ID ca cc thnh phn thc
hin cc s kin t cc i tng ValueChangeEvent, v n t gi tr, cng vi mt tn
thuc tnh, vo bn phin lm vic ca trng hp FacesContext.
ng k mt gi tr thay i vo mt thnh phn gii thch lm th no ng k
vo mt thnh phn.

15.6.2 Thc hin Action Listeners


Mt thc hin javax.faces.event.ActionListener phi bao gm mt phng php
processAction(ActionEvent). Phng php processAction(ActionEvent) x l s kin
hnh ng nu. Vic thc hin JSP c ch r invokes cc phng php
processAction(ActionEvent) khi ActionEvent xy ra.
Duke's Bookstore nghin cu s dng hai ActionListener trin khai,
LinkBookChangeListener v MapBookChangeListener. Xem x l s kin cho cc thnh
phn ty chnh chi tit v MapBookChangeListener.
ng k mt hnh ng trn mt thnh phn gii thch lm th no ng k vo
mt thnh phn.

15.7 X l Events i vi cc thnh phn ty chnh

Nh gii thch trong vic thc hin mt s kin thnh gi, s kin t ng
xp hng ngy thnh phn tiu chun s kin. Mt thnh phn ty chnh, mt khc, hng
i s kin phi theo cch th cng n gii m phng php nu xy ra s kin.
Thc hin Decoding gii thch lm th no xp hng mt s kin trn bng cch
s dng MapComponent gii m phng php. Phn ny gii thch lm th no vit
cc lp i din cho s kin ny bng cch nhp vo bn v lm th no vit
phng php x l s kin ny.
Nh gii thch trong trang Facelets, cc thuc tnh actionListener ca cc
bookstore:map t kha tr n cc lp MapBookChangeListener. Phng php x l s
kin processAction bng cch nhp vo bn hnh nh. Di y l cc phng php
processAction :
@Override
public void processAction(ActionEvent actionEvent)
throws AbortProcessingException {
AreaSelectedEvent event = (AreaSelectedEvent) actionEvent;
String current = event.getMapComponent().getCurrent();
FacesContext context = FacesContext.getCurrentInstance();
String bookId = books.get(current);
context.getExternalContext().getSessionMap().put("bookId", bookId);
}
Khi thc hin JSF cc cuc gi phng php ny, i tng ActionEvent i din
cho s kin ny c to ra bng cch nhp vo bn hnh nh.
Tip theo, n mt i tng AreaSelectedEvent (xem tut-install/examples/casestudies/dukesbookstore/src/java/dukesbookstore/listeners/AreaSelectedEvent.java)). Sau
phng php ny c MapComponent kt ni n s kin ny. Tip theo, thuc tnh
gi tr hin ti ca i tng MapComponent, cho thy khu vc c chn hin thi. Cc
phng php sau s dng gi tr trong cc thuc tnh hin ti c c gi tr ID ca
cun sch t mt i tng HashMap, l xy dng nhng ni khc trong lp
MapBookChangeListener. Cui cng, cc phng php a im ID thu c t cc i
tng HashMap vo phin bn cho cc ng dng.
Ngoi phng php x l s kin ny, bn cn cc lp s kin. iu ny rt n
gin vit; bn c n m rng ActionEvent v cung cp mt nh xy dng c cc thnh
phn m s kin ny xp hng i v mt phng php tr v cc thnh phn. y l lp
AreaSelectedEvent c s dng vi bn hnh nh:
public class AreaSelectedEvent extends ActionEvent {
public AreaSelectedEvent(MapComponent map) {

super(map);
}
public MapComponent getMapComponent() {
return ((MapComponent) getComponent());
}
}
Nh c din t trong cc phn to Custom thnh phn lp ,MapComponent
thc hin cc s kin ti a im u tin, n phi thc hin ActionSource. Bi v
MapComponent m rng UICommand, n cng thc hin ActionSource.

15.8 Xc nh Th Thnh phn ty chnh trong mt Th Th


vin Descriptor
s dng mt th ty chnh, bn tuyn b n trong mt th vin t kha m t
(TLD). Cc tp tin tn min xc nh ty chnh t kha c s dng nh th no trong
mt trang JSP. S dng cc thng cha tn min xc nhn th. Cc thit lp ca th l
mt phn ca render HTML kit c nh ngha trong tn min HTML_BASIC, c sn
ti:
http://docs.oracle.com/javaee/7/javaserverfaces/2.2/renderkitdocs/.
Tn tp tin tn min phi kt thc vi taglib.xml. Trong nghin cu trng hp
ca Duke's Bookstore, cc khu vc th ty chnh v bn c xc nh trong tp tin
web/WEB-INF/bookstore.taglib.xml.
Tt c t kha nh ngha phi c lng bn trong yu t facelet-taglib trong tn
min. Mi t kha c xc nh bi mt nguyn t t kha. Di y l cc nh ngha
t kha cho khu vc v bn thnh phn:
<facelet-taglib xmlns="http://xmlns.jcp.org/xml/ns/javaee"
...>
<namespace>http://dukesbookstore</namespace>
<tag>
<tag-name>area</tag-name>
<component>
<component-type>DemoArea</component-type>
<renderer-type>DemoArea</renderer-type>
</component>
</tag>
<tag>
<tag-name>map</tag-name>
<component>

<component-type>DemoMap</component-type>
<renderer-type>DemoMap</renderer-type>
</component>
</tag>
</facelet-taglib>
Cc yu t thnh phn-loi ch nh tn c nh ngha trong ch thch
@FacesComponent, v cc yu t renderer-type ch nh rendererType c nh ngha
trong cc ch thch @FacesRenderer.
Cc yu t facelet-taglib cng phi bao gm mt yu t khng gian tn, nh ngha
khng gian tn c xc nh trong trang s dng thnh phn ty chnh. Xem bng
cch s dng mt
Cc thnh phn ty chnh cho thng tin v cch xc nh khng gian tn trong
trang.
Cc tp tin TLD nm trong th mc WEB-INF. Ngoi ra, mt mc bao gm trong
trnh thc thi web (web.xml) xc nh cc th ty chnh m t tp tin th vin, nh
sau:
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/bookstore.taglib.xml</param-value>
</context-param>

15.9 S dng thnh phn ty chnh


s dng mt phn ty chnh trong mt trang, bn thm th ty chnh lin quan
n thnh phn trang.
Nh gii thch trong Xc nh Th Thnh phn ty chnh trong mt Th
Th vin m t, bn phi m bo rng cc TLD xc nh bt k th ty chnh c
ng gi trong ng dng nu bn c nh s dng cc th trong trang web ca bn.
TLD file c lu tr trong th mc WEB-INF / hoc th mc con ca tp tin WAR hoc
trong th mc META-INF / hoc th mc con ca mt th vin th c ng gi trong
mt tp tin JAR.
Bn cng cn phi gm mt tuyn b khng gian tn trong trang cc trang
truy cp vo cc th. Cc th ty chnh cho trng hp nghin cu sch ca Duke c

nh ngha trong bookstore.taglib.xml. Th ui:composition trn trang index.xhtml tuyn


b khng gian tn c nh ngha trong th th vin :
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:bookstore="http://dukesbookstore"
template="./bookstoreTemplate.xhtml">
Cui cng, s dng mt phn ty chnh trong mt trang, bn thm t kha ca
thnh phn trang.
Nghin cu trng hp sch ca Duke bao gm mt hnh nh ty chnh bn
thnh phn trn trang index.xhtml. Thnh phn ny cho php bn chn mt cun sch
bng cch nhp vo mt vng bn hnh nh:
...
<h:graphicImage id="mapImage"
name="book_all.jpg"
library="images
alt="#{bundle.chooseLocale}"
usemap="#bookMap" />
<bookstore:map id="bookMap"
current="map1"
immediate="true"
action="bookstore">
<f:actionListener
type="javaeetutorial.dukesbookstore.listeners.MapBookChangeListener" />
<bookstore:area id="map1" value="#{Book201}"
onmouseover="resources/images/book_201.jpg"
onmouseout="resources/images/book_all.jpg"
targetImage="mapImage" />
...
<bookstore:area id="map6" value="#{Book207}"
onmouseover="resources/images/book_207.jpg"
onmouseout="resources/images//book_all.jpg"
targetImage="mapImage" />
</bookstore:map>

Cc tag tiu chun h:graphicImage lin kt mt hnh nh (book_all.jpg) vi mt


bn hnh nh c tham chiu trong cc gi tr thuc tnh usemap.
Cc th ty chnh bookstore:map i din cho thnh phn ty chnh,
MapComponent, xc nh bn hnh nh v cha mt tp hp cc th bookstore:area.
Mi th ty chnh bookstore:area i din cho mt AreaComponent ty chnh v xc
nh mt khu vc ca bn hnh nh.
Trn trang ny, thuc tnh onmouseover v onmouseout xc nh hnh nh c
hin th khi ngi dng thc hin cc hnh ng c m t bi cc thuc tnh. Trnh
pht ty chnh cng biu din mt thuc tnh onclick.
Trong trang biu din HTML, onmouseover, onmouseout, v cc thuc tnh
onclick xc nh cc m JavaScript c thc hin khi nhng s kin xy ra. Khi ngi
dng di chuyn chut qua mt khu vc, chc nng onmouseover lin quan n khu vc
hin th bn vi khu vc c nh du. Khi ngi dng di chuyn chut ra khi khu
vc, chc nng onmouseout s hin th li hnh nh ban u. Khi ngi dng nhp vo
mt khu vc, chc nng onclick t gi tr ca mt th u vo n n ID ca vng la
chn v trnh trang.
Khi kt xut ty chnh biu din cc thuc tnh trong HTML, n cng s biu din
m JavaScript. Trnh pht ty chnh s biu din ton b thuc tnh onclick hn l cho
cc tc gi ca trang thit lp n.
Trnh pht ty chnh m biu din bn th HTML cng biu din mt thnh
phn u vo n nm gi khu vc hin ti. Cc i tng pha my ch ly gi tr ca
trng u vo n v thit lp min trong FacesContext theo khu vc c la chn.

15.10 To v s dng mt chuyn i ty chnh


Mt lp chuyn i JavaServer Faces chuyn i cc chui thnh i tng v cc
i tng thnh chui nh yu cu. Mt s chuyn i tiu chun c cung cp bi
JavaServer Faces cho mc ch ny Xem S dng chuyn i tiu chun bit thm
thng tin v cc b bao gm chuyn i.
Nh gii thch trong Chuyn i m hnh, nu chuyn i tiu chun i km
vi JavaServer Faces khng th thc hin vic chuyn i d liu m bn cn, bn c th
to ra mt cng c chuyn i ty chnh thc hin chuyn i chuyn ngnh ny. Vic
thc hin ny, mc ti thiu, phi xc nh lm th no chuyn i d liu hai chiu
gia hai quan im ca d liu c m t trong Chuyn i m hnh.

Tt c chuyn i ty chnh phi thc hin giao din


javax.faces.convert.Converter. Phn ny gii thch cch thc hin giao din ny
thc hin mt s chuyn i d liu ty chnh.
Trng hp nghin cu hiu sch ca Duke s dng mt ty chnh thc hin
chuyn i, nm tut-install/examples/case-studies/dukesbookstore/src/java/dukesbookstore/converters/CreditCardConverter.java, chuyn i
d liu c nhp vo trng Th Tn Dng trn trang bookcashier.xhtml. N di khong
trng v du gch ni t chui vn bn v nh dng n mt khong trng ngn cch
mi bn k t.
Mt trng hp s dng ph bin cho mt chuyn i ty chnh trong mt danh
sch cho mt loi i tng khng chun. Trong trng hp nghin cu ca Duke,
Student v Guardian yu cu chuyn i ty chnh chng c th c chuyn i v
t mt thnh phn u vo UISelectItems.

15.10.1. To ra mt chuyn i ty chnh.


Cc lp ty chnh chuyn i CreditCardConverter c to ra nh sau:
@FacesConverter("ccno")
public class CreditCardConverter implements Converter {
...
}
Cc ch thch @FacesConverter ng k lp ty chnh chuyn i nh mt chuyn
i vi tn ccno vi vic thc hin phi i mt vi JSP c ch r. Ngoi ra, bn c
th ng k b chuyn i vi mc trong tp tin cu hnh ng dng ti nguyn, nh th
hin trong vic ng k mt chuyn i ty chnh.
xc nh nh th no d liu c chuyn i t quan im trnh by xem
m hnh, thc hin chuyn i phi thc hin phng php getAsObject (FacesContext,
UIComponent, String) t giao din chuyn i. y l vic thc hin phng php ny t
CreditCardConverter:

@Override
public Object getAsObject(FacesContext context,
UIComponent component, String newValue)
throws ConverterException {
if (newValue.isEmpty()) {

return null;
}
// Since this is only a String to String conversion,
// this conversion does not throw ConverterException.
String convertedValue = newValue.trim();
if ( (convertedValue.contains("-")) || (convertedValue.contains(" "))) {
char[] input = convertedValue.toCharArray();
StringBuilder builder = new StringBuilder(input.length);
for (int i = 0; i < input.length; ++i) {
if ((input[i] == '-') || (input[i] == ' ')) {
}else{
builder.append(input[i]);
}
}
convertedValue = builder.toString();
}
return convertedValue;
}
Trong giai on p dng gi tr yu cu, khi cc thnh phn gii m phng php
c thc hin, vic thc hin phi i mt vi JSP c ch r nhn ln cc thnh phn
a phng gi tr trong yu cu v gi phng php getAsObject. Khi gi phng php
ny, thc hin JSP c ch r phi i mt vi n trong trng hp FacesContext hin
thi, cc thnh phn c d liu cn chuyn i, v gi tr a ch nh l mt chui. Cc
phng php sau vit gi tr a ch mt lot cc i tng, xa du gch ngang v
khong trng, thm phn cn li ca cc i tng vo mt chui v tr v chui.
xc nh nh th no d liu c chuyn i t quan im m hnh n ch
xem trnh by, thc hin chuyn i phi thc hin phng php getAsString
(FacesContext, UIComponent, Object) t giao din chuyn i. Di y l mt vic
thc hin phng php ny:
@Override
public String getAsString(FacesContext context,
UIComponent component, Object value)
throws ConverterException {
String inputVal = null;
if(value==null){
return "";
}
// value must be of a type that can be cast to a String.
try {

inputVal = (String)value;
} catch (ClassCastException ce) {
FacesMessage errMsg new
FacesMessage(CONVERSION_ERROR_MESSAGE_ID);
FacesContext.getCurrentInstance().addMessage(null, errMsg);
throw new ConverterException(errMsg.getSummary());
}
// insert spaces after every four characters for better
// readability if they are not already present.
char[] input = inputVal.toCharArray();
StringBuilder builder = new StringBuilder(input.length + 3);
for (int i = 0; i < input.length; ++i) {
if((i%4)==0&&(i!=0)){
if ({input[i] != ' ') || (input[i] != '-')){
builder.append(" ");
// if there are any "-"'s convert them to blanks.
} else if (input[i] == '-') {
builder.append(" ");
}
}
builder.append(input[i]);
}
String convertedValue = builder.toString();
return convertedValue;
}
Trong giai on a ra phn ng, trong cc thnh phn m ha phng php c
gi l Faces JSP c ch r thc hin cuc gi phng php getAsString to ra sn
lng thch hp. Khi thc hin JSP c ch r phi i mt vi cc cuc gi phng
php ny, n vt qua trong FacesContext hin ti, UIComponent c gi tr cn phi
c chuyn i v gi tr ng c chuyn i. Bi v b chuyn i ny hin mt
chuyn i chui thnh chui, phng php ny c th cast gi tr ng cho mt chui.
Nu gi tr khng th c chuyn i sang mt chui, cc phng php cho mt
ngoi l i qua mt thng bo li t cc gi ti nguyn c ng k vi cc ng dng.
ng k ng dng th gii thch lm th no ng k thng bo ty chnh li vi cc
ng dng.
Nu gi tr c th c chuyn i sang mt chui, cc phng php c chui mt
lot cc i tng v vng qua cc mng, thm mt khng gian sau khi tt c bn i
tng.

Bn cng c th to mt chuyn i ty chnh vi mt ch thch @FacesConverter ch


nh cc thuc tnh forClass, nh minh ho trong v d sau t cng tc km trng hp
nghin cu:
@FacesConverter(forClass=Guardian.class, value="guardian")
public class GuardianConverter extends EntityConverter implements Converter { ...
Thuc tnh forClass ng k b chuyn i nh chuyn i mc nh cho cc lp
ngi Guardian. Do , bt c khi no lp c ch nh bi mt thuc tnh gi tr ca
mt thnh phn u vo, b chuyn i kch hot t ng.
Mt chuyn i lp c th l mt lp Java POJO ring bit, nh trong nghin cu ca
hiu sch ca Duke. Nu n cn truy cp cc i tng c xc nh trong mt lp
ng c qun l, Tuy nhin, N c th l mt phn lp ca mt qun l ht JSF, nh
trong v d address-book, trong cc chuyn i s dng mt ht nguy him a v
lp qun l ht

15.10.2 S dng mt chuyn i ty chnh


p dng chuyn i d liu, thc hin bi mt chuyn i ty chnh gi tr
ca mt thnh phn c th, bn phi thc hin mt trong nhng iu sau y.
Tham kho b chuyn i t th thnh phn chuyn i thuc tnh.
Lm t mt th f:converter bn trong cc thnh phn t kha v tham kho cc ty
chnh chuyn i t mt trong cc thuc tnh ca th f:converter.
Nu bn ang s dng t kha thnh phn chuyn i thuc tnh, thuc tnh ny
phi tham kho thc hin chuyn i nh danh hoc tn lp iu kin ca b chuyn
i. To v s dng mt chuyn i ty chnh gii thch lm th no thc hin mt
chuyn i ty chnh.
nh danh cho th tn dng chuyn i lp l ccno, gi tr c ch nh trong
@FacesConverter ch thch:
@FacesConverter("ccno")
public class CreditCardConverter implements Converter {
...
V vy, v d CreditCardConverter c th c ng k trn cc thnh phn
ccno nh minh ho trong v d sau:
<h: inputText id="ccno"

size="19"
converter="ccno"
value="#{cashierBean.creditCardNumber}" .
requiredMessage="#{bundle.ReqCreditCard}">

required="true"

...
</h:inputText>
Bng cch t cc thuc tnh chuyn i ca mt thnh phn t kha nhn dng
ca chuyn i hoc tn lp, bn gy ra gi tr a phng thnh phn phi c t
ng chuyn i theo cc quy tc quy nh trong vic thc hin chuyn i.
Thay v tham kho b chuyn i t th thnh phn chuyn i thuc tnh, bn c
th tham kho b chuyn i t mt t kha f:converter lng bn trong cc thnh phn t
kha. tham kho b chuyn i ty chnh bng cch s dng cc t kha f:converter,
bn thc hin mt trong nhng iu sau y.
Thit lp cc t kha f:converter converterId thuc tnh thc hin chuyn i
nh danh c nh ngha trong ch thch @FacesConverter hoc trong tp tin ti
nguyn cu hnh ng dng. Phng php ny c th hin trong bookcashier.xhtml:
<h:inputText id="ccno"
size="19"
converter="ccno"
value="#{cashierBean.creditCardNumber}"
required="true"
requiredMessage="#{bundle.ReqCreditCard}">
...
</h:inputText>
Rng buc thc hin chuyn i mt ht c qun l ti sn bng cch s
dng cc thuc tnh rng buc th f:converter, nh c m t trong Binding Converters,
Listeners, and Validators to Managed Bean Properties.
JavaServer Faces thc hin gi phng thc getAsObject ca chuyn i
khng gian di v du gch ni t gi tr u vo. Phng php getAsString c gi khi
bookcashier.xhtml trang redisplayed; iu ny s xy ra nu ngi s dng n t hng
nhiu hn 100 $ gi tr ca cun sch.
Trong trng hp nghin cu ca Duke, mi chuyn i c ng k nh
chuyn i cho mt lp hc c bit. B chuyn i t ng c kch hot bt c khi
no lp c ch nh bi mt thuc tnh gi tr ca mt thnh phn u vo. Trong v
d sau, cc thuc tnh itemValue (nh du m) gi b chuyn i cho lp Guardian:

<h:selectManyListbox id="selectGuardiansMenu"
title="#{bundle['action.add.guardian']}"
value="#{guardianManager.selectedGuardians}"
size="5"
converter="guardian">
<f:selectItems value="#{guardianManager.allGuardians}"
var="selectedGuardian"
itemLabel="#{selectedGuardian.name}"
itemValue="#{selectedGuardian}"/>
</h:selectManyListbox>

15.11 To v s dng mt Validator ty chnh


Nu cc tiu chun validators hoc ht xc nhn khng thc hin xc nhn kim
tra bn cn, bn c th to mt validator ty chnh xc nhn ngi dng nhp vo.
Nh gii thch trong m hnh xc nhn, c hai cch trin khai m xc nhn.
Thc hin mt phng php u c qun l thc hin xc nhn.
Cung cp mt thc hin ca javax.faces.validator. Giao din Validator thc
hin xc nhn.
Vit mt phng php thc hin xc nhn gii thch lm th no thc hin
mt phng php ht c qun l thc hin xc nhn. Phn cn li ca phn ny gii
thch lm th no thc hin giao din Validator.
Nu bn chn thc hin giao din Validator v bn mun cho php tc gi trang
cu hnh thuc tnh ca validator t trang, bn cng phi xc nh mt th ty chnh
cho ng k validator vo mt thnh phn.
Nu bn mun t cu hnh cc thuc tnh trong vic thc hin Validator, bn c
th forgo ch nh mt th ty chnh v thay vo cho cc tc gi ca trang ng k
validator v mt thnh phn bng cch s dng th f:validator, nh c m t trong vic
s dng mt Validator ty chnh.
Bn cng c th to ra mt ht c qun l ti sn chp nhn v tr v vic
thc hin Validator bn to ra, nh c m t trong Writing Properties Bound to
Converters, Listeners, or Validators. Bn c th s dng thuc tnh rng buc f:validator
ca th rng buc vic thc hin Validator cho thuc tnh qun l ht.
Thng thng, bn s mun hin th mt thng bo li khi d liu khng xc
nhn. Bn cn phi lu tr cc thng bo li trong mt gi sn phm ti nguyn.

Sau khi to ra cc gi ti nguyn, bn c hai cch lm cho cc tin nhn c sn


cho cc ng dng. Bn c th xp ln lt cc thng bo li vo lp trnh FacesContext,
hoc bn c th ng k cc thng bo li trong tp tin cu hnh ng dng ti nguyn,
nh c din t trong ng k ng dng th.
V d, mt ng dng thng mi in t c th s dng mt Validator ty chnh
thng thng c gi l FormatValidator.java xc nhn cc d liu u vo vi mt
m hnh nh dng c ch nh trong th ty chnh Validator. Validator ny s c s
dng vi mt trng s th tn dng trn mt trang Facelets. y l th ty chnh
validator:
<mystore:formatValidator
formatPatterns="9999999999999999|9999 9999 9999 9999|9999-9999-9999-9999"/>
Theo validator ny, d liu nhp vo trng phi l mt trong nhng iu sau y:
A 16 ch s vi khng gian khng c
A 16 ch s vi mt khng gian gia mi bn ch s
A 16 ch s vi du gch ngang gia mi bn ch s
Cc t kha f:validateRegex lm cho mt validator ty chnh khng cn thit trong
tnh hung ny. Tuy nhin, phn cn li ca phn ny m t cch validator ny s c
thc hin v lm th no ch nh mt th ty chnh cho tc gi ca trang c th
ng k validator vo mt thnh phn.

15.11.1 Thc hin ValidatorInterface


Mt Validator hon thin phi cha mt kin trc, mt tp hp cc phng php
accessor cho bt k thuc tnh no trn th, v mt phng php xc nhn, s thay th cc
phng php xc nhn ca giao din Validator.
Cc lp gi thuyt FormatValidator cng xc nh phng php accessor thit
lp thuc tnh formatPatterns, xc nh cc nh dng c chp nhn cho cc m hnh
u vo vo cc lnh vc. Phng php setter gi phng php parseFormatPatterns, chia
tch cc thnh phn ca chui m hnh thnh mt chui mng formatPatternsList.
public String getFormatPatterns() {
return (this.formatPatterns);
}
public void setFormatPatterns(String formatPatterns) {

this.formatPatterns = formatPatterns;
parseFormatPatterns();
}
Ngoi ra xc nh phng php accessor cho cc thuc tnh, lp s ghi
phng thc xc nhn ca giao din Validator. Phng php ny xc nhn u vo v
cng c th truy cp cc thng bo li ty chnh s c hin th khi chui l khng hp
l.
Cc phng php xc nhn thc hin xc nhn thc t ca d liu. V d phn
FacesContext, cc thnh phn c d liu cn phi c xc nhn, v gi tr m cn phi
c xc nhn. Mt validator c th xc nhn ch d liu ca mt thnh phn thc hin
javax.faces.component.EditableValueHolder.
Di y l mt vic thc hin ca cc phng php xc nhn:
@FacesValidator
public class FormatValidator implements Validator, StateHolder {
...
public void validate(FacesContext context, UIComponent component,
Object toValidate) {
boolean valid = false;
String value = null;
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
if (!(component instanceof UIInput)) {
return;
}
if ( null == formatPatternsList || null == toValidate) {
return;
}
value = toValidate.toString();
// validate the value against the list of valid patterns.
Iterator patternIt = formatPatternsList.iterator();
while (patternIt.hasNext()) {
valid = isFormatValid(
(
(String)patternIt.next()), value);
if (valid) {
break;
}
}
if ( !valid ) {

FacesMessage errMsg =
new FacesMessage(FORMAT_INVALID_MESSAGE_ID);
FacesContext.getCurrentInstance().addMessage(null, errMsg);
throw new ValidatorException(errMsg);
}
}
}
Cc ch thch @FacesValidator ng k lp FormatValidator nh mt validator
vi vic thc hin phi i mt vi JSP c ch r. Cc phng php xc nhn c gi
tr con ca cc thnh phn v chuyn n n mt chui. N sau iterates trong danh
sch formatPatternsList, l danh sch cc m hnh c chp nhn phn tch c php t
cc thuc tnh formatPatterns ca th ty chnh validator.
Trong khi iterating trong danh sch, phng php ny s kim tra cc m hnh ca
cc thnh phn con gi tr chng li cc m hnh trong danh sch. Nu cc m hnh ca
gi tr con khng khp vi bt k mu trong danh sch, phng php ny to ra mt
thng bo li. N sau to ra mt javax.faces.application.FacesMessage v hng i n
trn FacesContext hin th, bng cch s dng mt chui i din ch cht trong cc
tp tin thuc tnh:
public static final String FORMAT_INVALID_MESSAGE_ID =
"FormatInvalid";
}
Cui cng, phng php truyn thng ip n cc kin trc ca
javax.faces.validator.ValidatorException.
Khi thng bo li c hin th, cc m hnh nh dng s c thay th cho {0}
trong thng bo li, m, trong ting Anh, l nh sau:
Input must match one of the following patterns: {0}
Bn c th lu v khi phc trng thi cho validator ca bn, mc d trng thi
tit kim l khng thng cn thit. lm nh vy, bn s cn phi thc hin giao din
StateHolder cng nh giao din Validator.
thc hin StateHolder, bn s cn phi thc hin cc 4 phng php:
saveState(FacesContext), restoreState (FacesContext, i tng), isTransient, v
setTransient(boolean). Xem Saving and Restoring State trng thi cho bit thm thng
tin.

15.11.2 Ch nh mt th ty chnh
Nu bn thc hin mt giao din Validator ch khng phi l thc hin mt
phng php ht c qun l thc hin xc nhn, bn cn phi thc hin mt trong
nhng iu sau y.
Cho php tc gi trang xc nh vic thc hin Validator s dng vi
th f:validator. Trong trng hp ny, vic thc hin Validator phi xc nh thuc tnh
ring ca mnh. Bng cch s dng mt Validator tu chnh gii thch lm th no s
dng th f:validator.
Ch nh mt th ty chnh cung cp thuc tnh cho cu hnh cc thuc tnh
ca validator t trang.
to mt th ty chnh, bn cn phi thm cc t kha m t th th vin cho
cc ng dng, bookstore.taglib.xml:
<tag>
<tag-name>validator</tag-name>
<validator>
<validator-id>formatValidator</validator-id>
<validator-class>
dukesbookstore.validators.FormatValidator
</validator-class>
</validator>
</tag>
Cc yu t tn th xc nh tn ca cc t kha nh n phi c s dng trong mt
trang Facelets. Cc yu t validator-id xc nh validator ty chnh. Cc yu t validator
cp dy th ty chnh cc lp thc hin.
Bng cch s dng mt Validator tu chnh gii thch lm th no s dng th ty
chnh validator trn trang.

15.11.3 bng cch s dng mt Validator ty chnh


ng k mt validator ty chnh trn mt thnh phn, bn phi thc hin mt
trong nhng iu sau y.
Lm t ca validator ty chnh t kha bn trong th ca cc thnh phn c
gi tr bn mun c xc nhn.

Lm t t kha tiu chun f:validator trong th ca cc thnh phn v tham


kho thc hin Validator ty chnh t th f:validator.
Di y l mt gi thuyt ty chnh formatValidator th cho trng s th tn
dng, lng nhau trong th h:inputText:
<h:inputText id="ccno" size="19"
...
required="true">
<mystore:formatValidator
formatPatterns="9999999999999999|9999 9999 9999 9999|9999-99999999-9999"/>
</h:inputText>
<h:message styleClass="validationMessage" for="ccno"/>
Th ny xc nhn u vo ca trng ccno chng li cc m hnh c xc nh
bi tc gi ca trang trong cc thuc tnh formatPatterns.
Bn c th s dng trnh xc nhn ty chnh tng t cho bt c thnh phn
tng t bng cch n gin lng cc th xc nhn ty chnh trong cc th thnh phn.
Nu cc nh pht trin ng dng to ra ty chnh validator thch cu hnh
cc thuc tnh trong vic thc hin Validator ch khng phi l cho php tc gi trang
cu hnh cc thuc tnh t trang, cc nh pht trin s khng to ra mt th ty chnh cho
s dng nhn validator.
Trong trng hp ny, ngi sng to ca trang phi lng t kha f:validator bn
trong th ca cc thnh phn c d liu cn phi c xc nhn. Sau , tc gi ca trang
cn phi thc hin mt trong nhng iu sau y.
t t kha f:validator validatorId thuc tnh ID validator c xc nh
trong tp tin ti nguyn cu hnh ng dng.
Lin kt thc hin Validator ty chnh vi mt bt ng sn ht c qun l
bng cch s dng cc thuc tnh rng buc th f:validator, nh c m t trong
Binding Converters, Listeners, and Validators to Managed Bean Properties.
Cc t kha sau y ng k mt gi thuyt validator v mt thnh phn bng
cch s dng mt th f:validator v ti liu tham kho ID ca validator:
<h:inputText id="name" value="#{CustomerBean.name}"
size="10" ...>
<f:validator validatorId="customValidator" />

...
</h:inputText>

15.12 Rng buc thnh phn gi tr v Cc v d qun l thuc


tnh ht.
Mt th thnh phn c th buc d liu ca n n mt ht c qun l bi mt
trong nhng phng php sau y:
Rng buc ca n thnh phn gi tr ti mt cn nh ht
Rng buc trng hp thnh phn ca n ti mt cn nh ht
Lin kt gi tr ca mt thnh phn vi mt ht c qun l ht, mt th thnh
phn gi tr thuc tnh s dng mt biu hin gi tr EL. Lin kt mt trng hp thnh
phn vi mt bt ng sn ht, mt th thnh phn rng buc thuc tnh s dng mt biu
thc gi tr.
Khi mt trng hp thnh phn l rng buc mt ht c qun l ti sn, ti
sn c gi tr ht ca thnh phn. Ngc li, khi gi tr ca mt thnh phn l rng buc
mt ht c qun l thuc tnh, thuc tnh c gi tr c lu tr trong ht c qun
l. Gi tr ny c Cp Nht vi gi tr a phng trong giai on Cp Nht m hnh
gi tr ca vng i. Rt thun li cho c hai ca nhng phng php ny.
Rng buc mt v d thnh phn s hu mt ht c nhng u im sau:
Ht qun l lp trnh c th thay i thnh phn thuc tnh.
Ht qun l c th nhanh chng thnh phn thay v cho php tc gi trang lm
nh vy.
Rng buc gi tr ca mt thnh phn s hu mt ht c nhng u im sau:
Tc gi ca trang c kim sot nhiu hn cc thnh phn thuc tnh.
Cc ht qun l khng ph thuc vo JSP c ch r phi i mt vi API
(chng hn nh cc lp thnh phn), cho php phn chia ln hn ca cc lp trnh by t
cc lp m hnh.
The Faces JSP c ch r thc hin c th thc hin chuyn i trn d liu
da trn loi thuc tnh ht m khng c cc nh pht trin cn phi p dng mt b
chuyn i.

Trong hu ht trng hp, bn s lin kt mt thnh phn gi tr ch khng phi


l trng hp ca n vi mt thuc tnh ht. Bn s cn phi s dng mt rng buc
thnh phn ch khi bn cn thay i mt trong cc thnh phn thuc tnh t ng. V d,
nu mt ng dng Hin th hnh nh mt thnh phn ch trong iu kin nht nh, n c
th thit lp cc thnh phn rendered thuc tnh cho ph hp do truy cp vo cc thuc
tnh m cc thnh phn l rng buc.

15.12 Cc gi tr v v d thnh phn rng buc ti thuc tnh


ht qun l
Mt th thnh phn c th gi d liu ca n n mt ht c qun l bng cc cch
sau y:
-

Rng buc thnh phn gi tr ti mt thuc tnh ht


Rng buc thnh phn v d ti mt thuc tnh ht

Lin kt gi tr ca mt thnh phn vi mt thuc tnh ht qun l, gi tr mt th


thnh phn thuc tnh s dng mt biu hin gi tr EL. Lin kt mt trng hp thnh
phn vi mt thuc tnh ht, mt th thnh phn rng buc thuc tnh s dng mt biu
thc gi tr.
Khi mt trng hp thnh phn l rng buc qun l thuc tnh ht, thuc tnh
c gi tr c bn ca thnh phn. Ngc li, khi gi tr ca mt thnh phn l rng
buc qun l thuc tnh ht, thuc tnh c gi tr c lu tr trong ht c qun l.
Gi tr ny c cp nht vi gi tr c bn trong giai on cp nht m hnh gi
tr vng i. N rt thun li cho c hai phng php ny.
Rng buc thnh phn v d c nhng u im sau:
Ht qun l c th lp trnh c th thay i thnh phn thuc tnh.
Ht qun l c th ngay lp tc thay i thnh phn thay v cho php tc
gi trang lm nh vy.
Rng buc thnh phn gi tr c nhng u im sau:
Tc gi ca trang c kim sot nhiu hn cc thnh phn thuc tnh.
Cc ht qun l khng ph thuc vo JSP c ch r phi i mt vi API
(chng hn nh cc lp thnh phn), cho php cho ln hn tng lp ca cc lp thuyt
trnh t cc m hnh lp.

The Faces JSP c ch r c th thc hin chuyn i trn d liu da


vo loi ht m khng c cc nh pht trin cn phi p dng mt chuyn i.
Trong hu ht trng hp, bn s lin kt mt thnh phn gi tr ch khng phi l
v d ca n vi mt thuc tnh ht. Bn s cn phi s dng mt thnh phn rng
buc ch khi bn cn phi thay i mt thnh phn thuc tnh t ng.
V d, nu mt ng dng Hin th hnh nh mt thnh phn ch trong iu
kin nht nh, n c th thit lp cc thnh phn tr li thuc tnh cho ph
hp bng cch truy cp cc thuc tnh m cc thnh phn l rng buc.
Khi tham kho cc thuc tnh bng cch s dng t kha thnh phn gi tr thuc
tnh, bn cn phi s dng c php thch hp. V d, gi s mt ht qun l c gi
l MyBean c thuc tnh int:
protected int currentOption = null;
public int getCurrentOption(){...}
public void setCurrentOption(int option){...}
Gi tr thuc tnh ti liu tham kho ny phi c gi tr rng buc biu hin:
#{myBean.currentOption}
Ngoi ra rng buc mt thnh phn gi tr ti mt thuc tnh ht, thuc tnh gi
tr c th ch nh mt gi tr ch hoc c th nh x d liu cc thnh phn cho bt k d
liu th no (chng hn nh int), cu trc (chng hn nh mt mng), hoc b su tp (v
d nh mt danh sch), c lp ca mt thnh phn JavaBeans. Bng 15-3 lit k mt
s biu thc gi tr rng buc v d bn c th s dng vi cc gi tr thuc tnh.
Bng 15-3 Biu thc gi tr rng buc v d.
Gi tr
Boolean
Mt thuc tnh c khi to t mt khi
to tham s
Mt thuc tnh ht
Mt gi tr trong mt mng
Mt gi tr trong mt b su tp
Thuc tnh ca mt i tng trong mt
lot cc i tng

Biu thc
cart.numberOfItems> 0
initParam.quantity
cashierBean.name
books[3]
books["fiction"]
books[3].price

Hai phn tip theo gii thch lm th no s dng thuc tnh gi tr rng
buc mt thnh phn gi tr cho mt thuc tnh ht hoc cc i tng d
liu khc v lm th no s dng cc thuc tnh rng buc lin kt mt trng
hp thnh phn vi mt thuc tnh ht.

15.12.1 Rng buc mt gi tr thnh phn ti mt thuc tnh.


rng buc gi tr ca mt thnh phn ti mt ht qun l, bn ch nh tn ca ht v
cc thuc tnh bng cch s dng thuc tnh gi tr.
iu ny c ngha l phn u tin ca biu thc gi tr EL phi ph hp vi tn ca ht
c qun l ln n giai on u tin (.) v mt phn ca biu thc gi tr sau phi ph
hp vi ti sn ca ht qun l.
V d, trong trng hp Duke's Bookstore, h: dataTable trong th bookcatalog.xhtml t
gi tr ca cc thnh phn vi gi tr ca ht sch ca ht BookstoreBean tr li, c tn l
ca hng:
<h:dataTable id="books"
value="#{store.books}"
var="book"
headerClass="list-header"
styleClass="list-background"
rowClasses="list-row-even, list-row-odd"
border="1"
summary="#{bundle.BookCatalog}">
Gi tr thu c bng cch gi phng php getBooks ht tr li, m ln lt gi
phng thc getBooks ca BookRequestBean.
Nu bn s dng cc tp tin ti nguyn cu hnh ng dng cu hnh ht qun l
thay v nh ngha chng trong cc lp ht qun l, tn ca cc ht trong gi tr biu hin
phi ph hp vi cc yu t qun l ht u tin ca ht c qun l khai n giai on
u tin (.) trong biu thc. Tng t nh vy, mt phn ca gi tr biu hin sau thi
gian phi ph hp vi tn c ch nh tng ng phn tn thuc tnh trong tp tin ti
nguyn cu hnh ng dng.

V d, hy xem xt cu hnh ht qun l, m cu hnh Ht ImageArea tng ng


vi cun sch trn cng bn tri trong bn hnh nh trn trang index.html ca nghin
cu trng hp sch ca Duke:
<managed-bean eager="true">
...
<managed-bean-name>Book201</managed-bean-name>
<managed-bean-class>dukesbookstore.model.ImageArea</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
...
<property-name>shape</property-name>
<value>rect</value>
</managed-property>
<managed-property>
...
<property-name>alt</property-name>
<value>Duke</value>
</managed-property>
...
V d ny cu hnh ht c gi l Book201, trong c mt s thuc tnh, mt
trong nhng c gi l hnh dng.
Mc d cc ca hng sch: th trong khu vc trn trang index.xhtml khng lin
kt vi mt Thuc tnh (chng kt hp vi cc ht ring ca mnh) ImageArea, bn c th
tham kho thuc tnh s dng mt biu thc gi tr t cc thuc tnh gi tr ca th ca
thnh phn:
<h:outputText value="#{Book201.shape}" />
Xem Cu hnh qun l Ht bit thng tin v cch cu hnh ht trong ng dng
tp tin ti nguyn cu hnh.

15.12.2 Rng buc mt gi tr thnh phn cho mt i


tng tim n.

Mt ngun d liu bn ngoi m mt thuc tnh gi tr c th tham kho l mt i


tng tim n.
Trang bookreceipt.xhtml nghin cu trng hp sch ca Duke c mt tham chiu
n mt i tng tim n:
<h:outputFormat title="thanks"
value="#{bundle.ThankYouParam}">
<f:param value="#{sessionScope.name}"/>
</h:outputFormat>
Th ny c tn ca khch hng t phm vi phin v chn n vo cc tp tin
tham s ti kha ThankYouParam t cc gi ti nguyn.
V d, nu tn ca khch hng l Gwen Canigetit, th ny s hin th:
Thank you, Gwen Canigetit, for purchasing your books from us.
Ly gi tr t cc i tng tim n khc c thc hin theo mt cch tng t
nh v d th hin trong phn ny. Bng 15-4 lit k cc i tng tim n m mt thuc
tnh gi tr c th tham kho. Tt c cc i tng tim n, tr cc i tng phm vi, ch
c v do khng nn c s dng nh cc gi tr cho mt thnh phn UIInput.
Bng 15-4: Cc i tng tim n:
i tng tim n
ApplicationScope

Ngha l g
Bn ca cc gi tr thuc tnh phm
vi ng dng, c nh du bi tn thuc
tnh

Cookie

Bn ca cc gi tr cookie cho yu
cu hin ti, c nh du bi tn cookie

FacesContext

Trng hp FacesContext cho tiu yu


cu hin ti

Header

Bn ca cc gi tr tiu
HTTP cho yu cu hin ti, c nh
du bi tn tiu

HeaderValue

Bn ca chui mng c cha tt


c cc gi tr tiu cho cc phn
u HTTP trong yu cu hin ti, c
nh du bi tn tiu

InitParam

Bn ca cc tham s khi to bi
cnh cho ng dng web ny

Param

Bn ca cc thng s yu cu cho yu
cu ny, c nh du bi tn tham s

ParamValue

Bn ca chui mng c cha tt


c cc gi tr tham s cho yu cu trong yu
cuhin ti, c nh du bi tn tham s

RequestScope

Bn ca cc thuc tnh yu cu cho yu


cu ny, c nh du bi tn thuc tnh

SessionScope

Bn ca cc thuc tnh phin cho yu


cu ny, c nh du bi tn thuc tnh

View

Gc UIComponent trong cy thnh


phn hin ti lu
tr trong FacesRequest cho yu cu ny

15.12.3 Rng buc thnh phn v d cho mt thuc tnh ht.


Mt v d thnh phn c th c lin kt vi mt thuc tnh ht s dng mt biu
thc gi tr vi thuc tnh rng buc ca th thnh phn. Bn thng gn mt v d thnh
phn khng phi l gi tr ca n i vi thuc tnh ht nu phi thay i thuc tnh ca
thnh phn.

Di y l hai th t trang bookcashier.xhtml rng buc cc thnh phn ti ht


thuc tnh:
<h:selectBooleanCheckbox id="fanClub"
rendered="false"
binding="#{cashierBean.specialOffer}" />
<h:outputLabel for="fanClub"
rendered="false"
binding="#{cashierBean.specialOfferText}"
value="#{bundle.DukeFanClub}"/>
</h:outputLabel>
Th h:selectBooleanCheckbox lm cho mt hp kim tra v lin kt vi cc
fanClubUISelectBooleann ti sn ca ht th qu specialOffer. Th h:outputLabel lin
kt vi cc thnh phn i din cho nhn hp kim ca cc thuc tnh specialOfferText
ca ht th qu. Nu ng dng c bn l ting Anh, th h: outputLabel s hin th:
I'd like to join the Duke Fan Club, free with my purchase of over $100
Cc thuc tnh ca c hai th tr li c thit lp l false ngn chn cc hp
kim tra v nhn ca n khng b tr li. Nu khch hng lm cho mt n t hng ln
v nhp chut vo nt Submit, phng php trnh ca CashierBean tr li thuc tnh ca
c hai thnh phn, to ra cc hp kim tra v nhn ca n s c tr li.
Nhng th ny s dng cc rng buc thnh phn ch khng phi rng buc gi tr
v qun l ht phi t ng thit lp cc gi tr tr li thuc tnh ca cc thnh phn.
Nu cc th s dng cam kt rng buc gi tr thay v rng buc thnh phn,
qun l ht s khng c quyn truy cp trc tip n cc thnh phn v do s yu cu
m b sung truy cp cc thnh phn t cc v d FacesContext thay i tr li thuc
tnh ca cc thnh phn.
Vit Thuc tnh rng buc Trng hp phn gii thch lm th no vit cc
ht tnh lin kt vi cc thnh phn v d.

15.13 Rng buc chuyn i, lng nghe v xc nhn thc hin


qun l mt ht.

Nh m t trong Thm thnh phn vo mt trang s dng th Th vin HTML ,


mt trang tc gi c th lin kt chuyn i, lng nghe, v trin khai xc nhn ht c
qun l bng cch s dng cc thuc tnh lin kt ca cc th c s dng ng k
trin khai thc hin trn cc thnh phn.
K thut ny c li th tng t nh trng hp rng buc thnh phn qun l
thuc tnh ht, nh m t trong Rng buc Gi tr phn v Trng hp qun l thuc
tnh ht. C th, rng buc mt chuyn i, lng nghe, hoc xc nhn thc hin s hu
mt bean c qun l mang li nhng li ch sau y.
Cc ht c qun l c th nhanh chng thc hin thay v cho php trang tc gi
lm nh vy.
Cc ht c qun l theo chng trnh c th thay i cc thuc tnh thc hin. Trong
trng hp ty chnh thc hin, ch c cch sa i cc thuc tnh bn ngoi ca lp s
c thc hin to ra mt th ty chnh cho n v yu cu tc gi trang thit lp cc
gi tr thuc tnh t trang.
Cho d bn ang rng buc mt chuyn i, lng nghe, hoc xc nhn mt bean c
qun l ti sn, qu trnh ny l ging vi bt k hin thc no.
T chuyn i, lng nghe, hoc th xc nhn trong vng mt th thnh phn thch hp.
Hy chc chn rng cc ht qun l c mt thuc tnh m chp nhn v tr v chuyn
i, lng nghe, hoc xc nhn lp thc hin m bn mun lin kt vi cc thuc tnh.
Hy tham kho cc thuc tnh ht c qun l bng cch s dng mt biu thc gi tr
t cc rng buc thuc tnh ca b chuyn i, lng nghe, hoc th xc nhn.
V d, ni rng bn mun lin kt chuyn i DateTime tiu chun vi mt ht
thuc tnh c qun l bi v bn mun thit lp m hnh nh dng u vo ca ngi
dng trong ht c qun l ch khng phi trn trang Facelets. u tin, trang ng
k b chuyn i ln cc thnh phn bng cch lm t t kha f:convertDateTimetag:
<h:inputText value="#{loginBean.birthDate}">
<f:convertDateTime binding="#{loginBean.convertDate}" />
</h:inputText>
Cc convertDateproperty s ging nh th ny:

private DateTimeConverter convertDate;


public DateTimeConverter getConvertDate() {
...
return convertDate;
}
public void setConvertDate(DateTimeConverter convertDate) {
convertDate.setPattern("EEEEEEEE, MMM dd, yyyy");
this.convertDate = convertDate;
}
Xem Vit Thuc tnh rng buc chuyn i, lng nghe, xc nhn hoc thc
hin bit thm thng tin v vn bn qun l thuc tnh ht cho chuyn i, lng nghe,
v xc nhn trin khai thc hin.

16.
ng dng cu hnh JSP Faces
Qu trnh xy dng v trin khai cc ng dng JavaServer Faces n gin l c
m t trong cc chng trc ca hng dn ny, trong c Chng 6, "Bt u vi
Cc ng dng web, "Chng 8," Gii thiu v Facelets, "Chng 13," S dng Ajax vi
Cng ngh JavaServer Faces, "v Chng 14," tng hp cc thnh phn: nng cao Ch
v mt v d. "Khi bn to cc ng dng ln v phc tp, tuy nhin, nhim v cu
hnh b sung khc nhau c yu cu. Nhng nhim v ny bao gm:
ng k ht qun l vi cc ng dng tt c cc b phn ca ng dng c tip
cn vi n.
Cu hnh qun l ht v ht m hnh n c khi to vi cc gi tr thch hp khi
mt trang lm ti liu tham kho cho n.
Xc nh quy nh cho mi trang trong ng dng cc ng dng c lu lng trang
mn, nu chuyn hng khng mc nh l cn thit.
ng gi ng dng bao gm tt c cc trang, ti nguyn, v cc file khc ng dng
c th c trin khai trn bt k container ph hp.
Cc ch c cp y:

S dng ch thch cu hnh qun l ht.


Tp tin cu hnh ng dng ti nguyn.
S dng mt dng chy.
Cu hnh qun l ht.
ng k ng dng th.
dng Validators Mc nh.
ng k mt Validator Tu chnh.
ng k mt chuyn i ty chnh.
Quy tc Cu hnh Navigation.
ng k mt Renderer ty chnh vi mt Render Kit.
ng k mt phn ty chnh.
Yu cu c bn ca mt ng dng JavaServer Faces.

16.1 S dng ch thch cu hnh qun l ht.


JavaServer Faces h tr cho cc ch thch ht c gii thiu trong Chng 7,
"JavaServer Faces technology ". Ht ch thch c th c s dng cu hnh cc ng
dng JavaServer Faces.
Cc @Named (javax.inject.Named) ch thch trong mt lp, cng vi mt phm vi
ch thch, t ng ng k lp nh mt ngun ti nguyn vi JavaServer Faces thc
hin. Mt ht s dng cc ch thch ny l mt CDI qun l ht.
Sau y cho thy vic s dng cc ch thch Named v SessionScoped trong mt
lp:
@Named("cart")

@SessionScoped
public class ShoppingCart ... { ... }
on m trn cho thy mt ht c qun l bi cc JavaServer Faces thc hin
v c sn cho chiu di ca phin.
Bn c th ch thch ht vi bt k phm vi c lit k trong phn tip theo, dng
Lnh vc qun l Ht.
Tt c cc lp s c qut cho cc ch thch lc khi ng, tr khi cc yu t
Faces config trong tp tin faces-config.xml c cc thuc tnh siu d liu y .
Ch thch cng c sn cho hin vt khc, chng hn nh cc thnh phn, chuyn
i, xc nhn, v trnh biu din, s c s dng v tr ca ng dng tp tin ti nguyn
cu hnh mc. y l nhng tho lun cng vi ng k ca ngi nghe ty chnh, ty
chnh xc nhn, v chuyn i ty chnh, trong chng 15, "To ty chnh cc thnh phn
giao din ngi dng v Ty chnh i tng khc ".

16.1.1 S dng qun l ht phm vi.


Bn c th s dng ch thch xc nh phm vi m cc ht s c lu tr. bn
c th ch nh mt trong nhng phm vi sau y cho mt lp ht.
Application (javax.enterprise.context.ApplicationScoped): Phm vi p dng vn cn
tn ti trn tt c cc tng tc ca ngi dng vi mt ng dng web.
Session (javax.enterprise.context.SessionScoped): phm vi phin vn cn trn nhiu
yu cu HTTP trong mt ng dng web.
Flow (javax.faces.flows.FlowScoped): lu lng vn cn trong phm vi ca mt ngi
s dng tng tc vi mt dng chy c th ca mt ng dng web. Xem Using Faces
flows bit thm thng tin.
Request (javax.enterprise.context.RequestScoped): phm vi yu cu vn cn tn ti
trong mt yu cu HTTP trong mt ng dng web.
Dependent (javax.enterprise.context.Dependent): Ch ra rng ht ph thuc vo mt s
ht khc.

Bn c th mun s dng @Dependent khi mt ht qun l ti liu tham kho


qun l ht khc . Ht th hai nn khng c mt phm vi (Dependent) nu n c
coi l ch c to ra khi n c tham chiu. Nu bn nh ngha mt ht u nh
@Dependent, ht l khi to mt ln na mi khi n c tham chiu, v vy n khng
c lu trong bt k phm vi no.
Nu ht c qun l ca bn c tham chiu bi thuc tnh rng buc ca mt
th thnh phn, bn cn xc nh cc ht vi mt phm vi yu cu. Nu bn t cc ht
trong phin giao dch hoc Phm vi p dng thay vo , ht s cn phi c bin php
phng nga m bo ch an ton, bi v mi trng hp
javax.faces.component.UIComponent chy ph thuc vo bn trong mt ch duy nht.
Nu bn ang cu hnh ht, cho php cc thuc tnh c lin quan n quan im,
bn c th s dng phm vi xem. Cc thuc tnh tn ti cho n khi ngi dng
chuyn n tip theo xem.

16.2 ng dng cu hnh ti nguyn tp tin.


Cng ngh JavaServer Faces cung cp mt nh dng cu hnh di ng (nh l mt
ti liu XML) cho cu hnh ti nguyn ng dng. Mt hoc nhiu ti liu XML, c gi
l ng dng tp tin ti nguyn cu hnh, c th s dng nh dng ny ng k v cu
hnh cc i tng v cc ngun lc v xc nh quy nh cho cc ng dng. Mt ng
dng tp tin ti nguyn c cu hnh thng c t tn faces-config.xml.
Bn cn mt tp tin ti nguyn cu hnh ng dng trong cc trng hp sau y:
xc nh cc yu t cu hnh cho ng dng ca bn m khng c sn thng qua cc
ch thch ht c qun l, chng hn nh tin nhn ni a ha v chuyn hng quy
nh.
ghi ln cc ch thch ht c qun l khi ng dng c trin khai.
Cc ng dng cu hnh tp tin ti nguyn phi c gi tr i vi lc XML
nm : http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_ 2.xsd.
Ngoi ra, mi tp tin phi bao gm cc thng tin sau y, theo th t sau:
S phin bn XML, thng l vi mt thuc tnh m ha:

<?xml version="1.0" encoding='UTF-8'?>


Mt th faces-config km theo tt c cc t khai khc:
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
...
</faces-config>
Bn c th c s dng nhiu hn mt ng dng tp tin ti nguyn cu hnh cho
mt ng dng. JavaServer Faces thc hin tm file cu hnh hoc cc tp tin bng cch
tm kim sau:
Mt ngun ti nguyn tn /META-INF/faces-config.xml trong bt k ca cc tp tin
JAR trong cc th mc ca trang web ng dng / WEB-INF / lib / v b ti lp cha m.
Nu mt ngun ti nguyn vi tn ny tn ti, n c np nh mt ngun ti nguyn
cu hnh. Phng php ny thc t cho mt th vin ng gi c cha mt s thnh phn
v trnh biu din. Ngoi ra, bt k tp tin c tn kt thc bng faces-config.xml cng
c coi l mt ti nguyn v cu hnh c np nh vy.
Mt tham s khi to bi cnh, javax.faces.application.CONFIG_FILES, trong tp tin
m t trin khai web ca bn ch nh mt hoc nhiu (du phy phn cch) ng dn
cho nhiu tp tin cu hnh cho ng dng web ca bn. Phng php ny l nht thng
c s dng cho cc ng dng doanh nghip quy m m u thc cho cc nhm ring
bit trch nhim duy tr cc tp tin cho mi phn ca mt ng dng ln.
Mt ngun ti nguyn tn faces-config.xml trong th mc / WEB-INF / th mc ca
bn ng dng. Cc ng dng web n gin lm cho cc tp tin cu hnh ca h c sn
trong theo cch ny.
truy cp vo cc ngun ti nguyn ng k vi cc ng dng, pht trin ng
dng c th s dng mt th hin ca lp javax.faces.application.Application, l t
ng to ra cho mi ng dng. Cc v d ng dng hot ng nh mt nh my tp trung
cho ngun lc c nh ngha trong file XML.
Khi mt ng dng khi ng, JSP c ch r phi vi to ra mt trng hp duy
nht ca cc lp ng dng v cu hnh n vi cc thng tin bn cung cp trong cc ng
dng cu hnh ti nguyn tp tin.

Khi mt ng dng khi ng, JavaServer Faces thc hin to ra mt c th n


ca lp ng dng v thit lp cu hnh theo cc thng tin m bn cung cp trong ngun
d liu cu hnh ng dng .

16.2.1 Cu hnh ng dng Eager Qun l phm vi ht


Qun l ht JavaServer Faces (c quy nh trong tp tin faces-config.xml hoc
ch thch bng javax.faces.bean.ManagedBean) c khi to chm. C ngha l, chng
c khi to khi mt yu cu c t ra t cc ng dng.
buc mt phm vi ht ng dng c khi to v t trong phm vi ng dng
ngay sau khi ng dng bt u v trc khi bt k yu cu no c thc hin, thuc tnh
eager ca ht qun l nn c thit lp l true, nh trong v d sau y.
Vic khai bo tp tin faces-config.xml nh sau:
<managed-bean eager="true">
Ch thch:
@Ht qun l(eager=true)
@Phm vi ng dng

16.2.2 Th t ca tp tin cu hnh ng dng ti nguyn.


Bi v cng ngh JavaServer Faces cho php s dng nhiu tp tin cu hnh ng
dng ti nguyn c lu tr nhng v tr khc nhau, th t m h c ti khi thc thi
tr nn quan trng trong nhng tnh hung nht nh.(v d, khi s dng cc i tng
mc ng dng). Lnh ny c th c xc nh thng qua th t yu t v phn t con
ca n trong tp tin cu hnh ng dng ti nguyn ca chnh n. Cc th t ca cc cu
hnh ng dng ti nguyn c th l tuyt i hay tng i.
Th t tuyt i c xc nh bi mt yu t th t tuyt i trong tp tin. Vi
th t tuyt i, ngi dng ch nh th t m tp tin cu hnh ng dng ti nguyn s
c np. V d sau y cho thy mt mc nhp cho thu t tuyt i.
Tp tin my-faces-config.xml c cha cc yu t sau:
<faces-config>
<name>myJSF</name>

<absolute-ordering>
<name>A</name>
<name>B</name>
<name>C</name>
</absolute-ordering>
</faces-config>
Trong v d ny, A, B, v C l tp tin cu hnh ng dng ti nguyn khc nhau v
ang c ti theo th t c lit k.
Nu c mt yu t th t tuyt i trong tp tin, ch c cc tp tin c lit k bi
tn phn t con c x l. x l bt k tp tin cu hnh ng dng ti nguyn khc,
phi c mt phn t con khc. Trong trng hp khng c phn t con, tt c cc tp tin
cha lit k khc s b b qua trong thi gian ti.
Th t tng i c xc nh bi mt yu t trt t v phn t con ca n trc
v sau. Vi th t tng i, th t m cc tp tin cu hnh ng dng ti nguyn sp
c ti c tnh ton bng cch xem xt cc mc nhp th t t cc tp tin khc nhau.
V d sau y cho thy mt s ch . V d, config-A, config-B, v config-C l cu hnh
ng dng ti nguyn khc nhau.
Tp tin config-A c cha cc yu t sau:
<faces-config>
<name>config-A</name>
<ordering>
<before>
<name>config-B</name>
</before>
</ordering>
</faces-config>
Tp tin config -B (khng hin th y) khng cha bt k yu t trt t.
Tp tin config-C c cha cc yu t sau:
<faces-config>
<name>config-C</name>
<ordering>

<after>
<name>config-B</name>
</after>
</ordering>
</faces-config>
Da trn cc phn t con trc khi nhp, tp tin config-A s c ti trc tp tin
config-B. Da trn cc phn t con sau khi nhp , tp tin config -C s c ti sau tp tin
config-B.
Ngoi ra, mt phn t con khc cng c th c lng vo trc v sau cc phn
t con. Nu c mt cc yu t khc, cc tp tin c ch nh c th nhn c s u tin
cao nht hoc thp nht trong c hai tp tin cu hnh lit k v khng lit k.
Nu mt phn t khng trt t c trong mt tp tin cu hnh ng dng, khi tp
tin s c ti sau tt c cc tp tin c cha cc yu t trt t.

16.3 S dng Faces Flows


c trng Faces Flows ca cng ngh JavaServer Faces cho php bn to ra mt
tp hp cc cc trang c phm vi, FlowScoped,ln hn phm vi yu cu, nhng t hn so
vi phin phm vi. V d, bn c th mun to ra mt lot cc trang cho qu trnh thanh
ton trong mt ca hng trc tuyn. Bn c th to ra mt tp hp cc trang khp kn c
th chuyn giao t mt ca hng khc khi cn thit.
Faces Flows c phn tng t nh chng trnh con trong lp trnh th tc, theo
nhng cch sau y:
Ging nh mt chng trnh con, mt lung c mt im khi u cng c
xc nh, danh sch cc thng s, v gi tr tr v. Tuy nhin, khng ging nh mt
chng trnh con, mt lung c th tr li nhiu gi tr.
Ging nh mt chng trnh con, mt lung c mt phm vi, cho php thng tin
c cung cp ch trong gi trnh ca dng chy. Nhng thng tin ny khng c sn bn
ngoi phm vi ca lung v khng tiu tn bt k ngun lc mt khi tr li lung.
Ging nh mt chng trnh con, mt lung c th gi lung khc trc khi tr
li. Nhng li gi lung c duy tr trong mt cuc gi ngn xp: mt lung mi gy ra
mt lc y vo ngn xp, v tr li mt pop.

Mt ng dng c th c nhiu lung. Mi lung bao gm mt tp hp cc trang


v, thng c mt hoc nhiu ht qun l phm vi cho lung . Mi lung c mt im
khi u, gi l nt bt u v im thot, c gi l mt nt tr li.
Cc d liu trong mt lung c phn vng vi lung n, nhng ta c th
truyn d liu t mt lung n lung khc bng cch xc nh cc thng s v ku gi
cc lung khc.
Lung c th c lng vo nhau, do nu ta gi t mt lung khc v sau
thot khi lung th hai, ta quay tr li gi lung ch khng phi l nt tr li ca lung
th hai.
Ta c th cu hnh cho mt lung lp trnh, bng cch to ra mt lp ch thch
@FlowDefinition (nh ngha lung),ta c th cu hnh cho mt lung bng cch s dng
mt tp tin cu hnh. Cc tp tin cu hnh c th c gii hn trong mt lung, hoc ta
c th s dng cc tp tin faces-config.xml t tt c cc lung mt ni, nu ta c
nhiu lung trong mt ng dng. Cc chng trnh cu hnh t m gn hn vi phn cn
li ca m lung v cho php bn n b ha lung.
Hnh 16-1 cho thy hai dng chy v minh ha cch chng tng tc.

Trong hnh ny, lung A c mt nt bt u c t tn l flow-a v hai trang


khc, next_ a1 v next_a2. T next_a2, ngi dng c th thot khi lung bng cch s
dng nt tr li quy nh, taskFlowReturn1, hoc gi lung B, i qua hai tham s. Mt
lung cng xc nh hai thng s gi n c th chp nhn t lung B. Lung B trng vi
lung A ngoi tr tn ca cc lung v cc tp tin.
Mi lung cng c mt ht c qun l lin quan; cc ht l Flow_a_Bean v
Flow_b_Bean.

16.3.1 ng gi lung trong mt ng dng


Thng thng, bn ng gi lung trong mt ng dng web s dng mt cu trc
th mc n b ha lung. Trong th mc src/main/webapp ca mt d n Maven, v d,
bn s t cc tp tin Facelets nm ngoi lung cp cao nht nh bnh thng. Sau ,
cc tp tin webapp cho mi lung s c t trong mt th mc ring bit, v tp tin
Java s c t di src / main / java. V d, cc tp tin cho cc ng dng c th hin
trong hnh 16-1 c th trng nh th ny:
src/main/webapp/
index.xhtml
return.xhtml
WEB_INF/
beans.xml

web.xml
flow-a/
flow-a.xhtml
next_a1.xhtml
next_a2.xhtml
flow-b/
flow-b-flow.xml
next_b1.xhtml
next_b2.xhtml
src/main/java/javaeetutorial/flowexample
FlowA.java
Flow_a_Bean.java
Flow_b_Bean.java
Trong v d ny, flow-a c lp trnh xc nh trong FlowA.java, trong khi flowb c xc nh bi cc tp tin cu hnh flow-b-flow.xml.

16.3.2 Cc lung n gin nht: V d ng dng lung n


gin
V d ng dng lung n gin cho thy cc khi xy dng c bn nht camt
ng dng Faces Flow v minh ha mt s quy c khin n d dng bt u vi lp li
s pht trin s dng lung. C th bn mun bt u vi mt v d n gin nh th ny
v xy dng trn .
V d ny cung cp mt nh ngha lung ngm bng cch bao gm mt tp cu
hnh rng. .Mt tp tin cu hnh c ni dung, hay mt lp ch thch @FlowDefinition
cung cp mt nh ngha lung r rng.
M ngun ca ng dng ny trong th mc tut-install/examples/web/jsf/simpleflow/.
Cch b tr tp tin ca v d lung n gin trng nh th ny:
src/main/webapp
index.xhtml
simple-flow-return.xhtml
WEB_INF/

web.xml
simple-flow
simple-flow-flow.xml
simple-flow.xhtml
simple-flow-page2.xhtml
V d lung n gin c mt tp tin cu hnh rng, l bi theo quy ct tn
l flow-name-flow.xml. Lung khng cn bt k cu hnh cho cc l do sau:
Lung khng gi lung khc, cng khng truyn tham s cho lung khc.
Lung s dng tn mc nh cho trang u tin ca lung, flow-name.xhtml, v
trang tr li, flow-name-return.xhtml.V d ny ch c bn trang Facelets.
index.xhtml, cc trang bt u, trong gn nh khng c g nhng c mt nt
iu hng n trang u tin ca dng chy:
<p><h:commandButton value="Enter Flow" action="simple-flow"/></p>
simple-flow.xhtml v simple-flow-page2.xhtml, hai trang ca chnh lung .
Trong trng hp khng c mt lung nh ngha r rng, cc trang c tn ging nh tn
ca lung c gi nh l cc nt bt u ca lung. Trong trng hp ny, lung c
t tn simple-flow, v vy trang c tn simple-flow.xhtml c gi nh l cc nt bt u
ca lung. Cc nt bt u l nt iu hng n khi nhp vo lung. N c th c coi
nh l trang ch ca lung.
Cc trang simple-flow.xhtml yu cu bn nhp mt gi tr phm vi lung v cung
cp mt nt iu hng n trang tip theo ca dng chy:
<p>Value: <h:inputText id="input" value="#{flowScope.value}" /></p>
<p><h:commandButton value="Next" action="simple-flow-page2" /></p>
Trang th hai, c th c tn bt k, hin th gi tr flow-scoped cung cp mt nt
iu hng n trang tr li:
<p>Value: #{flowScope.value}</p>
<p><h:commandButton value="Return" action="simple-flow-return" /></p>
simple-flow-return.xhtml, trang tr li. Cc trang tr li, m theo quy c c
t tn l flow-name-return.xhtml, phi nm ngoi lung. Trang ny hin th gi tr flowscoped, cho thy rng n khng c gi tr bn ngoi lung, v cung cp mt lin kt
iu hng n trang index.xhtml:

<p>Value (should be empty):


"<h:outputText id="output" value="#{flowScope.value}" />"</p>
<p><h:link outcome="index" value="Back to Start" /></p>
Cc trang Facelets s dng d liu ch c flow-scoped, v vy v d trn khng cn
mt ht c qun l.

16.3.2.1 Xy dng, ng gi, v trin khai cc simple-flow


Example s dng NetBeans IDE
1. Chc chn rng GlassFish Server c bt u (xem Bt u v Dng
GlassFish Server).
2. T menu File, chn Open Project.
3. Trong hp thoi Open Project, iu hng n: tut-install/examples/web/jsf
4. Chn th mc simple-flow.
5. Nhn Open Project.
6. Trong tab Projects, kch chut phi vo simple-flow project, v chn Build.
Lnh ny c xy dng v ng gi ng dng vo mt tp tin WAR, simpleflow.war, nm trong th mc ch. Sau , trin khai cc ng dng my ch.

16.3.2.2 Xy dng, ng gi, v trin khai cc simple-flow


Example dng Maven
1 . Chc chn rng GlassFish Server c bt u (xem Bt u v Dng
GlassFish Server).
2. Trong ca s, hy vo: tut-install/examples/web/jsf/simple-flow/
3. Nhp lnh sau y:mvn install
Lnh ny c xy dng v ng gi ng dng vo mt tp tin WAR, simpleflow.war, nm trong th mc ch. Sau , trin khai cc ng dng my ch.

16.3.2.3 Chy the simple-flow Example


1. Nhp URL sau vo trnh duyt web ca bn:
http: // localhost: 8080 / simple-flow
2. Trn trang index.xhtml, nhp vo Enter Flow.
3. Trn trang u tin ca lung, nhp bt k chui trong lnh vc gi tr gia tng,
sau nhn Next.
4 Trn trang th hai ca lung, bn s nhn thy gi tr m bn nhp vo. Nhn
Return.
5 Trn trang tr li, mt cp trng ca du ngoc kp bao quanh khng th tip
cngi tr. Nhn Back to Start tr v trang index.xhtml

16.3.3 Cc ng dng v d checkout module.


ng dng v d checkout module c coi l phc tp hn lung n. N ch ra
cch bn c th s dng tnh nng Faces Flows thc hin mt m-un checkout cho
mt ca hng trc tuyn.
Cng ging nh cc v d gi thuyt trong hnh 16-1, ng dng v d c cha hai
lung, mi lung c th gi cc lung khc. C hai lung c nh ngha lung r rng.
Mt lung, checkoutFlow, c quy nh lp trnh. Cc lung khc,joinFlow, l quy nh
trong file cu hnh.
M ngun ca ng dng ny trong th mc
tut-install/examples/web/jsf/checkout-module/
i vi cc ng dng checkout module, cu trc th mc nh sau ( cng l th
mc vi mt kiu dng v hnh nh: src/main/webapp/resources)
src/main/webapp/
index.xhtml
exithome.xhtml
WEB_INF/
beans.xml

web.xml
checkoutFlow/
checkoutFlow.xhtml
checkoutFlow2.xhtml
checkoutFlow3.xhtml
checkoutFlow4.xhtml
joinFlow/
joinFlow-flow.xml
joinFlow.xhtml
joinFlow2.xhtml
src/main/java/javaeetutorial/checkoutmodule
CheckoutBean.java
CheckoutFlow.java
CheckoutFlowBean.java
JoinFlowBean.java
V d, index.html l trang bt u cho cc ng dng cng nh cc nt tr li cho
lung checkout. Cc trang xut cnh home.xhtml l nt tr li cho lung tham gia.
Cc tp tin cu hnh joinFlow-flow.xml xc nh lung tham gia, v cc tp tin
ngun CheckoutFlow.java xc nh lung checkout.
Cc dng checkout bao gm bn trang Facelets, trong khi lung tham gia bao gm
hai trang.
Cc qun l phm vi ht cho mi lung l CheckoutFlowBean.java v
JoinFlowBean.java, trong khi Checkout Bean.java l ht sao lu cho
index.htmlpage.

16.3.3.1 Cc trang Facelets cho V d checkout-m-un


Cc trang bt u v d, index.html, tm tt ni dung ca mt gi mua hng gi
nh. N cho php ngi dng nhp vo mt trong hai nt nhp mt trong hai lung:
<p><h:commandButton value="Check Out" action="checkoutFlow"/></p>
...
<p><h:commandButton value="Join" action="joinFlow"/></p>

Trang ny cng l nt tr li cho lung checkout. Cc Facelets trang


exithouse.xhtml l nt tr li cho lung tham gia. Trang ny c mt nt cho php bn
quay tr li index.xhtmlpage.
Bn trang Facelets trong lung checkout, bt u vi checkoutFlow.xhtml v kt
thc vi checkoutFlow4.xhtml, cho php bn tip tc n trang tip theo, hoc trong mt
s trng hp, tr v lung. Trang CheckoutFlow.xhtml cho php bn truy cp cc thng
s truyn t lung tham gia thng qua phm vi lung. S xut hin cc du ngoc kp
trng nu bn khng gi cc lung checkout t cc lung tham gia.
<p>If you called this flow from the Join flow, you can see these parameters:
"<h:outputText value="#{flowScope.param1Value}"/>" and
"<h:outputText value="#{flowScope.param2Value}"/>"</p>
Ch checkoutFlow2.xhtmlh l nt tr v trang trc, nhng di chuyn gia cc
trang ni chung l c cho php trong lung. Di y l cc nt cho
checkoutFlow2.xhtml:
<p><h:commandButton value="Continue" action="checkoutFlow3"/></p>
<p><h:commandButton value="Go Back" action="checkoutFlow"/></p>
<p><h:commandButton value="Exit Flow" action="returnFromCheckoutFlow"/></p>
Hot ng returnFromCheckoutFlow c nh ngha trong cc tp tin m ngun
cu hnh, CheckoutFlow.java.
Trang cui cng ca dng checkout, checkoutFlow4.xhtml, c mt nt gi lung
tham gia:
<p><h:commandButton value="Join" action="calljoin"/></p>
<p><h:commandButton value="Exit Flow" action="returnFromCheckoutFlow"/></p>
Hnh ng calljoin cng c nh ngha trong tp tin m ngun cu hnh,
CheckoutFlow.java. Hot ng ny i vo lung tham gia, i qua hai tham s t lung
checkout.
Hai trang trong lung tham gia, joinFlow.xhtml v joinFlow2.xhtml, tng t nh
trong lung checkout. Trang th hai c mt nt gi lung checkout cng nh mt nt
tr v t lung tham gia:

<p><h:commandButton value="Check Out" action="callcheckoutFlow"/></p>


<p><h:commandButton value="Exit Flow" action="returnFromJoinFlow"/></p>
i vi lung ny, cc hnh ng callcheckoutFlow v returnFromJoinFlow c
nh ngha trong file cu hnh joinFlow-flow.xml.

16.3.3.2 S dng mt tp tin cu hnh cu hnh mt lung.


Nu bn s dng tp tin cu hnh ng dng ti nguyn cu hnh mt dng chy,
n phi c t tn l flowName-flow.xml. Trong v d ny, lung tham gia s dng
mt file cu hnh tn l joinFlow-flow.xml. Tp tin l mt tp faces- config m xc nh
mt yu t flow-definition. Yu t ny phi xc nh tn dng chy bng cch s dng
thuc tnh id. Theo cc yu t dng flow-definition, phi c mt yu t flow-return ch
nh im tr li cho dng chy. Bt k thng s gi n c quy nh vi cc yu t
inbound-parameter.Nu mt lung gi lung khc, yu t call-flow phi s dng yu t
flow-reference t tn lung c gi v c th s dng yu t outbound-parameter
xc nh bt k thng s i.
Cc tp tin cu hnh cho lung tham gia nh sau:
<faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee \
http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
<flow-definition id="joinFlow">
<flow-return id="returnFromJoinFlow">
<from-outcome>#{joinFlowBean.returnValue}</from-outcome>
</flow-return>
<inbound-parameter>
<name>param1FromCheckoutFlow</name>
<value>#{flowScope.param1Value}</value>
</inbound-parameter>
<inbound-parameter>
<name>param2FromCheckoutFlow</name>
<value>#{flowScope.param2Value}</value>
</inbound-parameter>

<flow-call id="callcheckoutFlow">
<flow-reference>
<flow-id>checkoutFlow</flow-id>
</flow-reference>
<outbound-parameter>
<name>param1FromJoinFlow</name>
<value>param1 joinFlow value</value>
</outbound-parameter>
<name>param2FromJoinFlow</name>
<value>param2 joinFlow value</value>
</outbound-parameter>
</flow-call>
</flow-definition>
</faces-config>

Thuc tnh id ca phn t dng chy-nh ngha nh ngha tn ca dng chy


joinFlow. Gi tr ca thuc tnh id ca cc yu t dng chy tr v xc nh tn
ca nt tr li, v gi tr ca n c nh ngha trong cc yu t t kt qu l thuc tnh
returnValue ca dng chy-phm vi c ht qun l cho dng chy tham gia,
JoinFlowBean.
Tn v cc gi
tr ca cc tham
s bn
trong ly t trong dng
chy (flowScope.param1Value, flowScope.param2Value), da trn cch thc h c
xc nh trong cu hnh kim tra dng chy.
Cc phn t gi dng chy xc nh nh th no khi tham gia kim tra
dng. CallcheckoutFlow, thuc tnh id ca phn t, xc nh cc hnh ng ca
gi dng chy.
Trn thc t, trong cc phn gi dng chy, cc yu t tham kho xc nh tn
dng chy gi c gi l checkoutFlow. Cc yu t xc nh cc thng s c ph
chun khi checkoutFlow c gi l tham s. y chng l ch cn bt k mt chui
no thi.

16.3.3.3 S dng mt lp Java cu hnh mt dng chy


Nu bn s dng mt lp Java cu hnh mt dng chy, n phi c tn ca dng
chy. Cc lp cho cc kim tra dng chy c gi l CheckoutFlow.java.

import java.io.Serializable;
import javax.enterprise.inject.Produces;
import javax.faces.flow.Flow;
import javax.faces.flow.builder.FlowBuilder;
import javax.faces.flow.builder.FlowBuilderParameter;
import javax.faces.flow.builder.FlowDefinition;
class CheckoutFlow implements Serializable {
private static final long serialVersionUID = 1L;

@Produces
@FlowDefinition
public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
String flowId = "checkoutFlow";
flowBuilder.id("", flowId);
flowBuilder.viewNode(flowId,
"/" + flowId + "/" + flowId + ".xhtml").
markAsStartNode();
flowBuilder.returnNode("returnFromCheckoutFlow").
fromOutcome("#{checkoutFlowBean.returnValue}");
flowBuilder.inboundParameter("param1FromJoinFlow",
"#{flowScope.param1Value}");
flowBuilder.inboundParameter("param2FromJoinFlow",
"#{flowScope.param2Value}");
flowBuilder.flowCallNode("calljoin").flowReference("", "joinFlow")

outboundParameter("param1FromCheckoutFlow",
"#{checkoutFlowBean.name}").
outboundParameter("param2FromCheckoutFlow",
"#{checkoutFlowBean.city}");
return flowBuilder.getFlow();
}
}
Lp thc hin hnh ng m gn nh ging ht vi thc hin cc tp tin cu hnh
joinFlow-flow.xml. N cha mt phng php duy nht l defineFlow, nh mt
phng php sn xut vi vng loi @FlowDefinition m tr v mt lp
javax.faces.flow.Flow. Phng php defineFlow c mt tham s, mt @FlowBuilder vi
@FlowBuilderParameter vng loi, c thc hin thng qua JavaServer Faces. Phng
php ny gi t phng phplp javax.faces.flow.Builder.FlowBuilder cu hnh dng
chy.
u tin, phng php xc nh id dng chy checkoutFlow. Sau , n nh
ngha mt cch r rng bt u nt cho dng chy. Theo mc nh, y l tn ca dng
chy vi ui l .xhtml. Cc phng php sau xc nh nt tr li tng t
nh cch cc tp tin cu hnh thc hin. Phng php returnNode t tn ca nt tr
li nh returnFromCheckoutFlow, v phng php chui fromOutcome ch nh gi
tr ca n nh l thuc tnh returnValue ca dng chy phm vi c ht qun
l cho dng kim tra c gi l CheckoutFlowBean.
Phng php t tn thng s bn trong v gi tr ca cc thng s trong tham gia
dng chy, c ly t phm vi dng chy (flowScope.param1Value,
flowScope.param2Value), da trn cch h xc nh trong cu hnh tham gia dng
chy.
Cc phng php dng CallNode nh ngha v kim tra dng gi tham gia dng
chy. Cc tranh lun, gi tham gia, quy nh c th cc hnh ng gi dng chy.
Phng php chun dng chy xc nh tn thc ca dng chy gi, tham gia
lu lng. Phng php t tn thong s ngoi xc nh cc thng s c thng qua khi
tham gia vao kim tra dng. Di y l cc gi tr t Checkout FlowBean qun l ht.

Cui cng, phng php xc nh dng gi phng php dng nhn v tr kt qu.

16.3.3.4 Cc dng phm vi qun l ht.


Mt trong s hai dng c mt ht c qun l xc nh cc thuc
tnh ca trang trong dng chy. V d, CheckoutFlowBean xc nh ti sn c gi
tr c nhp bi ngi s dng trn trang checkoutFlow.xhtml v trang
checkouFlow3.xhtml.
Mi ht c qun l c mt phng php getReturnValue b gi tr ca s tr li
nt. i vi CheckoutFlowBean, nt tr
li l trang index.xhtml, quy
nh
s
dng chuyn hng ngm:
public String getReturnValue() {
return "index";
}
i vi JoinFlowBean, nt tr li l trang exithome.xhtml.

16.3.3.5 Bng cch s dng NetBeans IDE xy dng, ng


gi, v trin khai cc m-un kim tra.
1. Hy chc chn rng my ch GlassFish c bt u (xem bt u v dng
li ti GlassFish Server).
2. T menu File, chn Open Project.
3. Trong hp thoi Open Project, iu hng n: tut-install/examples/web/js
4. Chn th mc checkout-m-un.
5. Nhn Open Project.
6. Trong tab Projects, kch chut phi vo kim tra module v chn Build.
Lnh ny c xy dng v ng gi ng dng vo mt tp tin WAR, checkoutmodule.war, m nm trong th mc ch. Sau , trin khai cc ng dng my ch.

16.3.3.6 S dng Maven xy dng, ng gi, v trin khai


kim nh module.

1. Hy chc chn rng GlassFish Server c bt u (xem Bt u v Dng


GlassFish Server).
2. Trong mt ca s, hy vo: tut-install/examples/web/jsf/checkout-module/
3. Nhp lnh sau y: mvn install
Lnh ny c xy dng v ng gi ng dng vo mt tp tin WAR, checkoutmodule.war, m nm trong th mc ch. Sau , trin khai cc ng dng my ch.

16.3.3.7 chy cc m-un kim v d.


1. Nhp URL sau vo trnh duyt web ca bn:
http://localhost:8080/thanh ton-m-un
2. Trang index.xhtml trnh by cc kt qu gi thuyt ca cc cuc thm him mua
sm. Nhp vo Check out hoc join ti mt trong hai dng.
3. Lm theo dng , cung cp u vo khi cn thit v la
khng tip tc, tr li, hoc ra khi dng.

chn c hay

Trong dng kim tra, ch l mt trong cc lnh vc u vo c sot hp


thc (lnh vc th tn dng d kin 16 ch s), v vy bn c th nhp bt k gi
tr no bn thch. Dng tham
gia
khng yu
cu bn kim
tra bt
k hp trong trnh n hp kim ca n.
4. Trn trang cui cng ca mt dng, chn ty chn nhp dng khc.
ny cho php bn xem cc thng s trong t dng trc .

iu

5. Bi v dng c lng nhau, nu bn nhp vo Exit Flow, bn s tr


li trang u tin ca dng c gi (Bn c th nhn thy mt cnh bo, bn c
th b qua). Nhp vo Exit Flow trn trang tr li nt quy nh.

16.4 Cu hnh qun l ht.


Khi mt trang ti liu tham kho mt ht c qun l ln u tin, JavaServer
Faces thc hin khi to n, hoc da trn mt ch thch v phm vi @Named ch thch
trong lp hoc theo cu hnh ca n trong cu hnh ng dng tp tin ti nguyn. bit
thng tin v vic s dng cc ch thch khi to cc ht, xem Using Annotations to
Configure Managed Beans.

Bn c th s dng ch thch hoc cc tp tin ti nguyn cu hnh ng dng nhanh


chng c s dng trong mt JavaServer Faces ng dng v lu tr n trong phm vi.
C s to ht c qun l c cu hnh trong ng dng tp tin ti nguyn cu hnh s
dng cc yu t XML qun l ht xc nh tng ht.
Tp tin ny c x l thi gian khi ng ng dng. bit thng tin v vic
s dng c s ny, Xem Using the managed-bean Element..
Ht c qun l to ra trong cc ng dng cu hnh ti nguyn tp tin l
JavaServerFaces, khng phi CDI qun l ht.
Vi c s to ht c qun l, bn c th:
To ht trong mt tp tin tp trung c sn cho ton b ng dng, to iu kin nhanh
chng trong sut ng dng.
Ty chnh cc c tnh ca mt ht m khng c bt k m b sung.
Ty chnh gi tr thuc tnh ca ht trc tip t trong tp tin cu hnh m n c khi
to vi cc gi tr khi n c to ra.
S dng yu t gi tr, thit lp mt ti sn ca mt ht c qun l l kt qu ca
nh gi biu hin gi tr khc.
Phn ny cho bn thy lm th no khi to ht bng cch s dng sng to ht
c s c qun l. Xem Writing Bean Properties and Writing Managed Bean Methods
cho thng tin v chng trnh qun l cc loi ht.

16.4.1 S dng cc phn t qun l ht.


Mt ht c qun l c bt u trong tp tin ti nguyn cu hnh ng dng
bng cch s dng yu t qun l ht, i din cho mt th hin ca mt lp khng tn
ti trong ng dng. Khi chy, JavaServer Faces thc hin x l yu t qun l ht. Nu
mt trang ti liu tham kho v khng c trng hp tn ti, JavaServer Faces nhanh
chng thc hin theo quy nh ca cc yu t cu hnh.
Di y l mt v d qun l cu hnh ht t trng hp sch ca Duke nghin
cu:
<managed-bean eager="true">

<managed-bean-name>Book201</managed-bean-name>
<managed-bean-class>dukesbookstore.model.ImageArea</managed-beanclass>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>shape</property-name>
<value>rect</value>
</managed-property>
<managed-property>
<property-name>alt</property-name>
<value>Duke</value>
</managed-property>
<managed-property>
<property-name>coords</property-name>
<value>67,23,212,268</value>
</managed-property>
</managed-bean>
Cc yu t qun l ht c nh ngha chnh, theo cc ht s c lu tr
trong mt phm vi. i vi gi tr ca mt thnh phn bn ny, gi tr cc th thnh
phn ca thuc tnh phi ph hp vi qun l tn ln n giai on u tin.
Cc yu t lp qun l xc nh tn y ca cc lp thnh phn c s dng.
Cc yu t qun l ht c th rng hoc cha nhiu cc yu t qun l, thuc tnh, tng
ng vi mt thuc tnh c xc nh trong lp. Nhng yu t ny c s dng khi
to cc gi tr ca cc thuc tnh. Nu bn khng mun c mt s khi to n c vi
mt gi tr khi ht c khi to, khng bao gm nh ngha qun l, thuc tnh cho n
trong ng dng tp tin ti nguyn cu hnh ca bn.
Nu mt yu t qun l ht khng cha cc yu t qun l ht khc, n c th
cha mt phn t mc bn hoc thnh phn danh sch-mc. Cc yu t bn mc
cu hnh mt tp hp cc ht l trng hp ca Bn . Cc yu t danh mc-cu hnh
mt tp hp cc ht l trng hp ca danh mc.
Trong v d sau, ht c qun l bn tin, i din cho mt thnh
phn UISelectItems, c cu hnh nh mt danh sch mng i din cho mt tp
hp cc i
tng SelectItem.
Mi i
tng SelectItem ln
lt c cu
hnh nh mt ht c qun l vi thuc tnh:

<managed-bean>
<managed-bean-name>newsletters</managed-bean-name>
<managed-bean-class>java.util.ArrayList</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<list-entries>
<value-class>javax.faces.model.SelectItem</value-class>
<value>#{newsletter0}</value>
<value>#{newsletter1}</value>
<value>#{newsletter2}</value>
<value>#{newsletter3}</value>
</list-entries>
</managed-bean>
<managed-bean>
<managed-bean-name>newsletter0</managed-bean-name>
<managed-bean-class>javax.faces.model.SelectItem</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
<managed-property>
<property-name>label</property-name>
<value>Duke's Quarterly</value>
</managed-property>
<managed-property>
<property-name>value</property-name>
<value>200</value>
</managed-property>
</managed-bean>
...
Cch tip cn ny c th hu ch cho vic to nhanh chng ca danh mc la
chn trc khi mt i ng pht trin c thi gian to ra danh sch ny t c s d
liu. Lu rng mi bn tin ht c mt phm vi qun l ht thit lp do h s khng
phi c t vo bt k phm vi no.
Xem khi to Mng v Danh sch tnh bit thm thng tin v cu hnh b su
tp ht.
Bn cho mt thuc tnh c xc nh bi mt yu t qun l, thuc tnh, bn
phi m bo rng mt phn ca biu gi tr th thnh phn sau giai on ph hp vi tn
thuc tnh phn t. Phn tip theo, khi to Thuc tnh dng cc phn t qun l, thuc

tnh, gii thch chi tit hn cch s dng cc yu t qun l, thuc tnh. Xem v d khi
to Qun l ht thuc tnh.

16.4.2 Khi to thuc tnh bng cch s dng cc yu t qun


l thuc tnh.
Mt yu t qun l thuc tnh phi cha mt nguyn t tn thuc tnh, phi ph
hp vi tn ca cc thuc tnh tng ng trong ht. Mt yu t thuc tnh qun l cng
phi cha mt trong mt tp cc phn
t xc
nh gi
tr ca thuc
tnh. Gi
tr ny phi l cng loi nh xc nh cho cc thuc tnh tng ng. Yu t m bn s
dng xc nh gi tr ph thuc vo loi thuc tnh c xc nh trong ht. Bng 161 danh sch tt c cc yu t c s dng khi to mt gi tr.

Bng 16-1: Danh sch cc yu t s dng khi to mt gi tr


Yu t

nh ngha gi tr

Danh mc

Xc nh cc gi tr trong mt danh sch

Bn mc

Xc nh cc gi tr trong mt bn

Gi tr rng

t thuc tnh rng mt cch r rng

Gi tr

Xc nh mt gi tr n v d nh mng,
chui, hoc JavaServer Faces EL.

S dng qun l-ht nguyn t bao gm cc v d v khi to mt thuc tnh int


(mt loi nguyn thy) s dng gi tr yu t ngm nh. Bn cng s dng gi tr
ny khi to chui v cc loi ti liu tham kho. Phn cn li ca phn ny m t lm
th no s dng gi tr ngm nh v gi tr ngm khc khi to cc thuc
tnh ca Java Enum, bn , mng, v b su tp, cng nh tham s khi to.

16.4.2.1 Tham kho mt loi Java Enum


Mt thuc tnh ht qun l cng c th l mt loi Java Enum (xem
http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html).
Trong trng
hp ny, cc yu t gi tr ca cc yu t qun l thuc tnh phi l mt chui ph hp
vi mt hng s chui ca Enum. Ni cch khc, Chui phi l mt trong cc gi tr hp
l m c th c tr li nu bn ang gi valueOf (hng, Chui) trn enum, lp u

lp Enum v chui l ni dung ca gi tr thnh phn ngm nh. V d, gi s thuc


tnh c qun l ht sau y:
public enum Suit { Hearts, Spades, Diamonds, Clubs }
...
public Suit getSuit() { ... return Suit.Hearts; }
Gi s bn mun cu hnh thuc tnh trong cu hnh ng dng tp tin ti nguyn
ny, yu t qun l, thuc tnh tng ng nh sau:
<managed-property>
<property-name>Suit</property-name>
<value>Hearts</value>
</managed-property>
Khi h thng gp thuc tnh ny, n iterates trn mi ngi trong s cc thnh
vinca enum v gi toString() mi thnh vin cho n khi n tm thy mt trong s
l chnh bng gi tr t cc yu t gi tr.

16.4.2.2 Tham kho mt tham s khi to bi cnh.


Mt tnh nng mnh m ca c s to ht c qun l l kh nng tham chiu i
tng tim n t mt thuc tnh ht qun l.
Gi s bn c mt trang m chp nhn d liu t mt khch hng, bao gm c a
ch khch hng. Cng cho rng hu ht cc khch hng ca bn sng mt s vng c
th. Bn c th lm cho cc thnh phn m vng lm m vng ny bng cch lu n vo
mt n i tng v tham kho n khi trang c tr li.
Bn c th lu cc m vng l mt gi tr mc nh ban u trong bi cnh
initParam ngm i tng bng cch thm vo mt tham s ng cnh ng dng web ca
bn v thit lp gi tr ca n trong m t trin khai. V d, thit lp mt tham s c
gi l ng cnh defaultAreaCode n 650, thm mt yu t ng cnh tham s m t
trin khai v cung cp cho cc tham s defaultAreaCode tn v gi tr 650.
Tip theo, vit mt t khai qun l ht dng cu hnh mt thuc tnh ti liu
tham kho tham s:
<managed-bean>
<managed-bean-name>customer</managed-bean-name>
<managed-bean-class>CustomerBean</managed-bean-class>

<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>areaCode</property-name>
<value>#{initParam.defaultAreaCode}</value>
</managed-property>
...
</managed-bean>
truy cp vo m vng ti trang thc hin, hy tham kho thuc tnh t cc khu
vc thnh phn th gi tr thuc tnh:
<h:inputText id=area value="#{customer.areaCode}"
Cc gi tr c ly t cc i tng tim n khc trong mt cch tng t.

16.4.2.3 khi to Bn Thuc tnh.


Cc yu t bn -mc c s dng khi to cc gi tr ca mt thuc tnh
ht vi mt loi nu cc yu t bn -mc c s dng trong mt yu t qun l
thuc tnh. Mt yu t bn -mc c mt yu t cha kha lp ty chn, mt yu t ty
chn gi tr cp, v cc yu t mc nhp bn s khng hay nhiu.
Mi ngi trong s cc yu t bn -mc phi cha mt yu t quan trng v gi tr
null hoc gi tr yu t. Di y l mt v d c s dng cc yu t bn -mc:
<managed-bean>
...
<managed-property>
<property-name>prices</property-name>
<map-entries>
<map-entry>
<key>My Early Years: Growing Up on *7</key>
<value>30.75</value>
</map-entry>
<map-entry>
<key>Web Servers for Fun and Profit</key>
<value>40.75</value>
</map-entry>
</map-entries>
</managed-property>
</managed-bean>

Bn to ra t th bn -mc ny cha hai mc. Theo mc


nh, tt
c cc phm v
cc gi
tr c chuyn
i thnh chui.
Nu bn mun ch
nh mt loi khc nhaucho cc phm trong bn , nhng cc yu t cha kha
cp ch bn trong cc yu tbn -mc:
<map-entries>
<key-class>java.math.BigDecimal</key-class>

</map-entries>
Tuyn b ny s chuyn i tt c cc phm vo java.math.BigDecimal. Tt
nhin, bnphi chc chn rng cc phm c
th c chuyn
i sang loi bn ch
nh. Cha
kha t cc v
d trong phn ny khng
th c chuyn
i sang mt lp thp phn, bi v n l mt chui.
Nu bn mun ch nh mt loi khc nhau cho tt c cc gi tr trong bn , bao
gm cc yu t gi tr cp sau khi cc yu t cha kha cp:
<map-entries>
<key-class>int</key-class>
<value-class>java.math.BigDecimal</value-class>

</map-entries>
Lu rng b th ny ch l mt loi ca tt c cc gi tr thnh phn ngm nh.
Mi mc t bn trong v d trc bao gm mt gi tr thnh phn ngm nh.
Gi tr ca n xc nh mt gi tr duy nht, m s c chuyn i sang loi c ch
nh trong ht.
Thay v s dng mt yu t bn -mc, n cng c th ch nh bn ton b
bng cch s dng mt yu t gi tr ch nh biu hin bn nh my.

16.4.2.4 Khi to mng v danh sch thuc tnh.


Cc yu t danh sch-mc c s dng khi to cc gi tr ca mt mng hoc
danh sch cc thuc tnh. Mi gi tr c nhn ca cc mng hoc Danh sch c khi to
bng cch s dng mt gi tr hay yu t v gi tr. Di y l mt v d:
<managed-bean>
...
<managed-property>
<property-name>books</property-name>
<list-entries>
<value-class>java.lang.String</value-class>

<value>Web Servers for Fun and Profit</value>


<value>#{myBooks.bookId[3]}</value>
<null-value/>
</list-entries>
</managed-property>
</managed-bean>
V d ny khi to mt mng hoc mt danh sch. Cc loi thuc tnh tng ng
trong ht xc nh cu trc d liu c to ra. Cc yu t danh mc-xc nh danh sch
cc gi tr trong mng hoc danh sch. Cc yu t xc nh mt gi tr duy nht gi tr
trong mng hoc danh sch v c th tham kho mt thuc tnh ht khc. Cc yu t v
gi tr s gy ra cc phng php setBooks c gi vi mt tham s rng. Mt v ti
sn khng th c ch nh cho mt ti sn c kiu d liu l mt Java nguyn thy,
chng hn nh int hay boolean.

16.4.2.5 Khi to Thuc tnh qun l ht.


i khi bn c th mun to ra mt ht m tham kho t ht qun l khc bn c
th xy dng mt biu hoc mt cy ca ht. V d, gi s bn mun to ht u i
din cho thng tin ca khch hng, bao gm c a ch gi th v a ch ph, mt trong
s cng l mt ht. Bn k khai qun l ht sau y to ra mt trng hp
CustomerBean c hai thuc tnh AddressBean. Mt ci i din cho ac h gi th, mt
ci khc i din cho a ch ph. Khai bo ny kt qu mt cy vi CustomerBean nh
l gc ca n v hai i tng AddressBean nh l nhnh con.
<managed-bean>
< managed-bean-name>customer</ managed-bean-name>
< managed-bean-class>
com.example.mybeans.CustomerBean
</ managed-bean-class>
< managed-bean-scope> request </ managed-bean-scope>
< managed-property>
<property-name>mailingAddress<property-name>
<value>#{addressbean}</value>
</managed-property>
< managed-property>
< managed-name>streetAddress</managed-name>
<value>#{addressbean}</value>

</managed-property>
<managed-property>
<property-name>customerType</property-name>
<value>New</value>
</managed-property>
</managed-bean>
<managed-bean>
< managed-bean-name> addressbean </ managed-bean-name>
< managed-bean-class>
com.example.mybean.AdrressBean
</ managed-bean-class>
< managed-bean-scope>none</ managed-bean-scope>
<managed-property>
<property-name>street</property-name>
<null-value/>
<managed-property>

</managed-bean>
Khai bo CustomerBean u tin( vi managed-bean-name ca customer) to ra
mt CustomerBean trong phm vi yu cu. Ht ny c hai thuc tnh, mailingAddress v
streetAddress. Cc thuc tnh ny s dng phn t Value tham chiu mt ht c t
tn l addressBean.
Th hai c qun l nh ngha ht khai bo mt AddressBean nhng khng
c to ra n, bi v phn t managed-bean-scope ca n nh ngha mt phm vi ca
none. S gi li phm v ny ca c hai thuc tnh mailingAddress v streetAddress tham
chiu addressBean s dng phn t element hai trng hp c bit ca AddressBean
c to ra khi m CustomerBean c to ra.
Khi bn to ra mt i tng hng vo nhng i tng khc, ng c hng
vo i tng vi vng i ngn, bi v n c th th hin li phm vi ca ngun
khi m n bin mt. Mt mc phin i tng, cho v d, khng th hng ti mt mc
yu cu i tng. V nhng i tng vi phm vi none phi khng nh hng ti vng
i c qun l bi framework, nn chng ta ch c th hng ti nhng i tng
none-scrope khc.
Bng 16-2: Cho php kt ni phm vi cc i tng.
An Object of This Scrope

May Point to an Object of This Scrope

none

None

application

None, application

Session

None, application, session

Request

None, application, session, request, view

view

None, application, session, view

16.4.3 Ci t cc bn v cc danh sch


Thm vo , cu hnh cc thuc tnh Map v List, bn ch c th cu hnh Map
v List mt cch trc tip do bn c th tham chiu chng t mt th ng hn l s
tham chiu mt thuc tnh th m bao gi mt Map hoc mt List.

16.5 ng k cc tin nhn ng dng.


Cc tin nhn ng dng c th bao gm vi chui c trnh by ti ngi s dng
tt nh l quy lut cc tin nhn li( th m c hin th bi tin nhn v cc th cc tin
nhn) cho kim sot v chuyn i cc thi quen ca bn. to ra cc tin nhn c sn
ti thi im bt u cc ng dng, thc hin 1 trong cc gi di y:
Hng i mt tin nhn ring bit
c ly lm v d pha trn
java.face.context.FacesContext , nh l c m t trong s dng FaceMesages
sng to mt Message.
ng k tt c cc tin nhn vi ng dng ca bn s dng tp tin ngun cu hnh
ng dng
y l phn ca tp tin face-config.xml th m ng k thng bo cho cc trng hp
nghin cu ng dng Bookstore ca
<application>
<resource-bundle>
<base-name>
javaeetutorial.dukesbookstore.web.messages.Messages
</base-name>
<var>bundle</var>
</resource-bundle>

<locale-config>
<default-locale>en</default-locale>
<supported-locale>es</supported-locale>
<supported-locale>de</supported-locale>
<supported-locale>fr</supported-locale>
</locale-config>
</application>
Thit lp ny ca cc yu t gy ra cc ng dng c tp hp vi cc tin nhn
c cha trong cc gi ti nguyn c quy nh.
Cc yu t ti nguyn-b( resource-bundle) i din cho mt tp hp cc tin nhn
bn a ha. N phi bao gm ng dn y iu kin n cc gi ti nguyn c cha
cc tin nhn bn a( trong trng hp ny, dukebookstore.web.message.Messages). Phn
t var nh ngha tn EL m trang tc gi cp ti ngun ti nguyn b.
Danh sch phn t local-config l min a phng mc nh v cc min a
phng h tr khc.
Danh sch phn t local-config cho php cc h thng tm min a phng
chnh xc da trn cc thit lp ngn ng ca trnh duyt.
Cc th supported-locale v default-locale chp nhn cc ch thng, hai k t
m code c nh ngha theo tiu chun ISO639-1( tham kho thm
http://www.loc.gov/standards/iso639-2/php/English_list.php). Hy chc chn rng gi m
ngun ca bn thc s cha cc tin nhn cho cc min a phng bn ch nh vi cc
th.
truy cp tin nhn bn a ha, cc nh pht trin ng dng ch n thun tham
chiu n kha ca tin nhn t gi m ngun.
Bn c th ko cc vn bn bn a ha vo trong mt th alt cho mt hnh nh
ha, nh v d minh ha di y:
<h:graphicImage id="mapImage"
name="book_all.jpg"
library="images"
alt="#{bundle.ChooseBook}"
usemap="#bookMap" />

Thuc tnh alt c th chp nhn gi tr biu hin. Trong trng hp ny, thuc tnh
alt cp ti bn a ha vn bn s c bao gm trong vn bn thay th ca hnh nh
kt xut bi cc th.

16.5.1 Using FacesMessage to Create a Message


Thay v ng k cc tin nhn trong ng dng cu hnh tp tin ti nguyn, bn c
th truy cp vo java.util.RestoreBundle trc tip t m s ht qun l.
on m di y nm trong mt thng bo li email:
String message = "";
...
message = ExampleBean.loadErrorMessage(context,
ExampleBean.EX_RESOURCE_BUNDLE_NAME,
"EMailError");
context.addMessage(toValidate.getClientId(context),
new FacesMessage(message));
These lines call the bean's loadErrorMessage method to get the message from the
ResourceBundle. Here is the loadErrorMessage method:
public static String loadErrorMessage(FacesContext context,
String basename, String key) {
if ( bundle == null ) {
try {
bundle = ResourceBundle.getBundle(basename,
context.getViewRoot().getLocale());
} catch (Exception e) {
return null;
}
}
return bundle.getString(key);
}

16.5.2 Tham kho thng bo li

Mt trang JavaServer Faces s dng cc th message hay messages truy cp cc


thng bo li, nh l gii thch trong mn hnh hin th thng bo li vi cc th
h:message v h:messages.
Cc thng bo li truy cp bao gm cc th.
+ Cc thng bo li tiu chun i km vi vic chuyn i tiu chun v xc nhn
rng con tu vi API. Xem phn 2.5.2.4 ca Java Server Faces c ch r c im k
thut cho cc thng bo li tiu chun)
+ Thng bo li ty chnh cha trong gi ti nguyn ng k vi ng dng bi cc
kin trc s ng dng s dng cc yu t ti nguyn b trong tp tin cu hnh.
Khi mt b chuyn i hoc xc nhn c ng k vo mt thnh phn u vo,
thng bo li thch hp c t ng xp hng trn cc thnh phn.
Mt trang tc gi c th can thip cc thng bo li xp hng trn mt thnh phn
bng cch s dng cc thuc tnh ca th di y:
+ ConvertetMessage: tham chiu tin nhn li hin th khi d liu trong ni dung
km theo khng th c chuyn i bi b chuyn i c ng k trong ni dung
ny.
+ RequeredMessage: tham chiu tin nhn li hin th khi khng c gi tr c
nhp vo trong ni dung km theo.
+ VilidatorMessage: tham chiu thng bo li hin th khi d liu trong ni
dung km theo khng th c xc thc bi cc trnh xc thc c ng k trong ni
dung ny.
Tt c ba thuc tnh c kch hot c gi tr bng ch v cc biu thc gi tr.
Nu mt thuc tnh s dng mt biu thc gi tr, biu thc ny tham chiu thng bo li
trong mt gi ti nguyn. Gi ti nguyn ny phi c cung cp cho cc ng dng trong
mt trong nhng cch di y:
Bi kin trc s ng dng s dng cc yu t resouce-bundle trong tp tin cu
hnh.
Bi trang tc gi s dng th f:loadBundle
Ngc li, phn t resouce-bundle phi c s dng bo cho ng dng nhng
gi ti nguyn cha cc thng bo li ty chnh c xp hng i trn cc thnh phn

nh l kt qu ca mt chuyn i ty chnh hoc xc nhn c ng k trn thnh


phn.
Cc th di y cho thy lm th no xc nh thuc tnh requeredMessage
s dng mt gi tr biu thc tham chiu cc thng bo li:
<h:inputText id="ccno" size="19"
required="true"
requiredMessage="#{customMessages.ReqMessage}">
...
</h:inputText>
<h:message styleClass="error-message" for="ccno"/>
Gi tr biu thc s dng s dng bi requeredMessage trong v d ny tham
chiu thng bo li vi kha ReqMessage trong gi ti nguyn customMessage.
Thng bo ny thay th thng bo tng ng xp hng trong ni dung v s
hin th bt c ni no c th message v messages c t trn trang.

16.6 S dng cc xc nhn thc mc nh.


Ngoi vic xc nhn vic bn khai bo trn thnh phn, bn cng c th ch nh
khng hoc nhiu hn cc xc nhn mc nh c ng k trong cc ng dng cu hnh
tp tin ti nguyn. Xc thc mc nh p dng cho tt c cc trng hp
javax.faces.component.UIIput trong mt ci nhn hoc cy ni dung v c gn vo sau
xc nhn ca a phng quy nh. y l mt v d ca xc thc mc nh c ng
k trong cc ng dng cu hnh tp tin ti nguyn:
<faces-config>
<application>
<default-validators>
<validator-id>javax.faces.Bean</validator-id>
</default-validators>
<application/>
</faces-config>

16.7 ng

k mt xc thc ty chnh

Nu cc nh pht trin ng dng cung cp mt cng c ca giao din


javax.faces.validator thc hin xc nhn, bn phi ng k xc nhn ty chn ny hoc
bng cch s dng cc ch thch @FacesValidator, nh l m t trong thc thi giao din
xc nhn, hoc l s dng yu t XML validator ng dng cu hnh tp tin ti nguyn:
<validator>
...
<validator-id>FormatValidator</validator-id>
<validator-class>
myapplication.validators.FormatValidator
</validator-class>
<attribute>
...
<attribute-name>formatPatterns</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
</validator>
Thuc tnh quy nh trong mt th xc nhn ghi ln cc thit lp trong ch thch
@FacesValidator.
Cc phn t validator-id v validartor-class l phn t con yu cu. phn t
validator-id i din cho nhn dng theo cc lp Validator phi c ng k. ID ny
c s dng bi cc lp th tng ng vi cc ty chnh th xc nhn.
Thuc tnh validartor-class i din cho tn lp y ca lp Validator.
Phn t attribute xc nh mt thuc tnh lin quan n vic thc hin Validator.
N yu cu cc phn t con attribute-name v attribute-class. Phn t attribute-name
cp ti tn ca cc thuc tnh nh n xut hin trn th validator. Phn t attribute-class
cp n kiu Java ca gi tr lin kt vi cc thuc tnh.
Creating and Using a Custom Validator gii thch lm cch no thc hin giao
din Validator.
Using a Custom Validator gii thch lm th no tham kho cc xc nhn t
trang.

16.8 ng k mt chuyn i ty chnh

Nh l mt trng hp vi xc thc thy chnh, nu nh pht trin ng dng sng


to mt chuyn i ty chnh, bn phi ng k n vi ng dng hoc bi s dng ch
gii @FacesConveter, nh l m t trong Creating a Custom Converter, hoc bi s dng
phn t chuyn i XML trong ng dng cu hnh tp tin ti nguyn. y l mt gi
thuyt chuyn i cu hnh cho CreditCardConverter t nghin cu trng hp c hng
sch ca Duke:
<converter>
<description>
Converter for credit card numbers that normalizes
The input to a standard format
</description>
<converter-id>CreditCardConverter</converter-id>
<converter-class>
dukesbookstore.converters.CreditCardConverter
</converter-class>
</converter>
Thuc tnh quy nh trong mt th converter ghi ln cc thit lp trong ch
thch @FacesConverter.
Phn t converter i din mt cng c javax.faces.convert.Converter v c yu
cu cc phn t converter-id v converter-class.
Phn t converter-id xc nh mt ID c s dng bi thuc tnh converter ca
th ni dung UI p dng b chuyn i d liu cho cc thnh phn d liu. Using a
Custom Converter bao gm mt v d v tham kho cc ty chnh chuyn i t mt th
thnh phn.
Phn t converter-class xc nh vic thc hin Converter.
Creating and Using a Custom Converter gii thch cch to ra mt chuyn i ty
chnh.

16.9 Cu hnh quy tc chuyn hng


Di chuyn gia cc trang khc nhau ca mt ng dng JavaServer Faces, nh l chn
trang tip theo hin th sau mt nt hoc mt lin kt thnh phn c nhp, c xc
nh bi mt tp cc quy tc. Quy tc chuyn hng c th ngm nh, hoc chng c
th r rng c xc nh trong ng dng cu hnh tp tin ti nguyn. bit thm thng
tin v quy nh chuyn hng ngm, xem Navigation Model.

Mi quy tc chuyn hng quy nh cch chuyn t mt trang ti trang khc


hoc thit lp cc trang. JavaServer Faces chn vic thc thi cc quy tc thch hp iu
hng theo trang hin thi s hin th.
Sau khi quy tc chuyn hng ng n c chn, s la chn ca trang truy
cp ti theo ph thuc vo hai yu t:
+ Phng php hot ng c kch hot khi cc thnh phn c nhp.
+ Kt qu hp l tham chiu bi cc thnh phn ca th hoc tr v t phng
thc hot ng.
Kt qu c th l bt c iu g cc nh pht trin ng dng chn, nhng bng 16-3
lit k mt s kt qu thng c s dng trn cc ng dng web.

Table 16-3: Chui kt qu thng dng.


Outcomes

What it means

Success

Tt c mi th lm vic.i ti trang tip


theo

Failure

C g sai. i ti trang li

Login

Ngi dng cn ng nhp u tin. i ti


trang ng nhp

No result

Vic tm kim khng th tm thy g c. Ti


trang tm kim mt ln na

Thng thng, phng php thc thi mt s tin trnh trn d liu ca trang hin
thi. Cho v d, phng thc c th kim tra tn ngi dng v mt khu nhp di dng
ph hp vi tn ngi dng v mt khu trn tp tin. Nu khng n s tr v kt qu tht
bi. V d ny cho thy, c hai phng thc c s dng x l hnh ng v cc kt
qu tr v l cn thit xc nh ng trang truy cp.

y l mt quy tc chuyn hng c th c s dng vi v d va m t:


<navigation-rule>
<from-view-id>/login.xhtml</from-view-id>
<navigation-case>
<from-action>#{LoginForm.login}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/storefront.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{LoginForm.logon}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/logon.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
Quy tc chuyn hng ny xc nh nhng cch c th di chuyn t login.xhtml.
Mi phn t navigation-case xc nh mt ng dn c th iu hng t login.xhtml.
Navigation-case u tin ni rng nu LoginForm.login tr v mt kt qu ca success,
sau storefront.xhmtl s c truy cp. Navigation-case th hai ni rng login.xhtml s
c kt xut li nu LoginForm.login tr li failure.
Cu hnh dng ca mt trang ng dng bao gm mt b cc quy tc chuyn
hng. Mi quy tc c xc nh bi mt phn t navigation-rule trong tp tin facesconfig.xml.
Mi phn t navigation-rule tng ng vi mt nh danh cy thnh phn c
xc nh bi cc ty chn phn t from-view-id. iu ny c ngha rng mi quy tc xc
nh tt c cc cch c th di chuyn t mt trang c th trong ng dng. Nu khng
c phn t from-view-id , quy tc chuyn hng c nh ngha trong cc yu t
navigation-rule p dng cho tt c cc trang trong ng dng. Phn t from-view-id ch
cho php k t i din ph hp vi m hnh. Cho v d, phn t from-view-id ni rng
quy tc chuyn hng ny p dng cho tt c cc trang trong th mc sch:
<from-view-id>/books/*</from-view-id>
Mt thnh phn navigation-rule c th cha s 0 hoc nhiu cc phn t navigation-case. Phn t navigation-case nh ngha mt tp ca cc tiu ch ph hp.

Khi cc tiu ch ny c hi lng, ng dng s iu hng ti trang c nh ngha bi


phn t to-view-id c cha trong cc phn t navigation-case tng t.
Cc tiu ch c nh hng c xc nh bi cc phn t ty chn fromoutcomes v from-action. Phn t from-outcome xc nh mt kt qu hp l, nh l
success. Phn t from-action s dng mt biu hin phng php cp ti mt
phng thc hot ng m tr v mt String, m l mt kt qu hp l. Phng php ny
thc hin mt s logic xc nh kt qu v tr v kt qu.
Phn t navigation-case c kim tra li vi cc kt qu v phng php biu
hin theo trnh t sau.
+ Trng hp xc nh c mt gi tr from-outcome v mt gi tr fromaction. C hai nhng yu tt ny c th c s dng nu phng thc hot ng
tr v kt qu khc nhau ph thuc vo kt qu ca tin trnh m n thc thi
+ Trng hp ch xc nh mt gi tr from-outcome. Phn t from-come
phi ph hp vi hoc l kt qu c nh ngha bi thuc tnh hnh ng
attribute ca ni dung javax.faces.component.UICommand hoc kt tr v ca
phng thc c gi bi cc thnh phn UICommand.
+ Trng hp ch xc nh mt gi tr from-action. Gi tr ny phi ph hp
vi biu hin hnh ng c th ca cc th thnh phn.
Khi mt trong nhng trng hp ny c khp, cy ni dung c nh ngha
bi phn t to-view-id s c la chn hin th.

16.10 ng k mt b hin th ty chnh vi Render Kit


Khi cc nh pht trin ng dng sng to mt b hin th ty chnh, nh l m t
trn Delegating Rendering to a Renderer, bn phi ng k n bng cch s dng b
cng c hin th thch hp. Bi v ng dng hnh nh bn thc hin mt hnh nh bn
HTML, cc lp AreaRender v MapRenderer trong trng hp nghin cu sch ca
Duke phi c ng k s dng b cng c hin th HTML.
Bn ng k b hin th hoc l s dng ch thch @FacesRenderer, nh m t
trn Creating the Renderer Class, hoc bi s dng phn t render-kit ca cc ng dng
cu hnh tp tin ti nguyn. y l cu hnh c tnh gi thuyt ca AreaRenderer:
<render-kit>

<renderer>
<component-family>Area</component-family>
<renderer-type>DemoArea</renderer-type>
<renderer-class>
dukesbookstore.renderers.AreaRenderer
</renderer-class>
<attribute>
<attribute-name>onmouseout</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
<attribute>
<attribute-name>onmouseover</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
<attribute>
<attribute-name>styleClass</attribute-name>
<attribute-class>java.lang.String</attribute-class>
</attribute>
</renderer>
...
Cc thuc tnh c ch nh trong mt th renderer ghi ln bt k ci t no
trong ch thch @FacesRenderer.
Phn t render-kit i din cho mt thc thi javax.faces.RenderKit. Nu khng c
Render-kit-id c ch nh, b ti to yu t i din cho mt thc thi
javax.faces.render.Renderer. B ti tao cc yu t bn trong cc yu t render-kit , bn
ang ng k chung trnh kt xut vi RenderKit thc hin kt hp vi cc yu t
render-kit
B ti to lp l tn lp y ca b ti to phn. Cc yu t thnh phn gia nh
v ti to loi c s dng mt thnh phn tm renderers c th khin n. nh danh
thnh phn gia nh phi ph hp vi m tr v bi thnh phn lp getFamily phng
php Family thnh phn i din cho mt thnh phn hoc tp hp cc thnh phn m
mt b ti to c th c th khin cc b ti to kiu phi ph hp vi tr v phng php
getRendererType ca cc t kha x l lp.
Bng cch s dng thnh phn Family v ti to loi tm kim renderers cho
thnh phn, thc hin phi i mt vi JSP c ch r cho php mt thnh phn c

tr li bi nhiu renderers v cho php mt chng trnh kt xut hin th nhiu thnh
phn.
Mi ngi trong s cc thuc tnh th ch nh mt thuc tnh ph thuc vo
render v loi ca n. Cc thuc tnh nguyn t khng nh hng n vic thc hin thi
gian chy cc ng dng ca bn. Thay vo , n cung cp thng tin cho cng c v cc
thuc tnh h tr ti to. i tng trch nhim rendering mt thnh phn (c th l cc
thnh phn ring camnh hoc mt b ti to m cc thnh phn i biu rendering) c
th s dng kha cnh h tr trong cc qu trnh ti to. Cc kha cnh cho php cc
nh pht trin thnh phn ty chnh kim sot mt s kha cnh ca lm cho cc thnh
phn. Xem xt vic ty chnh th thnh phn ty chnh ny:
<d:dataScroller>
<f:facet name="header">
<h:panelGroup>
<h:outputText value="Account Id"/>
<h:outputText value="Customer Name"/>
<h:outputText value="Total Sales"/>
</h:panelGroup>
</f:facet>
<f:facet name="next">
<h:panelGroup>
<h:outputText value="Next"/>
<h:graphicImage url="/images/arrow-right.gif" />
</h:panelGroup>
</f:facet>
...
</d:dataScroller>
Th thnh phn dataScroller bao gm mt thnh phn s hin th tiu v mt
thnh phn s hin th nt tip theo. Nu b ti to phn lin quan n iu ny thnh
phn lm cho cc kha cnh, bn c th bao gm cc yu t kha cnh sau y trong cc
b ti to yu t:
<facet>
<description>This facet renders as the header of the table. It should be
a panelGroup with the same number of columns as the data.
</description>
<display-name>header</display-name>

<facet-name>header</facet-name>
</facet>
<facet>
<description>This facet renders as the content of the "next" button in the scroller.
It should be a panelGroup that includes an outputText tag that has the text "Next"
and a right arrow icon.
</description>
<display-name>Next</display-name>
<facet-name>next</facet-name>
</facet>
Nu mt thnh phn h tr kha cnh cung cp ring ca mnh hin th v bn
mun bao gm cc kha cnh yu t trong cc ng dng cu hnh ti nguyn tp tin, bn
cn phi t chng trong cc thnh phn cu hnh ch khng phi l cu hnh ca b ti
to.

16.11 ng k mt phn ty chnh


Ngoi vic ng k renderers ty chnh (nh gii trong phn trc), bncng phi
ng k cc thnh phn ty chnh m thng lin kt vi cc ty chnh renderers. Bn s
dng mt trong hai ch thch mt @FacesComponent, nh trong m t.Cc lp hc thnh
phn ty chnh, hoc cc yu t thnh phn ca ng dng tp tin cu hnh ti nguyn.
y l mt yu t gi thnh phn t cc ngun ti nguyn cu hnh ng dng tp tin ng
k AreaComponent:
<component>
<component-type>DemoArea</component-type>
<component-class>
dukesbookstore.components.AreaComponent
</component-class>
<property>
<property-name>alt</property-name>
<property-class>java.lang.String</property-class>
</property>
<property>
<property-name>coords</property-name>
<property-class>java.lang.String</property-class>
</property>

<property>
<property-name>shape</property-name>
<property-class>java.lang.String</property-class>
</property>
</component>
Thuc tnh c ch nh trong mt th thnh phn ghi ln bt k ci t no
trong @FacesComponent ch thch.
Cc yu t thnh phn-loi ch ra tn theo cc thnh phn nn c ng k.
Cc i tng khc cp n thnh phn ny s dng tn ny. V d, Cc yu t thnh
phn-loi trong cu hnh cho AreaComponent xc nh mt gi tr ca DemoArea, m
ph hp vi gi tr tr li bi AreaTag lp getComponentType phng php.
Cc yu t thnh phn lp ch ra tn lp y ca cc thnh phn. Cc yu t bt
ng sn ch nh thuc tnh thnh phn v cc loi ca n.
Nu thnh phn ty chnh c th bao gm cc kha cnh, bn c th cu hnh cc
kha cnh trong cc thnh phn cu hnh bng cch s dng yu t kha cnh, m c
php sau khi cc yu t thnh phn lp. Xem ng k mt b ti to tu chnh vi mt b
nh cho thm chi tit v cu hnh kha cnh.

16.12 c bn yu cu ca mt ng dng Faces JSP c ch r


Ngoi vic nh cu hnh ng dng ca bn, bn phi p ng cc yu cu khc
ca JSP c ch r phi i mt vi ng dng, bao gm ng cch ng gi tt c cc
filecn thit v cung cp mt m t trin khai. Phn ny m t lm th no thc hin
cc tc v qun tr.JSP c ch r phi i mt vi cc ng dng c th c ng gi
trong mt tp tinchin tranh, phi ph hp viyu cu c th thc hin trn container
khc nhau. mc ti thiu, mt tp tinchin tranhcho mt JSP c ch r phi i mt
vi ng dng c th cha nhng iu sau y:
Mt ng dng web trin khai m t, c gi l web.xml, cu hnh ti nguyn
theo yu cu ca mt ng dng web (bt buc)
Thit lp c th ca cc tp tin JAR c cc lp hc cn thit (ty chn)
Tp hp cc lp hc ng dng, cc trang JSP c ch r phi i mt vi, v khcyu
cu ti nguyn,chng hn nh tp tin hnh nh
Mt tp tin chin tranh cng c th cha:

Mt ng dng ti nguyn tp tin cu hnh, m cu hnh ng dng ti nguyn


B th th vin m t tp tin
V d, mt Java phi i mt vi my ch web ng dng chin tranh tp tin bng
cch s dng Facelets thng c cu trc th mc sau y:
$PROJECT_DIR
[Web Pages]
+- /[xhtml or html documents]
+- /resources
+- /WEB-INF
+- /web.xml
+- /beans.xml (optional)
+- /classes (optional)
+- /lib (optional)
+- /faces-config.xml (optional)
+- /*.taglib.xml (optional)
+- /glassfish-web.xml (optional)
Cc web.xml tp tin (hoc web trin khai m t), tp hp cc JAR files, v cc
thit lp.
H s phi c cha trong th mc WEB-INF ca tp tin

16.12.1 Cu hnh mt ng dng vi mt m t trin khai Web


ng dng web thng c t cu hnh bng cch s dng yu t cha trong
cctrang web ng dng trin khai m t, web.xml. M t trin khai cho mt JSP c ch
r phi i mt vi ng dng phi ch nh cc cu hnh nht nh, bao gm c cc sau:
Servlet c s dng x l yu cu phi i mt vi JSP c ch r
Cho x l servlet servlet, nh x
ng dn n tp tin ti nguyn cho cu hnh, nu n tn ti v khng phi mt v
tr mc nh.
M t trin khai c th cng bao gm cu hnh khc, ty chn, chng hn nh
nhng ngi

Ch nh ni thnh phn nh nc c lu
M ho nh nc c lu trn my khch
Nn bang lu trn my khch
Hn truy cp vo trang c cha JSP c ch r phi i mt vi tagsBasic yu cuca
mt ng dng Faces JSP c ch r
Bt XML xc nhn
Xc nh giai on d n
Kim tra tu chnh cc i tng
Phn ny cho bit thm chi tit v cc cu hnh ny. Khi thch hp, n cng m t
lm th no bn c th lm cho cc cu hnh ny bng cch s dng NetBeansIDE.

16.12.1.1 Xc nh Servlet x l vng i


Mt yu cu ca mt ng dng phi i mt vi JSP c ch r l tt c yu cu
ng dng ti liu tham kho trc lu JSP c ch r phi i mt vi cc thnh
phn phi i qua javax.faces.webapp.FacesServlet. trng hp A FacesServlet qun l
ccyu cu x l vng i ng dng web v khi ngun lc cn thit bi cng ngh JSP
c ch r phi i mt .
Trc khi bn JSP c ch r phi i mt vi cc ng dng c th khi ng
trangweb u tin ca n, cc web container phi gi th hin FacesServlet cho qu
trnh vng i ng dng bt u. Xem The vng i ca mt JSP c ch r phi i
mt vi ng dng chobit thm thng tin.
V d sau cho thy cu hnh mc nh ca FacesServlet:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
Bn s cung cp cho mt mc nhp cu hnh lp bn m bo rng
FacesServlet trng hp gi. Lp bn FacesServlet c th l lp bn tin t,
chng hn nh / khun mt / *, hoc mt phn m rng bn , chng hn nh *.xhtml.
nh x cs dng xc nh mt trang c ni dung phi i mt vi JSP c ch r.

Bi v iu ny, URL trang u tin ca cc ng dng phi bao gm lp bn m hnh


URL.
Cc yu t sau y xc nh mt bn tin t:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
<welcome-file>faces/greeting.xhtml</welcome-file>
</welcome-file-list>
Cc yu t sau y, c s dng trong cc v d hng dn, ch nh mt bn
m rng:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
Khi bn s dng c ch ny, ngi dng truy cp cc ng dng nh minh ho
trong sau y:
V d:
http://localhost:8080/guessNumber
Trong trng hp ca phn m rng lp bn , nu mt yu cu n my ch
chomt trang vi mt .XHTML Tin ch m rng, cc thng cha s gi yu cu cho
trng hp FacesServlet, s mong i mt trang tng ng cng tn c cha ni dung
tn ti.
Nu bn ang s dng NetBeans IDE to ng dng ca bn, mt trin khai web
m t c to t ng vi cu hnh mc nh cho bn. Nu bn to ng dng ca bn
m khng c mt IDE, bn c th to ra mt m t trin khai web.

16.12.1.2 xc nh mt ng dn n mt ng dng cu
hnh tp tin ti nguyn.
Nh c din t trong tp tin ti nguyn cu hnh ng dng, ng dng c th c
nhiu ng dng cu hnh tp tin ti nguyn. Nu cc tp ny khng nm trong cc th
mc thc hin tm kim bng cch mc nh hoc cc tp tin khng c t tn. khun
mt-config.xml, bn cn phi ch nh ng dn n nhng tp tin ny.
ch nh cc ng dn bng cch s dng NetBeans IDE, lm nh sau:
1. M rng cc nt ca d n ca bn trong tab d n.
2. M rng cc trang Web v WEB-INF nt di nt d n.
3. Bm p chut web.xml.
4. Sau khi cc tp tin web.xml xut hin trong trnh chnh sa, nhp vo General
trncng ca trnh bin tp ca s.
5. M rng cc nt tham s bi cnh.
6. Bm vo Thm.
7. Trong hp thoi thm tham s bi cnh:
a. Nhp javax.faces.CONFIG_FILES trong lnh vc tn tham s.
b. Nhp ng dn n tp tin cu hnh ca bn trong lnh vc gi tr tham
s.
c. Bm OK.
8. Lp li cc bc 1 n 7 cho mi tp tin cu hnh.

16.12.1.3 xc nh ni nh nc c lu
i vi tt c cc thnh phn trong mt ng dng web, bn c th ch nh trong
trin khai ca bn m t ni bn mun nh nc c lu trn my khch hoc my
ch. Bn lm iu ny bng cch thit lp mt tham s bi cnh trong m t vic trin
khai ca bn. Theomc nh, nh nc l lu trn my ch, v vy bn cn phi ch nh
tham s ng cnh ny ch nu bn mun lu trng thi trn my khch. Xem tit kim v
Restoring nh nc thng tin v cc li th v bt li ca mi a im. xc nh
ni nh nc c lu bng cch s dng NetBeans IDE, lm nh sau:

1. M rng cc nt ca d n ca bn trong tab d n.


2. M rng cc trang Web v WEB-INF nt di nt d n.
3. Bm p chut web.xml.
4. Sau khi cc tp tin web.xml xut hin trong ca s chnh sa, nhp vo General
trn cng ca cc ca s son tho.
5. M rng cc nt tham s bi cnh.
6. Bm vo Thm.
7. Trong hp thoi thm tham s bi cnh:
a. Nhp javax.faces.STATE_SAVING_METHOD trong lnh vc tn tham
s.
b. Nhp my ch hoc khch hng trong lnh vc gi tr tham s.
c. Bm OK.
Nu nh nc c lu trn my khch, bang quan im ton b tr li cho trng
n trn trang. JSP c ch r phi i mt vi thc hin tit kim bang trn my ch
mc nh. Cng tc ca rng lu trng thi ca n trn my khch.

16.12.2 Cu hnh giai on d n


Giai on d n l mt tham s bi cnh xc nh trng thi ca mt Faces JSP
c ch r ng dng trong vng i ca phn mm. Giai on ca mt ng dng c th
nh hng n hnh vi ca ng dng. V d, thng bo li c th c hin th trong cc
giai on pht trin nhng b n p trong giai on sn xut.
Gi tr d n giai on c th nh sau:
Pht trin
UnitTest
SystemTest
Sn xut
D n giai on c cu hnh thng qua mt tham s bi cnh trong vic trin
khai web m t tp tin. Di y l mt v d:

<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
Nu khng c giai on d n c xc nh, giai on mc nh l sn xut. Bn
cng c th thm ty chnh giai on theo yu cu ca bn.

16.12.3 Bao gm cc lp, cc trang v ti nguyn khc


Khi ng gi ng dng web bng cch s dng kch bn bao gm xy dng, bn
snhn thy rng cc kch bn gi ti nguyn trong cc cch sau.
Tt c cc trang web c t cp cao nht ca cc tp tin chin tranh.
Khun mt-config.xml file v cc tp tin web.xml c ng gi trong WEB-INF th
mc.
Tt c cc gi c lu tr trong WEB-INF/lp hc/th mc.
Tt c cc files JAR ng dng c ng gi trong WEB-INF/lib/th mc.
Tt c ti nguyn tp tin l mt trong hai di gc /resources ng dng web
th mc hoc trong ng dng web classpath, cc
Th mc META-INF/ti nguyn/resourceIdentifier. bit thm thng tin v
ti nguyn, hy xem ti nguyn Web.
Khi ng gi ng dng ca ring bn, bn c th s dng NetBeans IDE hoc bn
c th s dng
Tp XML nh nhng ngi to ra cho Maven. Bn c th sa i cc tp tin XML
ph hp vi tnh hnh ca bn. Tuy nhin, bn c th tip tc gi tp tin chin tranh
ca bn bng cch s dng cc cu trc th mc c m t trong phn ny, bi v k
thut ny tun th cc thc hnh thng c chp nhn cho ng gi ng dng web.

You might also like