1、提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢。

ValueStack(值栈):Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是

OgnlContext),并将值栈设为OGNL的根对象。

ActionContext:一次Action调用都会创建一个ActionContext
              如:ActionContext ctx = ActionContext.getContext();

Stack Object:放入stack中的对象,一般是action。

Stack Context(map):stack上下文,它包含一系列对象,包括request、session、attr、application map等。

2、访问Stack Context中的对象的属性时要使用"#对象名.属性名"的方式,使用push标签可以将原来位于Stack Context中的对象放到ValueStack的栈顶。用push标签将对象保存在ValueStack的栈顶后,只需要使用"属性名"就可以直接访问了。如下面的例子:

<body>
 <s:bean name="cg.struts.at.User" id="user">
   <s:param name="username" value="'cg'"/>
   <s:param name="password" value="'p123'"/>
 </s:bean>
 <table border="1" width="80%">
  <tr align="center">
   <td colspan="4">用户信息</td>
  </tr>
  <tr align="center">
   <td>用户名:</td>
   <td><s:property value="#user.username"/></td>
   <td>密码:</td>
   <td><s:property value="#user.password"/></td>
  </tr>  
 </table>
 使用push标签,简化值的访问
 <s:push value="#user">
  <table border="1" width="80%">
   <tr align="center">
    <td colspan="4">用户信息</td>
   </tr>
   <tr align="center">
    <td>用户名:</td>
    <td><s:property value="username"/></td>
    <td>密码:</td>
    <td><s:property value="password"/></td>
   </tr>  
  </table>
 </s:push>
</body>

3、如果ValueStack栈顶是集合对象的话,通常可以用iterator标签取得位于ValueStack的顶端的集合对象,遍历集合并输出,遍历完成后集合对象会被移出ValueStack。

4、在页面输出ValueStack和Stack Context的方法

只要在<body>标签中加入<s:debug/>,运行时就可以生成相应的链接,点击该链接就可以显示stack相关信息。

5、在Action中获得ActionContext、request、session、application对象的方法

5.1 缺省情况下,Struts2的Action类是从ActionSupport类继承过来的,因此,可以用下面的语句获得ActionContext对象。

ActionContext ctx = ActionContext.getContext();

ctx.put(("address","上海");

5.2 如果想要在Action类中使用request对象,最简单的方法就是在定义类的时候实现ServletRequestAware接口。然后就可以直接在execute()方法中使用request对象,例如:

request.setAttribute("address","上海");

5.3 如果想要在Action类中使用session对象,就要在定义类的时候实现SessionAware接口。然后就可以直接在execute()方法中使用session对象。例如:

session.put("address","上海");

5.4 当需要在Action类中使用application对象时,在定义类的时候要实现ServletContextAware接口。然后可以直接在execute()方法中使用application对象。例如:

application.setAttribute("address","上海");

6、在jsp中用OGNL表达式获取不同范围的值

6.1 获取地址后面的参数信息(即上海)(http://localhost:8080/strutslogin/login.action?address=上海)的方法如下:

<s:property value="parameters.address"/>

6.2 获取上述request中信息的方法如下:

<s:property value="#request.address"/>

6.3 获取上述session中信息的方法如下:

<s:property value="#session.address"/>

6.4 获取上述application中信息的方法如下:

<s:property value="#application.address"/>

6.5 使用"#attr.参数名"的方法访问各种变量的顺序是:

request>session>application

Struts2的Stack Context和ValueStack的更多相关文章

  1. struts2.1.6教程四_2、ActionContext 、ValueStack 、Stack Context

    ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext.getContext() Va ...

  2. Struts2(六.用标签显示用户列表及Value Stack和Stack Context)

    一.用Struts2标签显示用户列表 原理: 在struts中可以通过在action中将所有用户的信息存入到某个范围中,然后转向userlist.jsp,进行访问 原则: 在jsp网页上,尽量不要出现 ...

  3. structs2 对ActionContext valueStack stack context 的理解 图片实例

    structs2 对ActionContext valueStack stack context 的理解 ActionConext : The ActionContext is the context ...

  4. 27.OGNL与ValueStack(VS)-获取Stack Context中的信息

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 我们知道,除了可以从值栈中获取信息,还可以从Stack Context中获取 ...

  5. 浅析Struts2中的OGNL和ValueStack

    要了解Struts2与OGNL表达式的关系,我们必须先搞清楚以下三个概念: 1.  ActionContext它是Action运行的上下文环境,Action的多项设置都存放在次,我们每一次Action ...

  6. 自己理解BFC 和 stack context , stack order

    1. stack order 发生在BFC计算好了之后. 2.一个一个的BFC里面,不同的block 里面的stack context 会根据 stack order的顺序,进行堆叠.呈现互相遮盖的效 ...

  7. [知识库:python-tornado]异步调用中的上下文控制Tornado stack context

    异步调用中的上下文控制Tornado stack context https://www.zouyesheng.com/context-in-async-env.html 这篇文章真心不错, 非常透彻 ...

  8. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)

    1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptio ...

  9. Struts2 值栈总结(ValueStack)

    1.获取值栈 //获取值栈的第一种方式 ValueStack valueStack1 = (ValueStack) ServletActionContext.getRequest().getAttri ...

随机推荐

  1. DECLARE CONTINUE HANDLER FOR NOT FOUND

    1.解释: 在mysql的存储过程中经常会看到这句话:DECLARE CONTINUE HANDLER FOR NOT FOUND. 它的含义是:若没有数据返回,程序继续,并将变量IS_FOUND设为 ...

  2. 研究 Javascript的&&和||的另类用法

    这篇文章主要介绍了Javascript的&&和||的另类用法,需要的朋友可以参考下 最近也没什么心思写文章了,感觉总有忙不完的事情,呵. 不过这些天又开始研究起 Titanium 来, ...

  3. 从一个Bug说开去--解决问题的思路,Linked Server, Bulk Insert, DataTable 作为参数传递

    声名— 部分内容为杜撰,如有雷同,不胜荣幸! 版权所有,如要引用,请标明出处! 如果打赏,请自便! 1       背景介绍 最近一周在忙一个SQL Server 的Bug,一个简单的Bug,更新两张 ...

  4. 【测试Json的多空格问题】

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 【额 原来ms sqlserver 中的视图果然是“虚表”哈】

    在视图中查询数据的时候,会不会使用实体表中的列上的索引呢?会 .... 测试结果 测试脚本 ; BEGIN INSERT INTO Teachers ( TeacherName, Sex, Money ...

  6. __declspec,__cdecl,__stdcall都是什么意思?有什么作用?

    __cdecl和__stdcall都是函数调用规范(还有一个__fastcall),规定了参数出入栈的顺序和方法,如果只用VC编程的话可以不用关心,但是要在C++和Pascal等其他语言通信的时候就要 ...

  7. linux之SQL语句简明教程---Subquery

    我们可以在一个 SQL 语句中放入另一个 SQL 语句.当我们在 WHERE 子句或 HAVING 子句中插入另一个 SQL 语句时,我们就有一个 subquery 的架构. Subquery 的作用 ...

  8. openstack 使用cloud init 和 console-log, nbd或者libguestfs 获取VM中的硬件信息。

    以获取PCI的信息为例. 基本代码: pci.py import base64 import guestfs from functools import partial import os impor ...

  9. nm命令中符号类型详解

    摘自http://blog.csdn.net/solmyr_biti/article/details/6565479 nm命令介绍的很多,但大多不介绍其函数符号标志的含义.最近在调试动态库时常用到,其 ...

  10. Python学习入门基础教程(learning Python)--5 Python文件处理

    本节主要讨论Python下的文件操作技术. 首先,要明白为何要学习或者说关系文件操作这件事?其实道理很简单,Python程序运行时,数据是存放在RAM里的,当Python程序运行结束后数据从RAM被清 ...