java调用js脚本

本文介绍了如何在Java项目中使用NashornJavaScript引擎执行前端提交的JS代码。通过示例代码展示了如何注入数据、限制访问类、调用JS函数以及在JS中使用Java的数据结构如Map和List。详细讲解了如何实现Java和JavaScript之间的交互,为混合编程提供了参考。
摘要由CSDN通过智能技术生成

项目中需要用到前端提交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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值