Struts2的Stack Context和ValueStack

简介: 1、提到Struts2的传值功能时,经常会见到Stack Context和ValueStack等概念,那么它们到底是什么,有什么作用呢。ValueStack(值栈):Struts2将OGNL上下文设置为Struts2中的ActionContext(内部使用的仍然是OgnlContext),并将值栈设为OGNL的根对象。ActionContext:一次Action调用都会创建一个Acti

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 

目录
相关文章
|
编解码 Linux Android开发
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
安卓投屏神器 Scrcpy 安装与使用(支持 Mac、Windows、Linux)
38588 1
|
11月前
|
存储 JSON 算法
N 种值得一看的前后端鉴权方案
先赞后看,Java进阶一大半各位hao,我是南哥。记得前几天南哥在牛客看到一条面试题:工作的鉴权怎么做的,了解常用的鉴权方案吗?不得不说,哪怕进入一家小型的互联网公司,他们的鉴权方案这类基础建设早已搭建好,在工作中用到的更多是前人搭建好的方案。遇到这道题,如果自己没去提前了解,回答起来容易太浅显。
398 1
N 种值得一看的前后端鉴权方案
|
移动开发 开发框架 .NET
TIOBE 6月榜单:Visual Basic排名下滑
【6月更文挑战第21天】### TIOBE 2023年6月编程语言指数:VB跌至第9 Visual Basic在编程语言排名中从第7位降至第9位,反映出市场竞争和技术趋势变化。VB,以其直观设计和易用性成名,面临C#、Web及移动开发语言崛起的挑战。排名下滑源于技术进步、教育偏好的转移及生态系统竞争。VB需适应新技术,如.NET Core,以维持生命力。教育市场和社区支持将是VB未来发展的关键,通过整合现代技术、项目导向学习和在线资源,VB可能在特定领域找到新机遇。
284 6
|
JavaScript Java 关系型数据库
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的网上鲜花商城管理系统。Javaee项目,springboot vue前后端分离项目。
|
中间件 数据挖掘 API
ERP系统的系统集成与接口管理:实现高效协同
【7月更文挑战第29天】 ERP系统的系统集成与接口管理:实现高效协同
1069 0
|
流计算 开发者 SEO
常用标签调用代码
这段内容介绍了DedeCMS内容管理系统中常用的标签调用代码,涵盖网站标题、描述、导航、文章列表及详情、SEO优化等多个方面。通过这些标签,用户可以轻松实现如网站首页标题和描述的调用、文章标题与内容展示、栏目导航生成、分页功能实现等功能,帮助网站开发者快速构建和管理网站内容。
185 0
|
域名解析 缓存 网络协议
关于错误ERR_NAME_NOT_RESOLVED
如果以上方法都未能解决问题,你可能需要联系你的网络管理员或互联网服务提供商以获取更多帮助,或者考虑尝试在不同的网络环境中访问网站。
4943 0
|
移动开发 监控 前端开发
2023 年大淘宝 Web 端技术概览
2022 年,大淘宝前端团队进行了调整:重新组织生产关系,按业务线拆分整合进对应的业务技术团队,同时保留了大前端虚线组织,确保研发基建的一致性、技术的持续投入以及推进人员的成长。 整个变化涉及超过三百人的前端团队,经过了半年多的运转,整个团队在技术上也进行了对应的聚焦和收敛。 新的组织协作形态下,大淘宝 Web 领域的工程师们正在做哪些技术工作、有什么技术产品,特在 2023 年开年之际向行业前端同学进行分享。
4227 1
2023 年大淘宝 Web 端技术概览
|
存储 流计算 索引
一个简单的时间窗口设计与实现
时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数据,则丢掉 一个简单的实现就是用一个队列来做,新的数据在对头添加;同时起一个线程,不断的询问队尾的数据是否过期,如果过期则丢掉 另外一中场景需要利用到这个时间窗口内的数据进行计算,如计算着五分钟交易中资金的流入流出总和,如果依然用上面的这种方式,会有什么问题?
600 0
一个简单的时间窗口设计与实现
|
JavaScript 前端开发 Unix
1.C 语言简介
1.C 语言简介
290 0