项目中需要用到前端提交js代码, 后端执行, 这里记录一下简单使用
使用的java8的Nashorn JavaScript引擎
java代码
@Test
public void javaExecScript() throws Exception {
/**
* 1 java往js中注入数据,js使用注入的数据
*/
String code = new String(Files.readAllBytes(Path.of(new URI("file:///D:/cxy/.../src/test/resources/script.js"))));
// 获取引擎
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
/**
* 2 可以使用ClassFilter限制访问的类,防止注入
*/
// engine = ((NashornScriptEngineFactory) engine.getFactory()).getScriptEngine(new ClassFilter() {
// @Override
// public boolean exposeToScripts(String className) {
// if (className.equals("java.util.HashMap")) {
// return false;
// } else {
// return true;
// }
// }
// });
// 数据绑定,注入
Bindings bindings = engine.createBindings();
engine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);
Map<String,Object> row = new HashMap<>();
row.put("id","id1");
row.put("name","name1");
bindings.put("row", row);
Object result = engine.eval(code);
System.out.println("java output get result from script : " + JSONObject.toJSONString(result));
/**
* 3 java使用js中定义的函数
* 因为js是在当前jvm中运行,所以invokeFunction可以传入当前jvm内的其他类对象
*/
Invocable invocable = (Invocable) engine;
System.out.println(invocable.invokeFunction("fun1", "hhhhhh"));
System.out.println("end");
}
js脚本
/**
* 参考文章https://mouse0w0.github.io/2018/12/02/Introduction-to-Nashorn/
*/
/**
* 函数
* @param param
* @returns {string}
*/
var fun1 = function(param) {
print('js function get param' + param);
return "return from js function:" + param;
}
/**
* 使用java绑定数据
*/
print('js get row : '+ row)
// 直接使用java中的类,然后可以在下面使用这个类的其他方法
/**
* 使用java map类
*/
var HashMap = Java.type('java.util.HashMap');
var subMap = new HashMap()//或者直接指定全路径 var subMap = new java.util.HashMap();
subMap.put('java_map_key', 'java_map_value');
/**
* 使用java list类
*/
var list = new java.util.ArrayList();
list.add('1');
list.add('2');
list.add('3');
for each (var item in list) {
print(item); // a, b, c
}
/**
* 数据返回
*/
var res = {}
if(row.id == '1'){
res = {
'id':'111',
'name':'name1111',
'java_map': subMap
}
}else{
res = {
'id':'222',
'java_map': subMap
}
}
res