上一次我们学习了struts2系统自带的类型转换以及错误提示消息的自定义方法。接下来我们学习Struts2自定义的类型转换方法。
为什么需要自定义的类型转换器 ?
因为 Struts 不能自动完成字符串到引用类型的转换,在需要进行字符串到引用类型的的转换的时候,我们就要自定义类型转换器。
如何自定义类型转换器 ?
自定义类型转换器,分为两步:
第一步:开发类型转换器的类: 扩展StrutsTypeConverter 类.
例如:默认情况下系统无法将字符串“1990-12”转换为Date类型。需要创建一个日期Date和String的转换类,这个类扩展了StrutsTypeConverter类,需要实现两个抽象方法public Object convertFromString(Map arg0, String[] str, Class clazz)
和public String convertToString(Map arg0, Object obj)
分别为将字符串转换为Date和把Date转换为String。代码如下:
package com.catec.mrd.converter;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.StrutsTypeConverter;
public class DateConvertor extends StrutsTypeConverter {
//定义DateFormat用于实现字符串和date之间的转换。
private DateFormat format = null;
public DateConvertor() {
}
//初始化DateFormat,获取自定义的DateFormat的格式
private DateFormat getFormat() {
if(format == null) {
/**
* 通过ServletContext获取配置文件中的DatePattern,并初始化DateFormat
* 初始化DateFormat没有写在构造函数中,是因为如果设置配置类型转换器为基于类型的配置,
* 则在服务器启动时调用该类型转换器的构造函数 ,而此时servletcontext为null,
* 所以无法初始化DateFormat。因此专门写一个方法调用。
*/
//
ServletContext context = ServletActionContext.getServletContext();
String pattern = context.getInitParameter("DatePattern");
format = new SimpleDateFormat(pattern);
}
return format;
}
@Override
public Object convertFromString(Map arg0, String[] str, Class clazz) {
// TODO Auto-generated method stub
//判断是否转换要转换为Date
if(clazz == Date.class && str != null &&str.length != 0){
try {
//转换
Date date = getFormat().parse(str[0]);
return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//如果转换失败返回原字符串。
return str;
}
@Override
public String convertToString(Map arg0, Object obj) {
// TODO Auto-generated method stub
if(obj instanceof Date){
return getFormat().format((Date)obj);
}
return null;
}
}
第二步:配置类型转换器。
有两种方式配置转换器,各有个的用途:
①. 基于字段的配置:
在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件,在该文件中输入键值对: fieldName=类型转换器的全类名。这种配置方式,在第一次使用该转换器时创建实例,调用构造函数,切只调用一次,类型转换器是单实例的!
②. 基于类型的配置:
在 src 下新建 xwork-conversion.properties,在该文件中输入键值对: 待转换的类型=类型转换器的全类名.这种配置方式,在当前 Struts2 应用被加载时创建实例. 而此时servletcontext尚未创建,因此如果要通过servletcontext加载配置文件将失败,较好的做法是将通过加载配置文件进行初始化的属性封装到一个初始化方法中,并在转换时调用。(见上面代码)