zoukankan      html  css  js  c++  java
  • struts2.1.6教程十、类型转换

    建立struts2conversion项目,并搭建好struts2的基本开发环境

    1.基于Action的直接属性转换

    建立t.jsp页面,内容如下:

    <s:form action="phone" method="post">
            <s:textfield name="thePhone" label="电话"/>
            <s:submit value="提交"/>
            <s:reset value="重置"/>
    </s:form>

    此action对应的配置如下:

    <action name="phone" class="com.asm.action.PhoneAction">
            <result name="success">tSuc.jsp</result>
            <result name="input">/t.jsp</result>
    </action>

    对应的PhoneAction类的代码如下:

    package com.asm.action;
    public class PhoneAction extends ActionSupport {
        private Telephone thePhone;
        public String execute() throws Exception {
            return SUCCESS;
        }
         ...省略thePhone的get/set方法
    }

    说明,如果直接这样执行将会出错,因为前台t.jsp传的String默认是不能被转成这里的Phone对象,所以我们必须使用类型转换,而且我们配置了input result就是告诉我们如果类型转换失败,将会停在t.jsp页面,而且会报错。下面接着看怎么类型转换。在这里我们要把010-123456这样的电话换成:区号:010 电话:123456这样的形式时。具体的操作步骤如下:

    创建类型转换类TelephoneConversion,代码如下:

    package com.asm.conversion;
    public class TelephoneConversion extends StrutsTypeConverter {
    public Object convertFromString(Map context, String[] values, Class toClass) {
            System.out.println("执行字串到Telephone对象的转换");
            Telephone tp=new Telephone();
            String [] tel=values[0].split("-");
            tp.setSecNum(tel[0]);
            tp.setPhone(tel[1]);
            return tp;
        }
    
        public String convertToString(Map context, Object obj) {
            System.out.println("执行Telephone对象到字串的转换");
            Telephone tp=(Telephone) obj;
            return "区号:"+tp.getSecNum()+"	电话:"+tp.getPhone();
        }
    }

    说明:类型转换类必须实现TypeConverter接口,而这里的StrutsTypeConverter类便是TypeConverter接口实现类DefaultTypeConverter的子类。此类中有两个方法,一个方法实现把字串转成其它对象,一个方法实现把其它对象转成字串。在convertFromString方法中,我们实现把客户端传递的字串转成Telephone对象,这样就能让PhoneAction的setThePhone方法得以正确执行。而后面的方法是为了我们要取值时进行的处理,比如在tSuc.jsp中我们要得到此值,需要把Telephone对象转换字串。其实如果没有convertToString方法,只要我们重写Telephone的toString方法也能达到目的。
    写完类类型转换类后,我们还应告知struts2,所以我们还需建立一个properties文件。我们在PhoneAction的同包下建立PhoneAction-conversion.properties文件,它的主要代码如下:
    thePhone=com.asm.conversion.TelephoneConversion
    说明:这句话的意思是说我们要把PhoneAction(通过properties文件名可以知道要转换的是此Action)下的thePhone使用TelephoneConversion进行转换。其实我们也可以配置全局的properties文件说明,比如我们在src目录下建立xwork-conversion.properties文件(名字固定),它的内容如下:
    com.asm.vo.Telephone=com.asm.conversion.TelephoneConversion

    说明:它的意思是只要遇到Telephone对象,就要用后面的转换器来实行转换。

    2.基于Action的间接属性vo转换

    t2.jsp主要内容如下:

    <s:form action="up" method="post">
            <s:textfield name="user.thePhone" label="电话"/>
            <s:submit value="提交"/>
            <s:reset value="重置"/>
    </s:form>

    我们建立UserPhoneAction类,它的主要代码如下:

    package com.asm.action;
    public class UserPhoneAction extends ActionSupport {
        private User user;
        public String execute() throws Exception {
            return SUCCESS;
        }
        ...省略user的get/set方法
    }

    User类的代码如下:

    package com.asm.vo;
    public class User {
        private Telephone thePhone;
        ...省略thePhone的get/set方法。
    }

    说明:通过这两个类及t2.jsp页面,我们知道,前台传递的thePhone对象不时直接传递,而是采用了vo模式,所以当我们配置类型转换时,要特别注意。因为前面我们使用了全局的类型转换,所以这里不会出错,但是当我们去掉前面的全局转换时,配置类型转换的properties文件就应在User类对应的包下配置User-conversion.properties文件,它的主要内容如下:

    thePhone=com.asm.conversion.TelephoneConversion
    说明及总结:类型转换的配置文件如果不采用全局的配置时,我们就应以要转换的类型的直接持有类为基准:比如,这里的thePhone的直接持有类为User对象,所以我们就应以User为基准写properties文件名。

  • 相关阅读:
    iframe+json
    qw
    MySql数据类型和Java数据类型对应一览
    MyEclipse生成get/set注释
    Redis集群_主从配置
    MyBatis输出sql需要log4j.properties配置
    默认没有创建两次定时实例的
    spring+freemarker+redis
    jquery easyui 扩展验证
    vs2010 安装 Ajax Control Toolkit
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4432113.html
Copyright © 2011-2022 走看看