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

abstract String convertToString(Map context, Object o)

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