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表达式,还可以调用方法

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕了有阑尾炎怎么办 食物堵塞在食管怎么办 食物卡在食管怎么办 小孩食道卡异物怎么办 八十岁老人得了膀胱癌怎么办 肾结石引起吐血尿血怎么办 肾结石引起的尿血怎么办 食道感觉有异物怎么办 膀胱出血有血块怎么办 肾小球滤过率20怎么办 膀胱癌术后有血尿怎么办 肾病贫血怎么办吃什么 低蛋白血症怎么办 慢性肾炎患者感冒了怎么办 透析病人磷高怎么办 尿毒症透析磷高怎么办 怀孕了有膀胱炎怎么办 宝宝拉肚子尿少怎么办 猫尿血怎么办吃什么药 肝癌小便不出来怎么办 怀孕三个月结石血尿怎么办? 肾小球滤过率65怎么办 肾穿后有血肿6cm怎么办 肾穿刺后血肿怎么办 手术后有血肿怎么办 尿蛋白胆红素高怎么办 哺乳期尿蛋白高怎么办 产后老放屁便秘怎么办 肝癌移植后复发怎么办 产后屁多便秘怎么办 肝癌切除后复发怎么办 宝宝便秘拉不出大便怎么办 宝宝便秘屁多怎么办 尿液浑浊气味重怎么办 经常便秘肚子胀怎么办 顺产满月后腰疼怎么办 化验尿蛋白质高怎么办 小孩子反复蛋白尿怎么办呢? 肾上张了个囊肿怎么办 同床后出血怎么办 药物引起胃不适怎么办