struts2支持功能強大的類型轉(zhuǎn)換,它通過提供了一個StrutsTypeConverter抽象類,它是DefaultTypeConverter類的子類,用戶在使用時需要實現(xiàn)以下兩個類

convertFromString(Map contextString[] valuesClass toType),它是字符串轉(zhuǎn)換成復(fù)合類型,其中為了滿足html中的多種請求參數(shù)形式如復(fù)合列表框,把參數(shù)values設(shè)成字符串?dāng)?shù)組形式。

converttoString(Map contextObject o)它是從復(fù)合類型轉(zhuǎn)換成字符串類型的方法

 

實現(xiàn)了自定義類型轉(zhuǎn)換器后,將該類型轉(zhuǎn)換器注冊在Web應(yīng)用中,Struts2才能正常使用它。

Struts2提供了3種注冊方式:

1.       注冊成局部類型轉(zhuǎn)換器

在與*Action.class相同位置下提供一個ActionName-conversion.propertiesProperites,文件 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è)置成ActionVO的值.屬性形式。

  比如一個UserBean包括兩個屬性namepass,在Action中它的變量為user變量對象,則在html表單中可以直接把請求參數(shù)名user.nameuser.pass,這樣struts2就會自動轉(zhuǎn)換。

另外,Struts2支持?jǐn)?shù)組,集合屬性的類型轉(zhuǎn)換器,其中在集合轉(zhuǎn)換器中為了讓系統(tǒng)了解集合中元素的類型,有兩種方法:

  1. 使用泛型來限制集合的元素的類型。
  2. 使用了Struts2的配置文件,使用局部類型轉(zhuǎn)換的配置文件來指定集合元素的數(shù)據(jù)類型,其中格式如下:

對于List類型:Element_xxx=復(fù)合類型(xxx表示屬性名,以下也是)

而對于Set類型:

Element_xxx=復(fù)合類型

KeyProperty_xxx=name (其中nameset索引屬性名)

 

類型轉(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é)果(能顯示才怪呢),我找了半天找到這個小錯誤。。。