OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。 
 第一次接触OGNL是因为tapestry,tapestry使用ognl在页面中绑定业务数据。。。
 关于ognl的原理和一般使用规则,本文不作详细描述,请自行参考http://www.ognl.org/
 在工作流的实际开发中,常常会遇到这样的情况,以经费申请流程为例,当申请金额<1000,流转到科长审批环节034,当申请金额>1000,流转到处长审批环节035。其ognl表达式可以这样定义:ammount>1000?'035':'034'。其中ammount为该流程绑定业务模型JfsqModel.java的一个属性。
  现在我们的问题来了,在流程引擎中如何动态解析以上表达式的结果呢?这个时候,ognl的作用充分体现出来了,下面式我写的一个ognl表达式解析类: 
package cn.common;
 
import java.util.Map;
 
import ognl.DefaultMemberAccess;
import ognl.Ognl;
import ognl.OgnlException;
 
/**
 * 解析ognl表达式工具类
 */
 
public class OgnlParser {
    private Map context = null;
    private Object target = null;
    
    /**
     * 默认构造函数,与当前class绑定
     */
    public OgnlParser(){
       context = Ognl.createDefaultContext(this);
       target = this;
    }
    
    /**
     * 构造函数,绑定目标class
     * @param targetBean 绑定bean
     */
    public OgnlParser(String className){
       try {
           target = Class.forName(className).newInstance();
           context = Ognl.createDefaultContext(target);
       } catch (Exception e) {
           e.printStackTrace();
       }      
    }
    
    /**
     * 构造函数,绑定目标bean
     * @param targetBean 绑定bean
     */
    public OgnlParser(Object bean){
       try {
           target = bean;
           context = Ognl.createDefaultContext(target);
       } catch (Exception e) {
           e.printStackTrace();
       }      
    }
    
    /**
     * @param ognlExpression 标准的OGNL表达式
     * @return 
     * @throws EecmisRuleException
     */
    public Object getValue(String expression)throws EecmisRuleException{
       DefaultMemberAccess  aMemberAccess = new DefaultMemberAccess(true);
       Ognl.setMemberAccess(context, aMemberAccess);
       try {
           return Ognl.getValue(expression,context,target);
       } catch (OgnlException e) {
           e.printStackTrace();
           throw new EecmisRuleException("ognl表达式解析失败:"+e.getMessage());
       }
    }
    
    //TODO setValue
}
提供了三个构造函数建立context,即Ognl与特定bean的绑定. 然后调用public Object getValue(String expression)返回表达式的结果值,expression为标准的ognl表达式。
对上述实例来说,通过如下方式调用:
 
JfSqModel model = .....;
OgnlParser parser = new OgnlParser(model);
String nodeId = 
       (String)parser.getValue("ammount>1000?'035':'034'");
JfSqWF.switch(nodeId);