1. 程式人生 > >Struts工作機制圖+OGNL+EL+值棧(Map,物件棧)

Struts工作機制圖+OGNL+EL+值棧(Map,物件棧)

struts 值棧  通過get set方法 方便的獲取,設定屬性值      例如從jsp頁面傳來的引數。。。從Action設定jsp所要回顯的內容

注意EL表示式,struts2對request進行了封裝,所以它的查詢順序 多了一個findvalue() 如上圖

再看下面的程式碼:

publicclass UserAction {

private String username;

//檢視使用者的詳細資訊

public String detail(){

username = "張三";

       List list = new ArrayList();

for(int i=0; i<10; i++){

           User user = new User();

user.setUsername("User"+i);

           list.add(user);

}

       ActionContext.getContext().put("users", list);

       User u = new User();

       u.setUsername("趙毅");

       ActionContext.getContext().getValueStack().push(u);

return"detail";

    }

對應的JSP如下:

1:  

<s:property value="username"/><br/>

2:  <s:iterator value="#users">

3:     <s:property value="username"/>

4:     <s:property value="#root[2].username"/><br/>

5:  </s:iterator>

6:  <s:property value="username"/>

7:  <s:property value="#root[1].username"/>

<!-- 張三 -->

根據剛才的示例,我們知道,第1行的username是“趙毅”(因為JSP在執行這行程式碼的時候,CompoundRoot中有兩個元素:第0個是“user物件趙毅”,第1個是“userAction物件張三”),因此第1行的username將取出CompoundRoot中第0個元素的username屬性:趙毅

第2行程式碼是iterator標籤,只定義了一個value屬性,iterator標籤將迴圈訪問users這個List中的User物件,並把當前迴圈的user物件壓入到CompoundRoot中!所以,在第3行和第4行程式碼被執行的時候,CompoundRoot中總共有3個元素:第0個元素是被iterator標籤壓入的當前迴圈的user物件;第1個元素是“user物件趙毅”;第2個元素是“userAction物件張三”,因此第3行程式碼的執行結果就是輸出“UserX”,即當前迴圈的user物件的username屬性!iterator標籤將會依次取出List中的user物件,並不斷壓入/彈出user物件(每次迴圈,都將執行一遍壓入/彈出)。而第4行程式碼取第2個元素的username屬性,即userAction物件的username屬性:張三。

第5行程式碼執行完成之後,在CompoundRoot中將剩下2個元素,與第2行程式碼被執行之前一樣。所以,第6行程式碼的輸出和第1行程式碼的輸出結果是一樣的,而第7行程式碼將取出userAction物件的username屬性:張三