十、类型转换

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

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

建立t.jsp页面,内容如下:
<s:form action="phone"method="post">

              <s:textfieldname="thePhone" label="电话"/>

              <s:submitvalue="提交"/>

              <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 classPhoneAction extendsActionSupport {

       private TelephonethePhone;

       public Stringexecute() 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 classTelephoneConversion extendsStrutsTypeConverter {

public Object convertFromString(Map context,String[] values, Class toClass) {

              System.out.println("执行字串到Telephone对象的转换");

              Telephone tp=newTelephone();

              String [] tel=values[0].split("-");

              tp.setSecNum(tel[0]);

              tp.setPhone(tel[1]);

              return tp;

       }

 

       public StringconvertToString(Map context, Object obj) {

              System.out.println("执行Telephone对象到字串的转换");

              Telephone tp=(Telephone) obj;

              return "区号:"+tp.getSecNum()+"\t电话:"+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:textfieldname="user.thePhone" label="电话"/>

              <s:submitvalue="提交"/>

              <s:reset value="重置"/>

</s:form>
我们建立UserPhoneAction类,它的主要代码如下:
package com.asm.action;

public classUserPhoneAction extendsActionSupport {

       private User user;

       public Stringexecute() throws Exception {

              return SUCCESS;

       }
       ...省略user的get/set方法

}

User类的代码如下:
package com.asm.vo;

public class User {

       private TelephonethePhone;

       ...省略thePhone的get/set方法。

}

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

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值