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详解的更多相关文章

  1. Strust OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  2. struts2中的OGNL详解

    先了解一下OGNL的概念 OGNL的全名称Object Graph Navigation Language.全称为对象图导航语言,是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取J ...

  3. Struts2_ValueStack,OGNL详解(转)

    原文地址:http://blog.csdn.net/wyply115/article/details/8257140 一.OGNL表达式 1.ognl是struts2中使用的一种表达式语言,可用于js ...

  4. Struts2_ValueStack,OGNL详解

    一.ValueStack    1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用实现了Value ...

  5. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  6. Struts2中的OGNL详解 《转》

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. struts OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  8. struts2中的ognl详解,摘抄

    http://blog.csdn.net/tjcyjd/article/details/6850203     很全很细致,自己再分析原理进阶

  9. MyBatis的动态SQL详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它 ...

随机推荐

  1. 基于SpringBoot从零构建博客网站 - 技术选型和整合开发环境

    技术选型和整合开发环境 1.技术选型 博客网站是基于SpringBoot整合其它模块而开发的,那么每个模块选择的技术如下: SpringBoot版本选择目前较新的2.1.1.RELEASE版本 持久化 ...

  2. Gradle入门到实战(一) — 全面了解Gradle

    声明:本文来自汪磊的博客,转载请注明出处 可关注个人公众号,那里更新更及时,阅读体验更好:  友情提示由于文章是从个人公众号拷贝过来整理的,发现图片没有正常显示,没关注公众号的同学可通过如下链接查看: ...

  3. H5 新特性之 fileReader 实现本地图片视频资源的预览

    大家好 !!  又见面了, 今天我们来搞一搞   H5的新增API    FileReader     真是一个超级超级方便的API呢!!!很多场景都可以使用.......... 我们先不赘述MDN文 ...

  4. 排序算法——(2)Python实现十大常用排序算法

    上期为大家讲解了排序算法常见的几个概念: 相关性:排序时是否需要比较元素 稳定性:相同元素排序后是否可能打乱 时间空间复杂度:随着元素增加时间和空间随之变化的函数 如果有遗忘的同学可以看排序算法——( ...

  5. 深度召回模型在QQ看点推荐中的应用实践

    本文由云+社区发表 作者:腾讯技术工程 导语:最近几年来,深度学习在推荐系统领域中取得了不少成果,相比传统的推荐方法,深度学习有着自己独到的优势.我们团队在QQ看点的图文推荐中也尝试了一些深度学习方法 ...

  6. Flutter 即学即用系列博客——02 一个纯 Flutter Demo 说明

    前言 上一篇文章我们搭建好了 Flutter 的开发环境. Flutter 即学即用--01 环境搭建 这一篇我们通过 Flutter 的一个 Demo 来了解下 Flutter. 开发系统:MAC ...

  7. windows防火墙实验-命令行设置远程桌面连接以及禁止浏览器上网

    windows防火墙实验-设置远程桌面连接以及禁止浏览器上网 实验环境: 1.win2008远程桌面服务 2.win7-1 10.10.10.136 3.win7-2 10.10.10.153 实验步 ...

  8. Django-CSRF跨站请求伪造防护

    前言 CSRF全称Cross-site request forgery(跨站请求伪造),是一种网络的攻击方式,也被称为“One Click Attack”或者Session Riding,通常缩写为C ...

  9. ASP.NET Aries 高级开发教程:Excel导入之代码编写(番外篇)

    前言: 以许框架提供的导入配置功能,已经能解决95%以上的导入情况,但有些情况总归还是得代码来解决. 本篇介绍与导入相关的代码. 1.前端追加导入时Post的参数: var grid = new AR ...

  10. 再谈AbstractQueuedSynchronizer3:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...