1.Overview
类型转化在struts2中的主要作用是把页面上符合ognl定义的控件的名字的输入值映射到action的相应字段中.以删除在servlet时代需要经常做的request.getParameter操作,并且利用ognl表达式甚至可以直接把页面上字段的值直接注入到action声明的对象中,是这个过程能够自动化,使得代码更加的简洁,更OO,可以说hibernate是处理对象到数据库的双向转化,struts2就是处理对象到html页面的双向转化.
2.Working Sample
  • Action以及字段级别的类型转化
  • 在action对应的目录下定义ActionClassName-conversion.properties
    point = com.acme.PointConverter
  • 全局以及类级别的类型转化
  • xwork-conversion.properties在classpath
    com.acme.Point = com.acme.PointConverter
  • PointConverter必须实现TypeConverter或者直接继承StrutsTypeConverter类.
  • 并且实现如下的双向转化
        public abstract Object convertFromString(Map context, String[] values, Class toClass);
        public abstract String convertToString(Map context, Object o);
    

    该接口中还有个performFallbackConversion 方法,用来实现转化失败后的一些必要的操作.
    当转化出现错误的时候需要抛出 XWorkException或者TypeConversionException以便struts2可以捕获该异常.

3.Built in Type Conversion Support(内建的转化)
String
boolean / Boolean
char / Character
int / Integer, float / Float, long / Long, double / Double
dates
arrays 数组数据可以单个转化数据
collections 如果不能确定collection中的元素的类型,默认传见一个String的ArrayList.
4.Relationship to Parameter Names
类型转化的最佳利用方式是直接在页面上定义user.name这样就能把input的数据直接注入到action.getUser().setName()方法中.
  • Use complex OGNL expressions--struts2能够自动处理对象的创建,而不用手工的创建嵌套对象.
  • Ognl语法支持创建带有不带参数构造函数的对象.
  • user.name会调用getUser().setName()但是如果user为空,那么action还必须具有setUser方法.
  • For lists and maps, use index notation, such as people[0].name or friends['patrick'].name.
  • 对于多选框,如果定义问people.name 则系统会自动传见多个person对象并且注入name属性.

5.Creating a Type Converter
继承StrutsTypeConverter类,实现to,from双向转化操作并且通过ActionClassName-conversion.properties或者全局xwork-conversion.properties中加载改converter即可.
6.Advanced Type Conversion(高级类型转化)
  • Null Property Handling(空指针处理)--自动对象嵌套关系创建.
  • 实现规则
    当ognl抛出空指针异常后,struts2能捕获该异常,并且自动创建相应的对象.
    如果属性被声明为Collection or List,创建ArrayList并注入.
    如果声明为Map,创建HashMap并且注入.
    如果是javabean并且具有无参数构造函数,系统会利用ObjectFactory.buildBean方法创建该对象.
    流程如下
    person.name-->setUsers()-->getUsers().setName()

7.Collection and Map Support
  • 系统支持在定义list或者collection中的对象类型.通过在Class-conversion.properties
  • 定义Element_xxx=Class(xxx表示action中对应的字段名),美来定义action中的对象类型.
  • 可以通过annotation来支持上面的Element_xxx定义.
  • 定义集合索引方式.
  • 在配置文件中定义KeyProperty_xxx=yyy xxx是集合字段的名字,yyy集合中类的某个需要当作索引的属性.下列举例
    MyAction.java
    /**
     * @return a Collection of Foo objects
     */
    public Collection getFooCollection()
    {
        return foo;
    }
    

    foo.java
    /**
     * @return a unique identifier
     */
    public Long getId()
    {
        return id;
    }
    

    在文件MyAction-conversion.properties中定义
    KeyProperty_fooCollection=id
    fooCollection(22)将代表fooCollection中id为22,foo对象.
    通过fooCollection(22).name可以直接设置该对象的其他属性的值.
    fooCollection(22)如果返回空值,不会自动创建该对象,可以通过fooCollection.makeNew[0]=Phil直接创建该对象,如果该写法用于Set那么必须定义foo对象的equal和hashCode并且包含id之外的字段,以防止Set删除id字段为null的元素.
  • 类型转化着部分处理的代码感觉和ognl结合的比较紧密,需要结合ognl来研习.

8.Type Conversion Error Handling
  • 类型转化错误提供了一种方式以区分用户输入错误和,输入类型转化错误.
  • 所有的类型转化错误的提示信息的格式可以通过重写xwork.default.invalid.fieldvalue来修改.
  • 也可以修改通过在Action.properties定义invalid.fieldvalue.xxx(xxx是字段名)来修改所需要显示的类型转化错误的信息.
  • 显示该错误信息的途径有
  • Globally, using the Conversion Error Interceptor
    在validator文件中定义conversion validator来显示.
评论
发表评论

您还没有登录,请登录后发表评论

myoldman
  • 浏览: 6272 次
  • 性别: Icon_minigender_1
  • 来自: 福建福州
  • 详细资料
搜索本博客
存档
最新评论