5.26日(rì)音(yīn)訊,Struts2必須≤¶÷掌握的(de)知(zhī)識。Struts2是(sh♦×∑¥ì)在WebWork2基礎發展而來(lái)的(deαε)。和(hé)struts1一(yī)樣,Strut↕©s2也(yě)屬于MVC框架。一(yī)、Struts2類型轉換α£®→介紹
類型轉換:解析HTTP請(qǐngπα)求參數(shù),将Http請(qǐng)求參數(shù)賦值λφ給Action的(de)屬性;比如(rúφ ):
<s:formaction="valid"☆&;>
<s:textfieldlabel="用(yònγ'&±g)戶名"name="name"><≠¶>/s:textfield>
<s:passwordlabel=&β"密碼"name="passworβ¶×Ωd"></s:password>
<s:textfieldlabel="年(nián)齡&±φquot;name="age"></∞±s:textfield>
<s:submitvalue=&qu☆ ot;提交"></s:submit>
</s:form>
此處将名為(wèi)name、password、age的(∑de)值賦值給Action的(de)屬性,類型轉換是(shì)指這(zhè¶')個(gè)賦值過程中可(kě)能(néng)出現(xiàn)的(de)類型不©≤'(bù)一(yī)緻問(wèn)題而做(zuò)☆&™出的(de)轉換,因為(wèi)HTTP參數(shù)都(dōu)是(s¶®€βhì)字符串類型的(de);因此從(cóng)String類型的(d±↔&©e)age參數(shù)傳給int類型的(de)age屬性時∏®✔§(shí),就(jiù)需要(yào)類型轉換,當↑>£Ω然這(zhè)些(xiē)struts2框架已經做(zuò)完了(le),>£開(kāi)發人(rén)員(yuán)不(bù)需要(yào)自(zì¶¥)行(xíng)處理(lǐ);
Struts2已經內(nèi)建了(÷•♥le)對(duì)于String和(hé)基本類型的(de)類型轉換,比如£β(rú)String<-->int、Striε∑↔≠ng<-->boolean等;
Action屬性一(yī)定要(yào)有(y↑•ǒu)getter和(hé)setter方法!
Struts2提供了(le)強大(dà)的(de)類型轉換支持, 不(bù)僅提供了(le)內(nèi)置的(de)類型轉換器(qì§₩≈),還(hái)可(kě)以自(zì)定義類型轉換器(qì),以滿×Ω足自(zì)定義需求;
Struts2類型轉換是(shì)通(tōng)過para•±↕ms攔截器(qì)進行(xíng)轉換;如(rú)果✘™≈£轉換失敗,則conversionError攔截器(qì)攔截該異常,并封裝α♣α到(dào)fieldError中,放(fàng)入ActionCo ↓¶ntext中;
Struts2類型轉換還(hái)支持OGNL表達式,隻需要(π yào)在表單控件(jiàn)的(de)name屬性∏™σ使用(yòng)ognl表達式即可(kě),比↑< 如(rú)表單控件(jiàn)的(de)name屬性為(w×↕èi)user.name,則此控件(jiàn)的(de)δ$數(shù)據将進入賦值給Action的(de)user屬α≥♣性中的(de)name屬性;
二、通(tōng)過一(yī)個(gè)例子(zǐ)初步了(le)↓≠β解Struts2類型轉換
此處的(de)類型轉換因為(wèi)是(sh"♦<←ì)內(nèi)建的(de),因此代碼上(shàng)和(h∞↕©é)原來(lái)的(de)struts2≈ ₩λ應用(yòng)沒有(yǒu)不(bù)同,struts2框架內(nèi)部完✘♠Ω€成了(le)所有(yǒu)了(le)類型轉換,以下(xià)程序是(₹€§shì)将name、age賦值給Action類的(∞"de)name、age屬性,gender、salary賦值給p.gender♠→™、p.salary屬性;struts.xml的(de)配置σ≥₹δ和(hé)原來(lái)一(yī)樣,所以就(jiù)不(bù)給出了↑←×(le);
Conversion01Action.java
packageorg.conversion.action;
importorg.person.Person;
importcom.opensymphony.xwork2.A≤₩≥£ctionSupport;
publicclassConversion01Action₩©extendsActionSupport{
privateStringname;
privateintage;
privatePersonp;
publicStringexecute()thr→€owsException{
System.out.println(name);
System.out.println(age);®≥
System.out.println(p.getGender());
System.out.println(p.getSalary()♠φ£φ);
returnSUCCESS;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(∞™Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicPersongetP(){
returnp;
}
publicvoidsetP(Personp){
this.p=p;
}
}
1.jsp
此處需要(yào)注意的(de)是(shì)性别₹÷♦、薪水(shuǐ)的(de)表單控件(jiàn)的"€>≥(de)name屬性是(shì)OGNL表達式;
<html>
<head>
<metahttp-equiv="β;Content-Type"content="text≠∑♦£/html;charset=utf-8">
<title>Inserttitlehere</t≈←©itle>
</head>
<body>
<s:fielderror></s:fiel•↔derror>
<s:formaction="c↑×✘onversion01">
<s:textfieldla ×bel="姓名"name="name®§✔"></s:textfiel©←™d>
<s:textfieldlabel= λ₽"年(nián)齡"name="age&< ∞quot;></s:textfiel≥d>
<s:textfieldlabel="性别&€♥quot;name="p.gender"&g"€t;</s:textfield>
<s:textfieldlabel="薪水(∑φshuǐ)"name="p.salary"&g∏×≠t;</s:textfield>
<s:submitvalue="提交">"→★</s:submit>
</s:form>
</body>
</html>
補充:List和(hé)Map的(de)Action∏Ω屬性的(de)類型轉換問(wèn)題
前面我們将的(de)都(dōu)是(shì)基本類型和(ε↑hé)自(zì)定義類型,因此這(zhè)裡(lǐ)我們将講¶™Ω述集合類型的(de)類型轉換問(wèn)題; ↔©
如(rú)果Action的(de)屬性為(wèi)ε">ΩList類型,List<String'α>lists,則表單控件(jiàn)'π↑★的(de)命名方式為(wèi)lists[i],如(rúβ&¥)lists[0]表示第1個(gè)元素;
如(rú)果Action的(de)屬性為(wèi)Map類型,MaδΩΩp<String,Person>maps;則表單控件(ji ↕>"àn)的(de)命名方式為(wèi)maps['firstα ≥♦9;].salary,表示map中key為(wèi)'firs "∑t'的(de)value中的(de)salary屬性;
以上(shàng)的(de)list和(hé)map類型≈♠↕屬性都(dōu)通(tōng)過泛型的(de)方式說(shuō)明(míng)↔δ★集合元素的(de)類型,如(rú)果在JDK1$ ← .5之前,泛型沒有(yǒu)出現(xiàn),則≈₹需要(yào)通(tōng)過局部類型轉換文(wén)件(jiàn)進行♥★(xíng)表示;
局部類型轉換文(wén)件(jiàn):對β λ$(duì)于特定Action的(de)特定屬性有(yǒu)效,位于特™定Action同一(yī)目錄下(xià),命名規則:ActionName-Ω conversion.properties;
對(duì)于List元素來(lái)說(shu☆∑ō),內(nèi)容如(rú):Element_attributeN¥₹∑$ame=typeName;
對(duì)于Map元素來(lái)說(shuō),
(1)如(rú)果表示key的(de)類∞₹∏β型,則:Key_attributeName=typeNamε±e;
(2)如(rú)果表示value的(de)類型,則為(wβ ★èi):Element_attributeName=typeName₹φ•;
比如(rú),此處沒有(yǒu)使用(yòng)泛型,而是(s¥÷hì)使用(yòng)了(le)局部類型轉換文(wé¥↔÷n)件(jiàn):
Conversion02Action.j€γava
packageorg.conversion.action;
importjava.util.Lis®±♠€t;
importjava.util.Mapα±;
importorg.person.Person;
importcom.opensymphony.xwork2.Actio&nSupport;
publicclassConversion02Actionexte ndsActionSupport{
privateListlists;
privateMapmaps;
publicStringexecute()throwsExcep¥ ↓tion{
System.out.println((© (Person)lists.get(0)δ≤).getGender());
System.out.println(((Person)lis±↑ts.get(0)).getSalary()♣≥♦);
System.out.printl☆ n(((Person)maps.get("one&α≥♦•quot;)).getGender());
System.out.println(((Person)maps.get£φ≈("one")).getSalary()); ®σ
returnSUCCESS;
}
publicListgetList≠÷επs(){
returnlists;
}
publicvoidsetLists(Listlists) ♣∑₹{
this.lists=lists;
}
publicMapgetMaps(){
returnmaps;
}
publicvoidsetMaps(Mapmaλσps){
this.maps=maps;
}
}
Conversion02Action-conversion.pr ≈↓÷operties
Element_lists=org.per £son.Person
Key_maps=java.lang.String
Element_maps=org.person.Per♦<∞>son
2.jsp
<html>
<head>
<metahttp-equiv="Cπγδ↕ontent-Type"content="t≠§∏ext/html;charset=utf-8">↔γ$®;
<title>Insert≤♥γtitlehere</title>ππ→;
</head>
<body>
<s:fielderror><β↓;/s:fielderror>
<s:formaction="conversi≥×on02">
<s:textfieldlabel="list1.s<♠♠€alary"name="lis♠♦ts[0].salary"></s:textfi♥≈®↔eld>
<s:textfieldlabel="φ♦ ↑;list1.gender"name="list≥♠s[0].gender">₹"∏</s:textfield>
<s:textfieldlabel="map1.ge>®nder"name="maps['one÷≤₹39;].gender"></"₹$s:textfield>
<s:textfieldlabel="δσmap1.salary"name="maps↑↕"['one'].salary&quo₩₹ t;></s:textfield>
<s:submitvalue="提交&q π'₩uot;></s:submit™©₽>
</s:form>
</body>
</html>
Conversion02Action-conversion. β∞properties
Element_lists=org.per≈₽♦son.Person
Key_maps=java.lang.S©$←λtring
Element_maps=org.person.Person
三、自(zì)定義類型轉換器(qì)
1.繼承DefaultTypeConver≠↑↑βter
如(rú)果我們自(zì)定義一(yī)個(φ♣gè)類型轉換器(qì),第一(yī)種方法是(shì)繼承De•↓↑≈faultTypeConverter,并重寫publicObjectconvσ♥ertValue(ActionContex♠§$&tcontext,Objectvalue≈σ,ClasstoType);
這(zhè)個(gè)函數(shù'↓♥≈)的(de)功能(néng)是(shì)完成雙向轉換,即從(cóng ∑)String數(shù)組轉到(dào×λ)Action屬性及Action屬性轉到(dào)Str©φ✘∑ing;需要(yào)注意的(de)是(shì)從Ω₩✘(cóng)String數(shù)組轉到(dào)Action屬★<性,而不(bù)是(shì)String轉到(dào)Action屬性σ±•;如(rú)果隻有(yǒu)一(yī)個(gè)字符串,則取paramΩ♣ s[0]即可(kě);
因此一(yī)般此函數(shù)的(₩"∏de)模闆代碼如(rú)下(xià):
publicObjectconvertValue€★ →(Map<String,Object>∏>context,Objectvalue,
ClasstoType){
if(toType==String.clasπ☆ πs){
......
returnString;
}
elseif(toType==Action屬性.class) ✘{
Stringparams[]=(String[])value;//必須是σ×(shì)字符串數(shù)組
.......
returnAction屬性;
}
returnnull;
}
完成自(zì)定義類型轉換器(qì)編φ∑₹寫後,如(rú)果需要(yào)使用(yòng)此轉換器(qì✘©↔),就(jiù)需要(yào)配置,通(tōng)常有(yǒu)兩種配₹←置方法:
1.局部類型轉換文(wén)件(jiàn)中δ 配置,僅對(duì)特定的(de)Action的(de)特定屬性有☆Ω(yǒu)效,比如(rú)在Action1中有(yǒu)aa屬性,則僅¥÷'對(duì)Action1的(de)aa屬性有(yǒu)效;
2.全局類型轉換文(wén)件(jiàn)中配置,對(duì)某'δε個(gè)類型都(dōu)有(yǒu)效;比如(rú)對(duì♥ )Person注冊了(le)類型轉換器(qì₽ ),則對(duì)任何Person和(hφ✔>é)String的(de)轉換都(dōu)有(yǒu)效;
全局類型轉換文(wén)件(jiàn)命名為(wèiγ÷ ☆):xwork-conversion.propertπ®∞ies,通(tōng)常放(fàng)在WEB-INF\clas∏♥•ses下(xià);
文(wén)件(jiàn)內(nèi)容如(r≠φγ ú):attributeName=Con™≤&vertClass,比如(rú)aa=org.convert.Conveδ÷₽rter1
attributeName表示屬性名稱,c ←"φonvertClass表示轉換器(qì)的(de)實現(x ✔iàn)類;
局部類型轉換文(wén)件(jiàn)命名為(wèi)φφ:ActionName-conversion§∑✔.properties,放(fàng)在特定Action的(de)目γ♣'錄下(xià);
文(wén)件(jiàn)內(nèi)容如(÷¥' rú):typeName=ConvertClas>♠βs,比如(rú)org.person.Person&δ≤€=org.convert.Converter2
注意:typeName表示轉換類型↔γ♥,convertClass表示轉換器(qì)的($Ωde)實現(xiàn)類;
代碼示例:
Conversion03Action.java↓♦₽
packageorg.conversioγ≥←n.action;
importorg.person.Person; ★₩
importcom.opensymphon∞™y.xwork2.ActionSupport;
publicclassConversion0♣∞γ3ActionextendsActionSupport{
privatePersonp;
publicStringexecute()δ£throwsException{
System.out.println(p.getGender())×'÷;
System.out.println(p.getπγα™Salary());
returnSUCCESS;
}
publicPersongetP(){
returnp;
}
publicvoidsetP(Personp$&©){
this.p=p;
}
}
Converter01.java
packageorg.converter;
importjava.util.Map;
importorg.person.Person;
importcom.opensymphony.xwork2.conve↔≈×rsion.impl.DefaultTypeConvλβε₽erter;
publicclassConverter01extendsD±∞efaultTypeConverter{₽'↕"
@Override
publicObjectconvertValue(Ma¥₹Ωεp<String,Object>co£✘λntext,Objectvalue,
ClasstoType){
if(toType==String≠'.class){
Personp=(Person)value;
returnp.getSalary()+","+±×♦p.getGender();
}
elseif(toType==Person.class){
Stringparams[]=(St§Ωring[])value;
String[]values=params[0].split(&♣©quot;\\,");
Personp=newPerson();
p.setGender(values®ε[1]);
p.setSalary(Double.parseDouble(value&>s[0]));
returnp;
}
returnnull;
}
}
3.jsp
pageEncoding="utf-8"%>Ω↑→γ
<html>
<head>
<metahttp-equiv="Conten•₹≤t-Type"content="text©∞ε/html;charset=utf-8">♦<™;
<title>Inserttitlehere</ti£γtle>
</head>
<body>
<s:fielderror></s:f< ielderror>
<s:formaction="conversion0✘®3">
<s:textfieldlabel="↑δ≥₩薪水(shuǐ),性别"nam₩ e="p"></s:textfield&g♠φ≈t;
<s:submitvalue="提交"&↑></s:submit>
</s:form>
</body>
</html>
Conversion03Action-convβ✔ ersion.properties
p=org.convert.Converter01
2.繼承StrutsTypeConverte÷ ≠r
StrutsTypeConverter是(shì)¥∏♦DefaultTypeConverter的(de)子(zǐ)類,☆'₽✔DefaultTypeConverter的(de)類型轉換器(qì)是(sπ≠<hì)在一(yī)個(gè)函數(shù)中進行(xíng)雙向轉換,而繼承Sδ>trutsTypeConverter的(de) &類型轉換器(qì)則是(shì)将兩個(↑≠→gè)方向分(fēn)别用(yòng)兩₩¥個(gè)函數(shù)實現(xiàn):
@Override
publicObjectconvertFromStrin ♣₩g(Mapcontext,String[]values,&¥ClasstoClass){
}
@Override
publicStringconvertToString('βλMapcontext,Objecto){
}