Java 执行 JS 脚本工具

用途:为了便于系统扩展,提供了 JS 脚本的功能,可以通过在系统中执行脚本来获得更复杂的功能。

例如:系统提供了一个接口,这个接口不必非的有实现类,而是可以通过JS来实现这个接口的方法,在运行时载入JS脚本去实现。只要能融会贯通,可用的地方还是很多的。

关于JAVA 执行 JS 的基本功能参考这里:

http://www.2cto.com/kf/201505/402064.html

先看最基础的一个工具类

实际上有这么一个工具类就足够了,后面讲的例子也是基于这个工具类的。

这段代码的原理:

由于在 Java 的 javascript 引擎中,常用的List,Map等复杂对象的 属性值 不能在 js 中直接使用。因此这里遍历params所有的key,通过 Gson 转换value为 Json 字符串,再通过 eval 执行 var key = {...};,执行后,在引擎中就有了一个可以使用的遍历key值,经过这种转换,复杂的对象就可以应用在 js 引擎中了。

提示
可以通过:Binds bs = engine.getBindings(ScriptContext.ENGINE_SCOPE);获得脚本引擎作用域内的所有变量。

你还可以往 engine 中绑定 Java 中的对象,调用对象的方法,像 Dao,Service 应该是没问题的,你也可以尝试去调用数据库方法。

如果你想使用对象的属性,你就需要按照上面的方式使用。

下面是一个使用该工具类的简单例子。

通过 JS 实现 Java 接口

这只是一个简单的例子,其中动态代理的原理在 MyBatis接口的简单实现原理 中介绍过,这个例子没有实现如 MyBatis 那样强大的功能,为了演示,这里的 Java 都是单接口方法。

代理类

这个类需要将脚本传递进来,接口方法参数需要有@JsParam注解,convertArgs 方法将参数转换适合JSUtil工具类使用的Map类型,然后传入script和参数来执行,执行后通过ConvertUtils工具来转换返回值类型,最后返回结果。

@JsParam注解


由于低版本 Java 无法获取参数名,因此这里仅仅通过简单的注解来得到名字。

这里注解设置的名字就是我们脚本中可以直接用到的参数。

代理工厂


一个简单的工厂类。

测试代码

测试用的接口

注:
接口很简单,但是参数类型可以是List<User>这样的复杂对象。
你可以在 JS 脚本中按照 JSON 的方式去使用所有的值。

测试代码

注意脚本中的num1num2,必须和接口中定义的注解名一致。

更特殊一点的可以是这样的脚本:

var sum = num1+num2;
sum;

这里需要注意如何返回值,就是将要返回的值写在最下面。不能写成 return sum;。不知道和函数式编程有什么联系,如果有懂的人,欢迎留言回复。

输出结果

100

最后

虽然这个例子没有直接使用的意义,但是其中包含的原理可以对你设计 JS 脚本功能有一定的帮助。在 Java 中,通过 Js 作为一种扩展手段是很容易可以实现的。

Java 执行 JS 脚本工具相关推荐

  1. mongodb java 执行js脚本_MongoDB编写并执行js脚本

    使用mongodb项目时经常需要在数据库中插入假数据,如果每次都手动插入就会很麻烦,所以我们可以选择编写脚本来执行.mongodb是可以直接执行js脚本的,使用方法也比较简单. 编写脚本 以插入数据为 ...

  2. java 执行js脚本_java中调用js脚本

    JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...

  3. java运行python脚本_java中执行python脚本工具类详解

    java中执行python脚本工具类,需要jython.jar import java.io.FileInputStream; import java.io.IOException; import j ...

  4. Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象window,document的问题

    问题场景: 使用java 掉用js代码,发现 ScriptEngine不支持浏览器内置对象window,document的问题: 问题一:为什么要 用java掉用js代码? 比如在 抓取(爬取)对方网 ...

  5. mongo shell连接到mongoDB及shell提示符下执行js脚本

    同mysql数据库类似,mongoDB也可通过mongo客户端连接到mongod服务器来进行绝大多数日常管理.这个命令行工具就是mongo,在mysql中则是mysql.通过mongo命令可以连接到本 ...

  6. Java执行动态脚本

    Java执行一些动态的规则,使用动态字节码反而来说就太复杂了,所以Java提供了ScriptManager调用JavaScript.Groovy.Ruby以及Scheme和Haskell编写的脚本. ...

  7. ScriptEngine--Java动态执行JS脚本

    ScriptEngine--Java动态执行JS脚本 简介 Eval(String script) 描述 实例代码 Put() and Get() 描述 实例代码 CompiledScript 描述 ...

  8. 脚本运行显示服务器超时,java执行shell脚本超时

    java执行shell脚本超时 [2021-02-11 04:20:34]  简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...

  9. AngularJs中,如何在render完成之后,执行Js脚本

    AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点 ...

最新文章

  1. 搜索插入位置—leetcode35
  2. node 安装_VUE项目迁移之node.js的安装
  3. ubuntu下c 访问mysql_Ubuntu下用C语言访问MySQL数据库
  4. 基于Cairngorm的Silverlight开发 - part3
  5. Mac/IOS Xcode Instruments资源统计及自动化相关
  6. Altium Designer生成网表 导出网表【worldsing笔记】
  7. Spring Boot2.0之热部署原理
  8. setup factory 设置默认字段的值
  9. 关于跨境电商shopee平台,你了解多少?
  10. RAID磁盘阵列与阵列卡 2022.6.5
  11. 阿里云免费服务器搭建个人博客
  12. wireshark学习笔记(MAC地址欺骗)
  13. 2020年排名前10的Python库
  14. 生成sign(签名),以及校验工具类
  15. Kalman实际应用总结
  16. 使用tensorflow2.x实现VGG
  17. cvi读写.csv文件
  18. react状态管理ppt
  19. 设置横坐标刻度_Excel图表坐标轴设置有技巧,能解决多数人会遇到的2个棘手问题...
  20. ALOS PALSAR卫星轨道参数读取

热门文章

  1. 网站流量统计与网站访问分析
  2. 海信85U7G和海信85U7G-PRO有什么区别 哪个好详细性能配置对比
  3. Redis 在windows中启动
  4. Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
  5. java调用java程序,详细说明
  6. JavaScript计算两个日期之间相差的天数
  7. ONVIF Device Test Tool测试工具使用方法(详细)
  8. 解决liquibase.exception.LockException: Could not acquire change log lock. Currently locked by XXXX
  9. 无法启动程序 系统找不到指定的文件
  10. ava Springboot养老院信息管理系统源码