OGNL详解
A.什么是OGNL?
全称叫ObjectGraphic Navigation Language(对象图导航语言),它是struts2框架里面的第三方语言(即可以再别的地方用,struts2只是拿过来了而已),它可以调用对象中的方法,获取struts2里值栈的数据,具体优点https://baike.baidu.com/item/OGNL/10365326?fr=aladdin
B.OGNL的三要素
表达式:OGNL表达式是功能强大的表达式语言,何解?在ognl中想要执行取值,赋值,调用方法等等操作,你都需要用表达式表示。通过表达式,底层会解析出来你的想要操作。它支持链式结构
根对象:即root对象,可以理解为OGNL的操作对象,表达式规定做什么,而该对象就指定对谁操作。OGNL叫做对象图导航语言,对象图就是以任意一个对象作为根,通过OGNL可以访问到与这个对象相关的其他对象。底层使用list集合做的。
Context对象:其实就是OGNL的上下文环境。root对象也在OGNL的上下文环境里,底层是一个Map集合。该上下文环境规定了OGNL操作在“哪里进行”,注意访问context对象时候需要在表达式中加上#。
C.OGNL在java环境的运用。
---导入OGNL jar包
---用法:
1.OGNL调用对象的方法
@Test
public void demo1() {
try {
// 创建context对象
OgnlContext context = new OgnlContext();
// 利用context来获取root对象
Object root = context.getRoot();
// Ognl中的静态方法getValue(expression, context, root, resultType)可以用来获取数据
Object value = Ognl.getValue("'helloworld'.length()", context, root); //expression就是方法表达式
System.out.println(value.toString());
} catch (OgnlException e) {
e.printStackTrace();
}
}
运行结果

2.利用ognl访问类中的静态方法
@Test
public void demo2() {
try {
// 创建context对象
OgnlContext context = new OgnlContext();
// 利用context来获取root对象
Object root = context.getRoot();
// Ognl中的静态方法getValue(expression, context, root, resultType)可以用来获取数据
Object value = Ognl.getValue("@java.lang.Math@random()", context, root); //这里注意获取静态方法表达式是固定表达: @类名@方法名
System.out.println(value.toString());
} catch (OgnlException e) {
e.printStackTrace();
}
}
运行结果

3.获取root区中的数据
创建context对象
OgnlContext context = new OgnlContext();
//注意,这里不能在getValue方法外面初始化获取root对象,不然导致该root为null,传进方法里面,由于root在外面已经被定义,方法底层就不会帮助创建赋值,直接报异常,name值根本不会再存
Object root = context.getRoot();
System.out.println(root);
// 向root区域存值,setRoot(Object obj),root就是通过一个对象找到与它关联的对象,所以只能用来存对象类型
User user = new User();
user.setName("张三");
context.setRoot(user);
// root的取值不需要加上#,它是ognl内部的,所以不需要加#来特意告诉ognl
String value;
try {
value = (String) Ognl.getValue("name", context, context.getRoot());
System.out.println(value);
} catch (OgnlException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
运行结果

4.获取context区域的值
@Test
public void demo4() {
// 创建context对象
OgnlContext context = new OgnlContext();
// 利用context来获取root对象
Object root = context.getRoot();
// 向context区域存值,set一般向里面存对象,而context区域用put是存值
context.put("name","张萨姆");
String value;
try {
// root的取值不需要加上#,它是ognl内部的,所以不需要加#来特意告诉ognl,而context区域上该ognl的所处的上下文环境,外部,要加上#说明
value = (String) Ognl.getValue("#name", context, root);
System.out.println(value);
} catch (OgnlException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
运行结果

D.ognl在struts2环境的介绍
如果是jsp页面,需要先引入ognl标签库才能用
<%@ taglib uri="/struts-tags" prefix="s" %>
1.访问对象中的方法
<h3>访问对象中的方法</h3>
<s:property value="'helloworld'.substring(5)"/> //剪切字符串
运行结果

2.访问静态方法
注意:struts2中默认静态访问方法是关闭的,怎么查看了,打开library---->/org/apache/struts2---->default.properties.所以我们需要手动在struts.xml文件里面开启它,才能实现静态访问

<struts>
<!-- 开启静态方法访问常量 -->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
<package name="struts" extends="struts-default"></package>
</struts>

运行结果:

后面获取root还有context区域的值就涉及到了值栈的知识了,后面继续,还涉及到了在值栈存值的知识。当然在jsp中获取contex和root存值,也可以在jsp中利用ognl表达式取值,但是用action比较正规一点。先大致看一下,什么都不存时候context区域
<h3>访问context区域</h3>
<s:property value="#session"/>
<s:debug/>
运行结果


看到了吧,取到了session,但是session里面什么样子,拿到就有哪些值,所以后面值栈继续。
好了,就讲到这里。
OGNL详解的更多相关文章
- Strust OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- struts2中的OGNL详解
先了解一下OGNL的概念 OGNL的全名称Object Graph Navigation Language.全称为对象图导航语言,是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取J ...
- Struts2_ValueStack,OGNL详解(转)
原文地址:http://blog.csdn.net/wyply115/article/details/8257140 一.OGNL表达式 1.ognl是struts2中使用的一种表达式语言,可用于js ...
- Struts2_ValueStack,OGNL详解
一.ValueStack 1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用实现了Value ...
- java框架篇---struts之OGNL详解
OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...
- Struts2中的OGNL详解 《转》
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- struts OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- struts2中的ognl详解,摘抄
http://blog.csdn.net/tjcyjd/article/details/6850203 很全很细致,自己再分析原理进阶
- MyBatis的动态SQL详解
MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...
随机推荐
- ASP.NET Core的实时库: SignalR简介及使用
大纲 本系列会分为2-3篇文章. 第一篇介绍了SignalR的预备知识和原理 本文介绍SignalR以及ASP.NET Core里使用SignalR. 本文的内容: 介绍SignalR 在ASP.NE ...
- TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)
这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...
- JavaWeb 乱码问题终极解决方案!
经常有读者在公众号上问 JavaWeb 乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因都不一样,给每位小伙伴都把乱码的原因讲一遍也挺费时间的 ...
- 学习 JavaScript (四)核心概念:操作符
JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,前面三个上一篇文章已经讲解完了.后面三个内容超级多,这篇文章主要讲解的是操作符. 操作符 什么叫做操作符? 这是一种 ...
- [翻译 EF Core in Action 1.6]你的第一个EF Core应用程序
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- transition-timing-function 属性
以相同的速度从开始到结束的过渡效果: div { transition-timing-function: linear; -moz-transition-timing-function: linear ...
- 企业自主可控免费开源ERP:Odoo采购管理解决方案
供应商基础资料 1. 所有的供应商基础资料,Odoo开账启用时,期初的客户数据如果大于200条,可以批量导入: 2. 点“采购/采购/供应商”菜单可以查看.编辑修改.搜索所有的供应商基础资料: 3. ...
- Git常用简介
Git是什么 git是目前最先进的分布式版本控制系统,它的核心架构如下图所示,分为四个核心区域.git的常用命令主要是关于这四个区域. 本地工作区-work 本地工作区就是我们实际电脑中的文件夹以及文 ...
- Socket深度探索 4 PHP(转)
[连载] Socket 深度探索 4 PHP (一) [连载] Socket 深度探究 4 PHP (二) [连载] Socket 深度探究 4 PHP (三)
- [20190402]关于semtimedop函数调用2.txt
[20190402]关于semtimedop函数调用2.txt --//前几天做了sql语句在mutexes上的探究.今天看看_mutex_wait_time设置很大的情况下是否semtimedop会 ...