OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強大的表達(dá)式語言(Expression Language,簡稱為EL),通過它簡單一致的表達(dá)式語法,可以存取對象的任意屬性,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型轉(zhuǎn)化等功能。

 第一次接觸OGNL是因為tapestry,tapestry使用ognl在頁面中綁定業(yè)務(wù)數(shù)據(jù)。。。

 關(guān)于ognl的原理和一般使用規(guī)則,本文不作詳細(xì)描述,請自行參考http://www.ognl.org/

 在工作流的實際開發(fā)中,常常會遇到這樣的情況,以經(jīng)費申請流程為例,當(dāng)申請金額<1000,流轉(zhuǎn)到科長審批環(huán)節(jié)034,當(dāng)申請金額>1000,流轉(zhuǎn)到處長審批環(huán)節(jié)035。其ognl表達(dá)式可以這樣定義:ammount>1000?'035':'034'。其中ammount為該流程綁定業(yè)務(wù)模型JfsqModel.java的一個屬性。

  現(xiàn)在我們的問題來了,在流程引擎中如何動態(tài)解析以上表達(dá)式的結(jié)果呢?這個時候,ognl的作用充分體現(xiàn)出來了,下面式我寫的一個ognl表達(dá)式解析類:


package
cn.common;

 

import java.util.Map;

 

import ognl.DefaultMemberAccess;

import ognl.Ognl;

import ognl.OgnlException;

 

/**

 * 解析ognl表達(dá)式工具類

 */

 

public class OgnlParser {

    private Map context = null;

    private Object target = null;

   

    /**

     * 默認(rèn)構(gòu)造函數(shù),與當(dāng)前class綁定

     */

    public OgnlParser(){

       context = Ognl.createDefaultContext(this);

       target = this;

    }

   

    /**

     * 構(gòu)造函數(shù),綁定目標(biāo)class

     * @param targetBean 綁定bean

     */

    public OgnlParser(String className){

       try {

           target = Class.forName(className).newInstance();

           context = Ognl.createDefaultContext(target);

       } catch (Exception e) {

           e.printStackTrace();

       }     

    }

   

    /**

     * 構(gòu)造函數(shù),綁定目標(biāo)bean

     * @param targetBean 綁定bean

     */

    public OgnlParser(Object bean){

       try {

           target = bean;

           context = Ognl.createDefaultContext(target);

       } catch (Exception e) {

           e.printStackTrace();

       }     

    }

   

    /**

     * @param ognlExpression 標(biāo)準(zhǔn)的OGNL表達(dá)式

     * @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表達(dá)式解析失敗:"+e.getMessage());

       }

    }

   

    //TODO setValue

}

提供了三個構(gòu)造函數(shù)建立context,即Ognl與特定bean的綁定. 然后調(diào)用public Object getValue(String expression)返回表達(dá)式的結(jié)果值,expression為標(biāo)準(zhǔn)的ognl表達(dá)式。


對上述實例來說,通過如下方式調(diào)用:

JfSqModel model = .....;

OgnlParser parser = new OgnlParser(model);

String nodeId = 
       (String)parser.getValue(
"ammount>1000?'035':'034'");

JfSqWF.switch(nodeId);