基础入门
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