zoukankan      html  css  js  c++  java
  • Struts2的类型转换

    转载时注明出处http://www.blogjava.net/sxyx2008

    原理

    struts2的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2已经为我们提供了几乎所有的primitive类型以及常用类型(如Date)的类型转换器,我们也可以为我们自定义类添加自定义类型转化器.

    struts2为我们提供了一个类型转化器的入口: ognl.DefaultTypeConverter,或继承org.apache.struts2.util.StrutsTypeConverter,由于StrutsTypeConverter提供了更好的封装,所以建议大家在写转换器时通常采用继承StrutsTypeConverter方式来实现.

    StrutsTypeConverter类实质上是DefaultTypeConverter的扩展

     publicabstractclass StrutsTypeConverter extends DefaultTypeConverter

    {

    }

    StrutsTypeConverter中的两个核心方法

     publicabstract Object convertFromString(Map context, String[] values, Class toClass);

    publicabstract String convertToString(Map context, Object o);

    convertFromString方法用于从前台页面获取字符串,将字符串转化为对象

    convertToString方法用于将对象以字符串的方式输出到页面

    我们在写struts2自定义类型转换类的时候主要就是覆盖上面两个方法

    分类

    struts2自定义类型转换从大的方面来讲分两种:

    u      局部类型转换

    u      全局类型转换

    局部类型转换又分为三种:

    ²       普通实体bean的自定义类型转换

    ²       基于领域模型的自定义类型转换

    ²       基于模型驱动的自定义类型转换

    无论是全局类型转换还是局部类型转换,转换器与Action之间是用properties文件来关联的,properties文件指明了转换规则

           全局类型转换规则:

           在classpath下新建文件xwork-conversion.properties(固定名称)

           其内容为:目标转换对象=转换器类(包名+类名)

           局部类型转换规则:

           在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)

           其内容为: 目标转换对象=转换器类(包名+类名)

           在局部类型转换中又存在一种特殊情况

           基于领域模型的自定义类型转换

       它不但要在对应的Action的同级目录下新建Action名-conversion.properties(一定要与Action类名对应)文件,还需在引用模型同级目录下建properties文件取名规则为引用名- conversion.properties

    这块不好用文字描述,举个列子:

    需求是这样的:

    在User类中有个Point对象的引用,现在要基于Point来做自定义类型转换,这里Point与User之间的这层关系就叫做领域模型,在操作User时需要对Point进行自定义类型转换,这时就必须在User类的同级目录下新建User-conversion.properties文件,在文件中指明point对象需要用什么类来进行转换.

    我们约定Point类的对象名就为point,而对应的转换类为com.dl.convertor.PointConvertor,对应的Action类为PointUserAtion, PointUserAtion中有一个User类型的属性名为user

    那么在PointUserAtion的同级目录中会存在一个名为PointUserAtion-conversion.properties的文件其内容为:

    user.point= com.dl.convertor.PointConvertor

    //因为在Action中引用的对象名为user而现在要处理的是user中的point属性,所以这里需要使用user.point来指明

    同样在User类的同级目录会存在一个名为User-conversion.properties的文件内容为

    point=com.dl.convertor.PointConvertor

    //因为该文件只针对user,所以只需指明User中的point对象即可不需在添加user否则会出现预想不到的结果

    针对局部类型转换三种情况的例子

      ²       普通实体bean类型转换

       实体bean(Point)

    /**

     *普通的javabean封装坐标

     */

    publicclass Point {

       privateintx;

       privateinty;

    //省略set get方法

    }

    对应的Action(PointAction)

    publicclass PointAction extends ActionSupport{

       private Point point;

    //省略set get方法

       public String execute() throws Exception {

          returnsuper.execute();

       }

    }

    对应的转换类(PointConvertor)

    publicclass PointConvertor extends StrutsTypeConverter{

       /**

        *从表单中的string到Point对象

        *我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证

        */

       @Override

       public Object convertFromString(Map context, String[] str, Class c) {

          Point point=null;

          if(str!=null||str.length>0){

            String[] s=str[0].split(",");

            point=new Point();

            int x=Integer.parseInt(s[0]);

            int y=Integer.parseInt(s[1]);

            point.setX(x);

            point.setY(y);

          }

          return point;

       }

       /**

        *从对象到字符串

        *比如页面输出

        */

       @Override

       public String convertToString(Map context, Object o) {

          Point point=(Point)o;

          return"("+point.getX()+","+point.getY()+")";

       }

    }

    需要做的配置:在PointAction的同级目录下新建PointAction-conversion.properties,文件内容为

    #目标转换对象=转换器

    point=com.dl.convertor.PointConvertor



    ²       领域模型自定义类型转换

    实体bean(Point,User)

     publicclass User {

       private String name;

       private Point point;

    //省略set get方法

    }

    publicclass Point {

       privateintx;

       privateinty;

    //省略set get方法

    }

    对应的Action(PointAction)

    public class UserAction extends ActionSupport{

       private User user;

    //省略set get方法

       @Override

       public String execute() throws Exception {

          return super.execute();

       }

    }

    对应的转换类(PointConvertor)

    publicclass PointConvertor extends StrutsTypeConverter{

       /**

        *从表单中的string到Point对象

        *我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证

        */

       @Override

       public Object convertFromString(Map context, String[] str, Class c) {

          Point point=null;

          if(str!=null||str.length>0){

            String[] s=str[0].split(",");

            point=new Point();

            int x=Integer.parseInt(s[0]);

            int y=Integer.parseInt(s[1]);

            point.setX(x);

            point.setY(y);

          }

          return point;

       }

       /**

        *从对象到字符串

        *比如页面输出

        */

       @Override

       public String convertToString(Map context, Object o) {

          Point point=(Point)o;

          return"("+point.getX()+","+point.getY()+")";

       }

    }

    需要做的配置:

    在UserAction的同级目录下新建UserAction-conversion.properties,文件内容为

    #目标转换对象=转换器

    user.point=com.dl.convertor.PointConvertor

    在User的同级目录下新建User-conversion.properties,文件内容为

    point=com.dl.convertor.PointConvertor

            
    ²       模型驱动自定义类型转换
    实体bean(Point)

    /**

     *普通的javabean封装坐标

     */

    publicclass Point {

       privateintx;

       privateinty;

    //省略set get方法

    }

    对应的Action(PointModelDrivenAction)

    /**

     * 基于模型驱动的自定义类型转换

     * @author Administrator

     *

     */

    @SuppressWarnings("serial")

    public class PointModelDrivenAction extends ActionSupport implements ModelDriven<Point>{

       private Point point;

       public Point getPoint() {

          return point;

       }

       public void setPoint(Point point) {

          this.point = point;

       }

       public Point getModel() {

          return point;

       }

       @Override

       public String execute() throws Exception {

          return super.execute();

       }

    }

    注:这里切记要生成point的set get方法要不值不能自动进行封装

    对应的转换类(PointConvertor)

    publicclass PointConvertor extends StrutsTypeConverter{

       /**

        *从表单中的string到Point对象

        *我们约定以,来分隔这里为了严谨期间最好要进行输入数据的验证

        */

       @Override

       public Object convertFromString(Map context, String[] str, Class c) {

          Point point=null;

          if(str!=null||str.length>0){

            String[] s=str[0].split(",");

            point=new Point();

            int x=Integer.parseInt(s[0]);

            int y=Integer.parseInt(s[1]);

            point.setX(x);

            point.setY(y);

          }

          return point;

       }

       /**

        *从对象到字符串

        *比如页面输出

        */

       @Override

       public String convertToString(Map context, Object o) {

          Point point=(Point)o;

          return"("+point.getX()+","+point.getY()+")";

       }

    }

    需要做的配置:

    在PointModelDrivenAction的同级目录下新建PointModelDrivenAction-conversion.properties,文件内容为

    #目标转换对象=转换器

    point=com.dl.convertor.PointConvertor

    在User的同级目录下新建User-conversion.properties,文件内容为

    point=com.dl.convertor.PointConvertor

  • 相关阅读:
    如何看Linux服务器的load average
    java中File读取文件中文乱码
    LR代理录制
    虚拟机打开虚拟文件报不兼容,无法使用
    面向对象示例-注册登录例子
    pickle 模块
    item方法
    加密方法
    @classmethod 和 @staticmethod 用法
    python 中 @property 的用法
  • 原文地址:https://www.cnblogs.com/future2012lg/p/2731750.html
Copyright © 2011-2022 走看看