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标签库才能用

1.访问对象中的方法

访问对象中的方法

//剪切字符串

运行结果

2.访问静态方法

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

运行结果:

后面获取root还有context区域的值就涉及到了值栈的知识了,后面继续,还涉及到了在值栈存值的知识。当然在jsp中获取contex和root存值,也可以在jsp中利用ognl表达式取值,但是用action比较正规一点。先大致看一下,什么都不存时候context区域

访问context区域

运行结果

看到了吧,取到了session,但是session里面什么样子,拿到就有哪些值,所以后面值栈继续。

好了,就讲到这里。

希望与广大网友互动??

点此进行留言吧!

java ognl 性能_OGNL详解相关推荐

  1. java ognl表达式 与struts2标签_Struts2 OGNL表达式实例详解

    Object Graph Navigation Language:对象图导航语言,就是用点来访问成员变量 例1: struts.xml: /ognl.jsp OgnlAction1.java: pac ...

  2. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  3. 蘑菇街2015校招 Java研发笔试题 详解,2015java

    蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A.  父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B.  改变 ...

  4. Java 内存模型 JMM 详解

    转载自 Java 内存模型 JMM 详解 JMM简介 Java Memory Model简称JMM, 是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见性.是否可以重排序等问题的无关具体 ...

  5. Java基础:volatile详解

    Java基础:volatile详解 1.volatile保证可见性 1.1.什么是JMM模型? 1.2.volatile保证可见性的代码验证 1.2.1.无可见性代码验证 1.2.1.volatile ...

  6. Java内存模型(JMM)详解

    在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...

  7. Java虚拟机(Jvm详解)

    Java虚拟机(Jvm详解) 总体知识点框架 1.运行时数据区域 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) Java 虚拟机规范对 ...

  8. Java 并发之 AQS 详解(上)

    Java 并发之 AQS 详解 前言 Java SDK 为什么要设计 Lock 死锁问题 synchronized 的局限性 显式锁 Lock Lock 使用范式 Lock 是怎样起到锁的作用呢? 队 ...

  9. Java JUC并发编程详解

    Java JUC并发编程详解 1. JUC概述 1.1 JUC简介 1.2 进程与线程 1.2 并发与并行 1.3 用户线程和守护线程 2. Lock接口 2.1 Synchronized 2.2 什 ...

最新文章

  1. VC++ 查看C++代码的汇编代码列表
  2. 推荐一个Python GUI神器,双手彻底解放!
  3. php 微信开发 菜单,微信公众号中个性化菜单的开发实例
  4. 牛客网剑指offer编程实践41-50题
  5. 【cocos2d-x】2.0升级为3.0一些常见变化纪录
  6. matlab 的excel 对象,MATLAB 中的 COM 对象
  7. 教室信息管理系统mysql_教师信息管理系统(方式一:数据库为oracle数据库;方式二:存储在文件中)...
  8. 认清当下的努力,可能毫无意义
  9. 深度学习笔记(37) 交并比
  10. 老对手 Intel 与 AMD 也开始合作打造新品了,Nvidia 怎么看?
  11. 《Linux编程》上机作业 ·002【Linux常用工具GCC、GDB、Make】
  12. 「leetcode」513.找树左下角的值(详解)
  13. 【事件驱动】【数码管识别】 封装成DLL的函数的梳理
  14. Ubuntu 18.04.04 安装显卡驱动 nvidia安装
  15. 【Postgresql】pg截取第一个和最后一个字符
  16. Android 状态栏常规操作(状态栏显示,状态栏颜色,沉浸式状态栏)
  17. Gentoo Linux,Gentoo Linux是什么
  18. 观大数据有感_读《大数据时代》有感-大数据时代的取舍
  19. 【侯捷 C++ 面向对象高级开发】课程笔记以及个人注释(附带课程资源)
  20. Scratch3.0创意编程(基础篇):第4课 算数小达人

热门文章

  1. jupyter qtconsole 配置文件的生成和修改
  2. debian10 简单的CA使用
  3. Pytorch的网络结构可视化(tensorboardX)(详细)
  4. pip 指定目录安装
  5. LeetCode简单题之键盘行
  6. MegEngine推理性能优化
  7. 实时实例分割的Deep Snake:CVPR2020论文点评
  8. 2021年大数据Flink(四十八):扩展阅读  Streaming File Sink
  9. 【C语言】数组指针与指针数组的区分与应用
  10. Android 通过创建一个类来传递对象