struts2自定义类型转换器

问题:
1)为什么需要自定义类型转化器?因为struts2不能自动完成字符串到引用类型的转换。
2)如何自定义类型转化器:
a.开发类型转化器的类:
扩展strutsTypeConverter类,也可以扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类
b.配置类型转换器:
两种方式
Ⅰ.基于字段的配置:
在字段所在的action的包下,新建一个名为 类名-conversion.properties的文件。
在文件中输入: fieldName=类型转化器的全类名。
例:birth=com.atguigu.struts2.app.converters.DateConverter
注意:
第一次使用该类型转化器时创建实例。
此类型转换器是单实例的!
Ⅱ.基于类型的配置
在src下新建 xwork-conversion.properties
键入:待转换的类型=类型转换器的全类名
例:java.util.Date=com.atguigu.struts2.app.converters.DateConverter
注意:在当前struts2应用被加载时创建实例。


扩展strutsTypeConverter类:

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 DateConverter extends StrutsTypeConverter {

	private DateFormat dateFormat;
	
	public DateConverter() {
		System.out.println("DateConverter's constructor...");
	}
	
	public DateFormat getDateFormat(){
		if(dateFormat == null){
		//web.xml文件中<context-param>
		//<param-name>pattern</param-name>
		//<param-value>yyyy-MM-dd hh:mm:ss</param-value>
		//</context-param>获取当前web 应用的初始化参数 pattern
			
			ServletContext servletContext = ServletActionContext.getServletContext();
			System.out.println(servletContext); 
			String pattern = servletContext.getInitParameter("pattern");
			//因为基于类型的配置是在当前struts2应用被加载时创建实例,所以不能在类构造器中生成dateFormat 对象
			dateFormat = new SimpleDateFormat(pattern);
		}
		
		return dateFormat;
	}
	
	@Override
	public Object convertFromString(Map context, String[] values, Class toClass) {
		
		System.out.println("convertFromString...");
		
		if(toClass == Date.class){
			if(values != null && values.length > 0){
				String value = values[0];
				try {
					//因为基于类型的配置是在当前struts2应用被加载时创建实例。所以我们只有调用getDateFormat()来获取dateFormat 对象
					return getDateFormat().parseObject(value);
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}
		}
		
		
		return values;
	}

	@Override
	public String convertToString(Map context, Object o) {
		
		System.out.println("convertToString...");
		
		if(o instanceof Date){
			Date date = (Date) o;
			return getDateFormat().format(date);
		}
		
	
		return null;
	}

}






扩展com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter类:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;


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




/**
 * 日期类型转换器
 * @author quezg
 *
 */
public class DateConverter extends DefaultTypeConverter{


	/*
	 *  Map<String, Object> context
	 *  Object value 参数值数组
	 *  Class toType  目标类型Class对象
	 */
	@Override
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		//获取取到的参数值
		String[] paramvalue=(String[])value;
		String format=null;
	    if(paramvalue[0].indexOf("-")!=-1){
	    	format = "yyyy-MM-dd";
	    }else if(paramvalue[0].indexOf("/")!=-1){
	    	format = "yyyy/MM/dd";
	    }else if(paramvalue[0].length()==8){
	    	format = "yyyyMMdd";
	    }
		
		try {
		    if(toType==Date.class){
		    	SimpleDateFormat sdf = new SimpleDateFormat(format);
				return sdf.parse(paramvalue[0]);
		    }
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值