struts2提供了简单基本类型的自动转换,如 java 八种基本数据类型,以及 StringDate 等简单数据类型。

我们将上个例子修改一下:

index .jsp中添加: 年龄: < input   type = "text"   name = "age" />< br />

    生日: < input   type = "text"   name = "birthday" />< br />

result .jsp中添加: 你的年龄:${requestScope.age} < br />

            你的生日是:${requestScope.birthday}

UserAction中添加两个属性: private  int age ;  private Date birthday ;并添加 get/set 方法。运行后输入相应信息结果页面显示:

你的用户名:lisi  
你的年龄:20
你的生日是:Sat Sep 08 00:00:00 CDT 1990

我们可以看到struts2已经将页面传过来的string类型经行了转换。

 

但是如果我们传入一个User类型的对象,struts2会不会帮我们转换的,肯定不会了,struts2怎么会知道User是个什么东西呢?当我们需要对复杂对象类型经行转换时就需要我们自己动手了。Struts2只会帮我做简单的事,复杂的事还是需要我们自己来做。

下面来看看一个复杂对象类型的转换该怎么做?(实例二)

  index.jsp:

< body >

   < h2 > 请用逗号分隔用户名和年龄 </ h2 >

   < form   action = "userAction" >

    用户: < input   type = "text"   name = "user" />

    < input   type = "submit"   value = "提交 "   />

   </ form >

   </ body >  

   result .jsp:

< body >

           < s:property   value = "user"   />

   </ body >

struts .xml:

< struts >

< package   name = "struts2_2"   extends = "struts-default" >

< action   name = "userAction"   class = "com.gufengxiachen.struts2_2.action.UserAction" >

< result   name = "success" > /result.jsp </ result >

</ action >

</ package >

</ struts >

UserAction.java:

 

package com.gufengxiachen.struts2_2.action;

import com.gufengxiachen.struts2_2.model.User;

import com.opensymphony.xwork2.ActionSupport;

 

public class UserAction extends ActionSupport{

private User user;

public User getUser() {

return user;

}

 

public void setUser(User user) {

this.user = user;

}

 

@Override

public String execute() throws Exception {

return "success";

}

 

}

User.java:

package  com.gufengxiachen.struts2_2.model;

 

public   class  User {

private  String  username ;

private   int   age ;

 

public  String getUsername() {

return   username ;

}

 

public   void  setUsername(String username) {

this . username  = username;

}

 

public   int  getAge() {

return   age ;

}

 

public   void  setAge( int  age) {

this . age  = age;

}

 

}

UserConversion.java(转换器类 ):

package com.gufengxiachen.struts2_2.conversion;

import java.util.Map;

import java.util.StringTokenizer;

 

 

import com.gufengxiachen.struts2_2.model.User;

import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;

 

public class UserConversion extends DefaultTypeConverter{

@Override

public Object convertValue(Map<String, Object> context, Object value,

Class toType) {

//从页面到后台转换

if(User.class==toType){

String[] str=(String[])value;

String firstValue=str[0];

StringTokenizer st=new StringTokenizer(firstValue,";");

String username=st.nextToken();

int age=Integer.parseInt(st.nextToken());

User user=new User();

user.setUsername(username);

user.setAge(age);

return user;

}else if(String.class==toType)  //从后台向页面转换

   {

User user=(User)value;

String username=user.getUsername();

int age=user.getAge();

String userInfo="你的用户名: "+username+" 你的年龄: "+age;

return userInfo;

   }

return null;

}

 

}

UserAction-conversion.properties(配置转换器属性文件 ):

user=com.gufengxiachen.struts2_2.conversion.UserConversion

web.xml和实例一样。

 

我们可以看到result.jsp 页面显示:

你的用户名:zhangsan你的年龄:15

这个很好理解,当struts2接受参数时发现Action中没有属性与之匹配,当它发现UserAction-conversion.perproties文件时,发现有个转换器,然后转向相应的转换器,转换后返回结果。

我们可以看到转换器实现了一个类:DefaultTypeConverter,并且重写了

c onvertValue这个方法,这个方法就是执行转换的方法。在这个方法里,我们可以进行双向转换,即可以从页面传过来的String 转换为我们需要的对象,也可以经行反向转换,其实我们还可以继承 StrutsTypeConverter 类,这个类是 struts2 对类型转换的一个简单封装,它里面有两个方法一个是从 String 转换到对象, convertFromString(Map<String,Object> context,String[],values,Class toClass), 另一个是从对象转换到 String 类型为: converterToStringMap<String ,Object> context,Object o,

推荐继承StrutsTypeConverter 类,因为它方便,清晰。

下面来总结一下复杂类型转换:

对于自定义类型转换器来说需要提供三个信息:Action 的名字, Action 中待转换的属性名以及该属性对应的类型转换器。其中 Action 的名字是通过属性文件 (Action 同包 ) 来获得的, Action 中待转换的属性名是通过属性文件中的 key 值获得的,该属性对应的类型转换器是通过 key 值所对应的 value 值获得的。

可使用struts2 框架自带的类型转换器 StrutsTypeConverter 简化类型转换。 StrutsTypeConverter 继承于 DefaultTypeConverter 。提供两个抽象方法,分别为 convertFromStringconverToString ,分别实现从页面向后台对象转换和从后台对象转换成字符串

还有个全局类型转换,就是不特定哪个Action ,对所有 Action 中相同的对象进行转换,和上面的类型转换唯一的区别就是转换的配置文件,文件名特定为: xwork-conversion.perproties 。位置为 src 根目录下,内容为:待转换的类的全名(包括包名) = 转换器的名字。

类型转换就介绍这么多,其实在实际应用中,用的不是特别多,想了解更多,可以参考struts2API 文档。