【Java脚本引擎】脚本引擎执行JavaScript代码

应用场景

公司有30员工,每个人工资计算方式不同。现在需要计算工资。

传统的方法:一个接口,30个实现类。

使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时使用脚本引擎调用相关的脚本,计算工资。
在这里插入图片描述
通过脚本引擎管理器,获得脚本引擎对象,执行相关代码
在这里插入图片描述在这里插入图片描述

Warning: Nashorn engine is planned to be removed from a future JDK release

警告:计划从未来的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代码在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章