Struts2自定义类型转换器分为局部类型转换器和全局类型转换器
ognl的api地址: http://www.opensymphony.com/ognl/api/
ognl源码在网上自行下载,我是在csdn里下的
1. struts2内部支持的类型转换
参考
http://ejb3.blogbus.com/logs/22922214.html
http://www.cnblogs.com/wushiqi54719880/archive/2011/07/09/2101773.html
可自动转换的类型:
8个基本类型,Date(本地格式yyyy-MM-dd),array数组,List,Map类, set类
bean.firstname 赋值给Action中属性名为bean对象的firstname属性
friends['patrick'].name 赋值给Map对象里key为'patrick' 的对象的name属性
friends['patrick'] 赋值给Map对象里key为'patrick' 的值
注意:使用集合时,要注意使用泛型,如果不使用泛型,要额外写配置文件.这里不做详述
参考http://hi.baidu.com/sqzhangling/item/b951bf8e39840e29100ef312
2. 自定义类型转换器
类型转换器的写法:
写一个类,类的要求: 实现TypeConverter接口或继承DefaultTypeConverter类或继承StrutsTypeConverter,然后覆盖类中的方法.
org.apache.struts2.util.StrutsTypeConverter是
com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter的子类,
DefaultTypeConverter是 TypeConverter的实现类
如果是继承DefaultTypeConverter,重写convertValue方法, 该方法介绍如下:
public Object convertValue(Map<String, Object> context,Object value, Class toType) {
context: context under which the conversion is being done
value: an object to be converted to the given type
totype: class type to be converted to
return: converted value of the type given, or value ifthe value cannot be converted to the given type.
这个方法转换是双向的,例如页面上<s:textfield name=”user”/>对应action中的user属性:
那么表单元素string->user的转换:if(toType==User.class){把value转换成String[],得到第1个元素,封装成User对象,返回user };表单回填时从user->string的转换: if(value instanceof User){return 字符串}
代码参考 http://blog.csdn.net/furongkang/article/details/6921440
如果是继承StrutsTypeConverter类,重写convertFromString方法和convertToString方法,从方法名字就知道一个是从对象到字符串,一个是从字符串到对象.比上面的类更简单,推荐是用这种.
/**
* 日期类型转换器
*/
publicclass DateTypeConversion extends StrutsTypeConverter{
publicstaticfinal String dateType="yyyy/MM/dd";
publicstaticfinal SimpleDateFormat format=new SimpleDateFormat(dateType);
/**
* 从表单到Action中属性的转换
*/
@Override
public Object convertFromString(Map context, String[] values, Class toType) {
if(toType==java.util.Date.class){
try {
if(!””.equals(values[0].trim()))
returnformat.parse(values[0]);
} catch (ParseException e) {
e.printStackTrace();
}
}
returnnull;
}
/**
* 把Action某属性转换成字符串
*/
@Override
public String convertToString(Map context, Object value) {
if(value instanceof java.util.Date){
returnformat.format((java.util.Date)value);
}
returnnull;
}
}
a) 局部类型转换器,
在action类所在的包下新建ActionClassName-conversion.properties文件,ActionClassName是类名,后面的-conversion.properties是固定的写法,
如:HelloWorldAction-conversion.properties
properties文件里面的内容为:属性名称=类型转换器的全类名(既包名.类名)
如:birthday=com.ljq.type.converter.DateTypeConverter
b) 全局类型转换
将上面的类型转换器注册成全局类型转换器,在src下新建文件:xwork-conversion.properties ,名称是固定的,内容格式:java.util.Date=cn.itcast.converter.DateTypeConverter
还有关于基于注解的类型转换器和上面的原理相同,在struts2的注解里再介绍,也可先参考:
http://blog.sina.com.cn/s/blog_883da5580100w3bt.html
http://blog.csdn.net/xiaoping8411/article/details/4775936
3. struts2类型转换错误处理
要求Action类继承ActionSupport,否则无法添加错误信息!
在struts2-default.xml中package name="struts-default"的里面可以找到
在<interceptor-stack name="defaultStack">里有对上面这个拦截器的引用,如果转换失败,例如拦截器里有异常抛出,那么struts2会把错误信息封装成fielderror放入ActionContext中,然后默认进入名为input的视图.
错误信息的国际化:
如果是自定义的转换器,某个Action特定属性转换失败:在ActionName_zh_CN.properties国际化资源文件中写
invalid.fieldvalue.属性名=提示信息即可
如果是struts2默认的类型转换器,要改变转换失败后的英文提示信息,那么在全局国际化资源文件中写:
xwork.default.invalid.fieldvalue={0}字段类型转换失败!
4. struts2中怎么设置日期类型的格式
struts.date.format=yyyy-MM-dd只能控制<s:date>标签中format属性的默认值
所以需要自己写日期类型转换器来实现,自定义的格式
全局的:java.util.Date=converter.MyDateDefaultTypeConverter
或局部的user.opTime=converter.MyDateDefaultTypeConverter
在页面上显示时可以使用<s:properties value=”birthday”/>标签,填写时也要写成自定义的格式