JSR 223, javax.script
08:47
在 JavaSE 6 裡面加入了 Java Scripting 的 API, 我記得很久以前在 BBS 有討論, 學 Java 和 JavaScript 的差別, 往往得到的答案是 Java != Javasript. 把 Javascript 的應用侷限在網頁設計之上, 但是隨著 AJAX 應用與 script 輕便性的考量, 在 JavaSE6 加入了 Script 的應用, 主要是為了簡單快速的開發應用, 對我來說, Scripting 的語言可以更容易進行文字處理而不用去考慮型別.
首先, JavaSE 6 要怎麼應用 Script 語言呢
主要是採用 javax.script 之下的 API
- 建立 ScriptEngineManager 物件
- 向該 Manager 物件取得 ScriptEngine
- 執行 ScriptEngine 的 eval() method
例如,
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("print('Hello world')"); // 直接跳出 Hello World 對話框
engine.eval(new java.io.FileReader("c:\\test.js")); // 取得 test.js 的 script 執行
因為 JavaSE 6 具有 Scripting Engine 的執行環境, 所以 script 的語法可以和 java 相互交錯, 也顯得更為複雜. 例如
File f = new File("test.txt");
engine.put("file",f);
engine.eval("print(file.getAbsolutePath())");
Engine 在執行 print 的時候, 發現 file 物件是由 java 傳送(put) 過來的, 所以他先利用 java 的執行環境取得 getAbsolutePath() 的字串, 才回到 ScriptEngine 中繼續執行 script 語法.
除了在 ScriptEngine 中呼叫 Java method 之外, 在 Java 之中也可以呼叫 Script function,
String script = 'function hello(name){ print('hello js to '+name);}";
engine.eval(script); // 建議都採用 js 檔案比較好寫
Invocable inv = (Invocable) engine; // 將 engine 轉型可以被 java 呼叫, 視你的 script engine 來決定是否有實做
inv.invokeFuction("hello","jini");
如果採用某個 js 物件的 Object, 可以用 get 取得該物件, 更可呼叫(invokeMehtod) 他的屬性
Object obj = engine.get("obj");
以上是比較基礎的應用, 其他的可以參考
http://java.sun.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.html
http://jcp.org/en/jsr/detail?id=223
http://www.mozilla.org/rhino/
- Scripting dev.java.net 可以查看其他的 scripting engine 是否有你熟悉的 script engine
https://scripting.dev.java.net/