ScriptEngine使用java調用js代碼__js

來源:互聯網
上載者:User
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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.