在方法

<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. JAX-MD在近邻表的计算中,使用了什么奇技淫巧?(一)

    技术背景 JAX-MD是一款基于JAX的纯Python高性能分子动力学模拟软件,应该说在纯Python的软件中很难超越其性能.当然,比一部分直接基于CUDA的分子动力学模拟软件性能还是有些差距.而在计 ...

  2. 【】Nessus安全测试插件编写教程

    Nessus安全测试插件编写教程 作者:Renaud Deraison 翻译:nixe0n 1.怎样编写一个高效的Nessus安全测试插件 在Nessus安全测试系统中, 所有的安全测试都是由ness ...

  3. js 简单版发布留言 案例

    <!DOCTYPE html>   <html lang="en">   <head>       <meta charset=" ...

  4. 初识python 之 cx_oracle

    使用cx_oracle操作oracle数据库 oracleClient 包 #!/user/bin env python # author:Simple-Sir # create_time: 2021 ...

  5. shell 之 循环执行某操作

    需求: 按月执行201904到202010的py脚本. 代码如下: #!/bin/bash i=201904 # 定义开始月份 while [ $i -le 202010 ] # 当i小于等于2020 ...

  6. SYCOJ798Biorhythms

    https://oj.shiyancang.cn/Problem/798.html #include<bits/stdc++.h> using namespace std; typedef ...

  7. Redis之持久化方式详解

    背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...

  8. 谱分解(SD)

    前提:矩阵A必须可相似对角化! 充分条件: $A$ 是实对称矩阵 $A$ 有 $n$ 个互异特征值 $A^{\wedge} 2=A $ $\mathrm{A}^{\wedge} 2=\mathrm{E ...

  9. SnackBar--FloatingActionButton--CoordinatorLayout

    SnackBar snack:小吃,点心,快餐 btOpenSnackBar = (Button) findViewById(R.id.bt_openSnackBar); btOpenSnackBar ...

  10. 一条 Git 命令减少了一般存储空间,我的服务器在偷着笑

    元旦不是搭建了一个<Java 程序员进阶之路>的网站嘛,其中用到了 Git 来作为云服务器和 GitHub 远程仓库之间的同步工具. 作为开发者,相信大家都知道 Git 的重要性.Git ...