Javascript執行器(Rhino)

引言

前一段時間用swing開發了sTodo(http://code.google.com/p/stodo/ ),對swing開發GUI的基本流程算是熟悉了,所以也常用swing來寫些小東西。在實際的開發或者學習中,經常遇到這樣的場景:想要執行一段javascript腳本,驗證一些想法,這可能需要你打開編輯器,建立一個新的html頁面,然後寫一堆標籤,然後用script標籤將腳本包起來,執行以下,整個過程比較麻煩。

 

其實javascript在web中的應用只是一部分,它最爲一個語言,可以完全獨立出來完成其他的工作,比如腳本化java應用等(上邊提到的sTodo就內嵌了一個javascript的執行環境,用戶可以自己定製或者擴展sTodo的部分功能)。JDK6中,SUN對其加入了對腳本的支持,Rhino (Google公司的Norris Boyd開發的)爲純java實現的一個javascript引擎。

 

有天在學習別人關於javascript中作用域鏈的文章的時候,看到作者舉的例子,想自己嘗試一下。於是就打開編輯器,新建了一個html文檔,突然就想到爲什麼不設計一個小工具,直接將腳本內容(一般是與DOM無關的邏輯)寫入一個輸入區域,然後點擊一個按鈕,就可以得到自己想要的結果,這樣就方便多了,於是有了se(script executor ),也就是今天要分享的東西。

 

效果

 

上邊的這個編輯器,用來輸入腳本,然後點擊eval按鈕,可以在下邊的結果框中看到結果,本例中就是計算:

x*2 + y*3 (x = 5, y = 6)

這個表達式的值


在第七行,故意引入了一個DOM中的函數alert, 然後腳本引擎rhino會檢測到錯誤,並指定行號:


 

設計思路

主要思路很簡單,將編輯器中的文本整個複製起來,傳輸給JDK的javascript腳本引擎解釋,然後重定向System.out和System.err到顯示結果的JTextArea。其中比較關鍵的代碼是,解釋腳本的部分:

 

    private Object evalScript(String script){
    	Object result = new Object();
    	ScriptEngineManager manager = new ScriptEngineManager();
    	ScriptEngine engine = manager.getEngineByName("JavaScript");
    	try {
    	    result = engine.eval(script);
    	} catch (ScriptException e) {
    	    e.printStackTrace();
    	}
        return result;
    }
 

代碼很簡單,這裏就不寫出來了,需要的可以看看附件中的代碼。

 

其他

se中主要用到的其他開源包有:

  • RSyntaxTextArea , 用以高亮顯示文本,顯得界面更友好
  • Console, 用以重定向System.out和System.err到JTextArea

界面很簡單,主要的功能有了,不過還需要進一步實現,抽時間把load, save等完成,就比較好用了。

 

運行方式:

java -jar se.jar //需要注意的是resource目錄需要和se.jar在同一級目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章