struts2局部类型转换器的使用。

当使用struts2的时候,如果传递的参数不符合action中的类型。
虽然struts会有自动的处理方式,让数据能够显示出来,但数据并没有传递到action中对应的变量中。

比如一个action中有一个Date的成员变量,其名字为birthday.
你可以在result中访问到birthday数据成员,但是并非传递给变量birthday的数据.

对此,我们也需要定义类型转换器,以便让传入的数据能够正确的转换成我们需要的格式。

package cn.dzr.converter;

import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

public class DateTypeConverter extends DefaultTypeConverter
{

	@Override
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType)
	{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	
		try
		{
			if(toType == Date.class)
			{
				String[] params = (String[])value;
				return sdf.parse(params[0]);
			}
			else if(toType == String.class)
			{
				Date date = (Date)value;
				return sdf.format(date);
			}
		}
		catch(ParseException e)
		{
			
		}
		return null;
	}
	
}

如上就是一个简单的类型转换器。
对于该类,需要注意两个地方,

第一是其父类为
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
struts2中提供了多个类型转换器,但是以此转换器为上品,所以通常情况下,请选择该类。

第二则是if(toType == Date.class)
            {
                String[] params = (String[])value;
                return sdf.parse(params[0]);
            }
            else if(toType == String.class)
            {
                Date date = (Date)value;
                return sdf.format(date);
            }

在这段转换代码中,开始时候是通过string数组传递参数。这主要是考虑兼容性。因为传递给action的数据,
可能具有多个值。比如用户选择兴趣爱好,就可能存在多个值。当我们接受到用户的浏览器请求的时候,可能其带来
的参数就是一个字符串数组,而不是一个简单的字符串。
所以,这里通过数组的形式来处理这个字符串转向日期格式的问题。

这里的下面还有一个字符串转为日期的操作。
这种情况被称为双向转换器,因为当你需要在JSP页面中显示你的非String数据的时候,也许你需要按照自己
要求,输出日期的格式。


好了,在完成了类型转换器类的编写好。
我们就需要注册该类型转换器,让其针对某个变量产生作用。我们这里是局部的类型转换器。
其具体的步骤如下:
在我们需要使用类型转换器的action的包下
新建一个文件,文件名为 actionname-conversion.properties
其内容为
变量名= 类型转换器的全路径

如上面的例子,需要将其应用在cn.dzr.action.HelloWorldAction这个类中的birthday成员。
那么,就需要在cn.dzr.action包下新建文件
HelloWorldAction-conversion.properties
其内容则是
birthday=cn.dzr.converter.DateTypeConverter

到此,类型转换器就已经成功的注册了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章