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

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.           
  6.   public class ScriptEngineTest {      
  7.     public static void main(String[] args) {   
  8.         ScriptEngineManager manager = new ScriptEngineManager();  
  9.         ScriptEngine engine = manager.getEngineByName("javascript");  
  10.           try {      
  11.             engine.eval("var a=3; var b=4;print (a+b);");      
  12.             // 不能调用浏览器中定义的js函数      
  13.             // engine.eval("alert(\"js alert\");");     
  14.             // 错误,会抛出alert引用不存在的异常     
  15.           } catch (ScriptException e) {  
  16.               e.printStackTrace();     
  17.           }    
  18.       }     
  19. }  

输出结果: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.             
  8. public class ScriptEngineTest2 {   
  9.     public static void main(String[] args) {     
  10.         ScriptEngineManager manager = new ScriptEngineManager();     
  11.           ScriptEngine engine = manager.getEngineByName("javascript");     
  12.           engine.put("a"4);   engine.put("b"3);     
  13.           Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);  
  14.           try {  
  15.               // 只能为Double,使用Float和Integer会抛出异常  
  16.               Double result = (Double) engine.eval("a+b");  
  17.               System.out.println("result = " + result);  
  18.               engine.eval("c=a+b");  
  19.               Double c = (Double)engine.get("c");  
  20.               System.out.println("c = " + c);  
  21.           } catch (ScriptException e) {  
  22.               e.printStackTrace();     
  23.           }    
  24.       }   
  25.   }  
输出:
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"23);     
  21.              System.out.println("c = " + c);     
  22.         }     
  23.     reader.close();   
  24.  }   
  25. }  
输出结果:
c = 5.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构05数组和广义表

第五章 数组 和 广义表 数组和广义表可以看成是线性表在下述含义上的扩展:表中的数据元素本身也是一个数据结构。 5.1 数组的定义 n维数组中每个元素都受着n个关系的约束,每个元素都有一个直接后继元素。 可以把二维数组看成是这样一个定长线性表&…

k8s的ingress使用

ingress 可以配置一个入口来提供k8s上service从外部来访问的url、负载平衡流量、终止SSL和提供基于名称的虚拟主机。 配置ingress的yaml: 要求域名解析无误 要求service对应的pod正常 一、test1.domain.com --> service1:8080 apiVersion: extensions/v1beta1…

JDK1.8中如何用ScriptEngine动态执行JS

JDK1.8中如何用ScriptEngine动态执行JS jdk1.6开始就提供了动态脚本语言诸如JavaScript动态的支持。这无疑是一个很好的功能,毕竟Java的语法不是适合成为动态语言。而JDK通过执行JavaScript脚本可以弥补这一不足。这也符合“Java虚拟机不仅仅是Java一种语言的虚拟机…

数据结构06树和二叉树

第六章 树和二叉树 6.1 树的定义和基本术语 树 Tree 是n个结点的有限集。 任意一棵非空树中: (1)有且仅有一个特定的称为根(root)的结点; (2)当n>1时,其余结点可…

2019.03.20 mvt,Django分页

MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。 V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回响应。 T全拼为Tem…

CountDownLatch,CyclicBarrier和Semaphore

在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法。以下是本文目录大纲:一.CountDownLatch用法二.CyclicBarrie…

数据结构07排序

第十章内部排序 10.1 概述 排序就是把一组数据按关键字的大小有规律地排列。经过排序的数据更易于查找。 排序前KiKj,且Ki在前: 排序方法是稳定的,若排序后Ki在前; 排序方法是不稳定的,如排序后Kj在前。 分类: 内…

数据结构08查找

第九章 查找 另一种在实际应用中大量使用的数据结构--查找表。 所谓查找,即为在一个含有众多的数据元素的查找表中找出某个“特定的”数据元素。 查找表 search table 是由同一类型的数据元素构成的集合。集合中的数据元素之间存在着完全松散的关系,故…

下载Centos7 64位镜像

下载Centos7 64位镜像 1.打开Centos官网 打开Centos官方网站地址:https://www.centos.org/,点击Get CentOS Now 2.点击Minimal ISO镜像 Minimal ISO镜像,与DVD ISO镜像的差别有很多,这里只说两点 1.Minimal ISO类似于Windows的纯净…

[Objective-C语言教程]结构体(17)

Objective-C数组可定义包含多个相同类型的数据项的变量类型,但结构体是Objective-C编程中的另一个用户定义数据类型,它可组合不同类型的数据项。 结构体用于表示记录,假设要图书馆中跟踪书籍信息。可能希望跟踪每本书的以下属性 - 标题作者学…

Scala01入门

第1章 可伸展的语言 Scala应用范围广,从编写脚本,到建立大型系统。 运行在标准Java平台上,与Java库无缝交互。 更能发挥力量的地方:建立大型系统或可重用控件的架构。 将面向对象和函数式编程加入到静态类型语言。 在Scala中&a…

架构师之路17年精选80篇

【架构必备】 《互联网架构如何实现“高并发”》4W 《TCP接入层的负载均衡、高可用、扩展性架构设计》2.2W 《配置中心架构设计演进》1.7W 《跨公网调用的大坑与架构优化》1.4W 《DNS在架构设计中的巧用》1.9W 《消息如何在网络上安全传输》1.2W 《10W定时任务,如何…

iphone手机型号获取

#import <sys/utsname.h> //手机型号 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java网络01基本网络概念

协议 Protocol&#xff1a;明确规则 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;数据如何分包&#xff1b; ... TCP/IP四层模型&#xff1a; 应用层 HTTP SMTP POP IMAP 传输层 TCP UDP 网际层 IP 主机网络层 host to host layer 数模、…

apache的产品分类说明

分类 项目名 说明 开发语言 服务器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服务器C/CTomcatJava的Web服务器JavaJames邮件服务器JavaSpamAssassin反垃圾邮件C/CPerlApache的Perl编程语言支持C/CTclTCL脚本语言C/CDirectory Server超级目录服务器JavaAxisW…

Java网络02基本Web概念

URI Uniform Resource Identifier 同一资源标识符 以特定语法标识一个资源的字符串 绝对URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分为&#xff1a; data file本地文件系统 ftp http telnet urn 统一资源名 scheme-specific-part为&am…

解决自建ca认证后浏览器警告

前一篇讲解了基本的建立证书的过程&#xff0c;但是建立后总是会在浏览器那里警告&#xff1a; 此链接不是私密链接 --谷歌浏览器 此证书颁发机构不可信 此证书不是这个网站的 --ie浏览器 总之证书是生成成功了&#xff0c;但是其中的内容填写错误了&a…

设计模式学习(三)——单例模式

在Java开发过程中&#xff0c;很多场景下都会碰到或要用到单例模式&#xff0c;在设计模式里也是经常作为指导学习的热门模式之一&#xff0c;相信每位开发童鞋都用到过。我们总是沿着前辈的足迹去做设定好的思路&#xff0c;往往没去探究为何这么做&#xff0c;所以这篇文章对…

Java网络03流

网络程序所做的很大一部分工作只是输入和输出&#xff1a;从一个系统向另一个系统移动数据。 输出流 Java的基本输出流类是java.io.OutputStream: public abstract class OutputStream 这个类提供了写入数据所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序开发的仿微信demo

(本文参考自github/liujians,地址:https://github.com/liujians/weApp) 作者声明&#xff1a; 基于微信小程序开发的仿微信demo 整合了ionic的样式库和weui的样式库 使用请查看使用必读! 更新日志请点击这里 目前功能 查看消息 网络请求获取数据&#xff08;download示例server…