初學struts2,遇到在jsp頁面上使用類似語句,心中一萬個疑惑「這竟然可以讀取到在之前在action裡建立的(有setter和getter)變數(user)?」how can that be???
好的,帶著這份疑惑,我決定好好研究一下這個東東。
資料傳輸背後機制就是 valuestack(值棧)。
valuestack儲存的內容:
當使用者訪問action,都會建立乙個action物件,actioncontext物件、valuestack物件..
struts2把action物件放進valuestack物件之中。
將valuestack放進request域中,傳入jsp頁面(key: struts.valuestack)
jsp頁面就可以使用ognl表示式獲取值棧中的資料了!
在debug模式下,看看valuestack裡面有哪些東西:
其中ognlcontext就是乙個map集合。
ognlcontext儲存著這樣的資料:compoundroot裡面:
終於,我們看到了loginaction,裡面自定義的全域性變數user和message也都儲存了下來,還有儲存error相關的變數。
compoundroot儲存著這樣的資料:有個問題:actioncontext和onglcontext、onglvaluestack間有什麼關係?
這圖很有意思,我們可以得出以下結論:
1. actioncontext 裡面就是 onglcontext;
2. onglvaluestack裡面儲存了onglcontext;
3. onglcontext裡面儲存了onglvaluestack(引用),有種迴圈的感覺。
4. onglvaluestack裡面也儲存了request。
再看一幅圖:
request裡面也有onglvaluestack。。。
完美詮釋了「你中有我,我中有你…」
這也解釋了為什麼以下兩種取值棧方式都可行了:
// 獲取值棧物件,方式1:
// 獲取值棧物件,方式2:
actioncontext ac = actioncontext.getcontext();
valuestack vs2 = ac.getvaluestack();
struts2會將valuestack物件封裝進request物件域中,傳入jsp頁面。
取值規則:
(來自:
其他:
獲取request域資料
value="china"/>
value="'china'"/>
value="%"/>
國家:name="txtcountry"
value="%">
s:textfield>
body>
struts2的action與jsp之間傳遞引數
1 瀏覽器往action傳遞引數 在action中設定屬性,並為屬性設定get set方法。傳遞引數時按照屬性的名字賦值即可。如 name aa 取值用request.getprameters 屬性名 public class useraction public string getname pub...
struts2的action與jsp之間傳遞引數
1 瀏覽器往action傳遞引數 在action中設定屬性,並為屬性設定get set方法。傳遞引數時按照屬性的名字賦值即可。如 name aa 取值用request.getprameters 屬性名 public class useraction public string getname pub...
struts2的action與jsp之間傳遞引數
1 瀏覽器往action傳遞引數 在action中設定屬性,並為屬性設定get set方法。傳遞引數時按照屬性的名字賦值即可。如 name aa 取值用request.getprameters 屬性名 public class useraction public string getname pub...