在方法

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

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

  1. struts2中valueStack,stackContext以及actionContext的关系

    一,首先给出三者的定义 1.valueStack: 里面存放的是Action类中通过set方法设置的属性值(表单传过来的值等),由OGNL框架实现; 2.stackContext: 也是用来存值的,s ...

  2. ActionContext.getContext().getSession()

    ActionContext.getContext().getSession() 获取的是session,然后用put存入相应的值,只要在session有效状态下,这个值一直可用 ActionConte ...

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

    转: 为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装, ...

  4. 关于ActionContext.getContext()的用法

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

  5. 【转载】关于ActionContext.getContext().getParameters()获值问题

    ActionContext.getContext().getParameters():一个学员问题的解答 2012-11-12 15:12:05|  分类: 默认分类 |  标签:struts2   ...

  6. <s:if>标签与ActionContext.getContext().getSession()

    今天在做<s:if>标签中的属性值从 ActionContext.getContext().getSession().put("WW_TRANS_I18N_LOCALE" ...

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

    这个也是我在另外一位仁兄的博客中看到的,原博客的有点长,我把它精简了一下,算看起来比較方便吧. 为了避免与Servlet API耦合在一起,方便Action类做单元測试,Struts 2对HttpSe ...

  8. 大约ActionContext.getContext()使用体验

    这是我在另一个人的博客看了,原来博客的时间长一点.我把它简化了一下,运营商,以方便它看起来. 为了避免与Servlet API耦合在一起,方便Action类做单元測试,Struts 2对HttpSer ...

  9. ActionContext.getContext()用法

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

随机推荐

  1. pod存在,但是deployment和statefulset不存在

    pod存在,但是deployment和statefulset不存在 这样的话,可以看一下是不是ReplicaSet, kubectl get ReplicaSet  -n iot

  2. 【SpringBoot】No 'Access-Control-Allow-Origin' header is present on the requested resource.

    关键字:跨域,Access-Control-Allow-Origin,转码,解码 在做一个前后端分离项目,本来前端项目都可以正常访问后端接口,跨域是这么设置的,接口可以正常访问 @Configurat ...

  3. PL/SQL连接时,报无法解析指定的字符串

    前言: 工作原因,需要安装PL/SQL连接数据,oracle和PL/SQL都装好了,环境变量也配好了,启动PL/SQL进行连接数据库,结果报"无法解析指定的字符串",连接失败了. ...

  4. Python_PyYaml模块的使用

    YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表示结构. 模块安装 pip install pyyaml # 如果是py2,使用 pip install yaml P ...

  5. ES6扩展运算符(...)

    来自为知笔记(Wiz)

  6. spring cloud --- Feign --- 心得

    spring boot      1.5.9.RELEASE spring cloud    Dalston.SR1 1.前言 什么是Feign? 为了简化我们的开发,Spring Cloud Fei ...

  7. PPT文档学习小练习链接

    1. <初识PPT2010> https://www.toutiao.com/i6486689592241029645/ 2. <PowerPoint2010实现折线图动态展示> ...

  8. jQuery里的mouseover与mouseenter事件类型区别

    JQ里面有mouseover和mouseenter  2个事件类型干着差不多的活,用不好经常出现些小问题. 今天我解释一下原理: 事件类型翻译: mouseover 鼠标移上 mouseenter 鼠 ...

  9. 三分钟:极速体验JAVA版目标检测(YOLO4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. Sentry 开发者贡献指南 - Feature Flag

    功能 flag 在 Sentry 的代码库中声明. 对于自托管用户,这些标志然后通过 sentry.conf.py 进行配置. 对于 Sentry 的 SaaS 部署,Flagr 用于在生产中配置标志 ...