struts2类型转换器

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.xmlpackage 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”/>标签,填写时也要写成自定义的格式

你可能感兴趣的:(struts2类型转换器)