OGNL使用手记

基本概念 

OGNL全称是Object-Graph Navigation Language,是一个用来获取和设置JAVA对象的属性的表达式语言。通过使用表达式语法导航对象图,而不是直接调用对象的获取和设置方法可以提供许多应用。比如在XML文件或者脚本文件中嵌入OGNL表达式语法,在JSP页面展现层使用OGNL表达式语法。类似的应用有Velocity,Freemark,Webwork。

如何使用

最简单的使用是直接使用ognl.Ognl类来评估一个OGNL表达式。 Ognl类提供一些静态方法用来解析和解释OGNL表达式,最简单的示例是不使用上下文从一个对象中获取某个表达式的值,示例如下:

java 代码
  1.  import ognl.Ognl; import ognl.OgnlException;      
  2. try {           
  3.        result = Ognl.getValue(expression, root);       
  4. }    
  5. catch (OgnlException ex)    
  6. {          
  7.         // Report error or recover       
  8. }  

上述代码将基于root对象评估expression,返回结果,如果表达式有错,比如没有找到指定的属性,将抛出OgnlException。

更复杂一点的应用是使用预解析的表达式。这种方式允许评估表达式前捕获解析错误,也允许缓存解析出来的表达式进一个AST供重得使用从而提高性能。Ognl的parseExpression方法就是用来执行预解析操作的。

Ognl类的获取和设置方法大都可以接受一个context map参数,是一个Map类型的对象,允许你一些自己的变量进去,缺省的上下文里只包含#root和#context两个键。 Ognl内部会用这个Map替换OgnlContext类的缺省的map属性。Ognl的一些addDefaultContext方法就是完成这些功能的。

OgnlContext提供一些设置,可以更改OGNL的缺省行为,比如TypeConverter接口实例用来改变类型转换行为,具体可以参见相关文档。

下面的示例展示如何从root对象中解析出documentName属性,然后将当前用户名称添加到返回的结果后面:

 
   
java 代码
  1. private Map context = new HashMap();       
  2.   
  3. public void setUserName(String value)   
  4. {   
  5.     context.put("userName", value);   
  6. }        
  7.   
  8. ry {   
  9.    // get value using our own custom context map   
  10.    result = Ognl.getValue("userName"", context, root);   
  11. catch (OgnlException ex) {   
  12.     // Report error or recover   
  13. }  

基本语法

OGNL的语法正变得越来越丰富,但是基本语法是没有什么改变的。比如要获取一个对象的name属性,OGNL表达式就是name,要获取一个对象的headline属性的text属性,OGNL表达式就是headline.text。 

OGNL表达式的基本单位是导航链。最简单的链包含如下部分:

表达式组成部分 示例
属性名称 如上述示例中的name和headline.text
方法调用 hashCode()返回当前对象的哈希码。
数组元素 listeners[TEC:0]返回当前对象的监听器列表中的第一个元素。

所有的OGNL表达式都基于当前对象的上下文来评估,导航链的示例如下:

 
  
java 代码
  1. name.toCharArray()[0].numericValue.toString()  

评估步骤如下:

  • 解析根对象的name属性。
  • 调用上一步返回的结果字符串的toCharArray()方法。
  • 获取返回的结果数组的第一个字符,是一个Character对象。
  • 获取字符的数字值表示,Character有一个getNumericValue()方法。
  • 调用结果Integer对象的toString()方法。

参考资料

API文档

语言规范

开发指南

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值