2016-08-20 79 views
1
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:的java struts2的同时使用迭代器非常奇怪的行为

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

我想说明的Struts2的非常奇怪的行为。

  1. 我点击属性链接 - >然后运行PropertyAction.execute(),它显示在jsp上面。
  2. 我点击用户链接 - >然后运行UserAction.Load()
  3. 我点击资源链接 - >然后运行PropertyAction.execute()和错误已被证明“的UserData没有财产天马”。

我间谍发生了什么,我注意到我设置了名称为“item”的setAttribute。所以如果我在jsp的迭代器中使用var =“item”,它不会使用propertyList中的值,而是使用session中的值!

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

回答

0

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

由于您使用的是JSP EL,Struts请求包装器负责解析JSP EL表达式。首先搜索正常的应用程序范围(例如,应用程序,会话,请求)。如果没有找到,只有这样才会查询值堆栈以查找匹配的表达式。

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

当你混合ELs的结果并不总是你所期望的,所以你必须意识到所讨论的框架是如何相互关联的。