JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
生活随笔
收集整理的這篇文章主要介紹了
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JDK1.6版添加了新的ScriptEngine類,允許用戶直接執行js代碼。
在Java中直接調用js代碼
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();????? ??????????}???? ??????}????? }??
在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。
[javascript]?view plain?copy//?expression.js??? function?merge(a,?b)?{??? ?????c?=?a?*?b;??? ?????return?c;??? }?? 在Java代碼中讀取js文件,并參數兩個參數,然后回去返回值
[java]?view plain?copypackage?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
在Java中直接調用js代碼
不能調用瀏覽器中定義的js函數,會拋出異常提示ReferenceError:?“alert”?is?not?defined。
[java]?view plain?copy輸出結果:7
在Java中綁定js變量
在調用engine.get(key);時,如果key沒有定義,則返回null
[java]?view plain?copy
result?=?7.0
c?=?7.0
在Java中調用js文件中的function,傳入調用參數,并獲取返回值
js文件中的merge函數將兩個參數a,b相加,并返回c。[javascript]?view plain?copy
c?=?5.0
總結
以上是生活随笔為你收集整理的JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java动态编译执行
- 下一篇: 架构师之路17年精选80篇