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()+"\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: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文件名。