自定义一个 Struts2 的类型转换器 (TypeCoverter)可以分为两个步骤:
1,实现一个类型转换器,需实现 ognl.TypeConverter 接口
2,注册
1,实现一个类型转换器
为了简化类型转换器的实现,Struts2 提供了一个抽象类 StrutsTypeConverter
继承 StrutsTypeConverter 并实现两个抽象方法:
Object onvertToString(Map context,String[] values,Class toClass);
String convertFromString(Map context,Object obj);
2,注册
A、注册局部类型转换器:仅仅对某个Action的属性起作用
文件名:<ActionName>-conversion.properties,其中<ActionName>是Action的名称
内容:<propertyName>=类型转换器类,如 date=com.aumy.DateConverter
存放位置:和Action类同一包下
B、注册全局类型转换器:对所有Action的特定类型的属性都会生效
文件名:xwork-conversion.properties
内容:被转换类型=类型转换器类,如 java.Util.Date=com.aumy.DateConverter
存放位置:WEB-INF/classes/目录下。
这是我写的 Timestamp<->String 转换器
package com.gdsc.core.converter;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.struts2.util.StrutsTypeConverter;
/**
* Struts2 类型转换器
* Timestamp <-> String
* @author linwei
*
*/
public class TimestampConverter extends StrutsTypeConverter {
// 匹配“2012年12月31日”这种模式的日期字符串
private static final String TYPE_A_REG_EXP = "^(\\d{4})年(\\d{2})月(\\d{2})日$";
private static final String TYPE_A_FORMAT = "yyyy年MM月dd日";
/**
* String -> Timestamp
*/
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
// 参数检测
if(values == null || values.length != 1){
return null;
}
if(!Timestamp.class.isAssignableFrom(toClass)){
return null;
}
Matcher matcher = Pattern.compile(TYPE_A_REG_EXP).matcher(values[0]);
if(matcher.matches()){ // 构造 Timestamp 对象
Timestamp timestamp = null;
try {
int year = Integer.valueOf(matcher.group(1));
int month = Integer.valueOf(matcher.group(2)) - 1;
int day = Integer.valueOf(matcher.group(3));
Calendar calendar = new GregorianCalendar(year, month, day, 0, 0, 0);
timestamp = new Timestamp(calendar.getTimeInMillis());
} catch (Throwable e) {
}
return timestamp;
} else {
return null;
}
}
/**
* Timestamp -> String
*/
@Override
public String convertToString(Map context, Object o) {
if(o instanceof Timestamp){
Timestamp timestamp = (Timestamp) o;
SimpleDateFormat sdf = new SimpleDateFormat(TYPE_A_FORMAT);
return sdf.format(new Date(timestamp.getTime())).toString();
} else {
return o.toString();
}
}
}
还有全局配置:
java.sql.Timestamp=com.gdsc.core.converter.TimestampConverter