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表达式入门的更多相关文章

  1. 20160502-struts2入门--ognl表达式

    一.OGNL表达式语言 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言 ...

  2. struts2简单入门-OGNL表达式

    什么是OGNL表达式 Object-Graph Navigation Language的缩写. 可以遍历整个对象结构图,实现对象类型转换等功能的表达式. OGNL实际上是个Map集合,有一个上下文根对 ...

  3. MyBatis OGNL表达式用法

    From<MyBatis从入门到精通> <!-- 4.7 OGNL用法 MyBatis常用的OGNL表达式: e1 or e2: e1 and e2 e1 == e2; e1 != ...

  4. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  5. Struts2深入学习:OGNL表达式原理

    今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1

  6. Struts2的OGNL表达式语言

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

  7. struts2学习笔记--OGNL表达式1

    struts2标签库主要使用的是OGNL语言,类似于El表达式,但是强大得多,它是一种操作对象属性的表达式语言,OGNL有自己的优点: 能够访问对象的方法,如list.size(); 能够访问静态属性 ...

  8. struts2 OGNL表达式

    一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...

  9. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

随机推荐

  1. Django 基础05篇 上下文管理和前端代码复用

    一.上下文管理器 在views中重复使用的代码,可以通过上下文管理器(在setting.py文件中的TEMPLATES中配置)中实现,减少代码冗余 上下文管理器的处理流程如下: 1.先走完views里 ...

  2. PAT乙级:1053 住房空置率 (20分)

    PAT乙级:1053 住房空置率 (20分) 题干 在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断.判断方法如下: 在观察期内,若存在超过一半的日子用电量低于某给 ...

  3. 【剑指offer】27. 二叉树的镜像

    剑指 Offer 27. 二叉树的镜像 知识点:二叉树:递归:栈 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像. 示例 输入:root = [4,2,7,1,3,6,9] 输出:[4, ...

  4. 2019 Mac下安装运行Homestead环境

    为了能提高自己的价值,还是要坚持学习新东西才行.这不,从多学会一个PHP开发框架开始.在开始使用Laravel之前,很多"经验"告诉我要先安装Homestead,至于好处,大家可以 ...

  5. 鸿蒙轻内核定时器Swtmr:不受硬件和数量限制,满足用户需求

    摘要:本文通过分析鸿蒙轻内核定时器模块的源码,掌握定时器使用上的差异. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十四 软件定时器Swtmr>,作者:zhushy . 软件定时器(S ...

  6. VUE-router-跳转

    跳转的 // 字符串 this.$router.push('/home/first') // 对象 this.$router.push({ path: '/home/first' }) // 命名的路 ...

  7. 看视频学SignalR—在微软虚拟学院学习SignalR

    SignalR把实时Web功能变得异常简单. 如果您希望在几个小时内对SignalR有一个直观的了解,观看微软虚拟学院(MVA)的视频教学Lighting Up Real-Time Web Commu ...

  8. Java学习常用链接

    最全的Jenkins插件开发教程 最最最全的Jenkins插件开发教程_邪恶八进制-CSDN博客_jenkins插件开发 代理FQ工具Shadow socks https://www.blog-chi ...

  9. InnoDB锁机制-转载

    InnoDB锁机制 1. 锁类型 锁是数据库区别与文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问. InnoDB使用的锁类型,分别有: 共享锁(S)和排他锁(X) 意向锁(IS和IX) 自 ...

  10. [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现

    [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 目录 [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 0x00 摘要 0x01 基础类 1. ...