天天看點

Struts工作機制圖+OGNL+EL+值棧(Map,對象棧)

Struts工作機制圖+OGNL+EL+值棧(Map,對象棧)

struts 值棧  通過get set方法 友善的擷取,設定屬性值      例如從jsp頁面傳來的參數。。。從action設定jsp所要回顯的内容

注意el表達式,struts2對request進行了封裝,是以它的查找順序 多了一個findvalue() 如上圖

再看下面的代碼:

public class 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屬性:張三

繼續閱讀