在Struts2的提供实例中,将查询出来的数据对象封装在list中,并通过iterator遍历显示在页面中,选中其中的一条数据,并希望能够单独显示在一个页面时,官方提供的方式是传递ID过去,并通过ID查询数据后显示在页面上。
能否将iterator遍历后的对象作为参数,直接传到的新的action中,并显示在跳转后的页面中,以此来减少对数据库的查询操作。
在struts中,页面向后台传递对象时,系统将报错,错误原因是将对象从页面传递到action时,其类型被转换为了String类型,因此不能将其赋值给对象数据。需要进行的处理就是对String类型做处理将其转换为对象类型。
第一步。在对象pojo中重写toString方法。因为在页面传递对象到action过程中,转换为String类型调用的是对象的toString方法,重写toString方法可以保存对象中的数据。
public Class User{
private String id;
private String name;
private String password;
......./get & set 方法/.........
@Override
public String toString(){
return this.getId()+","+this.getName+"," + .... ; //在每一字段中使用“,”分隔,是为了方便转换时对字符的判断,也可以采用其他数据
}
}
第二步。编写类型转换类。具体的编写可参考官方站点http://struts.apache.org/2.1.8.1/docs/type-conversion.html。
public Class UserConvert extends StrutsTypeConverter{
将字符串转换为对象
@Override
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
User u=null ;
if(arg2 == User.class){
u = new User();
String[] sts = arg1[0].split(",");//根据","分隔字符串
u.setId(sts[0]);
u.setName(sts[1]);
u.setPassword(sts[2]);
}
return u;
}
将对象转换为字符串
@Override
public String convertToString(Map arg0, Object arg1) {
return arg1.toString();
}
}
第三步,编写数据转换的配置文件。
局部转换,在action所在的文件夹中新建actionName-conversion.properties文件,文件内容 user = xxx. UserConvert // user代表action中User对象的命名,即private User user; 根据实际命名调整,XXX代表UserConvert对象所在的包名。
全局转化, 在Struts.xml同一目录下新建xwork-conversion.properties文件, 文件内容 XXX.User = XXX.UserConvert .
如此,这可以在页面中传递User对象到action中。