1. 程式人生 > >valueStack 值棧

valueStack 值棧

通過 例如 就是 驅動 錯誤信息 wrap 非root jsp session

1. valueStack介紹
我們使用valueStack的主要目的是為我將我們action中產生的數據攜帶到頁面上,也就是說valueStack它就是一個容器。
在Struts2框架中將valueStack設計成一個接口。
com.opensymphony.xwork2.util.ValueStack
我們主要使用的是它的實現類
com.opensymphony.xwork2.ognl.OgnlValueStack。
當客戶端向我們發送一個請求,服務器就會創始一個Action來處理請求,struts2中的action是一個多例,每一次請求都會有一個新的action對應。所以它不存在線程安全問題。
一個valueStack對應一個action,valueStack貫穿整個action的生命周期。
rquest-------àAction------àValueStack
struts2框架將valueStack保存在request中。
技術分享圖片
2. valueStack內部結構
技術分享圖片
valueStack主要有兩部分組成:
CompoundRoot:它就是一個ArrayList
它主要存儲的是action的相關數據
Map<String,Object> context:就是一個Map
Context中主要存儲了一些引用,這個引用主要是關於web開發中相關信息
pameters :請求參數
request:請求對象中所有屬性
session:會話對象中所有屬性
application:application對象中的所有發展
以上都是Map
在struts2框架中我們通過ognl表達式來獲取valueStack中數據,沒有使用#就會從CompoundRoot中獲取數據,
如果使用#來獲取,這時就會從context中來獲取.
3. 獲取ValueStack
第一種方式:可以直接通過request對象來獲取.

技術分享圖片
第二種方式:使用ActionContext來獲取
技術分享圖片
4. ActionContext是什麽
ActionContext它是action上下文,strtus2框架它使用actionContext來保存Action在執行過程中所需要的一些對象,例如 session, application…
ActionContext的獲取 是通過它的靜態方法getContext()得到。

Struts2會根據每一次的http請求來創建對應的ActionContext,它是與當前線程綁定的。
每一次請求,就是一個線程,對應著一個request,每一次請求,會創建一個Action,每一個action對應一個ActionContext.每一次請求也對應著一個valueStack.
request---ActionContext----Action-----ValueStaci它們都對應著一次請求(一個線程).
valueStack與ActionContext本質上是可以獲取
技術分享圖片
5. valueStack操作---存儲數據
註意:我們使用valueStack來存儲數據時,主要是向root中存儲。
介紹兩部分:
5.1. 手動向valueStack存儲數據
技術分享圖片
5.2. Struts2框架自動向valueStack中存儲數據
每次請求,訪問action,這個對象會存儲到valueStack中。
在DefaultActionInvocation的init方法內
技術分享圖片
在ModelDrivernInterceptor中
技術分享圖片
以上代碼會將模型對象存儲到valueStack中。
6. valueStack操作-獲取數據
技術分享圖片
在頁面中獲取
技術分享圖片
Action中屬性
技術分享圖片
技術分享圖片
使用模型驅動
技術分享圖片
訪問時的路徑
http://localhost:8080/struts2-day02/vs?username=tom&password=123
在action類中的業務處理時,又對user對象重新賦值
技術分享圖片
在頁面上獲取數據
技術分享圖片
技術分享圖片

7. EL表達式從valueStack中獲取數據
El表達式可以從valueStack中獲取信息
技術分享圖片
問題:為什麽el表達式可以從valueStack中獲取數據?
org.apache.struts2.dispatcher.StrutsRequestWrapper
技術分享圖片
Struts2框架對request進行了增強,重寫了getAttribute方法,如果在request域中查找不到數據,就會在valueStack中獲取。
8. Ognl表達式中特殊字符
OGNL是通常要結合Struts 2的標誌一起使用。主要是#、%和$這三個符號的使用
#號:它是從非root中獲取數據
技術分享圖片
%用於強制是否要解析ognl表達式
技術分享圖片
$它主要是從配置文件中來獲取valueStack中數據
技術分享圖片
9. valueStack練習9.1. 關於登錄失敗處理
如果用戶登錄時,用戶名或密碼錯誤,將錯誤信息存儲到valueStack中
技術分享圖片
在login.jsp頁面上獲取錯誤信息展示
技術分享圖片
註意:在實際開發中,我們一般會讓action去繼承ActionSupport類。
讓action類繼承ActionSupport類
技術分享圖片
可以使用父類提供的對於錯誤操作的處理
技術分享圖片
在頁面上可以直接使用struts2提供的標簽來顯示錯誤信息
技術分享圖片
總結:在struts2中處理簡單的信息(字符串)
技術分享圖片
在頁面上可以使用對應的標簽來獲取錯誤信息
技術分享圖片
9.2. 展示商品信息
在success.jsp頁面上
技術分享圖片
創建action
技術分享圖片
技術分享圖片
在product.jsp頁面上展示數據
要想在頁面上展示集合信息可以使用<s:iterator>標簽來完成
技術分享圖片
如果使用var,它存儲在context中,所以在使用時要添加#號
也可以使用以下方案
技術分享圖片
我們將List<Product> ps聲明成action的屬性,並提供了get/set方法
技術分享圖片
也可以在頁面上獲取到ps數據

valueStack 值棧