1. Struts2的类型转换,对于8个原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的类型转换来说,
就需要我们自己指定类型转器的方式。
2. 类型转换器必须继承DefaultTypeConverter,一般继承它的子类StrutsTypeConverter。action中调用set和get方法时,调用类型转换方法。
3. 自定义类型转换器的实现步骤:
1). 继承StrutsTypeConverter
2). 覆盖convertFromString和convertToString
范例:
public class UtilDateConverter extends StrutsTypeConverter {
private static final String PATTERN = "yyyy/MM/dd";
//浏览器提交到服务器是调用,将字符串转换成对象
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
//values为要转换属性的数组,可能有多个名字相同,所以取第一个。
String dateString = values[0];
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
Date date = null;
try {
//字符串,转换成日期类型。
date = sdf.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
//服务器向浏览器输出时调用,将某种类型转换成字符串。o是要转换成字符串的对象。
@Override
public String convertToString(Map context, Object o) {
Date date = (Date)o;
return new SimpleDateFormat("yyyy年MM月dd日").format(date);
}
}
3).注册类型转换器
a).局部类型转换器,局部类型转换器只对当前Action起作用,需要提供如下配置文件:
MyActionName-conversion.properties,MyActionName指需要使用转换器的Action名称”-conversion.properties“固定字符串,不能修改。
我们AddUserAction类型转换器的配置文件名称为:AddUserAction-conversion.properties,该配置文件必须和Action放到同一个目录中,该配
置文件的格式为:Action中的属性名称=转换器的完整路径,如:birthday=com.bjpowernode.struts2.UtilDateConverter 也可以转换数组,
同样需要有set和get方法。
b).全局类型转换器,全局类型转换器可以对所有的Action起作用(同Struts1的类型转换器),需要提供如下配置文件:
xwork-conversion.properties(该名字固定),该配置文件需要放到src下,该配置文件的格式:需要转换的类型完整路径=转换器的完整路径,
如:java.util.Date=com.bjpowernode.struts2.UtilDateConverter自定义类型也可以转换。
补:请求页面:
出生日期:<input type="text" name="birthday"><br>
显示页面:<s:property value="birthday"/> 或 <s:text name="date"></s:text>
4. 如果全局类型转换器和局部类型转换器同时存在,局部优先。
5. 采用struts2标签读取属性get方法时可以调用转换器的convertToString。采用JSTL不会调用,显示的是默认格式的时间。
6. 类型转换时,若发生异常,fieldError中会自动把异常加上,英文的。
7. 使用类型转换器须要在Action中提供属性的set和get方法