struts2 类型转换很智能,他会帮我们自动转换类型,struts会自动转换4类8种原生数据类型和String ,Date,当我们自己定义的类型就不会转换了,需要我们自己去编写类型转换器。
原理:类型转换有两个类,DefaultTypeConverter和Struts2TypeConverter,Struts2TypeConverter继承DefaultTypeConveter,DefaultTypeConverter里面就一个方法convertValue。
package com.shengsiyuan.converter;
import java.util.Map;
import java.util.StringTokenizer;
import ognl.DefaultTypeConverter;
import com.shengsiyuan.bean.User;
public class UserConverter extends DefaultTypeConverter
{
@Override
public Object convertValue(Map context, Object value, Class toType)
{
if(User.class == toType) //从前台页面String转到后台对象
{
String[] str = (String[])value;
String firstValue = str[0];
StringTokenizer st = new StringTokenizer(firstValue, ";");
String username = st.nextToken();
String password = st.nextToken();
User user = new User();
user.setUsername(username);
user.setPassword(password);
return user;
}
else if(String.class == toType) //从后台对象转换到前台页面string
{
User user = (User)value;
String username = user.getUsername();
String password = user.getPassword();
String userInfo = "username: " + username + ", password: " + password;
return userInfo;
}
return null;
}
}
我们在这个方法里面进行了一个if elseif的判断,到底是从页面还是转到页面而Struts2TypeConverter,还提供了另外两个方法。
package com.shengsiyuan.converter;
import java.util.Map;
import java.util.StringTokenizer;
import org.apache.struts2.util.StrutsTypeConverter;
import com.shengsiyuan.bean.User;
public class UserConverter2 extends StrutsTypeConverter
{
@Override
public Object convertFromString(Map context, String[] values, Class toClass)
{
User user = new User();
String value = values[0];
StringTokenizer st = new StringTokenizer(value, ";");
user.setUsername(st.nextToken());
user.setPassword(st.nextToken());
return user;
}
@Override
public String convertToString(Map context, Object o)
{
User user = (User)o;
String username = user.getUsername();
String password = user.getPassword();
String userInfo = "username: " + username + ", password: " + password;
return userInfo;
}
}
这里面的两个方法就相当于实现了那个if elseif功能了,只不过是将他们写到两个方法里面了。
我们定义了类型转换的类之后,还必须写一个配置文件,这个配置文件就是用来指定那个变量来使用我们所定义的类来进行转换,对于所有的类型转换的属性文件都是一样的,名字的后面部分都是-conversion.properties , 前面是action名字,这就代表的是Action里面需要类型转换的变量的名字。
局部或者全局:局部是需要在UserAction-convision.properties中定义UserAction中的属性名字,放在那个Action的目录下,而全局是需要在xwork-conversion.properties中指定好。
这个需要转换的类的名字,如下:com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2,放在src目录下。最后会编译到classes目录下面。
类型转换器怎么知道转换那个类型呢?比如action中有个属性是User类型的,那么有属性是User类型的,那么这个属性就会被自定义转换器转换了。