脚本语言因其方便、简洁等特性越来越受到关注,如javascript和groovy。在某些时候,使用脚本语言完成和java一样的功能时会编写得更快更方便,拿java中列表来说,使用java代码和groovy代码的比较如下:

  1. // 这是java代码
  2. List list = new ArrayList();
  3. list.add("obj1");
  4. list.add("obj2");
  5. // 这是groovy代码
  6. list = ["obj1", "ojb2"];

      可以看到,脚本语言更加简洁快速。脚本语言往往是解释性的语言,因此在运行期间动态更改更加利于我们进行测试而无须编译。所以,在需要进行快速编写和频繁修改的前提下,脚本语言的优势得以体现。java从1.6开始就已经将脚本语言的支持加入到标准API中来了,在javax.script包中可以看到该脚本框架的所有功能。如果有用过BSF的话,相信对脚本框架也应该相对比较熟悉了,java脚本语言框架提供的主要功能有:

 

1、使用ScriptEngine标准接口来执行脚本语言(包括代码段、函数、获取返回值等)

      该接口是主要的使用接口,可以通过字符串、文件来执行给定的脚本并获取返回值。背后是各个脚本语言引擎的实现

 

2、使用Binds和ScriptContext提供java和脚本语言间的参数传递(支持命名空间)

      对每个脚本引擎而言都有独立的命名空间来进行参数传递,同时也提供全局的命名空间和自定义命名空间。java程序和脚本语言可以通过命名空间相互传递参数

 

3、提供对脚本语言的编译/解析缓存(如groovy)以提高执行效率

这是针对实现了Compilable接口的引擎而言的,可以用来缓存编译/解析结果以提供重复执行的效率。比如groovy可以将代码编译为java字节码来执行,效率提高是非常明显的。

 

4、其他功能

      其实我们使用前3个主要功能就够了,足可以满足我们在java程序中使用脚本语言的便利。java1.6版的JRE已经自带了javascript脚本语言的实现引擎,采用的是ECMAScript规范的实现Mozilla Rhino。因此,默认我们就可以使用脚本框架在java程序中执行和调用javascript代码了。对于javascript而言,和我们平常在浏览器中使用的基本上都一样,因为都是兼容ECMAScript规范的。有区别的是浏览器中的javascript扩展了可以对DOM对象操作的功能,这是ECMAScript规范中没有的,所以不用指望可以使用类似alert等这样的方言功能了(所有window对象的属性和方法都不可用用的)。 使用脚本框架执行javascript是非常简单的,举个简单的例子如下,只需要3个步骤就可以:

  1. // 脚本引擎管理器,用来动态查找所有的脚本引擎
  2. ScriptEngineManager sem = new ScriptEngineManager();
  3. // 获取js引擎
  4. ScriptEngine jsEngine = sem.getEngineByExtension("js");
  5. // 执行一个js中的打印方法
  6. jsEngine.eval("println('Hello world')");

      ScriptEngineManager的动态查找方式是:搜索classpath路径中的所有jar文件,并读取jar文件中/META-INF/services/javax.script.ScriptEngineFactory文件的内容,该文件就是指定了实现ScriptEngineFactory接口的实现类。我们可以在jre/lib/resources.jar文件中找到javascript引擎的实现注册。

      ScriptEngine负责执行脚本,我们这里使用的是字符串,还可以是Reader对象从流中读取脚本内容。我们写一个js文件存放在类目录下,名称为js-1.js:

  1. var array = [12,13,15,16,18];
  2. for (var i = 0; i < array.length; i ++) {
  3. println("index:" + i + ",value:" + array[i]);
  4. }
  5. var obj = {};
  6. obj.a = 'i am a';
  7. obj.b = 'i am b';
  8. for (var p in obj) {
  9. println("Attribute:" + p + ",value:" + obj[p]);
  10. }

然后写如下java代码保存在ScriptDemo类文件中执行:

  1. ScriptEngineManager sem = new ScriptEngineManager();
  2. ScriptEngine jsEngine = sem.getEngineByExtension("js");
  3. jsEngine.eval(new InputStreamReader(ScriptDemo.class.getResourceAsStream("js-1.js")));

      运行后,我们就可以在控制台打印我们想要的结果了。如果想使用其他脚本语言的支持,直接将其实现了java脚本框架的jar包扔到classpath中即可。比如groovy的发行包已经实现了该规范,只需要将其发行包放入到classpath中然后调用即可。

      时间原因,暂时就写这么多吧,后面再慢慢补其他特性。。。

复制 搜索
复制 搜索

javascriptengine相关推荐

  1. java7 javascript引擎_Java7中脚本引擎的一般用法,共三种方法获得JavaScript引擎:名称、文件扩展名、MIME类型 | 学步园...

    package com.sino.java7; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; i ...

  2. 变量作用域函数作用域

    一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部 ...

  3. C# 获取QQ群数据的实现

    一,分析 1,群数据获取 当访问http://qun.qq.com/air/#mygroup我们通过Fiddler可以查看到QQ群列表是从http://qun.qq.com/air/group/min ...

  4. java连接mongodb_第78天: Python 操作 MongoDB 数据库介绍

    MongoDB 是一款面向文档型的 NoSQL 数据库,是一个基于分布式文件存储的开源的非关系型数据库系统,其内容是以 K/V 形式存储,结构不固定,它的字段值可以包含其他文档.数组和文档数组等.其采 ...

  5. HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数

    HtmlUnit官网的介绍: HtmlUnit是一款基于Java的没有图形界面的浏览器程序.它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充 ...

  6. NPAPI插件开发学习:NPAPI和NPRuntime的介绍

    本篇文章在探讨 NPAPI与 NPRuntime的设计,并非 Plugin教学. 当时因为看到公司内部写出来的 Plugin问题不少,而且网络上说明太少,特地写来给大家看的- 故本篇没有详细介绍每个  ...

  7. android aoto未解锁,【求教】为什么我的解锁屏幕代码缺无法解锁屏幕

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我运行后报错,有谁知道吗? if(!device.isScreenOn()) { //点亮屏幕 device.wakeUp(); sleep(1000); ...

  8. HttpClient和HtmlUnit的比较总结以及使用技巧(一)

    大家在做爬虫.网页采集.通过网页自动写入数据时基本上都接触过这两个组件(权且称之为组件吧),网上入门资料已经很多了,我想从实际的应用角度谈谈我对于这两个组件的看法,并记录在博客中,以便日后翻阅,欢迎大 ...

  9. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)

    文章目录 注入 SQL注入 JDBC拼接不当造成SQL注入 框架使用不当造成SQL注入 不安全的反射 命令注入 代码注入 表达式注入 Spel表达式注入 OGNL表达式注入 模板注入 注入 SQL注入 ...

最新文章

  1. Makefile所有内嵌函数
  2. if you feel lonely
  3. search Paths $(SRCROOT)和$(PROJECT_DIR)区别
  4. ARKit从入门到精通(2)-ARKit工作原理及流程介绍
  5. STL-Deque的实现
  6. 几种常见的Web攻击
  7. 中运算符百分号作用_SQL基础知识——LIKE运算符
  8. 【经典回放】多种语言系列数据结构算法:基数排序
  9. 探索C#之6.0语法糖剖析
  10. e-006 matlab,基于MATLAB进行潮流计算
  11. 单位阶跃信号是周期信号吗_直流散热风扇的信号你知道如何控制吗?
  12. 如何提升数据安全治理能力
  13. 数论入门基础(同余定理/费马小定理/扩展欧几里德算法/中国剩余定理)
  14. JavaScript之WebSocket 技术
  15. em算法python包_关于EM算法原理的分析与理解(Python实现)
  16. JAVA微博文章内容抓取_关于微博数据抓取的实践
  17. ARKit入门到精通-1.0 -基础内容-史小川-专题视频课程
  18. Excel POI 导入导出(支持大数据量快速导出)
  19. 【资源总结】前端资源收集
  20. ubuntu 钉钉 输入法不能输入中文,只能输入英文。

热门文章

  1. docker push 镜像 An image does not exist locally with the tag
  2. 【C语言篇】结构体和其它数据形式
  3. [产品03]-项目工作流程-产品启动/规划/执行/跟进/结尾/产品文档
  4. Mac下ssh生成及问题解决
  5. NER任务的评测指标
  6. 软考高级系统架构设计师系列论文五十四:论软件设计模式及应用
  7. Python数据分析28——seaborn可视化(四)之箱线图和分类柱状图
  8. oracle中未找到父项关键字怎么办,ORA-02298: 无法验证 (约束)提示未找到父项关键字的解决办法...
  9. 【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解
  10. layui数据表格实现重载数据表格功能(搜索功能)