第四篇 通过脚本引擎去执行JavaScript代码
脚本引擎执行JavaScript代码
脚本引擎介绍:
是的java应用程序可以通过一套固定的接口与各种脚本引擎交互,从而达到在java平台上面调用各种脚本语言的目的。
java脚本api是连通java平台和脚本语言的桥梁。
可以把一些复杂易变的业务逻辑交给脚本语言处理,这就大大提高了开发效率。
获得脚本引擎对象:
//获取脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager ();
ScriptEngine engine = sem .getEngineByName("javaScript");
java脚本api为开发者提供了如下功能:
获取脚本程序的输入,通过脚本引擎运行脚本并返回运行结果,这是最核心的接口。
注意点:接口。java可以通过使用各种不同的实现,从而调用js、groovy、python等脚本。
js使用了Rhino,这是一种使用java语言编写的JavaScript的开源实现。
通过脚本引擎运行上下文,在脚本和java平台间交换数据。
通过java应用程序调用脚本函数。
1 /** 2 * 测试脚本引擎执行JavaScript代码 3 * 4 * @author Zhang XiaoDao 5 * 6 */ 7 8 public class Demo01 { 9 //获取脚本引擎对象 10 ScriptEngineManager sem = new ScriptEngineManager(); 11 ScriptEngine en = sem.getEngineByName("javascript"); 12 13 14 //定义变量,存储到引擎上下文中,java和js都能获取到 15 en.put("msg","hello world"); 16 String str = "var user = {name:'zhangsan',age:18};"; 17 str += "println(user.name);"; 18 19 //执行脚本 20 en.eval(str); 21 22 //修改脚本里面的值 23 en.eval("msg = 'hi world';"); 24 System.out.println(en.get("msg")); 25 26 System.out.println("=============================="); 27 //定义函数 28 en.eval("function add(a,b){var sum = a+b; return sum;}"); 29 //执行js函数 取得调用接口 30 Invocable jsInvocable = (Invocable) en; 31 //传递方法名和参数 32 Object resualt = jsInvocable.invokeFunction("add",new Object[]{10,20}); 33 System.out.println(resualt); 34 35 //导入其他的java包,使用其他包中的java类 36 String jsCode = "importPackage(java.util); var list = Arrays.asList([\"张三\",\"李四\",\"王五\"])"; 37 en.eval(jsCode); 38 //获取js中的list 39 List<String> list1 = (List<String>)en.get("list"); 40 for(String ls : list1){ 41 System.out.println(ls); 42 } 43 44 //执行一个js文件(我们将a.js放在项目的src下面即可,或者是其他的地方) 45 URL url = Demo01.class.getClassLoader().getResource("a.js"); 46 FileReader fr = new FileReader(url.getPath()); 47 en.eval(fr); 48 fr.close(); 49 }
编写一个js文件
1 //定义test方法 2 function test(){ 3 var a = 1; 4 var b = 2; 5 println("执行js文件:"+(a+b)); 6 } 7 8 //执行test方法 9 test();