struts2的转换器,局部,全局

来源:互联网 发布:同步翻译软件 英语 编辑:程序博客网 时间:2024/05/17 00:14

Struts2的类型转换,对于8个原生数据类型以及Date,String等常见类型,Struts2可以使用内建的类型转换器实现自动的转换;但对于自定义的对象类型来说,就需要我们自己指定类型转换的方式了。

局部类型转换:

对于自定义的类型转换器来说需要提供3个信息:Action的名字、Action中待转换的属性名以及该属性对应的类型转换器。其中Action的名字是通过属性文件名来获得的、Action中待转换的属性名是通过属性文件中的key来获得的,该属性对应的类型转换器是通过该key所对应的value来获得的。

文件名是有规则的.action名字-conversion.properties.内容如下:属性名=转换器的全路径名.如user=cn.wenping.converter.UserConverter.他告诉框架对应Action中的属性使用什么样的类型转换器.

转换就不属于业务逻辑.通用的转换器要继承自DefaultTypeConverter,才具备类型转换的功能,这是最通用的一种方式.

代码如下:

public class UserConvertor extends DefaultTypeConverter {
@Override
public Object convertValue(Map context, Object value, Class toType) {

if(User.class==toType){//从前端页面向后台转
String[] str=(String[])value;
String strValue=str[0];
StringTokenizer st=new StringTokenizer(strValue, ",");
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){
User user=(User)value;
String username=user.getUsername();
String password=user.getPassword();

String userInfo="username:"+username+",password:"+password;

return userInfo;
}

return null;
}
}

可以使用Struts2框架自带的类型转换器StrutsTypeConverter简化类型转换代码的编写,StrutsTypeConverter继承于DefaultTypeConverter父类,并且提供了两个抽象方法:convertFromString与convertToString,分别表示从页面的字符串转换为后台对象以及从后台对象转换为页面的字符串,我们只需实现这两个抽象方法即可实现类型转换

代码 如下:

public class UserConvorter2 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
User user=new User();
String strValue=values[0];
StringTokenizer st=new StringTokenizer(strValue,",");
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;
return userInfo;
}
}

如何进行批量转换:

public class UserConverter3 extends StrutsTypeConverter {
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
List<User> user=new ArrayList<User>();
for(String value:values){
StringTokenizer st=new StringTokenizer(value,",");
User u=new User();
u.setUsername(st.nextToken());
u.setPassword(st.nextToken());

user.add(u);
}
return user;
}

@Override
public String convertToString(Map context, Object o) {
List<User> list=(List)o;
String str="";
for(int i=0;i<list.size();i++){
User user=list.get(i);
String username=user.getUsername();
String password=user.getPassword();

str+="username:"+username+",password:"+password+"<br>";
}
return str;
}

}

全局类型转换:

全局类型转换。在src目录下新建xwork-conversion.properties,该文件的内容是待转换的类=转换器的名字,即com.shengsiyuan.bean.User=com.shengsiyuan.converter.UserConverter2

其他 的跟局部的没什么两样的,不同的是全局的类型每个Action都用这种类型转换器.,而局部的是一个Action专用的