什么是ValueStack
它是一個接口com.opensymphony.xwork2.util.ValueStack。我們使用它是將其做為一個容器,用于攜帶action數據到頁面。在頁面上通過ognl表達式獲取數據。?
valueStack主要是將action數據攜帶到頁面上,通過ognl獲取數據
1.ValueStack有一個實現類叫OgnlValueStack.?
2.每一個action都有一個ValueStack.(一個請求,一個request,一個action,一個valueStack) valueStack生命周期就是request生命周期。?
3.valueStack中存儲了當前action對象以及其它常用web對象(request,session,application.parameters)?
4.struts2框架將valueStack以“struts.valueStack”為名存儲到request域中。
valueStack結構
?
ValueStack中 存在root屬性 (CompoundRoot) 、 context 屬性 (OgnlContext )!并且context中含有root?
* CompoundRoot 就是ArrayList?
* OgnlContext 就是 Map
list集合中存儲的是action相關信息?
map集合中存儲的是相關映射信息,包含 paramters,request,session,application attr等。
我們想要從list中獲取數據,可以不使用#號.(它就是ognl的root)?
如果從map中獲取數據,需要使用#. (其實在struts2中的map–context其實就是ognlContext)
結論:?
ValueStack它有兩部分 List Map?
在struts2中List就是root Map就是ognlContext.?
默認情況下,在struts2中從valueStack獲取數據從root中獲取。
值棧對象的創建 ,ValueStack 和 ActionContext 是什么關系 ?
valueStack是每一次請求時,都會創建.
ActionContext ctx = ActionContext.getContext();
if (ctx != null) { stack = ctx.getValueStack(); }
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
如何獲得值棧對象?
對于valueStack獲取有兩種方式:
1.通過 request獲取
ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.通過ActionContext獲取.
ValueStack vs=ActionContext.getContext().getValueStack();
向值棧保存數據 (主要針對 root)
主要有兩個方法?
push(Object obj)——->底層就是 root.add(0,obj) 將數據存儲到棧頂。?
set(String name,Object obj);—–>底層是將數據封裝到HashMap中,在將這個HashMap通過push存儲。
在jsp中 通過?<s:debug />
?查看值棧的內容
在JSP中獲取值棧的數據
root中數據不需要#,而context中數據需要#
1.如果棧頂是一個Map集合,獲取時,可以直接通過Map集合的key來獲取value.
<s:property value="username"/>
2.如果棧頂數據不是一個Map,沒有key值,可以使用序號來獲取。
<s:property value="[0]"> 從0的位置向下查找所有。<s:property value="[0].top"> 只查找0位置上數據。
如何獲取OgnlContext中數據:?
request:?<s:property value="#request.username"/>
?
session:?<s:property value="#session.username"/>
?
application:<s:property value="#application.username"/>
?
attr:?<s:property value="#attr.username"/>
?
parameters:<s:property value="#parameters.cid[0]"/>