Professional Documents
Culture Documents
238-308-Tạo Tùy Chỉnh Các Thành Phần Giao Diện Người Dùng Và Tuỳ Chỉnh Đối Tượng Khác
238-308-Tạo Tùy Chỉnh Các Thành Phần Giao Diện Người Dùng Và Tuỳ Chỉnh Đối Tượng Khác
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.
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
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.
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.
...
<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.
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>
</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.
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
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
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.
biu phi
hp HTML bn
v u
vo th vo lp
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.
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
}
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;
}
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.
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.
<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>
@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.
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>
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.
...
</h:inputText>
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.
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
Header
Bn ca cc gi tr tiu
HTTP cho yu cu hin ti, c nh
du bi tn tiu
HeaderValue
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
RequestScope
SessionScope
View
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:
@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 ".
<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.
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.
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:
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.
<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>
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.
chn c hay
iu
<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.
nh ngha gi tr
Danh mc
Bn mc
Xc nh cc gi tr trong mt bn
Gi tr rng
Gi tr
Xc nh mt gi tr n v d nh mng,
chui, hoc JavaServer Faces EL.
<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.
</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.
</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
none
None
application
None, application
Session
Request
view
<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.7 ng
k mt xc thc ty chnh
What it means
Success
Failure
C g sai. i ti trang li
Login
No result
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.
<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.
<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.
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.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:
<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.