OGNL(Object-Graph Navigation Language):对象视图导航语言

${user.addr.name}这样的写法就叫对象视图导航

OGNL不仅可以视图导航,支持EL表达式更加丰富的功能

EL表达式取值要从11个内置对象中取:requestScopesessionScopeapplicationScopepageScope、  pageContextparams、paramValues、header、headerValues、cookie、initParams

OGNL表达式取值要从OGNLContext中取值,在Ognl上下文中有Root部分Context部分,Root部分放置任何对象作为root都可以,Context部分必须是Map类型

使用OGNL准备工作

  导包->struts2的包中已经包含了,所以不需要导入额外的jar包

  书写代码

@Test
//准备工作
public void fun1() throws Exception{
//准备ONGL Context
//准备ROOT
User rootUser = new User("tom","18");
//准备Context
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL 在双引号里写OGNL表达式即可
Ognl.getValue("", oc, oc.getRoot());
}

OGNL基本语法演示 取出root的值

    @Test
//基本语法演示
//取出oot中的属性值
public void fun2() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
//取出root中user对象的name属性
String name = (String) Ognl.getValue("name", oc, oc.getRoot());
String age = (String) Ognl.getValue("age", oc, oc.getRoot());
System.out.println(name+" "+age);
}
tom 18

OGNL取出Context的值

@Test
//基本语法演示
//取出context中的属性值
public void fun3() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
String name = (String) Ognl.getValue("#user1.name", oc, oc.getRoot());
String name2 = (String) Ognl.getValue("#user2.name", oc, oc.getRoot());
String age = (String) Ognl.getValue("#user2.age", oc, oc.getRoot());
System.out.println(name);
System.out.println(name2);
System.out.println(age);
}

jack
rose
22

OGNL赋值语法

@Test
//赋值
public void fun4() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context); Ognl.getValue("name='jerry'", oc, oc.getRoot());
String name = (String) Ognl.getValue("name", oc, oc.getRoot());
//书写OGNL
String name2 = (String) Ognl.getValue("#user1.name='zao',#user1.name", oc, oc.getRoot());
System.out.println(name);
System.out.println(name2);
}

jerry
zao

OGNL方法调用

    @Test
//调用方法
public void fun5() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
Ognl.getValue("setName('lilei')", oc, oc.getRoot());
String name = (String) Ognl.getValue("getName()", oc, oc.getRoot()); String name2 = (String) Ognl.getValue("#user1.setName('lucy'),#user1.getName()", oc, oc.getRoot());
System.out.println(name);
System.out.println(name2);
}

lilei
lucy

OGNL调用静态方法和静态常量

注意下面表达式
@全类名@方法名('传参')
@全类名@常量名
@@常量名

@Test
public void fun6() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
String name = (String) Ognl.getValue("@cn.itheima.a_ognl.HahaUtils@echo('hello shijie')", oc, oc.getRoot());
Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc, oc.getRoot());
Double pi1 = (Double) Ognl.getValue("@@PI", oc, oc.getRoot());
System.out.println(name);
System.out.println(pi);
System.out.println(pi1);
}

hello shijie
3.141592653589793
3.141592653589793

OGNL创建 list map集合

@Test
public void fun7() throws OgnlException{
User rootUser = new User("tom","18");
Map<String, User> context = new HashMap<String,User>();
context.put("user1", new User("jack","18"));
context.put("user2", new User("rose","22"));
OgnlContext oc = new OgnlContext();
oc.setRoot(rootUser);
oc.setValues(context);
//书写OGNL
//创建list对象
Integer size = (Integer) Ognl.getValue("{'tom','jerr','jack'}.size()", oc, oc.getRoot());
String name = (String) Ognl.getValue("{'tom','jerr','jack'}[0]", oc, oc.getRoot());
String name2 = (String) Ognl.getValue("{'tom','jerr','jack'}.get(1)", oc, oc.getRoot());
System.out.println(size);
System.out.println(name);
System.out.println(name2);
//创建map对象
Integer size2 = (Integer) Ognl.getValue("#{'name':'tom','age':18}.size()", oc, oc.getRoot());
String name3 = (String) Ognl.getValue("#{'name':'tom','age':18}['name']", oc, oc.getRoot());
Integer age = (Integer) Ognl.getValue("#{'name':'tom','age':18}.get('age')", oc, oc.getRoot());
System.out.println(size2);
System.out.println(name3);
System.out.println(age);
}

3
tom
jerr
2
tom
18

浅谈OGNL表达式的更多相关文章

  1. 浅谈Lambda表达式详解

    lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定 ...

  2. 浅谈lambda表达式&lt;最通俗易懂的讲解

    Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...

  3. Java线上问题排查神器Arthas快速上手与原理浅谈

    前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...

  4. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  5. 转:浅谈CSS在前端优化中一些值得注意的关键点

    前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...

  6. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  7. 浅谈w3c标准

    #浅谈w3c标准 ##w3c标准是什么 w3c标准包括多个方面,官方是从应用角度分的,相关的文档可以戳[这里](http://www.w3.org/standards/).如果从WEB技术角度,可以分 ...

  8. 浅谈sql 、linq、lambda 查询语句的区别

    浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...

  9. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

随机推荐

  1. Numpy数组对象的操作-索引机制、切片和迭代方法

    前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法.使用索引和切片的方法选择元素,还有如何数组的迭代方法. 一.索引机制 1.一维数组 In [1]: a = np.arange ...

  2. OBS源码解析(1)main函数

    int main(int argc, char *argv[]){#ifndef _WIN32 signal(SIGPIPE, SIG_IGN);#endif #ifdef _WIN32 /*Open ...

  3. 【技能大赛笔记01】Zigbee点对点按键控制程序开发

    [技能大赛笔记01]Zigbee点对点按键控制程序开发 --2017年"物联网物联网技术应用与维护"任务五题1(中职组) 1.题目要求 2.工程文件 在比赛中,提供了一个基于Bas ...

  4. Android最佳性能实践(四)——布局优化技巧

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43376527 在前面几篇文章其中.我们学习了怎样通过合理管理内存,以及高性能编码技 ...

  5. 利用linux shell自己主动顶贴

    在论坛上面发帖问个什么东西的话,一旦不顶.帖子就秒沉了,可是又实在不想每时每刻都去顶,怎么办?以下展示了怎样利用shell 的crontab实现自己主动顶贴. 闲话不多说了,以豆瓣为例-– 1: 用c ...

  6. public,private,protected,以及不写时的差别

    作用域public,private.protected.以及不写时的差别 这四个作用域的可见范围例如以下表所看到的. 说明:假设在修饰的元素上面没有写不论什么訪问修饰符,则表示friendly.不使用 ...

  7. Automatic Preferred Max Layout Width is not available on iOS versions prior to

    警告:Automatic Preferred Max Layout Width is not available on iOS versions prior to 8.0 如: 找到: : 改动为:

  8. PHP中被忽略的性能优化利器:生成器

    如果是做Python或者其他语言的小伙伴,对于生成器应该不陌生.但很多PHP开发者或许都不知道生成器这个功能,可能是因为生成器是PHP 5.5.0才引入的功能,也可以是生成器作用不是很明显.但是,生成 ...

  9. 自学Zabbix3.10.1.1-事件通知Notifications upon events-媒介类型email

    自学Zabbix3.10.1.1-事件通知Notifications upon events-媒介类型email 配置媒介Email Administration→Media types->Cl ...

  10. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...