在struts2支持功能強(qiáng)大的類型轉(zhuǎn)換,它通過提供了一個(gè)StrutsTypeConverter抽象類,它是DefaultTypeConverter類的子類,用戶在使用時(shí)需要實(shí)現(xiàn)以下兩個(gè)類
convertFromString(Map context,String[] values,Class toType),它是字符串轉(zhuǎn)換成復(fù)合類型,其中為了滿足html中的多種請(qǐng)求參數(shù)形式如復(fù)合列表框,把參數(shù)values設(shè)成字符串?dāng)?shù)組形式。
converttoString(Map context,Object o),它是從復(fù)合類型轉(zhuǎn)換成字符串類型的方法
實(shí)現(xiàn)了自定義類型轉(zhuǎn)換器后,將該類型轉(zhuǎn)換器注冊(cè)在Web應(yīng)用中,Struts2才能正常使用它。
Struts2提供了3種注冊(cè)方式:
1. 注冊(cè)成局部類型轉(zhuǎn)換器
在與*Action.class相同位置下提供一個(gè)ActionName-conversion.properties的Properites,文件 由key-value組成,內(nèi)容如下:
propertyName=類型轉(zhuǎn)換器類(需要加包前綴)
2. 注冊(cè)成全局類型轉(zhuǎn)換器
為了讓系統(tǒng)中的多個(gè)Action重復(fù)使用類型轉(zhuǎn)換器類,需要把類型轉(zhuǎn)換器類設(shè)置成全局類型轉(zhuǎn)換器:它需要在classes目錄提供一個(gè)xwork-conversion.properties文件,內(nèi)容由“復(fù)合類型=對(duì)應(yīng)類型轉(zhuǎn)換器”項(xiàng)組成,它們都需要提供完整的包前綴。
3. 使用JDK1.5的注釋來(lái)注冊(cè)
由于Struts2內(nèi)建了OGNL表達(dá)式的支持,所以比較常用,簡(jiǎn)單的方式是把html的請(qǐng)求屬性名直接設(shè)置成Action中VO的值.屬性形式。
比如一個(gè)User的Bean包括兩個(gè)屬性name和pass,在Action中它的變量為user變量對(duì)象,則在html表單中可以直接把請(qǐng)求參數(shù)名user.name和user.pass,這樣struts2就會(huì)自動(dòng)轉(zhuǎn)換。
另外,Struts2支持?jǐn)?shù)組,集合屬性的類型轉(zhuǎn)換器,其中在集合轉(zhuǎn)換器中為了讓系統(tǒng)了解集合中元素的類型,有兩種方法:
- 使用泛型來(lái)限制集合的元素的類型。
- 使用了Struts2的配置文件,使用局部類型轉(zhuǎn)換的配置文件來(lái)指定集合元素的數(shù)據(jù)類型,其中格式如下:
對(duì)于List類型:Element_xxx=復(fù)合類型(xxx表示屬性名,以下也是)
而對(duì)于Set類型:
Element_xxx=復(fù)合類型
KeyProperty_xxx=name (其中name為set索引屬性名)
類型轉(zhuǎn)換中錯(cuò)誤處理:
Struts內(nèi)置了類型轉(zhuǎn)換攔截器,它負(fù)責(zé)將對(duì)應(yīng)錯(cuò)誤封裝成表單域錯(cuò)誤信息(fieldErro),并將其放入ActionContext中。為了在input視圖對(duì)應(yīng)的頁(yè)面中顯示錯(cuò)誤信息,只需要在頁(yè)面中使用<s:fielderror/>標(biāo)簽就可輸出類型轉(zhuǎn)換的錯(cuò)誤信息,其中可以通過在應(yīng)用的國(guó)際化資源文件中增加代碼來(lái)修改類型轉(zhuǎn)換失敗后的提示信息:
Xwork.default.invald.fieldvalue={0} 字段類型轉(zhuǎn)換失敗!.(非西歐字符,需要用native2ascii轉(zhuǎn)換)
以上改變的是全局的錯(cuò)誤信息提示,若需要對(duì)特定字段指定特別的提示信息,可以提供Action的局部資源文件,文件名為ActionName.properties,在文件中增加一行如下項(xiàng):
Invald.fieldvalue.屬性名=提示信息
在使用《struts2權(quán)威指南》中,犯了兩個(gè)錯(cuò)誤:
1. 在局部與全部類型轉(zhuǎn)換配置文件中,給整暈了------在局部文件中寫了
包名.復(fù)合類型==類型轉(zhuǎn)換器類 局部類型轉(zhuǎn)換的配置文件中,紅色部分為屬性名
2. 在寫Action中的一個(gè)屬性的getXXX方法,把它的訪問使用private了,然后在結(jié)果的視圖頁(yè)面中就是無(wú)法顯示其結(jié)果(能顯示才怪呢),我找了半天找到這個(gè)小錯(cuò)誤。。。