这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
如何使用java代码进行javascript代码调用
前文
本文仅为项目中存在利用java代码调用JavaScript代码的需求,在此进行一下记录,并非完善的处理方案。
整体信息
目的需求主要可以归纳为通过前端输入JavaScript代码,将其传递给java服务。然后在后续的操作中,将对应记录了代码的节点利用脚本的代码进行处理,进行数据的过滤、加工等操作。
解决方案
想要利用java执行JavaScript代码,首先需要调研如何能够让JavaScript代码在java中正常执行。经过调研,了解到ScriptEngine这个可引用包,利用它可以进行JavaScript代码的调用。下面先来简单看一个demo代码:
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");
try {
engine.eval("function transform(msg){\n" +
"msg=JSON.parse(msg);\n" +
"\ttry{\n" +
"\t\tif(msg.data.property1 > 1){\n" +
"\t\t\treturn msg.msgType;\n" +
"\t\t}\n" +
"\t}catch(e){\n" +
"\t\tthrow e;\n" +
"\t}\n" +
"}");
if(engine instanceof Invocable){
Invocable in = (Invocable)engine;
String content = "{"msgType":"property","tenantName":"test","deviceTypeKey":"a12345","deviceName":"deviceName1234","time":1510799670074,"data":{"property1":"100","property2":"value2"}}";
System.out.println(in.invokeFunction("transform",content));
}
}catch (Exception e){
e.printStackTrace();
System.out.println("遭遇错误!");
}
}
这是一段demo代码,核心的思路就是首先编写好JavaScript脚本,然后将脚本交给ScriptEngine进行执行。当然,执行前要指定好执行的脚本内容为JavaScript语言。经过执行后,对于执行结果进行处理。需要注意的是,当我们执行JavaScript代码时,指定的执行方法需要与脚本中已经编写的执行方法保持一致。如上图所示,执行方法为transform。由于传入的数据预先设定好为字符串格式,因此需要在JavaScript脚本中,对于字符串进行转json对象操作。至此,准备工作进行完毕,只需要利用invokeFunction方法的调用,即可完成JavaScript脚本的执行。而由于本例仅为demo,内部逻辑尚未进行复杂的操作处理,实际上可以根据需求在JavaScript脚本中正常的编写所需要的逻辑。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。