`
myoldman
  • 浏览: 84856 次
  • 性别: Icon_minigender_1
  • 来自: 福建福州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2 Core Developers Guide-Type Conversion

阅读更多
1.Overview
类型转化在struts2中的主要作用是把页面上符合ognl定义的控件的名字的输入值映射到action的相应字段中.以删除在servlet时代需要经常做的request.getParameter操作,并且利用ognl表达式甚至可以直接把页面上字段的值直接注入到action声明的对象中,是这个过程能够自动化,使得代码更加的简洁,更OO,可以说hibernate是处理对象到数据库的双向转化,struts2就是处理对象到html页面的双向转化.
2.Working Sample
[list]
  • 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可以捕获该异常.
    [/list]
    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]
  • 系统支持在定义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来研习.
  • [/list]
    8.Type Conversion Error Handling
    • 类型转化错误提供了一种方式以区分用户输入错误和,输入类型转化错误.
    • 所有的类型转化错误的提示信息的格式可以通过重写xwork.default.invalid.fieldvalue来修改.
    • 也可以修改通过在Action.properties定义invalid.fieldvalue.xxx(xxx是字段名)来修改所需要显示的类型转化错误的信息.
    • 显示该错误信息的途径有
    • Globally, using the Conversion Error Interceptor
      在validator文件中定义conversion validator来显示.







    分享到:
    评论

    相关推荐

    Global site tag (gtag.js) - Google Analytics