0
点赞
收藏
分享

微信扫一扫

Java8使用ScriptEngine动态执行js及规则引擎jexl3、groovy的使用

知年_7740 2022-12-03 阅读 91


基础入门

public static void javaCallJS() {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("nashorn");

String name = "Jaemon";
Integer result = null;

try {
scriptEngine.eval("print('" + name + "')");
result = (Integer) scriptEngine.eval("10 + 2");
} catch (ScriptException e) {
e.printStackTrace();
}
System.out.println(result.toString());
}

输出结果

Jaemon
12

 

执行js函数

public static void javaCallJS() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
String script = "function add(x, y) { return x + y;}";
scriptEngine.eval(script);
Invocable invocable = (Invocable) scriptEngine;
Object result = invocable.invokeFunction("add", new Object[]{10, 20});
System.out.println("result=" + result);
}

输出结果

result=30.0

 

将变量传入js脚本

public static void javaCallJS() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
String script = "Math.pow(x, y)";
Map<String, Object> params = Maps.newHashMap();
params.put("x", 10);
params.put("y", 2);
Object result = scriptEngine.eval(script, new SimpleBindings(params));
System.out.println("result=" + result);
}

输出结果

result=100.0

 

执行js语句块

如果现在知道参数值为: {“company”: 2, “amt”: 200},判断如下规则的执行结果

if (company == 1) {
return true;
} else if (company == 2 && amt > 100) {
return true;
} else if (company == 3 && amt > 200) {
return true;
} else {
return false;
}

实现方式如下

public static void javaCallJS() throws Exception {
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
// 待执行语句块
String script = "" +
"if (company == 1) {\n" +
" return true;\n" +
"} else if (company == 2 && amt > 100) {\n" +
" return true;\n" +
"} else if (company == 3 && amt > 200) {\n" +
" return true;\n" +
"} else {\n" +
" return false;\n" +
"}";
// 参数列表名称
String paramsName = "company, amt";
String executeScript = String.format(
"function execute(%s) { %s }", paramsName, script
);

scriptEngine.eval(executeScript);
Invocable jsInvoke = (Invocable) scriptEngine;

System.out.println(jsInvoke.invokeFunction("execute", new Object[]{1, 100}));
System.out.println(jsInvoke.invokeFunction("execute", new Object[]{2, 100}));
System.out.println(jsInvoke.invokeFunction("execute", new Object[]{2, 200}));
System.out.println(jsInvoke.invokeFunction("execute", new Object[]{3, 200}));
}

执行结果

true
false
true
false

 

jexl3表达式引擎执行字符串表达式

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>

private static final JexlEngine JEXL_ENGINE = new Engine();
// private static final JexlEngine JEXL_ENGINE = new JexlBuilder().strict(true).silent(false).cache(32).create();

public static void doExecute() throws Exception {
JexlContext mapContext = new MapContext();
mapContext.set("x", 1);
mapContext.set("y", 1);
Object evaluate = JEXL_ENGINE.createExpression("x+y").evaluate(mapContext);
System.out.println(evaluate);

String script = "if (company == 1) {\n" +
" return true;\n" +
"} else if (company == 2 && amt > 100) {\n" +
" return true;\n" +
"} else if (company == 3 && amt > 200) {\n" +
" return true;\n" +
"} else {\n" +
" return false;\n" +
"}\n";

mapContext.set("company", 3);
mapContext.set("amt", 201);
Object execute = JEXL_ENGINE.createScript(script).execute(mapContext);
System.out.println(execute);

mapContext.set("out", System.out);
mapContext.set("message", "hello world");
JEXL_ENGINE.createExpression("out.println(message)").evaluate(mapContext);
}

执行结果

2
true
hello world

 

groovy规则引擎的使用

<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.5</version>
</dependency>

public static void main(String[] args) {
String script = "" +
"if (company == 1) {\n" +
" return true;\n" +
"} else if (company == 2 && amt > 100) {\n" +
" return true;\n" +
"} else if (company == 3 && amt > 200) {\n" +
" return true;\n" +
"} else {\n" +
" return false;\n" +
"}\n";
Map<String, Object> env = Maps.newHashMap();
env.put("x", 1);
env.put("y", 2);
Object result = execute("x+y", env);
System.out.println(result);

env.put("company", 3);
env.put("amt", 201);
Object execute = execute(script, env);
System.out.println(execute);
}


public static Object execute(String scriptText, Map<String, Object> env) {
Script script = new GroovyShell().parse(scriptText);
script.setBinding(new Binding(env));
return script.run();
}

运行结果

3
true


举报

相关推荐

0 条评论