package com.lzy.test.bean;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* 测试脚本引擎执行javascript代码
* @author
*
*/
public class TestDemo02 {
public static void main(String[] args) throws ScriptException, NoSuchMethodException, IOException {
//获得脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
//定义变量,存储到引擎上下文中
engine.put("msg", "lzy is a good man!");
String str = "var user = {name:'lzy',age:18,schools:['清华大学','北京尚学堂']};";
str += "print(user.name);";
//执行脚本
try {
engine.eval(str);
engine.eval("msg='sj is a good school';");
System.out.println(engine.get("msg"));
System.out.println("#################################");
} catch (ScriptException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//定义函数
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);
//导入其他java包,使用其他包中的java类
//String jsCode="importPackage(java.util.ArrayList); var list=Arrays.asList([\"政法大学\",\"清华大学\",\"北京大学\"]);";该方法已经不适用,用一下就是jsCode1方法
String jsCode1 = "var list = java.util.Arrays.asList
([\"北京尚学堂\",\"清华大学\",\"北京大学\"]);";
engine.eval(jsCode1);
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");
FileReader fr = new FileReader(url.getPath());
engine.eval(fr);
fr.close(); //由于只是测试,就不那么规范了。大家实际用时要使用try catch finally!
}
}
注意:打印不再是println而是print