Java中使用JavaScript脚本的方法步骤

所属分类: 软件编程 / java 阅读数: 87
收藏 0 赞 0 分享

简介 Nashorn

Nashorn 一个 javascript 引擎。

从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展。

它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。

与先前的Rhino实现相比,这带来了2到10倍的性能提升。

使用方式

1. 编写JavaScript脚本

列:JavaScript方法使用Java对象执行方法获取返回值。

function scriptFunction(obj){
 var a = 1;
 var b = 2;
 return obj.sum(a,b);
}
scriptFunction(obj);//调用该方法

该脚本变量定义为 String script1;

2. 创建JavaScript容器用户存储脚本 ScirptContainer.java

public class ScirptContainer {
 
 
 public static ScriptEngine engine;//脚本引擎
 
 static {
 ScriptEngineManager manager = new ScriptEngineManager();//脚本引擎管理
 engine = manager.getEngineByName("nashorn");//获取nashorn脚本引擎
 engine.getContext().getWriter();//获取正文并且写入
 }
 
 private ConcurrentHashMap<Integer, CompiledScript> scripts = new ConcurrentHashMap<>();//脚本存储容器
 
 
 public CompiledScript getCompiledScript(String script) throws ScriptException{
 //判断脚本是否为空
 if(script == null || "".equals(script)){
 throw new ScriptException("JavaScript empty");
 }
 //获取脚本Hash
 int hashCode = script.hashCode();
 //从容器中获取脚本
 CompiledScript compiledScript = scripts.get(hashCode);
 if(compiledScript == null){
 //容器中无脚本创建脚本对象
 Compilable compilable = (Compilable) engine;
 //编译JavaScript脚本
 compiledScript = compilable.compile(script);
 //脚本对象存入容器中
 scripts.put(hashCode, compiledScript);
 }
 return compiledScript;
 } 
}

3. Java执行JavaScript脚本

public class ScriptHandler {
 
 //创建容器对象
 private ScirptContainer scirptContainer = new ScirptContainer();
 
 //需要执行的对象
 String js1 = "function scriptFunction(obj){ var a = 1; var b = 2; return obj.sum(a,b); } scriptFunction(obj);";
 
 @Test
 public void test() throws ScriptException{
 //获取脚本对象
 CompiledScript c1 = scirptContainer.getCompiledScript(js1);
 //创建参数绑定
 Bindings bindings = scirptContainer.engine.createBindings();
 //obj参数绑定SumTest类
 bindings.put("obj", new SumTest());
 //执行JavaScript脚本并且打印返回值
 System.out.println(c1.eval(bindings));
 }
}

注意事项:

  • 脚本中scriptFunction(obj);是必须存在,否则不会执行方法.
  • 脚本中可以创建Java对象,需要全类名如var map = new java.util.HashMap();

作者: SimpleWu

出处:https://www.cnblogs.com/SimpleWu/p/12598442.html

本站使用「SimpleWu BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。

更多精彩内容其他人还在看

Java实现一个简单的文件上传案例示例代码

这篇文章主要介绍了Java实现一个简单的文件上传案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解在spring中使用JdbcTemplate操作数据库的几种方式

这篇文章主要介绍了详解在spring中使用JdbcTemplate操作数据库的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

java中的switch case语句使用详解

这篇文章主要介绍了java中的switch case语句使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

深入理解Java 线程池

这篇文章主要介绍了Java 线程池的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

详解mybatis #{}和${}的区别、传参、基本语法

这篇文章主要介绍了mybatis #{}和${}的区别、传参、基本语法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

这篇文章主要介绍了MyBatis 中 ${}和 #{}的正确使用方法,本文给大家提到了MyBatis 中 ${}和 #{}的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Mybatis中的 ${} 和 #{}区别与用法

这篇文章主要介绍了Mybatis中的 ${} 和 #{}区别与用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Maven安装过程图文详解

这篇文章主要介绍了Maven安装过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

SpringBoot登录拦截配置详解(实测可用)

这篇文章主要介绍了SpringBoot登录拦截配置详解(实测可用),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

JAVA 内存溢出案例汇总

这篇文章主要介绍了JAVA 内存溢出案例的汇总,文中讲解非常细致,帮助各位工作学习时避免内存溢出,感兴趣的朋友可以了解下
收藏 0 赞 0 分享
查看更多