2016-08-20 30 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的結果並不總是你所期望的,所以你必須意識到所討論的框架是如何相互關聯的。