struts2支持复合类型转换的一个抽象类为org.apache.struts2.util.StrutsTypeConverter
所以在复合类型转换时,需要继承这个抽象类.
如:
public class UserConverter extends StrutsTypeConverter {
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
// TODO 自动生成方法存根
User user=new User();
String[] values=arg1[0].split(",");
user.setUsername(values[0]);
user.setPassword(values[1]);
return user;
}
@Override
public String convertToString(Map arg0, Object arg1) {
// TODO 自动生成方法存根
User user=(User)arg1;
return "<"+user.getUsername()+","+user.getPassword()+">";
}
}
在这里面有两个方法.
其中public Object convertFromString(Map arg0, String[] arg1, Class arg2)
这个方法,表示将客户端中的String类型转换为混合类型,如User对象.
其中public String convertToString(Map arg0, Object arg1)
这个方法,表示复合类型转换为String类型.
所以在表单中使用如下:
<form action="Login.action" method="post">
<table align="center">
<caption><h3>用户登陆</h3></caption>
<tr>
<td>用户名与密码:<input type="text" name="user" /></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="登陆" />
<input type="reset" value="重填" /></td>
</tr>
</table>
</form>
当用户在user的表单中输入 用户名,密码 时,如 abc,xyz.将会自动使用上面的类型转换,返回一
个User对象,供LoginAction直接使用.
public class LoginAction implements Action {
private User user;
/**
* @return user
*/
public User getUser() {
return user;
}
/**
* @param user 要设置的 user
*/
public void setUser(User user) {
this.user = user;
}
public String execute() throws Exception{
if(getUser().getUsername().equals("scott")&&getUser().getPassword().equals
("tiger")){
act.put("user",getUser());
return SUCCESS;
}
else{
return ERROR;
}
}
}
最后一点,需要注册类型转换类,
在LoginAction.class相同的路径下,
配置一个properties文件,
这个文件的命名规则为:ActionName-conversion.properties
以上的文件名:LoginAction-conversion.properties
在配置文件中使用 key=类型转换类
格式为:
user=converter.UserConverter
因为这个类放置在converter的包中,所以指定路径为converter.UserConverter
按照上面的方法,就可以方便的使用.上面是局部类型转换的写法,如果要使用全局类型转换也有类似的方法。
2.全局级别配置
在classpath的根目录下创建一个xwork-conversion.properties文件,加入如下内容:
user=converter.UserConverter
这样可以在多个action中去使用user对象而不必每次都对不同的action中的user都进行类型转换.