Java 执行 JS 脚本工具
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 的方式去使用所有的值。
测试代码
注意脚本中的num1
和num2
,必须和接口中定义的注解名一致。
更特殊一点的可以是这样的脚本:
var sum = num1+num2;
sum;
这里需要注意如何返回值,就是将要返回的值写在最下面。不能写成 return sum;
。不知道和函数式编程有什么联系,如果有懂的人,欢迎留言回复。
输出结果
100
最后
虽然这个例子没有直接使用的意义,但是其中包含的原理可以对你设计 JS 脚本功能有一定的帮助。在 Java 中,通过 Js 作为一种扩展手段是很容易可以实现的。
Java 执行 JS 脚本工具相关推荐
- mongodb java 执行js脚本_MongoDB编写并执行js脚本
使用mongodb项目时经常需要在数据库中插入假数据,如果每次都手动插入就会很麻烦,所以我们可以选择编写脚本来执行.mongodb是可以直接执行js脚本的,使用方法也比较简单. 编写脚本 以插入数据为 ...
- java 执行js脚本_java中调用js脚本
JDK1.6加入了对Script(JSR223)的支持.这是一个脚本框架,提供了让脚本语言来访问Java内部的方法.你可以在运行的时候找到脚本引擎,然后调用这个引擎去执行脚本.这个脚本API允许你为脚 ...
- java运行python脚本_java中执行python脚本工具类详解
java中执行python脚本工具类,需要jython.jar import java.io.FileInputStream; import java.io.IOException; import j ...
- Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象window,document的问题
问题场景: 使用java 掉用js代码,发现 ScriptEngine不支持浏览器内置对象window,document的问题: 问题一:为什么要 用java掉用js代码? 比如在 抓取(爬取)对方网 ...
- mongo shell连接到mongoDB及shell提示符下执行js脚本
同mysql数据库类似,mongoDB也可通过mongo客户端连接到mongod服务器来进行绝大多数日常管理.这个命令行工具就是mongo,在mysql中则是mysql.通过mongo命令可以连接到本 ...
- Java执行动态脚本
Java执行一些动态的规则,使用动态字节码反而来说就太复杂了,所以Java提供了ScriptManager调用JavaScript.Groovy.Ruby以及Scheme和Haskell编写的脚本. ...
- ScriptEngine--Java动态执行JS脚本
ScriptEngine--Java动态执行JS脚本 简介 Eval(String script) 描述 实例代码 Put() and Get() 描述 实例代码 CompiledScript 描述 ...
- 脚本运行显示服务器超时,java执行shell脚本超时
java执行shell脚本超时 [2021-02-11 04:20:34] 简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...
- AngularJs中,如何在render完成之后,执行Js脚本
AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点 ...
最新文章
- 搜索插入位置—leetcode35
- node 安装_VUE项目迁移之node.js的安装
- ubuntu下c 访问mysql_Ubuntu下用C语言访问MySQL数据库
- 基于Cairngorm的Silverlight开发 - part3
- Mac/IOS Xcode Instruments资源统计及自动化相关
- Altium Designer生成网表 导出网表【worldsing笔记】
- Spring Boot2.0之热部署原理
- setup factory 设置默认字段的值
- 关于跨境电商shopee平台,你了解多少?
- RAID磁盘阵列与阵列卡 2022.6.5
- 阿里云免费服务器搭建个人博客
- wireshark学习笔记(MAC地址欺骗)
- 2020年排名前10的Python库
- 生成sign(签名),以及校验工具类
- Kalman实际应用总结
- 使用tensorflow2.x实现VGG
- cvi读写.csv文件
- react状态管理ppt
- 设置横坐标刻度_Excel图表坐标轴设置有技巧,能解决多数人会遇到的2个棘手问题...
- ALOS PALSAR卫星轨道参数读取
热门文章
- 网站流量统计与网站访问分析
- 海信85U7G和海信85U7G-PRO有什么区别 哪个好详细性能配置对比
- Redis 在windows中启动
- Java基础篇:什么是hashCode 以及 hashCode()与equals()的联系
- java调用java程序,详细说明
- JavaScript计算两个日期之间相差的天数
- ONVIF Device Test Tool测试工具使用方法(详细)
- 解决liquibase.exception.LockException: Could not acquire change log lock. Currently locked by XXXX
- 无法启动程序 系统找不到指定的文件
- ava Springboot养老院信息管理系统源码