概說
許多時候struts能很好的將頁面上field中的字符輸入和POJO類中的屬性對應起來并自動轉換(比如整型、日期等等),但如果遇到一些自定義復雜業務類型,就需要我們顯式的提供轉換處理。
struts2中實現類型轉換的接口為
interface com.opensymphony.xwork2.conversion.TypeConverter
其中定義的方法為
Object convertValue(Map<String,Object> context, Object target, Member member, String propertyName, Object value, Class toType)
為了方便使用,struts2提供了兩個實現
(1) com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter
我們只需要override其中的
Object convertValue(Map<String,Object> context, Object value, Class toType) 方法即可。
toType為將要轉換為的類型
(2)更方便的解決辦法是繼承抽象類
org.apache.struts2.util.StrutsTypeConverter
它繼承了上面的類,并提供了兩個抽象函數
abstract Object convertFromString(Map context, String[] values, Class toClass)

abstract String convertToString(Map context, Object o)

因為平時最常用的就是特定類型與String類的互轉,所以在一般情況下實現這兩個方法已經足夠了。
下面簡單說一下轉換原理。在JSP中的s:textfield提交后到Action的同時也將調用Action的set方法賦值,如果此時Action中定義了POJO類,則struts2會自動試圖尋找該類和String[]之間的轉換方法。他回到如下兩個地方尋找:
(1)WEB-INF下的 xwork-conversion.properties
某個字段=轉換該字段的類
如:point1=PointConverter
(2)與XXXAction所在同一級目錄下的XXXAction-conversion.properties
某個要轉換的類=轉換該類的類
如:Point=PointConverter
如果同時配置的話,(2)具有更高的優先級。
幾個需要記住的幾個地方再寫一下:
class DefaultTypeConverter struts2中類型轉換的基類
class StrutsTypeConverter struts2提供的一個更方便的實現
xwork-conversion.properties 全局轉換屬性文件名
XXXAction-conversion.properties 基于特定Action的轉換屬性文件名
集合及部分自動轉換
集合的話,最好用范型指定轉換類的類型,否則Struts會找不到
List<ClassA>
部分自動轉換是指頁面上可以直接寫類似于ClassA.A,ClassA.B 這樣的field,
程序會自動尋找Action中的setClassA方法,同時尋找ClassA中的setA和setB方法從而賦值。
但是好像實際使用的時候用的并不多,因為這樣事實上直接將POJO的細節透露給表示層。