ValueStack与ContentMap (ActionContext.getContext().getValueStack().set())

在方法

<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文件中有区别

时间: 2024-09-28 06:36:07

ValueStack与ContentMap (ActionContext.getContext().getValueStack().set())的相关文章

ActionContext.getContext();

转url="http://blog.csdn.net/sunqing0316/article/details/47176601" <a href="http://blog.csdn.net/sunqing0316/article/details/47176601">地址<a> 原文: ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如session, parameter

关于ActionContext.getContext()取得的值是什么,和struts2如何获取request,session,appliaction作用域

今天做struts时发现了一个bug. 有个tea对象,该对象包含id,name等属性,由于项目的需要,我希望把它存入到request作用域里,查阅资料后网上有人说是通过ActionContext.getContext().put("tea", tea);的方式可以实现存入request作用域的效果. 但是实际发现当我在jsp页面上写下这样语句取得request域里tea的id:<s:property value="#request.tea.id"/>,

关于ActionContext.getContext()的用法心得

转: 为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest.HttpSession和ServletContext对应的Map对象来保存和读取数据. (一)通过ActionContext来获取request.session和application对象的Logi

关于ActionContext.getContext().getSession()返回null

在xwork2.1.6版本中使用以下这段代码是没有错误的. ActionContext ctx = ActionContext.getContext(); Map session = ctx.getSession(); session.put(String, Object);   但在xwork2.0.7版本中就会出现null错误: 解决的方法:      Map session = new HashMap();       ActionContext.getContext().setSessi

ActionContext.getContext()用法

为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest.HttpSession和ServletContext对应的Map对象来保存和读取数据. (一)通过ActionContext来获取request.session和application对象的LoginAc

关于ActionContext.getContext()的用法

为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了三个Map对象来替代这三种对象,在Action中,直接使用HttpServletRequest.HttpSession和ServletContext对应的Map对象来保存和读取数据. (一)通过ActionContext来获取request.session和application对象的LoginAc

在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .

笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Struts2版本为2.3.1.2,内容仅供参考,限于笔者水平有限,难免有所疏漏,望您能友善指出.本文发表于ITEYE,谢绝转载. 1. ValueStack ValueStack在中文版的<Struts2深入浅出>一书中译作“值栈”.其本身数据结构是一个栈,使用者可以把一些对象(又称作bean)存入值栈中

Struts ongl 集合伪属性

首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象.

Struts2的值栈和对象栈

ValueStack 如何得到值栈: 如何将对象存入值栈: 让值栈执行表达式来获得值: 在JSP中跳过栈顶元素直接访问第二层: 在JSP中访问值栈对象本身(而不是它们的属性) ActionContext ValueStack与ActionContext的联系和区别: 如何获得ActionContext: 如何向ActionContext中存入值: 如何从ActionContext中读取值: HttpServletRequest类或request的Map 使用HttpServletRequest类