应用场景
公司有30员工,每个人工资计算方式不同。现在需要计算工资。
传统的方法:一个接口,30个实现类。
使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时使用脚本引擎调用相关的脚本,计算工资。
通过脚本引擎管理器,获得脚本引擎对象,执行相关代码
警告:计划从未来的JDK版本中删除Nashorn引擎
示例(1):在Java中执行JS代码
package cn.hanquan.rhino;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
//测试脚本引擎执行JavaScript代码
public class TestRhino {
public static void main(String[] args) throws Exception {
// 获得脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
// 定义变量,存储到引擎的上下文中
engine.put("msg", "hello~world!");
String str = "var user= {name:'HanQuan', age:29};";
str += "print(user.name);";
// 执行脚本
engine.eval(str);
}
}
运行结果
HanQuan
示例(2):分别通过 JavaScript/Java 获取脚本引擎定义的msg变量、使用脚本引擎修改msg的内容
- 引擎,相当于连接JavaScript和Java的桥梁。
- 存储到引擎的上下文中的变量
msg
,既可以被JavaScript
操作,也可以被Java
操作
package cn.hanquan.rhino;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
//测试脚本引擎执行JavaScript代码
public class Demo1 {
public static void main(String[] args) throws Exception {
// 获得脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
// 定义变量msg,存储到引擎的上下文中
engine.put("msg", "hello~world!");
// 使用js修改msg内容
engine.eval("msg='Hello,Are you Okayyyy'");
// 分别通过 JavaScript/Java 获取msg
engine.eval("print('通过JavaScript获取msg: '+msg);");
System.out.println("通过Java获取msg:" + engine.get("msg"));
}
}
运行结果
通过JavaScript获取msg: Hello,Are you Okayyyy
通过Java获取msg:Hello,Are you Okayyyy
示例(3):分别用JavaScript和Java,执行JavaScipt中的函数
package cn.hanquan.rhino;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
//测试脚本引擎执行JavaScript代码
public class Demo2 {
public static void main(String[] args) throws Exception {
// 获得脚本引擎对象
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("javascript");
// 定义函数
engine.eval("function add(a,b){var sum=a+b; return sum;}");
// 通过JavaScript执行函数
engine.eval("print('通过JavaScript执行函数: ' + add(11,22));");
// 通过Java执行函数
Invocable jsInvoke = (Invocable) engine;
Object res = jsInvoke.invokeFunction("add", new Object[] { 44, 55 });
System.out.println("通过Java执行函数: " + res);
}
}
运行结果
通过JavaScript执行函数: 33
通过Java执行函数: 99.0
还可以导入其他Java包
运行结果
北京尚学堂
清华大学
北京大学
* 若想要深入了解 Rhino 细节,可以上 Rhino 官网,详细学习 Rhino 语法。
* 另外,还有很多用 Java 执行 JS 脚本的方法, Rhino 只是其中一种。
执行本地的JavaScript文件
JS代码
目录结构
Java代码
更多推荐
【Java脚本引擎】脚本引擎执行JavaScript代码
发布评论