struts2 中, iterator 标签 取不到action中变量的值

 

 

假设有下面这个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,这样就没问题了。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值