struts2 类型转换很智能,他会帮咱们自动转换类型,struts会自动转换4类8种原生数据类型和String ,Date,当咱们本身定义的类型就不会转换了,须要咱们本身去编写类型转换器。java
原理:类型转换有两个类,DefaultTypeConverter和Struts2TypeConverter,Struts2TypeConverter继承DefaultTypeConveter,DefaultTypeConverter里面就一个方法convertValue。apache
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,还提供了另外两个方法。ide
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功能了,只不过是将他们写到两个方法里面了。code
咱们定义了类型转换的类以后,还必须写一个配置文件,这个配置文件就是用来指定那个变量来使用咱们所定义的类来进行转换,对于全部的类型转换的属性文件都是同样的,名字的后面部分都是-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类型的,那么这个属性就会被自定义转换器转换了。get