• 目录 1. Java中使用Ognl表达式引擎 1 1.1.1. 一、Ognl简介 1 1.1.2. 二、Ognl应用场景 1 1.2. 基本介绍 vs 模板语言 2 1.Java中使用Ognl表达


    目录

    1. Java中使用Ognl表达式引擎 1

    1.1.1. 一、Ognl简介 1

    1.1.2. 二、Ognl应用场景 1

    1.2. 基本介绍 vs 模板语言 2

     

     

    1. Java中使用Ognl表达式引擎

    2018年08月19日 22:54:51 脱线宅 阅读数:253

        1. 一、Ognl简介

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

        1. 二、Ognl应用场景

    简单地说,Ognl最大的作用就是支持 name.field1.field2.value 方式的取值。如果你的应用需要用到这方面的功能,你可能就需要使用到Ognl了,比如用户要输入Ognl表达式从上下文中取值。

    最出名的,也就是Struts框架就运用了Ognl表达式,从而在jsp中使用Ognl进行取值。

    package com.attilax.util;

     

    import java.util.HashMap;

    import java.util.Map;

     

    import org.apache.commons.io.output.ThresholdingOutputStream;

     

    import ognl.Ognl;

    import ognl.OgnlException;

     

    public class ognlDemo {

     

    public static void main(String[] args) throws OgnlException {

    //Ognl表达式的“根节点”

    Map<String, Object> root = new HashMap<String, Object>();

    root.put("jack", new HashMap(){{

       this.put("username", "jack...");

       this.put("age", 19);

    }});

    //Ognl上下文

    Map context = Ognl.createDefaultContext(root);

    // context.put("lucy", new User("lucy"));

     

    //根节点取值不需要#

    Object expression2 = Ognl.parseExpression("jack.username");

    System.out.println(Ognl.getValue(expression2, context, root));

    Object expression3 = Ognl.parseExpression("jack.age");

    System.out.println(Ognl.getValue(expression3, context, root));

     

     

    //非根节点取值需要#开头

    // Object expression = Ognl.parseExpression("#lucy.username");

    // Object value = Ognl.getValue(expression, context, root);

    // System.out.println(value);

     

    }

     

    }

      1. 基本介绍 vs 模板语言

    编辑

    OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。这样可以更好的取得数据。

    OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境的根对象为user1,则表达式person.address[0].province可以访问到user1的person属性的第一个address的province属性。

    这种功能是模板语言的一个重要补充,像jsp2.0,velocity,jelly等等,都有类似的功能,但是ognl比它们完善得多,而且以一个独立的lib出现,方便我们构建自己的框架。

    webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。

     

      1. Ognl优点

    OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁;

    支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能;

    Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:

    支持对象方法调用,如xxx.doSomeSpecial();

    支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;

    支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(price*discount),这个表达式会返回80;

    访问OGNL上下文(OGNL context)和ActionContext;

    操作集合对象。

    可以直接new一个对象

     

      1. 由来

    编辑

    OGNL stands for Object-Graph Navigation Language; it is an expression language for getting and setting properties of Java objects. You use the same expression for both getting and setting the value of a property.

    The ognl.Ognl class contains convenience methods for evaluating OGNL expressions. You can do this in two stages, parsing an expression into an internal form and then using that internal form to either set or get the value of a property; or you can do it in a single stage, and get or set a property using the String form of the expression directly.

    OGNL started out as a way to set up associations between UI components and controllers using property names. As the desire for more complicated associations grew, Drew Davidson created what he called KVCL, for Key-Value Coding Language, egged on by Luke Blanshard. Luke then reimplemented the language using ANTLR, came up with the new name, and, egged on by Drew, filled it out to its current state. Later on Luke again reimplemented the language using JavaCC. Further maintenance on all the code is done by Drew (with spiritual guidance from Luke).

     

      1. 表达式

    编辑

    OGNL支持各种纷繁复杂的表达式。但是最最基本的表达式的原型,是将对象的引用值用点串联起来,从左到右,每一次表达式计算返回的结果成为当前对象,后面部分接着在当前对象上进行计算,一直到全部表达式计算完成,返回最后得到的对象。OGNL则针对这条基本原则进行不断的扩充,从而使之支持对象树、数组、容器的访问,甚至是类似SQL中的投影选择等操作。

    1. 基本对象树的访问

    对象树的访问就是通过使用点号将对象的引用串联起来进行。

    例如:xxxx,xxxx.xxxx,xxxx. xxxx. xxxx. xxxx. xxxx

    2. 对容器变量的访问

    对容器变量的访问,通过#符号加上表达式进行。

    例如:#xxxx,#xxxx. xxxx,#xxxx.xxxxx. xxxx. xxxx. xxxx

    3. 使用操作符号

    OGNL表达式中能使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等。

    4. 容器、数组、对象

    OGNL支持对数组和ArrayList等容器的顺序访问:例如:group.users[0]

    同时,OGNL支持对Map的按键值查找:

    例如:#session['mySessionPropKey']

    不仅如此,OGNL还支持容器的构造的表达式

    例如:{"green", "red", "blue"}构造一个List,#{"key1" : "value1", "key2" : "value2", "key3" : "value3"}构造一个Map

    你也可以通过任意类对象的构造函数进行对象新建:

    例如:new Java.net.URL("xxxxxx/")

    5. 对静态方法或变量的访问

    要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args):

    例如:@com.javaeye.core.Resource@ENABLE,@com.javaeye.core.Resource@getAllResources

    6. 方法调用

    直接通过类似Java的方法调用方式进行,你甚至可以传递参数:

    例如:user.getName(),group.users.size(),group.containsUser(#requestUser)

    7. 投影和选择

    OGNL支持类似数据库中的投影(projection) 和选择(selection)。

    投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。

    例如:group.userList.{username}将获得某个group中的所有user的name的列表。

    选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操作符有三种:

    ? 选择满足条件的所有元素

    ^ 选择满足条件的第一个元素

    $ 选择满足条件的最后一个元素

    例如:group.userList.{? #txxx.xxx != null}将获得某个group中user的name不为空的user的列表。

     

  • 相关阅读:
    UVALive4727:jump
    UVALive
    UVA11795 Mega Man's Mission
    UVA4731:Cellular Network
    UVA11404:Palindromic Subsequence
    设计思路
    阅读计划
    上课未完成代码原因
    《人月神话》读后感
    《软件工程》第十一章总结
  • 原文地址:https://www.cnblogs.com/attilax/p/15197379.html
Copyright © 2020-2023  润新知