JDK1.6版添加了新的ScriptEngine類,允許使用者直接執行js代碼。
在Java中直接調用js代碼
不能呼叫瀏覽器中定義的js函數,會拋出異常提示ReferenceError: “alert” is not defined。
package com.sinaapp.manjushri; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager;import javax.script.ScriptException; /** * 直接調用js代碼 */ public class ScriptEngineTest { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); try { engine.eval("var a=3; var b=4;print (a+b);"); // 不能呼叫瀏覽器中定義的js函數 // engine.eval("alert(\"js alert\");"); // 錯誤,會拋出alert引用不存在的異常 } catch (ScriptException e) { e.printStackTrace(); } } }
輸出結果:7 在Java中綁定js變數
在調用engine.get(key);時,如果key沒有定義,則返回null
package com.sinaapp.manjushri; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class ScriptEngineTest2 { public static void main(String[] args) { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); engine.put("a", 4); engine.put("b", 3); Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE); try { // 只能為Double,使用Float和Integer會拋出異常 Double result = (Double) engine.eval("a+b"); System.out.println("result = " + result); engine.eval("c=a+b"); Double c = (Double)engine.get("c"); System.out.println("c = " + c); } catch (ScriptException e) { e.printStackTrace(); } } } 輸出:
result = 7.0
c = 7.0
在Java中調用js檔案中的function,傳入調用參數,並擷取傳回值
js檔案中的merge函數將兩個參數a,b相加,並返回c。
// expression.js function merge(a, b) { c = a * b; return c; } 在Java代碼中讀取js檔案,並參數兩個參數,然後回去傳回值
package com.sinaapp.manjushri; import java.io.FileReader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * Java調用並執行js檔案,傳遞參數,並活動傳回值 * * @author manjushri */ public class ScriptEngineTest { public static void main(String[] args) throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("javascript"); String jsFileName = "expression.js"; // 讀取js檔案 FileReader reader = new FileReader(jsFileName); // 執行指定指令碼 engine.eval(reader); if(engine instanceof Invocable) { Invocable invoke = (Invocable)engine; // 調用merge方法,並傳入兩個參數 // c = merge(2, 3); Double c = (Double)invoke.invokeFunction("merge", 2, 3); System.out.println("c = " + c); } reader.close(); } } 輸出結果:
c = 5.0