struts2提供了简单基本类型的自动转换,如 java 八种基本数据类型,以及 String , Date 等简单数据类型。
我们将上个例子修改一下:
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 类型为: converterToString ( Map<String ,Object> context,Object o, )
推荐继承StrutsTypeConverter 类,因为它方便,清晰。
下面来总结一下复杂类型转换:
对于自定义类型转换器来说需要提供三个信息:Action 的名字, Action 中待转换的属性名以及该属性对应的类型转换器。其中 Action 的名字是通过属性文件 ( 和 Action 同包 ) 来获得的, Action 中待转换的属性名是通过属性文件中的 key 值获得的,该属性对应的类型转换器是通过 key 值所对应的 value 值获得的。
可使用struts2 框架自带的类型转换器 StrutsTypeConverter 简化类型转换。 StrutsTypeConverter 继承于 DefaultTypeConverter 。提供两个抽象方法,分别为 convertFromString 和 converToString ,分别实现从页面向后台对象转换和从后台对象转换成字符串
还有个全局类型转换,就是不特定哪个Action ,对所有 Action 中相同的对象进行转换,和上面的类型转换唯一的区别就是转换的配置文件,文件名特定为: xwork-conversion.perproties 。位置为 src 根目录下,内容为:待转换的类的全名(包括包名) = 转换器的名字。
类型转换就介绍这么多,其实在实际应用中,用的不是特别多,想了解更多,可以参考struts2 的 API 文档。