struts2 中, iterator 标签 取不到action中变量的值
程序员文章站
2022-07-12 20:42:55
...
假设有下面这个Action
public class Action{ public User user; Public List<Role> allRole; // getter and setter for user and role }
然后,有下面这两个POJO
public class User { private int id; // getter and setter for id }
public class Role { private List<User> user; // getter and setter for user }
页面与上面的Action进行绑定,且在页面中,像下面这样使用了 iterator 标签
<s:iterator value="allRole" var="role"> <s:property value="user.id"> </s:iterator>
页面的本意是,在遍历 action 中 allRole 的时候,同时将 action 中 user 的id 给输出出来。
但是,你发会现,将无法获取action中user对象中的id。这是为什么呢?
因为在 iterator标签 中,通过 var 属性 声明的变量 'role' (代表了 Role 类)将被压入Struts2的 valuestack 中,且处于valuestack中第0个元素的位置。然后,OGNL在解析 ‘user.id’ 表达式 的时候,会从valuestack的第0个元素去查找。也就是说,它将先从上面的 ‘role’ 变量进行查找。恰好的是,这个 ‘role’ 变量所代表的 Role 类中,刚好也包含一个 名为 ‘user’ 的字段。这样一来,OGNL 就不会再去找 action中的user变量了。
所以,为了避免这个问题的发生,可以采用以下两个方式
① 修改字段名称,使得 action中和role中不要存在同名变量名
② 通过指定下标,让OGNL解析的的时候,直接从 valuestack 的指定元素进行查找,如上例可以修改为:
<s:property value="[1].user.id"/>
这样一来,OGNL就可跳过 valuestack中的第0个元素,直接从第 1 个元素开始查找 user,这样就没问题了。