学习OGNL语法
程序员文章站
2022-10-04 09:29:23
原文链接:http://www.yiidian.com/struts2/struts2 ognl.html 1 OGNL简介 的全称是对象图导航语言( Object Graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,存 ......
原文链接:
1 ognl简介
ognl
的全称是对象图导航语言( object-graph navigation language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某种表达式语法,存储java对象的任意属性,调用java 对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一种带有语义的字符串,那么 ognl 无疑成为了这个语义字符串于java对象之间的沟通桥梁。
2 ognl数据结构
ognl表达式,操作的是一个叫ognlcontext
的对象。该对象包含两个属性:
- root:根对象,可以存入任何对象作为root对象
- context:上下文对象,这是一个map结构,可以往该map存入任意key-value键值对
以上ognlcontext对象的两部分属性,我们都可以通过ognl表达式进行数据存取。
3 ognl表达式语法
ognl表达式基本规则:
-
取root对象的值,只需要直接通过根对象属性即可
-
取context对象的值,必须通过指定的上下文容器中的#key.属性去取
3.1 环境准备
首先导入ognl包到项目
设计一个user类,用于存储数据
package com.yiidian.ognl; /** * @author 一点教程(yiidian.com) */ public class user { private string name; private integer age; public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; } public user() { super(); } public user(string name, integer age) { super(); this.name = name; this.age = age; } }
3.2 基本取值
/** * 基本取值 */ @test // 取出root中的属性值 public void test1() throws exception { // 准备onglcontext // 准备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表达式取出属性==== // 取出root中user对象的name属性 string name = (string) ognl.getvalue("name", oc, oc.getroot()); integer age = (integer) ognl.getvalue("age", oc, oc.getroot()); system.out.println(name); system.out.println(age); // --------------------------------------------------- // 取出context中键为user1对象的name属性 string name1 = (string) ognl.getvalue("#user1.name", oc, oc.getroot()); string name2 = (string) ognl.getvalue("#user2.name", oc, oc.getroot()); integer age1 = (integer) ognl.getvalue("#user2.age", oc, oc.getroot()); system.out.println(name1); system.out.println(name2); system.out.println(age1); }
结果为:
3.3 赋值
/** * 赋值 */ @test public void test2() throws exception { // 准备onglcontext // 准备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表达式 // 将root中的user对象的name属性赋值 ognl.getvalue("name='jerry'", oc, oc.getroot()); string name = (string) ognl.getvalue("name", oc, oc.getroot()); string name2 = (string) ognl.getvalue("#user1.name='张三',#user1.name",oc, oc.getroot()); system.out.println(name); system.out.println(name2); }
结果为:
3.4 调用方法
/** * 调用方法 */ @test public void test3() throws exception { // 准备onglcontext // 准备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表达式 // 调用root中user对象的setname方法 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); }
结果为:
3.5 调用静态方法
1)设计一个ognlutil类,里面有个sayhello的静态方法
package com.yiidian.ognl; /** * @author 一点教程(yiidian.com) */ public class ognlutil { public static string sayhello(string name){ return "你好,"+name; } } 使用ognl表达式调用sayhello静态方法 /** * 调用静态方法 */ @test public void test4() throws exception { // 准备onglcontext // 准备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表达式 string name = (string) ognl.getvalue("@com.yiidian.ognl.ognlutil@sayhello('张三')", oc,oc.getroot()); double pi = (double) ognl.getvalue("@@pi", oc, oc.getroot()); system.out.println(name); system.out.println(pi); }
3.6 创建对象(list、map)
/** * 创建对象(list、map) */ @test public void test5() throws exception { // 准备onglcontext // 准备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表达式 // 创建list对象 integer size = (integer) ognl.getvalue("{'tom','jerry','jack','rose'}.size()", oc, oc.getroot()); string name = (string) ognl.getvalue("{'tom','jerry','jack','rose'}[0]", oc, oc.getroot()); string name2 = (string) ognl.getvalue("{'tom','jerry','jack','rose'}.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); }
结果为:
源码下载:https://pan.baidu.com/s/1ld59fmfqlsg1h1yvx55wug
欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
如果您对我的系列教程感兴趣,也可以关注我的网站: