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包下。大家可以根据自己的项目进行修改文件内容。接下来就可以进行类型转换。