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行为。
我侦察发生的事情,我注意到我设置名称为“item”的setAttribute。所以,如果我在jsp中的迭代器中使用var =“item”,它不会使用propertyList中的值,而是来自session!
我的问题是这是正确的行为吗?
答案 0 :(得分:0)
这是定义的行为;是否“正确”是值得商榷的。
因为您正在使用JSP EL,所以Struts请求包装器负责解析JSP EL表达式。首先搜索正常的应用程序范围(例如,应用程序,会话,请求)。如果找不到任何内容,则只有查询值堆栈才能匹配表达式。
如果您通过非JSP EL方式访问item
,例如<s:property>
标记,则只会查询值堆栈,并且您将获得预期的行为。
当你混合EL时,结果并不总是你所期望的,所以你必须要知道相关框架是如何相互关联的。