JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。
在Java中直接调用js代码
不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert” is not defined。
- package com.sinaapp.manjushri;
- import javax.script.ScriptEngine;
- import javax.script.ScriptEngineManager;
- import javax.script.ScriptException; /** * 直接调用js代码 */
- public class ScriptEngineTest {
- public static void main(String[] args) {
- ScriptEngineManager manager = new ScriptEngineManager();
- ScriptEngine engine = manager.getEngineByName("javascript");
- try {
- engine.eval("var a=3; var b=4;print (a+b);");
- // 不能调用浏览器中定义的js函数
- // engine.eval("alert(\"js alert\");");
- // 错误,会抛出alert引用不存在的异常
- } catch (ScriptException e) {
- e.printStackTrace();
- }
- }
- }
输出结果:7
在Java中绑定js变量
在调用engine.get(key);时,如果key没有定义,则返回null
- package com.sinaapp.manjushri;
- import javax.script.Bindings;
- import javax.script.ScriptContext;
- import javax.script.ScriptEngine;
- import javax.script.ScriptEngineManager;
- import javax.script.ScriptException;
- public class ScriptEngineTest2 {
- public static void main(String[] args) {
- ScriptEngineManager manager = new ScriptEngineManager();
- ScriptEngine engine = manager.getEngineByName("javascript");
- engine.put("a", 4); engine.put("b", 3);
- Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
- try {
- // 只能为Double,使用Float和Integer会抛出异常
- Double result = (Double) engine.eval("a+b");
- System.out.println("result = " + result);
- engine.eval("c=a+b");
- Double c = (Double)engine.get("c");
- System.out.println("c = " + c);
- } catch (ScriptException e) {
- e.printStackTrace();
- }
- }
- }
输出:
result = 7.0
c = 7.0
在Java中调用js文件中的function,传入调用参数,并获取返回值
- // expression.js
- function merge(a, b) {
- c = a * b;
- return c;
- }
在Java代码中读取js文件,并参数两个参数,然后回去返回值
- package com.sinaapp.manjushri;
- import java.io.FileReader;
- import javax.script.Invocable;
- import javax.script.ScriptEngine;
- import javax.script.ScriptEngineManager;
- /** * Java调用并执行js文件,传递参数,并活动返回值 * * @author manjushri */
- public class ScriptEngineTest {
- public static void main(String[] args) throws Exception {
- ScriptEngineManager manager = new ScriptEngineManager();
- ScriptEngine engine = manager.getEngineByName("javascript");
- String jsFileName = "expression.js";
- // 读取js文件
- FileReader reader = new FileReader(jsFileName);
- // 执行指定脚本
- engine.eval(reader);
- if(engine instanceof Invocable) {
- Invocable invoke = (Invocable)engine;
- // 调用merge方法,并传入两个参数
- // c = merge(2, 3);
- Double c = (Double)invoke.invokeFunction("merge", 2, 3);
- System.out.println("c = " + c);
- }
- reader.close();
- }
- }
输出结果:
c = 5.0
JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。相关推荐
- Selenium Webdriver 的使用java执行js代码 解决 ScriptEngine不支持浏览器内置对象window,document的问题
问题场景: 使用java 掉用js代码,发现 ScriptEngine不支持浏览器内置对象window,document的问题: 问题一:为什么要 用java掉用js代码? 比如在 抓取(爬取)对方网 ...
- 可添加至收藏夹并在浏览器地址栏运行的JS代码
编辑当前网页 代码如下: javascript:document.body.contentEditable='true'; document.designMode='on'; void 0 无敌图片风 ...
- 爬虫案例之网易有道翻译JS代码复杂版
网易有道翻译逆向案例 本次案例逆向的是网易有道云翻译 https://fanyi.youdao.com/index.html#/ 用到的知识包括 requests 模块及方法 md5加密 js代码环境 ...
- 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析
今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行JavaScript代码. 听上去确实很有 ...
- .NET 6 预览版 7:新功能已完成 ,将专注于改进
.NET 团队的项目经理 Richard Lander在宣布 .NET 6 Preview 7 时说:"这是 .NET 预览的又一季的结束.", 中文翻译:.NET 6 预览版 7 ...
- ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能
微软发布了其最新版本的机器学习框架:ML.NET 0.11带来了新功能和突破性变化. 新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能,但也包括一些重大变化, 这也是发布RC版本之 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...
- 有效期判断功能 java_有效的Java第三版有哪些新功能?
有效期判断功能 java 自从听说即将出版的有效Java 第三版以来,我一直想知道其中有什么新内容. 我假设将涵盖自Java 6以来引入Java的功能,的确如此. 但是,第三版Java开发人员经典版也 ...
- ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案
ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 原文:ASP.NET Core 2.2 : 十六.扒一扒2.2版更新的新路由方案 ASP.NET Core 从2.2版本开始 ...
最新文章
- vue 路由相关操作
- kernel和filter这两个概念在CNN中的区别以及卷积核与卷积层的关系
- java jvm目录,JVM(Java虚拟机)中过程工作目录讲解
- C++ STL vector的操作
- MySQL入门之访问控制与安全
- 项目管理学习总结(16)——如何突破技术管理
- 使用php 发送邮件,使用PHPMailer实现邮件发送代码分享
- ospf多区域路由实验
- 如何做一名了不起的开发人员?
- 这才是你寻寻觅觅想要的 Python 可视化神器!
- iOS开发 - 在状态栏显示FPS,CPU和内存信息
- Redisbook学习笔记(3)数据类型之列表
- linux内核虚拟内存之物理内存
- JetChat-简仿微信聊天应用
- 基于docker的test-containers环境百宝箱
- 怎么利用计算机自带功能删除垃圾,win7系统怎么清除电脑里的垃圾
- 各互联网公司offer比较
- 名人名言大全API 推荐
- 学习Nisy作者c语言教程笔记1
- SAP部分清账与剩余清账
热门文章
- pymysql.err.OperationalError: (1203, “User root already has more than ‘max_user_connections‘ active
- python数据库连接池使用
- OBTW的完整形式是什么?
- Java StringBuffer insert(int offset,String s)方法,带示例
- ejs获取js变量值_EJS变量(注入值)
- 简单的登录系统(java+JFrame+Mysql)
- 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
- python安全攻防---scapy使用
- uva 11012——Cosmic Cabbages
- 第一次训练赛的相关总结和教训!