前些天写代码遇到了调用脚本的问题,今天总结总结吧!java从jdk1.6开始支持调用脚本,它的底层实现是Mozilla Rhino,这是一个完全使用java语言编写的开源javascript引擎实现 。
好了,废话不多说了,直接上步骤和代码。
1、获得一个ScriptEngineManager
ScriptEngineManager mgr = new ScriptEngineManager();
2、生成一个ScriptEngine脚本引擎,有三种方法可以获得
a)ScriptEngine engine = mgr.getEngineByExtension(String extension);
其中Extension只可取js,代表JavaScript
b)mgr.getEngineByMineType(String mine)
其中mine可取值有 1>application/javascript 2>application/ecmascript
3>test/javascript 4>test/ecmascript
c)mgr.getEngineByName(String Name)
其中Name可取值有 1>js 2>rhino
3>javascript 4>JavaScript
5>ECMAScript(JavaScript是ECMA-262标准的实现和扩展)
6>ecmascript
实际上可以通过以下代码找出当前环境支持的脚本引擎
package ex.jstest; import java.util.List; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; public class ParamType { public static void main(String[] args) { // TODO Auto-generated method stub ScriptEngineManager mgr = new ScriptEngineManager(); List<ScriptEngineFactory> factories = mgr.getEngineFactories(); for (ScriptEngineFactory f : factories) { System.out.println( "egine name:"+f.getEngineName() + "\n" + "engine version:"+f.getEngineVersion()+ "\n" + "language name:"+f.getLanguageName()+ "\n" + "language version:"+f.getLanguageVersion()+ "\n" + "names:"+f.getNames()+ "\n" + "mime:"+f.getMimeTypes()+ "\n" + "extension:"+f.getExtensions()); } } }
输出如下:
3、调用eval()方法执行脚本
package ex.jstest; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; public class ExecJs { public static void main(String[] args) { ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("js"); String js = "function hello(){return 'Hello World';} hello()"; try { // Object value = engine.eval("function hello(){return 'Hello World';} hello()"); Object value = engine.eval(js); System.out.println(value); } catch (Exception e) { e.printStackTrace(); } } }
I)当然在我们调用函数的时候还要传递一些参数此时可以这样做
ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("js"); engine.put("name", "Mr Lee"); try { Object value = engine.eval("function hello(p){return 'Hello world,' + p;} hello(name);" ); System.out.println(value); } catch (Exception e) { e.printStackTrace(); }
输出:Hello World,Mr Lee
II)如果想要更灵活的调用脚本,我们可以用到Invocable接口。例子如下:
ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); try { String js = "function test(p){return 'this is a test!' + p}"; 、 engine.eval(js); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } Invocable inv = (Invocable) engine; try { //可以多次的调用,动态的设置参数(这里执行了两次) String value1 = (String) inv.invokeFunction("test", "Mr Lee"); System.out.println(value1); String value2 = (String) inv.invokeFunction("test", "Mr Wong"); System.out.println(value2); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); }
有人可能要问了,能不能调用外部的js脚本呢?答案是肯定的
eval()是接受Reader类型的参数的,看代码
package ex.jstest; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.io.Reader; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /** * * @author Eswin * *读取文件中的js脚本 */ public class JsTest3 { public static void main(String[] args) throws FileNotFoundException { // TODO Auto-generated method stub ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); File f = new File("F:/test.js"); Reader r = new InputStreamReader(new FileInputStream(f)); try { engine.eval(r); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } Invocable inv = (Invocable) engine; try { String value = (String) inv.invokeFunction("test", "Mr Lee"); System.out.print(value); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ScriptException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这是js代码
好吧,暂时到这里,学到更多后续内容我会慢慢补充!加油!↖(^ω^)↗