struts2 類型轉換

從表單提交的數據全是字符串,在數據到達Action類前會有攔截器先對錶單請求進行處理,其中參數攔截器完成表單數的類型轉換,但struts2在提供簡單的數據轉換功能,並不能徹底知足實際需求。比方說日期數據轉換隻支持"yyyy-mm-dd"方式,而實際web應用中不可能只用這種日期表示方式。提交不支持的轉換數據類型,會出現類型轉換錯誤。所以須要自定義類型轉換器。java

<!--參數攔截器 -->
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

若是類型轉換失敗,有兩種狀況:web

  1. Action 類沒有實現 ValidationAware 接口: Struts 即便在遇到類型轉換錯誤時仍會繼續調用目標Action 方法。
  2. Action 類實現了 ValidationAware 接口:Struts 在遇到類型轉換錯誤時將不會繼續調用目標Action 方法:,直接返回字符串"input"。

自定義類型轉換器步驟

1.建立類型轉換器類

繼承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;
	}

}

2.配置類型轉換器

有兩種方式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

注意:若是局部類型轉換和全局類型轉換同時存在的話,局部類型轉換具備較高的優先級。

相關文章
相關標籤/搜索