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