引言
前一段時間用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按鈕,可以在下邊的結果框中看到結果,本例中就是計算:
這個表達式的值
在第七行,故意引入了一個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在同一級目錄下。