java struts2使用迭代器时非常奇怪的行为

时间:2016-08-20 22:47:44

标签: struts2

public class UserAction{
 private UserData user;
 //getter, setter
  public String Load() {
        user = UserDao.getInstance().getItem(getUserContext().getId()); 
        request.getSession().setAttribute("item", user);
        return super.Load();
    }
} 

public class PropertyAction {
    private List <PropertyData> propertyList;
    //getter, setter
    @Override
    public String execute() throws Exception {
        propertyList=PropertyDao.getInstance().getItems();
        return "list";
    }
}

JSP:

<s:iterator value="propertyList" var="item">
    ${item.name}
    ${item.thema}
    ${item.desc}
</s:iterator>

我想表现出非常奇怪的Struts2行为。

  1. 点击属性链接 - &gt;然后运行PropertyAction.execute()并显示在jsp。
  2. 上方
  3. 点击用户链接 - &gt;然后运行UserAction.Load()
  4. 点击属性链接 - &gt;然后运行PropertyAction.execute()并显示错误“UserData没有属性thema”。
  5. 我侦察发生的事情,我注意到我设置名称为“item”的setAttribute。所以,如果我在jsp中的迭代器中使用var =“item”,它不会使用propertyList中的值,而是来自session!

    我的问题是这是正确的行为吗?

1 个答案:

答案 0 :(得分:0)

这是定义的行为;是否“正确”是值得商榷的。

因为您正在使用JSP EL,所以Struts请求包装器负责解析JSP EL表达式。首先搜索正常的应用程序范围(例如,应用程序,会话,请求)。如果找不到任何内容,则只有查询值堆栈才能匹​​配表达式。

如果您通过非JSP EL方式访问item,例如<s:property>标记,则只会查询值堆栈,并且您将获得预期的行为。

当你混合EL时,结果并不总是你所期望的,所以你必须要知道相关框架是如何相互关联的。