JDK1.6版添加了新的ScriptEngine類,允許用戶直接執行js代碼。
在Java中直接調用js代碼
在Java中綁定js變量
在調用engine.get(key);時,如果key沒有定義,則返回null
輸出:
result?=?7.0
c?=?7.0在Java中調用js文件中的function,傳入調用參數,并獲取返回值
在Java代碼中讀取js文件,并參數兩個參數,然后回去返回值
輸出結果:
c?=?5.0
在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變量
- 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;???
- }??
- 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