OGNL表达式入门
package com.scorpion.ognl; import java.util.ArrayList;
import java.util.List; import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException; public class OgnlTest
{ /**
*
* Ognl实现了map接口
*
* @param args
* @throws OgnlException
*/
public static void main(String[] args) throws OgnlException
{
Person person = new Person();
person.setUsername("yujun"); Dog dog = new Dog();
dog.setUsername("laifu");
/**
* 生成ognl上下文对象
*/
OgnlContext context = new OgnlContext(); /**
* put方法是将对象放置到上下文,以便ognl进行读取解析
*
*/
context.put("person", person); context.put("dog", dog);
/**
* 设置根元素对象,假如直接读取属性,那么将从根元素寻找此属性值,比如person对象的username属性,
* 当我们将person设置为根元素后,那么parseExpression方法将从person里面寻找username
*/
context.setRoot(person); Object obj1 = Ognl.parseExpression("username"); System.out.println(obj1); Object obj2 = Ognl.getValue(obj1, context, context.getRoot()); System.out.println(obj2); Object obj3 = Ognl.parseExpression("#person.username"); System.out.println(obj3); Object obj4 = Ognl.getValue(obj3, context, context.getRoot()); System.out.println(obj4); Object obj5 = Ognl.parseExpression("#dog.username"); System.out.println(obj5); Object obj6 = Ognl.getValue(obj5, context, context.getRoot()); System.out.println(obj6); /**
* 获取username属性值的时候,相当于是隐式调用了对应的getUsername()方法
* 可以再去调用这个获得的字符串的相应的方法,比如说toUpperCase,还可以再调用length
*
*/
Object obj7 = Ognl.parseExpression("username.toUpperCase().length()"); System.out.println(obj7); Object obj8 = Ognl.getValue(obj7, context, context.getRoot()); System.out.println(obj8); /**
* 调用静态方法不需要生成对象,格式为\@package.className@methodName(parameters)\
* 当调用的类是java
* .lang.Math时,可以省略package.className,形式为@@methodName(parameter)
*/
Object obj9 = Ognl
.parseExpression("@java.lang.Integer@toBinaryString(10)"); System.out.println(obj9); Object obj10 = Ognl.getValue(obj9, context, context.getRoot()); System.out.println(obj10); /**
* 生成一个集合对象的使用方法,用花括号,里面用逗号,要访问某个值,只需要用下标访问即可 对于Ognl来说,集合与数组是一样的
*
*/
Object obj11 = Ognl.getValue("{'aa','ab','ac'}[2]", context,
context.getRoot()); System.out.println(obj11); dog.setFriends(new String[]
{ "aa", "bb", "cc" }); Object obj12 = Ognl.getValue("#dog.friends[1]", context,
context.getRoot()); System.out.println(obj12); List<String> list = new ArrayList<String>(); list.add("aaaaa");
list.add("bbb");
list.add("ccc"); context.put("list", list); Object obj13 = Ognl.getValue("#list[1]", context, context.getRoot()); System.out.println(obj13); /**
* Ognl处理映射(map)的语法格式 #{'key1':'value1','key2':'value2'};
*
* 如果要获得某个value,传递对应的key即可
*/ Object obj14 = Ognl.getValue("#{'key1':'value1','key2':'value2'}['key2']", context,
context.getRoot()); System.out.println(obj14); /**
* 过滤(filter)的表达式
*
* collection.{? expression}
*
*/
List<Person> persons = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setUsername("zhangsikkkk");
p2.setUsername("liwu");
p3.setUsername("zhaoliu"); persons.add(p1);
persons.add(p2);
persons.add(p3);
context.put("persons", persons);
/**
* 过滤操作,返回name值大于4的 #this代表persons对象,操作结果返回的是一个集合collection
* "#persons.{? #this.username.length() > 4}.isEmpty()"
* 返回的集合就可以调用集合的方法了,比如size(),比如isEmpty()
*
* 获取集合中的第一个元素 #persons.{? #this.username.length() >
* 4}[0].username,可以返回第一个元素的username属性 获取集合中的第一个元素(返回的是一个集合) #persons.{^
* #this.username.length() > 4},此表达式返回[perosn@hashcode]
*
* 返回符合条件的最后一个元素(返回的是一个元素) #persons.{$ #this.username.length() >
* 4},此表达式返回perosn@hashcode
*
*
*/
Object obj15 = Ognl.getValue("#persons.{? #this.username.length() > 4}.size()", context,
context.getRoot()); System.out.println(obj15); /**
* 投影(projection)表达式 collection.{expression} 过滤是取行,投影是取列
* #persons.{username} 返回三个名字的集合
* 下面这个表达式将名字长度小于5的替换成hello world
* #persons.{#this.username.length() <= 5 ? 'hello world' : #this.name}
*/
Object obj16 = Ognl.getValue("#persons.{username}.size()", context,
context.getRoot()); System.out.println(obj16); Object obj17 = Ognl.getValue("#persons.{#this.username.length() <= 5 ? 'hello world' : #this.username}",
context, context.getRoot()); System.out.println(obj17); } }
OGNL表达式入门的更多相关文章
- 20160502-struts2入门--ognl表达式
一.OGNL表达式语言 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言 ...
- struts2简单入门-OGNL表达式
什么是OGNL表达式 Object-Graph Navigation Language的缩写. 可以遍历整个对象结构图,实现对象类型转换等功能的表达式. OGNL实际上是个Map集合,有一个上下文根对 ...
- MyBatis OGNL表达式用法
From<MyBatis从入门到精通> <!-- 4.7 OGNL用法 MyBatis常用的OGNL表达式: e1 or e2: e1 and e2 e1 == e2; e1 != ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
- Struts2深入学习:OGNL表达式原理
今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1
- Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
- struts2学习笔记--OGNL表达式1
struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...
- struts2 OGNL表达式
一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...
- Java Lambda表达式入门
Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...
随机推荐
- Docker从容器拷贝文件到宿主机或从宿主机拷贝文件到容器
1.从容器里面拷文件到宿主机? 答:在宿主机里面执行以下命令 docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径 示例: 假设容器名为testtomcat, ...
- win10 删除WPS提示存在wpsupdate.exe进程
这个进程在:WIN10 任务管理器 的"详细列表"查找可能有1-2个类似的,全部关闭才能删除
- 你有没有乱用“leader”,担当是个好东西
PS:此文为个人认知,不足处请多多批评. 近期在一线leader(经理)身上发现了几个case,然后又回想起前几年自己做的一些傻事,可能都属于明面上leader不会说什么,但私下会有情绪的类型: Ca ...
- Pycharm关联gitlab(http方式)
Pycharm支持关联gitlab仓库,关联后对远端项目的克隆和提交都很方便.当初笔者在关联时遇到了很多坑,网上也没找到相关解决办法,所以在这里分享下完整的关联过程. 一.安装git 下载地址http ...
- 字符串匹配算法(三)-KMP算法
今天我们来聊一下字符串匹配算法里最著名的算法-KMP算法,KMP算法的全称是 Knuth Morris Pratt 算法,是根据三位作者(D.E.Knuth,J.H.Morris 和 V.R.Prat ...
- OpenFaaS实战之四:模板操作(template)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- js 倒计时退出
<p>您已提交成功!<span id='submit_second'></span></p> $("#submit_second") ...
- 租了一台华为云耀云服务器,却直接被封公网ip,而且是官方的bug导致!
小弟在博客园也有十多个年头了,因为离开了.net圈子,所以很少发文,今天可算是被华为云气疯了.写下这篇文章,大家也要注意自查一下,避免无端端被封公网ip. 因为小弟创业公司业务发展,需要一个公网做宣传 ...
- 最高级的AutoHotkey重试源代码结构20191221.docx
;; 最高级的AutoHotkey重试源代码结构20191221.docx;; 在编写AutoHotkey脚本时经常要用到重试,; 单击控件无效时需要重新再单击,; 发送模拟按键无效时需要重新发送.; ...
- 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别
前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...