浅谈OGNL表达式
OGNL(Object-Graph Navigation Language):对象视图导航语言
${user.addr.name}这样的写法就叫对象视图导航
OGNL不仅可以视图导航,支持EL表达式更加丰富的功能
EL表达式取值要从11个内置对象中取:requestScope、sessionScope、applicationScope、pageScope、 pageContext、params、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表达式的更多相关文章
- 浅谈Lambda表达式详解
lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定 ...
- 浅谈lambda表达式<最通俗易懂的讲解
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...
- Java线上问题排查神器Arthas快速上手与原理浅谈
前言 当你兴冲冲地开始运行自己的Java项目时,你是否遇到过如下问题: 程序在稳定运行了,可是实现的功能点了没反应. 为了修复Bug而上线的新版本,上线后发现Bug依然在,却想不通哪里有问题? 想到可 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 转:浅谈CSS在前端优化中一些值得注意的关键点
前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 浅谈w3c标准
#浅谈w3c标准 ##w3c标准是什么 w3c标准包括多个方面,官方是从应用角度分的,相关的文档可以戳[这里](http://www.w3.org/standards/).如果从WEB技术角度,可以分 ...
- 浅谈sql 、linq、lambda 查询语句的区别
浅谈sql .linq.lambda 查询语句的区别 LINQ的书写格式如下: from 临时变量 in 集合对象或数据库对象 where 条件表达式 [order by条件] select 临时变量 ...
- [C#]6.0新特性浅谈
原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...
随机推荐
- devdependencies与dependencies的区别
一直在纠结devdependencies与dependencies的区别是什么,下面就对此作出详细介绍,希望对你有所帮助! 我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入 ...
- H5页面项目的思路整理
这是H5项目完成后的一些整理,有些理解不能非常准确,希望大家能帮忙指出. 移动端的适配 一些名词解释 visual viewport 可视视图 layout viewport 布局视图 vm 可视视图 ...
- 【转】Python微信好友头像拼接图
转自:Python微信好友头像拼接图 今天在朋友圈看到有人发了微信好友拼接图,心里满是新奇,看了下评论才知道用Python写的.心里痒痒,立马就安装了下Python. 安装好了之后,看了下大神的代码, ...
- IIS网站本机可以访问但局域网其他机器无法访问 解决方法
在IIS部署网站的时候,发现只有本机可以访问,通过localhost和IP地址都可以,但是当局域网其他机器访问我的网站的时候,无响应. 我的是WIN10的系统 解决方法: 网站所对应的端口必须对外 ...
- linux工作中遇到的问题总结---更新中
今天这个,严格来说不算一篇文章,我只想把我工作中遇到的问题分享给大家,让大家少犯错误. 1.安装rmp包时出现错误 :header V3 DSA signature: nokey ,key id .. ...
- WPF依赖对象(DependencyObject) 实现源码,理解WPF原理必读
/// DependencyObject encompasses all property engine services. It's primary function /// is providin ...
- 关于Mysql下使用Dapper QueryFirstOrDefault的问题
1.环境 MySql:5.7.20 Dapper:1.50.2 .Net:4.5 2.遇到的问题 在开发中我发现,使用Dapper查询数据时,第一次查询正确,第二次查询就差不出来,或者直接修改数据库后 ...
- 》》ajax加蒙版
在与后台交互时,用时过长.禁止页面操作等,有提示,增强页面体验: $.ajax({ type:'POST',url:url,data:obj,dataType:'json',beforeSend: f ...
- linux_Mysql导入数据基本操作
创建数据库:Databases 数据库名字;导入数据: mysql -uroot -proot use 数据库名字 source < sql文件名.sql
- SDL2源码分析2:窗体(SDL_Window)
===================================================== SDL源码分析系列文章列表: SDL2源码分析1:初始化(SDL_Init()) SDL2源 ...