java与js脚本的交互

这篇博客展示了如何使用Java加载和预编译JavaScript脚本,通过ScriptEngine和Invocable接口调用函数,并处理返回的数组结果。示例中,脚本文件包含多个函数,如f3_646_range和f3_647_write,这些函数返回不同数量的参数。博客详细记录了加载、执行和解析脚本返回值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

脚本初始化

    private ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engineArr = new ScriptEngine;

从文件加载脚本,预编译,检查语法错误

            String fileScript = "./cabtype.js";
            File fs = new File(fileScript);
            if (fs.exists()) {
                try {
                    engineArr = mgr.getEngineByName("JavaScript");
                    FileReader fr = new FileReader(fileScript);
                    engineArr.eval(fr);
                    logger.info("加载脚本 cabType = {} 成功!", i);
                } catch (Exception e) {
                    logger.error("加载脚本 cabType = {} 失败!", i);
                }
            }

调用js脚本中的函数,js函数可以以数组的形式返回多个返回值

 Invocable inv = (Invocable) engineArr;
 int i = 0;

 try {
         ScriptObjectMirror som = (ScriptObjectMirror) inv.invokeFunction(paramSymbol + "_fault", newVA);//调用JS函数
         if (som == null) {//TODO  代表无函数,可以不做处理
                        
                        
          } else if (som.isEmpty()) {
                logger.info("脚本执行返回空数组元素!");
          } else {
               //取数组中的返回值
               if (som.isArray() && som.size() >= 3) {
                     String faultCode = som.get("0").toString();
                     String faultValu = som.get("1").toString();
                     String faultName = som.get("2").toString();
                        
               } else {
                      logger.error("NODEID:{}, 脚本返回的故障参数{}值不为3的倍数", sNodeId, obj.getParamSymbol());
                }
                      
             }
    } catch (ScriptException e) {
           logger.error("NODEID:{}, FAULT脚本异常:{}", sNodeId, e.getMessage());
    } catch (NoSuchMethodException e) {
           logger.error("NODEID:{}, FAULT方法异常:{}", sNodeId, e.getMessage());
    } catch (Exception e) {
           logger.error("NODEID:{}, FAULT未知异常:{}", sNodeId, e.getMessage());
    }
       
   

js文件中的部分函数例子


//主路EEV 3 强制开
function  f3_646_range ( projectId, cabId, js) {
   var minV = 0;
   var maxV = 500;
   return [6,646,0,500,0,"步"] ;
}

function  f3_646_write(value) {
    return [6, 646, value];
}
//主路EEV 4 强制开
function  f3_647_show (value) {
   return [value, value+"步"] ; 
}

//主路EEV 4 强制开
function  f3_647_range ( projectId, cabId, js) {
   var minV = 0;
   var maxV = 500;
   return [6,647,0,500,0,"步"] ;
}

function  f3_647_write(value) {
    return [6, 647, value];
}
//辅路EEV 3 强制开
function  f3_648_show (value) {
   return [value, value+"步"] ; 
}

//辅路EEV 3 强制开
function  f3_648_range ( projectId, cabId, js) {
   var minV = 0;
   var maxV = 500;
   return [6,648,0,500,0,"步"] ;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

langeldep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值