天天看點

使用規則引擎(Jess)驅動Javascript實作伺服器端程式設計

這個思路在上周就确定了,但是一直沒有空去實作。 直到今天才實作了一個簡單的原形。而且還有很多問題沒有解決,主要都是對JESS不熟悉。

主要的思路就是,在servlet收到請求後,将Servlet, Request,  Response, Session幾個對象封裝成Java Bean添加Jess引擎作為Fact。 根據定義好的規則,調用相應的伺服器端javascript完成服務端的處理。 和一般的Web架構相比, 一個Url可以觸發多個規則, 當處理的流程和業務變化時,修改規則比修改代碼更簡單(其實不一定)。

Servlet的代碼:

protected void doPost(final HttpServletRequest req,
			final HttpServletResponse resp) throws ServletException, IOException{
		
		try {
			if(reload) urlEngine.reload();
			urlEngine.driveRuleEngine(this, req, resp);
		}catch (Exception e1) {
			throw new ServletException(e1.getMessage(), e1.getCause());
		}
	}
           

 DriveRuleEngine的代碼:

@SuppressWarnings("unchecked")
	public void driveRuleEngine(HttpServlet s,
							   HttpServletRequest req,
							   HttpServletResponse resp)
							   throws JessException, IOException, JavaScriptException{
        //恢複引擎到初始狀态
        engine.resetToMark(marker);
        //傳遞封裝後的Request對象				
        Request r = new Request(req);
        engine.add(r);
        //初始化javascript 運作環境。
        jsEngine.startService(s, req, resp);
        jsEngine.service(s, req, resp);
        //運作規則
        engine.run();
        
        jsEngine.endService();
	}
           

一個簡單的規則描述:

(defrule index_urls
    "define a rule for mapping to index_fn"
    ?r <- (Request)  ;任意一個request到達
    =>
    (index)  ;任意一個request到執行的方法
)
      
(deffunction index()
    (?js exec "index_fn()") ;調用一個javascript 方法
)

           

javascript的内容:

var exports = ['index_fn']

function index_fn(){
    //define the response contentType;
    web.contentType('text/plain'); 
    
    print('javascript web application environment\n');
    print('-----------------------------------------\n');
    //輸出目前javascript環境支援的方法名和方法體的内容.
    each(this, function(e, k){
        print(k + "===>" + e + "\n")
    });
    
    print('-----------------------------------------\n');
}
      

這隻是一個簡單的原形,  War包下載下傳的位址:  http://js-web.googlecode.com/files/WebRoot.zip. 項目主要是學習Jess和Javascript. 是以不确定這個方式有什麼适用性. 本人也不做web開發的項目,隻是愛好而已.

繼續閱讀