在方法
<action name="zilei" class="dtreeAction" method="zilei">
<result name="listzilei" >/zilei.jsp</result>
<result name="input">/error.jsp</result>
</action>
ActionContext.getContext().getValueStack().set("listzilei", listzilei);
取值:
<s:property value="%{#request.listzilei}"/>
<s:property value="#request.listzilei"/>
<s:property value="listzilei"/>
<s:property value="#attr.listzilei"/>
<%=request.getAttribute("listzilei") %>
${listzilei}
<s:iterator value="#request.listzilei" id="dtree">
都可以取到值。
當保存在contextMap中時:
ActionContext.getContext().getContextMap().put("listzilei", listzilei);
取值:用
<s:property value="listzilei"/>不行
<s:property value="#session.listzilei"/>不行
<s:property value="#params.listzilei"/>不行
下面都可以取到值:
<s:property value="%{#request.listzilei}"/>
<s:property value="#request.listzilei"/>
<s:property value="#attr.listzilei"/>
<%=request.getAttribute("listzilei") %>
${listzilei}
3:直接用request.setAttribute()
request.setAttribute("listzilei", listzilei);
<s:property value="%{#request.listzilei}"/>
*
<s:property value="#request.listzilei"/>
**
<s:property value="listzilei"/>只有這個不行
***
<s:property value="#attr.listzilei"/>
****
<%=request.getAttribute("listzilei") %>
*****
${listzilei}
4,Maprequest:
Map request1 = (Map) ActionContext.getContext().get("request");
request1.put("listzilei", listzilei);
<s:property value="%{#request.listzilei}"/>
*
<s:property value="#request.listzilei"/>
**
<s:property value="listzilei"/>不行
***
<s:property value="#attr.listzilei"/>
****
<%=request.getAttribute("listzilei") %>
*****
${listzilei}
******
總結:說明getContextMap取值的范圍比valueStack大一點。只保存在request的attribute中。而ContextMap與手動request.setAtribute()及Map request是一樣的。
struts2,a頁面url傳值,,再執行方法,再到b頁面,a.jsp?id=33,在b.jsp頁面都可以取到值。
方法中采用
<action name="delete1" class="dtreeAction" method="delete1">
<result type="redirect-action" name="success">
<param name="actionName">zilei1.action</param>
<param name="id">${id}</param>
</result>
</action>
<s:property value="%{#request.id}"/>
*
<s:property value="#request.id"/>
**
<s:property value="id"/>不行
***
<s:property value="#attr.id"/>
****
<%=request.getAttribute("id") %>
*****
${id}
點擊b頁面的刪除再回到b頁面,什么都沒有。
當struts.xml中用${id}時:
//request.setAttribute("id", id);不行
//ActionContext.getContext().getValueStack().set("id", id);可以
//ActionContext就是ognl上下文,是整個上下文最大的一個。e
//ActionContext.getContext().getContextMap().put("id", id);可以
//request1.put("id", id);不行
當struts.xml中用${request.id}時:
request.setAttribute("id", id);可以
ActionContext.getContext().getValueStack().set("id", id);可以
ActionContext就是ognl上下文,是整個上下文最大的一個。e
ActionContext.getContext().getContextMap().put("id", id);可以
request1.put("id", id);可以
都可以的。
總結:ContextMap在struts.xml文件中可以取到值。用valuestack無法取到值
OgnlValueStack類包含兩個重要的屬性,一個root和一個context。其中root本質上是一個ArrayList,而context是一個Map(更確切的說是一個OgnlContext對象)。
也就是說:Map的范圍更大,所以不帶#有事就取不到。一條豎着的都是map類型
OgnlValueStack類的主要屬性關系圖如下:
|
|--application
|
|--session
context map (OgnlValueStack屬性)--|
|--value stack (OgnlValueStack的root屬性,實際是個ArrayList)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
OgnlValueStack是ActionContext的基礎
暫時就把ContextMap和valueStack當成一樣就行了,在.xml文件中有區別