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