package com.bjsxt.test; import java.io.FileReader; import java.net.URL; import java.util.List; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; /** * 测试脚本引擎执行javascript代码 * @author 尚学堂高淇 www.sxt.cn * */ public class Demo01 { public static void main(String[] args) throws Exception { //获得脚本引擎对象 ScriptEngineManager sem = new ScriptEngineManager(); ScriptEngine engine = sem.getEngineByName("javascript"); //定义变量,存储到引擎上下文中 engine.put("msg", "gaoqi is a good man!"); String str = "var user = {name:'gaoqi',age:18,schools:['清华大学','北京尚学堂']};"; str += "println(user.name);"; //执行脚本 engine.eval(str);//输出结果gaoqi /* * 修改msg的值 * */ engine.eval("msg = 'sxt is a good school';"); /* * 打印msg的孩子 * */ System.out.println(engine.get("msg"));//输出sxt is a good school System.out.println("###########################"); //定义函数 engine.eval("function add(a,b){var sum = a + b; return sum;}"); //取得调用接口 Invocable jsInvoke = (Invocable) engine; //执行脚本中定义的方法 Object result1 = jsInvoke.invokeFunction("add", new Object[]{13,20}); System.out.println(result1);//输出结果是33.0 //导入其他java包,使用其他包中的java类.若需要深入了解细节,可以详细学习Rhino的语法 /** * * 使用java中的java类*/ String jsCode = "importPackage(java.util); var list=Arrays.asList(["北京尚学堂","清华大学","北京大学"]);"; engine.eval(jsCode); List<String> list2 = (List<String>)engine.get("list"); for (String temp : list2) { System.out.println(temp); } //执行一个js文件(我们将a.js至于项目的src下即可) URL url = Demo01.class.getClassLoader().getResource("a.js"); System.out.println(url.getPath()); FileReader fr = new FileReader(url.getPath()); engine.eval(fr); fr.close(); //由于只是测试,就不那么规范了。大家实际用时要使用try catch finally! } }
程序的运行结果是:
gaoqi
sxt is a good school
###########################
33.0
北京尚学堂
清华大学
北京大学