自定义 Struts2 类型转换器 (TypeCoverter)

自定义一个 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值