有時候因為需要,我們想在java中調用js方法,不再是像頁面中一個事件觸發,該如何做到呢?今天下午沒事得時候小研究了下,現跟大家分享一下。不對之處,望大家指正,共同進步!
/*<br /> * 載入指令碼引擎,並在java中調用js方法<br /> */<br />public void test2()<br />{<br /> ScriptEngineManager manager = new ScriptEngineManager();</p><p> ScriptEngine engine = manager.getEngineByName("javascript");<br /> try {<br /> String str="2&1";<br /> Double d = (Double) engine.eval(str);<br /> Integer i=d.intValue();<br /> System.out.println(i);<br /> } catch (ScriptException ex) {<br /> ex.printStackTrace();<br /> }</p><p>}
/*<br /> * 在java中調用js,jdk1.6中有載入js引擎類,然後由它來調用js方法。<br /> * 並通過JDK平台給script的方法中的形參賦值<br /> */<br />public void test(String name)<br />{<br />ScriptEngineManager sem = new ScriptEngineManager();<br />/*<br /> *sem.getEngineByExtension(String extension)參數為js<br /> sem.getEngineByMimeType(String mimeType) 參數為application/javascript 或者text/javascript<br /> sem.getEngineByName(String shortName)參數為js或javascript或JavaScript<br /> */<br />ScriptEngine se = sem.getEngineByName("js");<br />try<br />{<br /> String script = "function say(){ return 'hello,'"+name+"; }";<br /> se.eval(script);<br /> Invocable inv2 = (Invocable) se;<br /> String res=(String)inv2.invokeFunction("say",name);<br /> System.out.println(res);<br />}<br />catch(Exception e)<br />{<br />e.printStackTrace();<br />} </p><p>}
/*<br /> * 示範如何將java中對象作為js中全域變數,同時示範將file類賦給指令碼語言,並獲得其屬性。<br /> */<br />public void testScriptVariables()<br />{<br />ScriptEngineManager sem=new ScriptEngineManager();<br />ScriptEngine engine=sem.getEngineByName("js");<br />File file=new File("c://1.txt");<br />engine.put("f", file);<br />try {<br />engine.eval("println('path:'+f.getPath())");//無法使用alert方法<br />} catch (ScriptException e) {<br />e.printStackTrace();<br />}</p><p>}
/*<br /> * 示範如何在java中如何通過線程來啟動一個js方法<br /> */<br />public void testScriptInterface() throws ScriptException<br />{<br />ScriptEngineManager sem=new ScriptEngineManager();<br />ScriptEngine engine=sem.getEngineByName("js");<br />String script="var obj=new Object();obj.run=function(){println('test thread')}";<br />engine.eval(script);<br />Object obj=engine.get("obj");//擷取js中對象<br />Invocable inv=(Invocable)engine;<br />Runnable r=inv.getInterface(obj,Runnable.class);<br />Thread t=new Thread(r);<br />t.start();</p><p>}
這樣java就可以執行動態語言了,不過注意是jdk1.6版本的哦~