• [转]OGNL笔记1——表达式


    JSTL中的EL语言是个灾难,很难想象一个EL表达式不能去取复杂的属性还不支持显示的方法调用,类似list.get(20).getName(locale)。而且这个灾难还非常流行,唉。

    幸好OGNL很好的解决了这个问题,而且在Tapestry,Webwork等框架下均已经内嵌了支持。

    表达式分类:
    1. 访问属性:如,user.name
    2. 访问接口/方法:如,user.verify()
    3. 数组游标,如:users[2]

    常量:
    字符串、字符:一般使用单引号,也可以使用双引号,支持所有的转义字符
    数值:可以使用B表示BigDecimal,H表示BigInteger(不是十六进制)
    布尔:true或者false关键字
    空指针:null关键字

    访问属性:
    user.name

    索引位置:
    OGNL提供了一个很有趣的例子:array["length"],其中array作为根对象,调用其length方法是采用字符串的形式来进行的,等同于array["len" + "gth"],当然等价array.length。

    带索引的属性:
    someProperty[2] 可以用来getSomeProperty(2) or setSomeProperty(2, value),查找顺序先找关联数组的方法,再找带索引参数的方法如下:
    public PropertyType[] getPropertyName()
    public void setPropertyName(PropertyType[] anArray)
    public PropertyType getPropertyName(int index)
    public void setPropertyName(int index, PropertyType value)

    OGNl扩展的带索引的属性:
    public PropertyType getPropertyName(IndexType index)
    public void setPropertyName(IndexType index, PropertyType value)
    比如:session.attribute("bar")

    调用方法:
    method( ensureLoaded(), name ),用逗号分隔参数,由于逗号在OGNL语言中有别的用处,所以在语法上需要小心。

    变量引用:
    使用#标注:#var = 99
    this是OGNL语言中内置的对象,用来表示当前表达式的变量。listeners.size().(#this > 100? 2*#this : 20+#this)

    括号:
    method( (ensureLoaded(), name) )这个表达式是调用一个参数的method方法。

    链接表达式:
    再看一次method( (ensureLoaded(), name) )
    其中ensureLoaded(), name的意思是:调用ensureLoaded方法,再调用#this.name,method方法的参数是name。

    集合构建
    { null,"Untitled" }——说明:最好看成数组,因为集合一般不会支持空元素。

    集合投射
    listeners.{delegate}返回所有listener对象的delegate对象。
    objects.{ #this instanceof String ? #this : #this.toString()}转变为字符串对象

    集合选择:
    listeners.{? #this instanceof ActionListener}——注意?的位置
    返回单个对象,首个:objects.{^ #this instanceof String },最后一个:objects.{$ #this instanceof String }

    创建对象:
    需要显式的指定java package,如:new java.util.ArrayList()

    静态方法、成员:
    @class@method(args),@class@field,同样要指定class的全路径

    表达式赋值:
    如果是AST,OGNL直接解析,如果是其他对象,则将其转化对字符串交给AST解析。

    简单的功能表达式:
    如递归表达式:#fact = :[#this<=1? 1 : #this*#fact(#this-1)], #fact(30H)

    集合的特殊属性
    Collection:size, isEmpty
    List:iterator
    Map:keys, values
    注意:someMap["size"]可能得到someMap中对应key为"size"的对象, 而someMap.size得到someMap的大小.
    Set:iterator
    Iterator:next,hasNext
    Enumeration:next,hasNext,nextElement,hasMoreElements

    与JAVA的不同之处
    逗号:类似C的语法,逗号用于分割两个不同的表达式
    花括号:用于创建list,元素可以为空
    in和not in:用于集合的contains测试
  • 相关阅读:
    springmvcdemo
    src/main/resorces applicationContext.xml
    maven 中setting.xml
    Git
    刘相兵 AWR
    Oracle 查询SQL 执行次数---hash value
    Oracle 查询重复索引列
    Oracle 史上最全近百条Oracle DBA日常维护SQL脚本指令
    Oracle 查询表对应的索引
    11g RAC 自动升级 PSU
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562446.html
Copyright © 2020-2023  润新知