JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。

在Java中直接调用js代码

不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert” is not defined。

[java] view plain copy
  1. package com.sinaapp.manjushri;
  2. import javax.script.ScriptEngine;
  3. import javax.script.ScriptEngineManager;
  4. import javax.script.ScriptException;   /**  * 直接调用js代码  */
  5. public class ScriptEngineTest {
  6. public static void main(String[] args) {
  7. ScriptEngineManager manager = new ScriptEngineManager();
  8. ScriptEngine engine = manager.getEngineByName("javascript");
  9. try {
  10. engine.eval("var a=3; var b=4;print (a+b);");
  11. // 不能调用浏览器中定义的js函数
  12. // engine.eval("alert(\"js alert\");");
  13. // 错误,会抛出alert引用不存在的异常
  14. } catch (ScriptException e) {
  15. e.printStackTrace();
  16. }
  17. }
  18. }

输出结果:7

在Java中绑定js变量

在调用engine.get(key);时,如果key没有定义,则返回null

[java] view plain copy
  1. package com.sinaapp.manjushri;
  2. import javax.script.Bindings;
  3. import javax.script.ScriptContext;
  4. import javax.script.ScriptEngine;
  5. import javax.script.ScriptEngineManager;
  6. import javax.script.ScriptException;
  7. public class ScriptEngineTest2 {
  8. public static void main(String[] args) {
  9. ScriptEngineManager manager = new ScriptEngineManager();
  10. ScriptEngine engine = manager.getEngineByName("javascript");
  11. engine.put("a", 4);   engine.put("b", 3);
  12. Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
  13. try {
  14. // 只能为Double,使用Float和Integer会抛出异常
  15. Double result = (Double) engine.eval("a+b");
  16. System.out.println("result = " + result);
  17. engine.eval("c=a+b");
  18. Double c = (Double)engine.get("c");
  19. System.out.println("c = " + c);
  20. } catch (ScriptException e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

输出:
result = 7.0
c = 7.0

在Java中调用js文件中的function,传入调用参数,并获取返回值

js文件中的merge函数将两个参数a,b相加,并返回c。
[javascript] view plain copy
  1. // expression.js
  2. function merge(a, b) {
  3. c = a * b;
  4. return c;
  5. }

在Java代码中读取js文件,并参数两个参数,然后回去返回值

[java] view plain copy
  1. package com.sinaapp.manjushri;
  2. import java.io.FileReader;
  3. import javax.script.Invocable;
  4. import javax.script.ScriptEngine;
  5. import javax.script.ScriptEngineManager;
  6. /**  * Java调用并执行js文件,传递参数,并活动返回值  *   * @author manjushri  */
  7. public class ScriptEngineTest {
  8. public static void main(String[] args) throws Exception {
  9. ScriptEngineManager manager = new ScriptEngineManager();
  10. ScriptEngine engine = manager.getEngineByName("javascript");
  11. String jsFileName = "expression.js";
  12. // 读取js文件
  13. FileReader reader = new FileReader(jsFileName);
  14. // 执行指定脚本
  15. engine.eval(reader);
  16. if(engine instanceof Invocable) {
  17. Invocable invoke = (Invocable)engine;
  18. // 调用merge方法,并传入两个参数
  19. // c = merge(2, 3);
  20. Double c = (Double)invoke.invokeFunction("merge", 2, 3);
  21. System.out.println("c = " + c);
  22. }
  23. reader.close();
  24. }
  25. }

输出结果:
c = 5.0

JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码。相关推荐

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

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

  2. 可添加至收藏夹并在浏览器地址栏运行的JS代码

    编辑当前网页 代码如下: javascript:document.body.contentEditable='true'; document.designMode='on'; void 0 无敌图片风 ...

  3. 爬虫案例之网易有道翻译JS代码复杂版

    网易有道翻译逆向案例 本次案例逆向的是网易有道云翻译 https://fanyi.youdao.com/index.html#/ 用到的知识包括 requests 模块及方法 md5加密 js代码环境 ...

  4. 从恶意软件获得的新姿势——通过rundll32.exe执行js原理详细分析

    今年7月份,国外研究机构发现了一个比较新型的恶意软件,这个恶意软件不会在系统上安装任何文件,而是藏身在windows的注册表中通过rundll32.exe执行JavaScript代码. 听上去确实很有 ...

  5. .NET 6 预览版 7:新功能已完成 ,将专注于改进

    .NET 团队的项目经理 Richard Lander在宣布 .NET 6 Preview 7 时说:"这是 .NET 预览的又一季的结束.", 中文翻译:.NET 6 预览版 7 ...

  6. ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

    微软发布了其最新版本的机器学习框架:ML.NET 0.11带来了新功能和突破性变化. 新版本的机器学习开源框架为TensorFlow和ONNX添加了新功能,但也包括一些重大变化, 这也是发布RC版本之 ...

  7. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...

  8. 有效期判断功能 java_有效的Java第三版有哪些新功能?

    有效期判断功能 java 自从听说即将出版的有效Java 第三版以来,我一直想知道其中有什么新内容. 我假设将涵盖自Java 6以来引入Java的功能,的确如此. 但是,第三版Java开发人员经典版也 ...

  9. 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版本开始 ...

最新文章

  1. vue 路由相关操作
  2. kernel和filter这两个概念在CNN中的区别以及卷积核与卷积层的关系
  3. java jvm目录,JVM(Java虚拟机)中过程工作目录讲解
  4. C++ STL vector的操作
  5. MySQL入门之访问控制与安全
  6. 项目管理学习总结(16)——如何突破技术管理
  7. 使用php 发送邮件,使用PHPMailer实现邮件发送代码分享
  8. ospf多区域路由实验
  9. 如何做一名了不起的开发人员?
  10. 这才是你寻寻觅觅想要的 Python 可视化神器!
  11. iOS开发 - 在状态栏显示FPS,CPU和内存信息
  12. Redisbook学习笔记(3)数据类型之列表
  13. linux内核虚拟内存之物理内存
  14. JetChat-简仿微信聊天应用
  15. 基于docker的test-containers环境百宝箱
  16. 怎么利用计算机自带功能删除垃圾,win7系统怎么清除电脑里的垃圾
  17. 各互联网公司offer比较
  18. 名人名言大全API 推荐
  19. 学习Nisy作者c语言教程笔记1
  20. SAP部分清账与剩余清账

热门文章

  1. pymysql.err.OperationalError: (1203, “User root already has more than ‘max_user_connections‘ active
  2. python数据库连接池使用
  3. OBTW的完整形式是什么?
  4. Java StringBuffer insert(int offset,String s)方法,带示例
  5. ejs获取js变量值_EJS变量(注入值)
  6. 简单的登录系统(java+JFrame+Mysql)
  7. 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
  8. python安全攻防---scapy使用
  9. uva 11012——Cosmic Cabbages
  10. 第一次训练赛的相关总结和教训!