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. codeforces 887B Cubes for Masha 两种暴力

    B. Cubes for Masha time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  2. C++课程设计2

    PS:大一下学期C++课程设计 1.成绩管理系统 #include<stdio.h> #include<string> #include<iostream> #in ...

  3. google软件测试之道读后感(二)

    这几天又翻了几页这本书,觉得妙语连珠,关键语录摘抄如下,并补充自己的一些思考: "如果你想要求一个团队去尝试新的事物或者做某些改进,给他们提供一个联系人会更好一些,这个联系人来源于更大的社区 ...

  4. 洛谷 P3928 Sequence

    题目描述 小强喜欢数列.有一天,他心血来潮,写下了三个长度均为n的数列. 阿米巴也很喜欢数列.但是他只喜欢其中一种,波动数列. 阿米巴把他的喜好告诉了小强.小强便打算找出这三个数列内的最长波动数列. ...

  5. JAVA字符串转换MD5值

    简介: MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法),主流编程语言普遍已有MD5 ...

  6. Cocos2d-x 3.0 Android改动APK名、更改图标、改动屏幕方向、改动版本,一些须要注意的问题

    非常多新手程序员做出一个游戏后,编译成apk安装在手机上.却发现安装程序名和游戏图标都是Cocos2dx默认的,并且默认屏幕方向是横向.那么须要怎么才干改动为自己想要的呢? 打开你创建的project ...

  7. HDFS对象存储--Ozone架构设计

    前言 如今做云存储的公司非常多,举2个比較典型的AWS的S3和阿里云.他们都提供了一个叫做对象存储的服务,就是目标数据是从Object中进行读写的,然后能够通过key来获取相应的Object,就是所谓 ...

  8. ios应用程序国际化

    1.程序名称国际化: 在Xcode中新建项目后,能够在project的info选项卡中找到Localization的项目,能够加入应用程序须要支持的国际语言. 回到项目中能够发如今InfoPlist. ...

  9. 《github一天一道算法题》:并归排序

    看书.思考.写代码! /******************************************* * copyright@hustyangju * blog: http://blog.c ...

  10. xml文档读取-SAX

    由于dom采用的是将xml文档加载入内存进行处理的方式,如果xml文档较大,则会导致加载时间过长,效率降低的情况,因此,sun公司在JAXP中又添加了对SAX的支持: SAX,全称Simple API ...