從表單提交的數據全是字符串,在數據到達Action類前會有攔截器先對錶單請求進行處理,其中參數攔截器完成表單數的類型轉換,但struts2在提供簡單的數據轉換功能,並不能徹底知足實際需求。比方說日期數據轉換隻支持"yyyy-mm-dd"方式,而實際web應用中不可能只用這種日期表示方式。提交不支持的轉換數據類型,會出現類型轉換錯誤。所以須要自定義類型轉換器。java
<!--參數攔截器 --> <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
若是類型轉換失敗,有兩種狀況:web
繼承StrutsTypeConverter類,重寫convertFromString方法apache
示例:數組
MyTypeConverter.javaide
package cn.iborder.interceptor; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class MyTypeConverter extends StrutsTypeConverter{ /** * 自定義類型轉換器 * @param context 上下文環境 * @param values 表單提交的數據(字符串數組) * @param toClass 要轉換的目標類型 */ @Override public Object convertFromString(Map context, String[] values, Class toClass) { // TODO Auto-generated method stub if (values == null && values.length == 0) { return null; } if (Date.class != toClass) { return null; } SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd"); try { return sdf.parse(values[0]); } catch (ParseException e) { // TODO Auto-generated catch block throw new RuntimeException(e); } } @Override public String convertToString(Map arg0, Object arg1) { // TODO Auto-generated method stub return null; } }
有兩種方式spa
(1)基於字段的配置(局部類型轉換器)code
在字段所在的Action類的包下, 新建一個 Action類名-conversion.properties 文件。orm
內容格式以下:xml
字段名=類型轉換器類名
示例:繼承
UserAction-conversion.properties
user.birth =cn.iborder.interceptor.MyTypeConverter
(2)基於類型的配置(全局類型轉換器)
在src路徑下新建 xwork-conversion.properties 文件
內容格式如以下:
目標轉換類型=類型轉換器類名
示例
xwork-conversion.properties
java.util.Date = cn.iborder.interceptor.MyTypeConverter
注意:若是局部類型轉換和全局類型轉換同時存在的話,局部類型轉換具備較高的優先級。