這個思路在上周就确定了,但是一直沒有空去實作。 直到今天才實作了一個簡單的原形。而且還有很多問題沒有解決,主要都是對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開發的項目,隻是愛好而已.