ognl表达式要点
来源:互联网 发布:天纵软件 编辑:程序博客网 时间:2024/06/05 15:15
1,OGNL(Object-Graph Navigation Language的简称),对象图导航语言
2,学习要点:
理解什么样的表达式是ognl表达式。
我们在学习struts2的时候,一直很困惑,只知道ognl表达式这个名字。我们并不知道,我们什么时候使用过表达式。
重点:
所谓的对象图导航语言指的就是通过 “放置到OgnlContext中的
#对象名字.属性名字
” 的方式去获取对应对象的属性值;主要工作就是用来学习如何让表达式合法,能够被正确解析且解释执行就可以了;
// 新建一个部门对象并设置部门名称 SlDept dept = new SlDept(); dept.setName("软件开发部"); // 新建一个员工对象并设置员工姓名 SlEmployee emp = new SlEmployee(); emp.setName("李四"); emp.setSlDept(dept); OgnlContext context = new OgnlContext(); context.put("dept", dept); context.put("emp", emp); // 将员工设置为根对象 context.setRoot(emp); // 构建Ognl表达式的树状表示,用来获取 Object expression; try { //1.获取非根对象(普通对象)中直接获取部门名称 expression = Ognl.parseExpression("#dept.name"); // 解析树状表达式,返回结果 Object deptName = Ognl.getValue(expression, context, context.getRoot()); System.out.println(deptName); System.out.println("-----------------------------"); //2.获取(根对象)的方式一,直接取得。不要输入对象名,直接输入属性名称。 expression = Ognl.parseExpression("name"); Object name = Ognl.getValue(expression, context,context.getRoot()); System.out.println(name); System.out.println("-----------------------------"); //3.获取根对象的方式一,不需要用#号,直接对所拥有的对象引用去获取引用的属性. expression = Ognl.parseExpression("slDept.name"); Object name2 = Ognl.getValue(expression, context,context.getRoot()); System.out.println(name2);System.out.println("-----------------------------"); //3.获取根对象的方式一,像普通对象一样取得,用#号也可以 expression = Ognl.parseExpression("#emp.name");//引号就是ongl表达式 Object expression1 = Ognl.parseExpression("#emp.slDept.name"); name = Ognl.getValue(expression, context,context.getRoot()); name2 = Ognl.getValue(expression1, context,context.getRoot()); System.out.println(name); System.out.println(name2); System.out.println(name==name2); System.out.println("------------------------------------"); expression = Ognl.parseExpression("slDept.name");//引号里就是ongl表达式 expression1 = Ognl.parseExpression("#emp.slDept.name"); name = Ognl.getValue(expression, context,context.getRoot()); name2 = Ognl.getValue(expression1, context,context.getRoot()); System.out.println(name); System.out.println(name2); System.out.println(name==name2); } catch (OgnlException e) { // TODO Auto-generated catch block e.printStackTrace(); } }//
输出为:
软件开发部-----------------------------李四-----------------------------软件开发部-----------------------------李四软件开发部false------------------------------------软件开发部软件开发部truetrue
经过实验验证过。
解释一下ognl中的关键类。
OgnlContext context = new OgnlContext();
context.put(“dept”, dept);
context.put(“emp”, emp);
Object expression = Ognl.parseExpression(“#emp.name”);
Object deptName = Ognl.getValue(expression, context, context.getRoot()); //解释执行Ognl表达式
这个类为Ognl表达式提供了一个执行环境,这个类实现了Map接口,所以允许通过put(key,obj)方法向OgnlContext环境中方式各种类型的对象,需要注意的是在OgnlContext中对象分为两种,第一种是叫做root对象(根对象),在整个OgnlContext中有且最多只能有一个根对象,可以通过调用OgnlContext.setRoot(obj)设置为根对象,另外一种就是OgnlContext中的普通对象,这种个数类型不受限制.
1、获取普通对象的属性值方式;(获取方式是唯一的)
比如上述例子当中,dept对象就是放置到OgnlContext中的普通对象,对于这种普通对象,只能通过“#dept.name
”的方式去获取属性值,需要注意的是dept指的是放置到上下文中key的值,另外在Dept类型中要提供getName方法;
2、获取根对象的属性值的方式,有两种,第一种也是跟上述方式一样,不多做叙述
Object expression = Ognl.parseExpression("#emp.name");
第二种,直接写属性名称就可以,注意:这个时候就不要加“#”(对象名称也不要加。),如下
expression = Ognl.parseExpression("name");
切记:随然有两种方式。但是
expression = Ognl.parseExpression("emp.name"); 是错误的。
本文只是防止以后自己忘记
更详细的记录(这里写的很好)
请参看:OGNL表达式语言详解感谢他的博文
ognl表达式,还可以调用方法
- ognl表达式要点
- OGNL表达式
- ognl表达式
- OGNL表达式
- OGNL表达式 #%$
- OGNL表达式
- OGNL表达式
- ognl表达式
- Ognl表达式
- ognl表达式
- OGNL表达式
- OGNL表达式
- OGNL表达式
- ognl表达式
- OGNL表达式
- OGNL表达式 #%$
- ognl表达式
- ognl表达式
- [bzoj4860]树的难题
- 线段树 2017.4.26
- web前端工程师--html和css基础课程(三)
- 第一章 布尔检索
- msg=SolrCore 'collection1' is not available due to init failure: Could not load conf for core collec
- ognl表达式要点
- Spring中配置和读取多个Properties文件--转
- 编译在linux arm核上运行的内核模块
- 用Markdown写表格
- android学习线路
- 挂载PramFS遇到的关于SELinux的问题
- c#中的insert操作
- Swift中闭包的介绍以及使用
- SQLite中特殊的INSERT语句