对于自定义的类型转换器来说,需要提供三个信息:
Action的名字、Action中带转换的属性名、该属性对应的转换器类
其中,action的名字是通过属性文件名来获取的,action中待转换的属性名是通过文件中的key获得的,该属性对应的转换器类是通过该key对应的value获取的。
例如上节中的UserAction-converter.properties,其文件内容为:
user=com.test.converter.UserConverter
这就告诉我们,对于UserAction这个action,我们可以使用
com.test.converter.UserConverter这个类完成user这个属性的转换工作。
上节中我们的转换器类使用的是ognl提供的DefaultTypeConverter类,现在我们采用Struts提供的StrutsTypeConverter来简化代码的编写。
StrutsTypeConverter继承自DefaultTypeConverter,并且提供了两个抽象方法:converterFromString与convertToString,分别表示从页面的String转化为后台对象,以及从后台对象转化为页面的字符串。
我们只需要实现这两个抽象方法即可。
我们新建一个类,UserConverter2:
package com.test.converter; import java.util.Map; import java.util.StringTokenizer; import org.apache.struts2.util.StrutsTypeConverter; import com.test.bean.User; public class UserConverter2 extends StrutsTypeConverter { @Override public Object convertFromString(Map context, String[] values, Class toClass) { User user = new User(); String str = values[0]; StringTokenizer st = new StringTokenizer(str, ";"); String username = st.nextToken(); String password = st.nextToken(); user.setUsername(username); user.setPassword(password); 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; } }
然后在UserAction-converter.properties将原来的内容注释掉,修改为:
user=com.test.converter.UserConverter2
重新打开页面,发现仍然可以正常工作。
如果在项目中大量使用User类,我们可以写一个全局的配置文件。在src下新建xwork-conversion.properties,内容为:
com.test.bean.User=com.test.converter.UserConverter2
这意味着,凡是需要转换User类型的属性,如果我们没有像上面那样针对某个Action写配置,那么就采用默认的UserConverter2类去实现转换。
时间: 2024-10-24 10:51:20