應用場景
公司有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代碼