struts2(六)之ognl表达式与ActionContext、ValueStack
前言
前面已经把struts2讲内容说了一半了,我写的很详细,希望对博友们有帮助。
一、OGNL表达式语言概述
1.1、OGNL表达式简介
百度上是这样说:
OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目。Struts2框架使用OGNL作为默认的表达式语言。
它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的
结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
1.2、OGNL功能概述
对OGNL这5个作用进行讲解:
1)存取对象的任意属性,简单说就是对javabean进行操作(重要)
2)调用对象方法
3)调用类的静态方法
4)索引数组元素
5)操作集合(重 要)
1.4、OGNL表达式使用格式
操作之前必须知道如何使用OGNL表达式,并且了解OGNL表达式的取值范围只能在其context和root中,格式为:
Ognl.getValue(expression,context,root);
//expression:为我们编写的ognl表达式,从后两个参数中获取值,获取规则会从下面的例子中详细讲解
//context:ognl的上下文,类型为map,
//root:ognl的根,可以为javabean、list、map、.... 等等很多值
二、OGNL功能实现
2.1、对javabean进行操作
1)User.java
2)Address.java
3)获取javabean中的属性值
4)获取javabean中的对象的属性值
5)对javabean中的属性进行赋值操作
2.2、调用对象方法
2.3、调用类的静态方法或属性
这里获取静态方法和静态变量,不受方法或属性是否在root或者上下文中的限制。
编写user对象放入root中只是为了满足使用Ognl的条件,没有别的作用。
1)访问静态方法
调用系统的类的静态方法,调用编写的类的静态方法,都是一样的。
格式:@包名+类名@静态方法
例如:@java.util.UUID@randomUUID()
2)访问静态变量
格式:@包名+类名@静态变量名
例如:@java.lang.Math@PI
结果:
2.4、索引数组元素
2.5、操作集合
1)操作list集合
list结合本质就是一个数组,所以从list中读取数据跟对数组的操作是一样的。
2)操作map集合
取root下的map集合中的value值
格式:key 直接写上key,就能找到对应的value值,如果value值是一个对象,那么通过“.”来获取中的属性。
如果想获取上下文中的属性,因为上下文就是一个map,为了区分是从root下取还是从上下文中取。使用“#”区分
格式:#key
3)创建list集合
格式:{xxx,xxxx,xxxxx......}
4)创建map集合
格式:#{'key':'value','key':'value'}
2.6、其他用法
使用数学运算符,使用“,”号连接表达式,in与not in运算符,投影、过滤等操作就不讲解了,都非常简单,重点掌握上面的即可。
三、OGNL与Struts2的结合
从上面的例子中我们可以看出来OGNL的功能非常的强大,能对对象进行存取,能操作少数组、集合。那在struts2中是如何使用的呢?
OGNL中的上下文即struts2中的actionContext
OGNL中的root即struts2中的valueStack
ctionContext和valueStack是什么,他们之间什么关系?
3.1、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域中查找也能够获取到。
3.2、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); //任意值,以key-value的形式放入到了root中。
jsp获取
push存放,在root下,直接使用属性获取即可
set存放,通过属性也可以直接获得。这里要排除一个误区,就是不要觉得set方式是以键值对的方式存放,就觉得是放入了context中,并没有,还是在root中锝
context操作
ActionContext.getContext().put(key,value); //存放在actionContext中,也就是OGNL的context中
JSP获取:三种方式进行获取
#key获取。
直接使用key获取,因为值栈中也有context。只不过要从栈顶中的root开始找,然后在从context中查找
#request获取。因为struts2对request进行了增强,如果request域中找不到,则使用findValue(),从值栈中的root开始一路往下找。
3.3、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();
四、struts2中使用OGNL表达式获取数据
4.1、jsp页面中
大部分都会在这里使用,因为jsp就是显示数据的地方,在struts2中有很多s标签,通过s标签和OGNL表达式一起配置使用,就能拿到想要的数据了。
而OGNL的表达式的编写在最开始就已经讲解过了,context就是actionContext,root就是valueStack,剩下表达式就看我们需要什么了。
4.2、在struts.xml中
在struts.xml中有时候也需要用到OGNL表达式去拿一些数据。比如,在result中设置stream时,就需要从action中获取流,而action可以看成是javabean,
又在栈顶,所以直接使用OGNL表达式就能够获取到,但是注意特殊的,如果在你直接编写ognl表达式时struts2不能够区分出这是ognl表达式还是普通文
本,那么就需要使用${}来表明该段文本是ognl表达式。
struts2(六)之ognl表达式与ActionContext、ValueStack的更多相关文章
- (补充)9.Struts2中的OGNL表达式
OGNL表达式概述 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关 ...
- 【基于初学者的SSH】struts2 值栈的详解与struts2标签库+ognl表达式
一:什么是值栈:struts2里面本身提供的一种存储机制,类似于域对象,值栈,可以存值和取值 特点:先进后出,最上面的元素叫做栈顶,也叫压栈. <s:debug></s:debug& ...
- Struts2中的OGNL表达式
一.OGNL表达式简介 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目.所谓对象图,即以任意一个对象为根,通过OGNL可以访问 ...
- struts2简单入门-OGNL表达式
什么是OGNL表达式 Object-Graph Navigation Language的缩写. 可以遍历整个对象结构图,实现对象类型转换等功能的表达式. OGNL实际上是个Map集合,有一个上下文根对 ...
- struts2学习笔记--OGNL表达式1
struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...
- struts2中使用ognl表达式时各种符号的使用规则$,#,%
OGNL表达式struts2标签“%,#,$” 一.什么是OGNL,有什么特点? OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一 ...
- struts2框架之OGNL表达式概述(在代码中使用OGNL表达式)
1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象 * 通 ...
- 2018.11.24 struts2中的OGNL表达式及两者的结合
OGNL表达式 OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航. OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 理解图示 使用OGNL准备工 ...
- Struts2中使用OGNL表达式语言访问静态方法和静态属性
1.一定要在struts.xml配置文件中配置允许使用OGNL访问静态方法,否则不能使用OGNL访问静态方法 2.<s:property value="@com.gk.StaticTe ...
随机推荐
- 3D位置语音,引领吃鸡游戏体验升级
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 导语:在刚刚结束的首届腾讯用户开放日上,腾讯音视频实验室带着3D位置音效解决方案,向所有用户亮相,为用户提供360度立体空间的 ...
- ES6之Promise
Promise是一个对象,用来传递异步操作的消息,他有两个特点:第一对象的状态不受外界的影响,第二一旦状态改变就不会在变,任何时候都可以得到这个结果,他有两个参数分别是resolve(他的作用是将Pr ...
- python模拟shell执行脚本
工作时候需要模拟shell来执行任务,借助包paramkio import paramiko class ShellExec(object): host = '127.0.0.1' port = 36 ...
- 高级开发层面,针对Hibernate方面面试题的总结(对其它ORM也适用)
虽然目前mytabis用得比较多,但Hibernate相对比较容易上手,而且也有不少公司在用,所以本文就用这个举例,事实上,本文给出的面试建议也适用于各种ORM.本文摘自java web轻量级开发面试 ...
- axios配合vue+webpack使用
1.安装引用: cnpm install axios --save-dev 2.在组件中引入: import axios from 'axios'; 3.使用示例: 执行GET请求: // 为给定 I ...
- Android破解学习之路(六)——Android游戏 方块冒险 破解
前言: 可能大家看到标题会有些懵逼,以为我发错了,这应该是五才对吧,其实,五我已经发了,不过被管理大大移出首页了,不知道这一篇是不是也会是同样的命运.. 今天所写的是关于支付宝内购的破解 原版 链接: ...
- 论文笔记-Squeeze-and-Excitation Networks
作者提出为了增强网络的表达能力,现有的工作显示了加强空间编码的作用.在这篇论文里面,作者重点关注channel上的信息,提出了"Squeeze-and-Excitation"(SE ...
- \Process(sqlservr)\% Processor Time 计数器飙高
计数器" \Process(sqlservr)\% Processor Time",是经常监测,看看SQL Server如何消耗CPU资源.sqlserver是如何利用现有的资源; ...
- async await promise
async 异步函数,以后可能会用得很广. 1.箭头函数: 没有{ }时不写return 也有返回值 2.Promise : 异步神器,很多异步api都是基于Promise 3.new Promise ...
- php代码审计一些笔记
之前学习了seay法师的代码审计与及80sec的高级审计,整理了一些笔记在印象里面,也发到这里作为记录 1,漏洞挖掘与防范(基础篇) sql注入漏洞 挖掘经验:注意点:登录页面, ...