今天来说说ognl表达式在struts2中的运用。
--wh
一、什么是Ognl?
通过百度百科查询到的解释,其中详细的说明了OGNL的作用。
下面我们就对OGNL这5个作用进行讲解
1、存取对象的任意属性,简单说就是对javabean进行操作(重要)
2、调用对象方法。
3、调用类的静态方法
4、索引数组元素
5、操作集合(重 要)
二、OGNL的功能实现
操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为
Ognl.getValue(expression,context,root);
//expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解
//context:ognl的上下文,类型为map,
//root:ognl的根,可以为javabean、list、map、.... 等等很多值
2.1、对javabean进行操作
User.java
Address.java
获取javabean中的属性值
获取javabean中的对象的属性值
对javabean中的属性进行赋值操作
2.2、调用对象方法
2.3、调用类的静态方法或属性
2.4、索引数组元素
2.5、操作集合
操作list集合,list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。
操作map集合
创建list集合
创建map集合
2.6、其他用法,使用数学运算符,使用“,”号连接表达式,in与not in运算符,投影、过滤等操作就不讲解了,都非常简单,重点掌握上面的即可。
三、OGNL与struts2的结合
上面说了那么一大堆的OGNL的使用功能,我们也感受到了他的强大,啥都能取出来,表达式啥都能做,但是在struts2中它是如何使用的呢?
OGNL中的上下文即struts2中的actionContext
OGNL中的root即struts2中的valueStack
actionContext和valueStack是什么,他们之间什么关系?
3.1、ActionContext和valueStack(重要)
ActionContext:
充当OGNL的context。是action的上下文,也可以叫做action的数据中心,本质是一个map,在其中,所有的数据都存放在这里,那其中到底存放了哪些东西呢,actionContext中存放数据的方式又是怎样的?
actionContext是一个map,所以其中都是以键值对的形式存储对象,如下图所示,
request、session、application这种我们熟知的作用域,注意是作用域,而不是对象,
paramters:这个是表单提交的参数,全部都会放到这个map中,
attr(attributes):三个作用域所有的属性都会放在该map下,如果有重复的,那么以request域中的为准。
VALUE_STACK:值栈,存放着valueStack对象,也就是说,通过ActionContext能够获取到valueStack。
如果我们使用actionContext.put(); 那么会将该键值对直接放入到ActionContext下,
注意:除了request外,其他都可以直接通过getXxx()获得。而想要获取request作用域,必须通过key值的方式来获取。ActionContext.getContext().get("request"); 为什么这样呢?因为struts2对request进行了增强。从这里actionContext中是不能直接获取到的,request进行了怎样的增强呢?比如在actionContext中put了一个普通的key和value,该键值对并没有在request域中,但是在jsp中,通过在request域查找key,也能找到该键值对,底层进行了两步:第一步:从request域中查找数据,第二步:如果没有找到,将从值栈中执行findValue()。 这样就解释了为什么通过ActionContext不能直接获取request,并且为什么不在request作用域中的数据,而通过在request域中查找也能够获取到。
valueStack:值栈,本质是一个ArrayList,作用,充当ognl的root,给一次请求*享数据的功能。
内部图
root:源码中的名称为CompoundRoot,它也是一个栈,而每次值栈中入栈和出栈等操作其实就是对CompoundRoot进行对应的操作。
Context:对actionContext的引用,也就是通过valueStack也能够获取到上下文,通过getContext();
在我们访问一个action时,会将action加入到栈顶,也就是action会在CompoundRoot的栈顶,而我们提交的各种表单参数(充当了ognl表达式)会在valueStack从顶向下查找对应的属性进行赋值。这就是值栈的作用。
值栈的操作
这里提一下,知道了值栈的内部结构图,那么就好理解了。
action中手动向valueStack中放数据。
ActionContext.getContext().getValueStack().push(xxx); //一般是javabean,这样放是放在root中,因为push操作是对栈进行操作,也就是对root进行操作
ActionContext.getContext().getValueStack().set(key,value); //任意值,对context进行操作,存放到context中去了。
jsp获取
push存放,在root下,直接使用属性获取即可
set存放,在context中,因为也在值栈中,所以通过属性也可以直接获得。
context操作
ActionContext.getContext().put(key,value); //存放在actionContext中,也就是OGNL的context中
JSP获取:三种方式进行获取
#key获取。
直接使用key获取,因为值栈中也有context。只不过要从栈顶中的root开始找,然后在从context中查找
#request获取。因为struts2对request进行了增强,如果request域中找不到,则使用findValue(),从值栈中的root开始一路往下找。
3.2、ActionContext和valueStack的关系(重要)
你中有我,我中有你。
也就是说,通过valueStack可以获取到actionContext,通过ActionContext也可以获取到valueStack。
valueStack是对root进行操作,而actionContext是对context进行操作。(root和context是OGNL中的根和上下文)
获取值栈的方式:
ActionContext.getContext.getValueStack();//常用
ActionContext.getContext.get("VALUE_STACK");
request.getAttribute("VALUE_STACK"); //这个为什么可以?因为request进行了增强。详情看上面的解释。
获取actionContext的方式
ActionContext.getContext(); //常用
valueStack.getContext();
3.3、struts2不同的地方使用OGNL表达式获取数据
3.3.4、在jsp页面中
大部分都会在这里使用,因为jsp就是显示数据的地方,在struts2中有很多s标签,通过s标签和OGNL表达式一起配置使用,就能拿到想要的数据了。而OGNL的表达式的编写在最开始就已经讲解过了,context就是actionContext,root就是valueStack,剩下表达式就看我们需要什么了。标签的讲解会在下一章
3.3.5、在struts.xml中
在struts.xml中有时候也需要用到OGNL表达式去拿一些数据。比如,在result中设置stream时,就需要从action中获取流,而action可以看成是javabean,又在栈顶,所以直接使用OGNL表达式就能够获取到,但是注意特殊的,如果在你直接编写ognl表达式时struts2不能够区分出这是ognl表达式还是普通文本,那么就需要使用${}来表明该段文本是ognl表达式
四、总结
struts2我觉得最重要的两点,
一、理解它的架构图,知道大概的流程,
二、该篇文章讲解的值栈,actionContext,ognl的关系,
这两个弄懂了,基本上没什么难得倒我们了,在写三到四篇文章就可以把struts2给结束掉,还差的知识点有,s标签的使用、国际化、还有文件上传和下载的功能详细讲解,最后通过小项目将struts使用起来,就完了。
struts2(四) ognl表达式、值栈、actionContext之间的关系的更多相关文章
-
框架学习之Struts2(三)---OGNL和值栈
一.OGNL概述 1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对 ...
-
Struts2 (三) — OGNL与值栈
一.OGNL表达式 1.概述 1.1什么是OGNL OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...
-
Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
-
Struts2笔记3--获取ServletAPI和OGNL与值栈
获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...
-
struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象
struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...
-
(转)OGNL与值栈
http://blog.csdn.net/yerenyuan_pku/article/details/67709693 OGNL的概述 什么是OGNL 据度娘所说: OGNL是Object-Graph ...
-
Struts2学习(四)———— ognl表达式、值栈、actionContext之间的关系
一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任意属性,简单说就是对javabean进行操作(重要) 2.调用 ...
-
Struts2之 OGNL表达式和值栈
技术分析之OGNL表达式概述(了解) 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意 ...
-
Struts2知识点小结(三)--值栈与ognl表达式
1.问题一 : 什么是值栈 ValueStack 回顾web阶段 数据交互问题? 客户端提交数据 到 服务器端 request接受数据+BeanUtils实体封装 ...
随机推荐
-
WPF入门教程系列十八——WPF中的数据绑定(四)
六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会 ...
-
1.NSNotification|远程通知|本地通知|激光推送
1. 通知在iOS中应用非常广泛,合理的应用通知可以减少冗余代码,使我们的代码层次结构变了更加的清晰明了,利于程序猿读写.它主要分为不可见通知可见通知两种: 1.1 不可见通知,主要是有系统发出的 ...
-
[翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续
英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...
-
Emule Xtreme Kid eD2K 设置
设置udp和tcp端口: 测试结果必须为通过,若不通过, 1.请将主机ip丢入路由器DMZ区(设置将以上端口与本机ip地址绑定) 2.在windows防火墙中加入以上端口允许通行项 测试结果: 其它一 ...
-
jquery1.0源码【1-60行】构造函数及全局$变量
一.jquery源码1-60行 该部分代码主要完成jquery对象的创建,以及全局变量$与jQurey类的映射: /* * jQuery - New Wave Javascript * * Copyr ...
-
C#编写QQ找茬外挂
QQ找茬外挂,用C#代码编写. 使用方法 这个工具的主要运行流程很简单:游戏截图->比较图片->标记图片不同点.实现代码 截图的处理类ScreenCapture: /// /// 提供全屏 ...
-
java序列化是什么和反序列化和hadoop序列化
1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...
-
云笔记项目-MyBatis返回自增类型&;堆栈对象补充理解
在云笔记项目中,讲到了MySql的自增,MyBatis查询到自增类型数据后可以设置返回到参数属性,其中学习了MySql的自增写法,堆栈对象等知识. MySql数据类型自增 建立一张Person表,其中 ...
-
GROUP BY和 HAVING 及 统计函数 执行顺序等
[我理解:where是对最外层结果进行条件筛选,而having是对分组时分组中的数据进行 组内条件筛选,注意:只能进行筛选,不能进行统计或计算,所有统计或计算都要放在最外层的select 后面,无论是 ...
-
ios真机测试问题
前端页面在ios端真机测试出现的问题 由于苹果对于性能的要求是近乎苛刻,如果没有可点的特性的元素系统默认不会给它响应事件,因此真机测试时容易添加不上绑定事件 解决办法: 1.通过js判断当前是否为苹果 ...