ognl表达式要点

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
------------------------------------
软件开发部
软件开发部
true
true

经过实验验证过。

解释一下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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值