struts ValueStack 详解
一、ValueStack 1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用 实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.
2.ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象.
3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了
4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
(1)其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法:push(),和pop()方法,
用来对root对象中所包含的数据进行存取.正是由于这两个方法,CompoundRoot变成了一个栈结构. struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.
(2)其中的context对象是OgnlContext,它实现了map接口,在valuestack的默认实现类中,即OgnlValueStack类中,
调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可知,
此方法返回的是一个OgnlContext对象.
5.获取ValueStack的三种方式
(1)ValueStack valueStack = ActionContext.getContext().getValueStack();
ActionContext为Action的上下文,其中有重要的6大对象
* valueStack,parameters,request,session,application,attr
* 而ognl表达式必须选择AcitonContext中的一个对象作为根对象(root),默认为valueStack,因此访问valueStack中的数据不加#
而如果要使用另外5个对象作为根对象,需要加#前缀.
(2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());
ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.
(3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
6.ValueStack内存结构图

7.常用的存储数据的方法
(1)向map栈中存数据,即ValueStack中的context(OgnlContext)
* 通过request,session等向map中存储数据
ServletActionContext.getRequest().setAttribute("username","joey");
ServletActionContext.getSession().put("pwd","123");
* 直接向map栈中放数据
ActionContext.getContext().put("msg","how you doing");
(2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象
* 先得到root,再把数据压入到root中,这中方式是放入到栈底.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(new Person());
* 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.
* 存放一个map到对象栈中
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.
* 利用valueStack的push方法把一个对象直接压入栈顶
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.push(new Person());
8.利用OGNL表达式取ValueStack中的数据
(1)<s:property />:取栈顶的元素.
(2)<s:iterator />:取栈顶的元素.
注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.
二、ognl
1.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性. 它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中.
2.Root对象 OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象. 例如:
public class User{
private String username;
private Group group;
//省略setter,getter方法
}
public class Group{
private String name;
private Organization org;
//省略setter,getter方法
}
public class Organization{
private String orgId;
//省略setter,getter方法
}
以上三个类,描述了通过一个User对象,同过User对象可以导航到Group对象,进而导航到Organization对象.
以User为根,通过基本的getters方法,可以访问到此根对象的其它关联对象.【对象图的导航,必须通过getters方法导航】
注意: * 导航的目的,就是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法.
* OGNL表达式语言的真正目的,是为了在那些不能写java代码的地方执行java代码,或者是为了更方便的执行java代码.
3.Context对象
* 在OGNL表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到
Map中即可.而这个Map对象称为Context
* 要在表达式访问到context中的对象,需要使用"#对象名称"的语法规则.
* 存在context的主要原因就是在OGNL中,不支持多个root对象,而如果需要在表达式中访问多个毫不相关的对象时,
只能通过一个Map来把这些对象统一传递给OGNL.
struts ValueStack 详解的更多相关文章
- Struts功能详解——ActionMapping对象
Struts功能详解——ActionMapping对象 ActionMapping描述了struts中用户请求路径和Action的映射关系,在struts中每个ActionMapping都是通过pat ...
- struts2之配置文件struts.xml详解
struts配置文件 struts.xml配置参数详解 struts.xml中很大一部分配置默认配置就好了 但是有些还是需要做了解 以便于理解 和修改 <?xml version=" ...
- Struts2初学 struts.xml详解 一
一.简介 Struts 2是一个MVC框架,以WebWork设计思想为核心,吸收了Struts 1的部分优点 二.详解 首先让我们看一下一个简单的struts.xml文件的结构 < ...
- Struts2第九篇【OGNL、valueStack详解】
什么是OGNL表达式? OGNL是Object Graphic Navigation Language 是操作对象属性的开源表达式. Struts2框架使用OGNL作为默认的表达式语言. 为什么我们学 ...
- Strus2中关于ValueStack详解
什么是ValueStack 它是一个接口com.opensymphony.xwork2.util.ValueStack.我们使用它是将其做为一个容器,用于携带action数据到页面.在页面上通过ogn ...
- Struts基础详解
1.web.xml配置: <filter> <filter-name>Struts2</filter-name> <filter-class> org. ...
- struts OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- Struts配置详解
一.Stuts的元素 1 web.xml 任何一个web应用程序都是基于请求响应模式进行构建的,所以无论采用哪种MVC框架,都离不开web.xml文件的配置.换句话说,web.xml并不是Struts ...
- strus2 struts.xml详解
<struts> <!-- 配置一个包:package --> <package name="demo1" extends="struts- ...
随机推荐
- UVA Live Archive 4394 String painter(区间dp)
区间dp,两个str一起考虑很难转移. 看了别人题解以后才知道是做两次dp. dp1.str1最坏情况下和str2完全不相同,相当于从空白串开始刷. 对于一个区间,有两种刷法,一起刷,或者分开来刷. ...
- Go - 环境安装
目录 你好,Go语言 环境安装 目录结构 命令 开发工具 学习网址 小结 你好,Go语言 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. 因工作需要,准备入坑,先从环境安装开始 ...
- SQL小知识_长期总结
1. 左联接右联接区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner ...
- sass安装更新及卸载方法
在 Windows 平台下安装 Ruby 需要先有 Ruby 安装包,大家可以到 Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本 ...
- java的模运算
在学习某个加密算法的时候留意到模运算,仔细查了资料后才注意到Java中的 % 其实是取余而不是取模,但是百度的时候找到的很多文章都把Java的 % 直接当成取模来用了,为了少踩坑所以自己整理了一下写了 ...
- 通过sudo提权方式控制公司人员权限
#通过visudo编辑/etc/sudoers Runas_Alias OP = root #定义使用sudo的时候以哪个用户执行命令,一般都是使用root #命令别名 Cmnd_Alias NETW ...
- vue.js 服务端渲染nuxt.js反向代理nginx部署
vue.js的官方介绍里可能提到过nuxt.js,我也不太清楚我怎么找到这个的 最近项目vue.js是主流了,当有些优化需求过来后,vue还是有点力不从心, 比如SEO的优化,由于vue在初始化完成之 ...
- JS的四舍五入问题
最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...
- thinkphp3.2.3如何只改变地址url中的某一个分隔符,其它保持不变
今天教大家一个关于使用thinkphp3.2.3改变只改变地址url中的某一个分隔符的方法,首先大家来看看这个地址! 它的原始地址应该是/Home/Index/index/page/2.html,那我 ...
- JZOJ 4722. 跳楼机
Description DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天大楼.由于前来学习的蒟蒻越来越多,srwudi改造了一个跳楼机,使得访客可以更方 ...