十三 . 表达式计算 OGNL 第4章. 表达式

如果你在一个 OGNL 表达式之后带上一个括号表达式, 而且在括号之前没有点号, 则 OGNL 将试图把第一个表达式的结果作为另一个表达式来进行计算, 并将把括号表达式的结果用作这次计算的根对象. 第一个表达式的结果可以是任意类型的对象, 如果它是一个AST , OGNL 将假定它是一个表达式被解析之后的形式, 并简单地解释执行它; 否则, OGNL 将把这个对象转换为字符串形式, 然后解析这个字符串, 最后解释执行这个解析结果.

例如, 下面的表达式

#fact(30H)

首先将查找fact变量, 并把它的值作为一个 OGNL 表达式来解释执行, 执行时将使用BigInteger30 作为这个表达式的根对象??. 后面的章节将给出一个例子, 首先我们给fact变量赋值为一个表达式, 这个表达式将返回它收到的参数的阶乘. 注意, 因为难以将这种双重计算操作符与方法调用区分开, 就导致了一个OGNL语法歧义. OGNL 解决这个语法歧义的方法是, 将一切貌似方法调用的语句都作为方法调用来处理. 比如, 如果当前对象中存在一个fact属性, 它的值是一个进行阶乘运算的OGNL表达式, 你不能通过下面这种方法来调用它:

fact(30H)

因为 OGNL 将把这个表达式解释为对fact方法的一个调用. 你可以给属性引用加上括号, 来强制 OGNL 按照你希望的方式来解释这个语句:

(fact)(30H)

posted on 2016-07-11 22:12  雪的心  阅读(199)  评论(0编辑  收藏  举报

导航