struts2-类型转换器

HTTP请求上的所有内容都按协议处理为字符串,包括数字,布尔值,整数,日期,小数和其他。对HTTP来说,每个事件都是一个字符串。但是,在Struts类中,你可以具有任意数据类型的属性。我们如何让Struts自动匹配属性呢?
Struts使用各种类型的转换器在幕后做了许多繁重的工作。例如,如果你的Action类中有一个integer属性,你不需要执行任何操作,Struts会自动将请求参数转换为integer属性。默认情况下,Struts提供了多个类型的转换器。其中一些列出如下,如果你使用其中一个,那你就不用担心什么了:
Integer,Float,Double,Decimal
Date,Datetime
Arrays,Collections
Enumerations
Boolean
BigDecimal
所以总结一下类型转换器的功能:
1、将页面传递的字符串转为java实体类属性对应的数据类型。
2、struts2框架具有的类型转换器已经可以实现常用类型(int、double、…)的转换。
自定义类型转换器的步骤
(1)编写转换器类继承DefaultTypeConverter。
(2)重写convertValue方法
(3)编写属性文件指定要转换的属性类型
注意属性文件的命名规范应该满足:Action类名-conversion.properties文件与动作类Action在同一包下。
接下来我们看一下日期转换的代码实现第一步编写转换器类继承DefaultTypeConverter并重写convertValue方法。

public class MyDateconverter extends DefaultTypeConverter{
	@Override
	//value接受的是String[] 页面的值,class是要被转换的类型,
	//因为页面到服务端和服务端到页面都要经过转换器,所以内部是双向逻辑。
	public Object convertValue(Map<String, Object> context, Object value,
			Class toType) {
		System.out.println("正在进行类型转换");
		SimpleDateFormat dateFormat = null;
		if(toType ==Date.class){ //页面到服务端目标类型恒等于日期格式   
		//字符串向日期类型转换
			System.out.println("字符串日期转换为日期格式.........");
			String [] valobj = (String[])value;	  // 可能界面需要转换的数据不只是一个 所以设置一个数组
			dateFormat = getSimpleDateFormat(valobj[0]);  //调用函数判断格式			
			System.out.println("要转换的数据----->" + valobj[0]);
			try {
				Date date = dateFormat.parse(valobj[0]);
				return date;  //返回按格式转换后的string字符串
			} catch (Exception e) {
				// TODO: handle exception
			}
		}else if(toType == String.class){
			System.out.println("日期向字符串类型转换");
			Date date = (Date) value;
			return dateFormat.format(date);
		}
		return super.convertValue(context, value, toType);
	}
	private SimpleDateFormat getSimpleDateFormat(String dateStr) {   //正则表达式
        //根据这里的格式进行判断,若没有相应格式即抛出异常      
        SimpleDateFormat sdf = null;
        if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)){//用模块匹配来判断格式
            sdf = new SimpleDateFormat("yyyy-MM-dd");
        }else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyy/MM/dd");
        }else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)){
            sdf = new SimpleDateFormat("yyyyMMdd");
        }else {
            throw new TypeConversionException();//若格式都不符合则抛出异常
        }
        return sdf;
    }

}

然后建立属性文件 里面只用写us.date=com.convert.MyDateconverter us是我的实体类它有一个的date的属性,MyDateconverter 类在com.convert包下。大家可以根据自己的项目进行修改文件内容。接下来就可以进行类型转换。
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值