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

注意:若是局部类型转换和全局类型转换同时存在的话,局部类型转换具备较高的优先级。

相关文章
相关标签/搜索