Java Nashorn--Part 3
jjs 的 -Scripting 选项
jjs shell 是一个不错的方法来测试一些基本的 JavaScript,或者于不太熟悉的 JavaScript包进行交互(主要是指 javax.script)的方式,然而,在即时预览功能下,它缺乏多行输入和其他先进的功能,通常会在开发中稍微受限。
相反,在非交互的情境下使用 jjs 更加合适,例如运行一个用 JavaScript 写的后台守护进程,就可以这样使用:
$ jjs -scripting my_script.js
这使我们能够利用 jjs 的增强功能,这些包括一些有用的扩展,而其中的一些扩展对熟悉脚本程序员来说更加容易。
脚本注释
在Unix脚本语言中,使用“#”来注释一行的代码,在 Nashorn 里同样适用:
#!/usr/bin/jjs
# A perfectly legal comment in scripting mode
print("After the comment");
执行内置命令
此功能通常被称为“反撇号”由经验丰富的Unix程序员来使用。所以,我们可以利用Unix curl命令用来从谷歌点击下载内容:
echo "Google says: " `curl http://www.google.co.uk
我们也可以在 Nashorn 环境下执行相同功能的 Unix 命令:
print("Google says: "+ `curl http://www.google.co.uk`);
字符串插值
字符串插值是一种特殊的语法,允许程序员直接包含一个变量而不使用字符串连接。在Nashorn中,我们可以使用语法${} 插在字符串变量。例如,上一个下载网页的例子可以用这样的插值来重写:
var url = "www.google.co.uk";
var pageContents = `curl http://${url}`;
print("Google says: ${pageContents}");
特殊变量
Nashorn 也提供了一些特殊的全局变量和函数,特别有助于脚本和正常情况下不可用的JavaScript 中。例如,一个脚本的参数可以通过变量 $ARG 来访问。这个参数用“--”来约定,像这样:
jjs test1.jjs -- aa bbb cccc
然后这些参数可以在下面的例子中访问:
print($ARG);
for(var i=0; i < $ARG.length; i++) {
print("${i}: "+ $ARG[i]);
}
注意:
变量 $ARG 是 JavaScript 数组。对于来自其他语言的程序员(例如 Perl )来说,这个语法可能有点混乱,其中 $ 符号通常表示标量变量。
下一个特殊的全局变量,是 $ENV,提供对当前的环境变量的一个接口。例如,打印当前用户的主目录:
print("HOME = "+ $ENV.HOME); # Prints /home/ben for me
Nashorn 中也提供了一个特殊的全局函数称为 exec()。这就像我们刚才遇到的反撇号的用法,如本例所示:
var execOutput = $EXEC("echo Print this on stdout");
print(execOutput);
你可能已经注意到,当我们使用反撇号或 \(exec() 执行的命令的输出并没有打印出来,而是最终作为函数的返回值。这是为了防止在脚本的输出时打印一些无用的信息。
Nashorn 提供了其他两个特殊的变量供程序员使用,从脚本中执行命令的输出工作:\)OUT 和 $ERR,用于捕获从脚本中执行的命令的输出和任何错误消息。例如:
$EXEC("echo Print this on stdout");
// Code that doesn't change stdout
var saveOut = $OUT;
print("- - - - - - -");
print(saveOut);
内联文档
JavaScript,Java 并不支持字符串在同一个引号内分行书写,但是 Nashorn 在脚本模式下是支持的,在脚本预言中,可以使用这样的语法:<<END_TOKEN,来标识字符串的开始,一直到表示结束的标识符,这个标识符可以是任意的字符串,不过通常来使用END, END_DOC, END_STR, EOF, 和 EOSTR这样意义明显的字符串,在结束标识符结束以后,脚本语言恢复正常,看下面的例子:
var hw = "Hello World!";
var output = <<EOSTR;
This is a multiline string
It can interpolate too - ${hw}
EOSTR
print(output);
Nashorn 的辅助功能
Nashorn 还提供了一些辅助功能,让开发人员可以完成常见的任务,使执行的shell脚本更加容易:
- print() / echo()
我们一直在许多实例中使用 print() 方法,这些方法通常用来验证程序的预期行为。它会打印传递给它的字符串,后跟一个换行符。 - quit() / exit()
这两个方法完全相等,它们都会导致脚本退出。它们可以使用一个整数参数,该参数将用作脚本进程的返回代码。如果没有提供参数,按照惯例为Unix 惯例,默认使用0。 - readLine()
从标准输入读取一行输入(通常是键盘)。默认情况下,它将在标准输出下打印一行,但如果 readline() 返回值赋值给一个变量,输入的数据会被变量里的值替换掉,如下面的例子:
print("Please enter your name: ");
var name = readLine();
print("Please enter your age: ");
var age = readLine();
print(<<EOREC);
Student Record
-+-+-+-+-+-+-+-
Name: ${name}
Age: ${age}
EOREC
- readFully()
不是从标准输入读取,readfully() 加载一个文件的所有内容。与 readline() 一样,打印内容到标准输出,或赋给一个变量:
var contents = readFully("input.txt");
- load()
此方法用来加载和评估(通过 JavaScript 的eval)脚本。脚本可以由本地路径或URL定位。或者,它可以使用 JavaScript 的脚本对象标识定义为一个字符串。
注意:
当使用 load() 来加载其他脚本,可能会发生意外的错误。JavaScript 支持的形式使用 try-catch 块的异常处理,那么你在加载代码应该使用它。
这里是一个简单的例子,如何从 Nashorn 负载D3可视化图形库:
try {
load("http://d3js.org/d3.v3.min.js");
} catch (e) {
print("Something went wrong, probably that we're not a web browser");
}
- loadWithNewGlobal()
当我们使用 load() 方法,它是基于当前 JavaScript 上下文脚本。有时我们想把脚本放到自己的,干净的上下文。在这些情况下,使用loadwithnewglobal() 来开始一个全新和全局的上下文。
表达式语法
这些特性使 jjs 成为一个很好的选择,就像 shell,Perl 或是其它脚本语言一样利于书写。而表达式语法这一终极特性,使得在 Nashorn 下建立书写脚本语言成为可能。
注意:
如果一个可执行的脚本的第一行以#!开头,接下来是路径的可执行文件,则 Unix 操作系统将路径指向一个解释器,能够处理这种类型的脚本。如果脚本被执行,操作系统将执行解释器并将其传递给需要处理的脚本文件。
在这种情况下,为 Nashorn 建立一个软连接会是一个非常不错的实践。我们可以吧 jjs 库的实际位置(通常是 $JAVA_HOME/bin/jjs)软连接到 /usr/bin/jjs (或 /usr/local/bin/jjs),然后脚本语言就可以这样写啦!
#!/usr/bin/jjs
# ... rest of script
对于更高级的使用情况(例如,长时间运行的守护进程),甚至可以兼容 Node.js。这是由 Avatar 项目下的 avatar.js 来实现的。
我们看到,Nashorn 使 JavaScript 代码可以直接运行在命令行工具下,但在许多情况下,我们需要在 Java 代码中执行 JavaScript,这时候我们就需要 javax.script java 这个包下的 API 了。
Java Nashorn--Part 3的更多相关文章
- Java 7 可执行的 Nashorn,取代 Rhino
惊现有人把 OpenJDK 上的 Nashorn dump 下来,使得 Java 7 都能够使用.源代码在 https://bitbucket.org/ramonza/nashorn-backport ...
- Learning Java 8 Syntax (Java in a Nutshell 6th)
Java is using Unicode set Java is case sensitive Comments, C/C++ style abstract, const, final, int, ...
- Atitit。Js调用后台语言 java c# php swing android swt的方法大总结
Atitit.Js调用后台语言 java c# php swing android swt的方法大总结 1. Js调用后台语言有三种方法1 2. Swt BrowserFunction 绑定方法 ...
- JS代码检查工具ESLint
前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java 8 的 Nashorn 脚本引擎教程
本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...
- Nashorn 在JDK 8中融合Java与JavaScript之力
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...
- Nashorn——在JDK 8中融合Java与JavaScript之力
从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript ...
- java 11 移除的一些其他内容,更简化的编译运行程序,Unicode 10,移除了不太使用的JavaEE模块和CORBA技术,废除Nashorn javascript引擎,不建议使用Pack200 相关api
移除的一些其他内容 移除项 移除了com.sun.awt.AWTUtilities 移除了sun.misc.Unsafe.defineClass, 使用java.lang.invoke.MethodH ...
- Java 8 Nashorn JavaScript
转自:https://www.runoob.com/java/java8-nashorn-javascript.html Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Na ...
随机推荐
- 牛客网-《剑指offer》-二进制中1的个数
题目:http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8 C++ 负数需要特殊处理,因为负数右移会补1(符号位) cla ...
- uni - 使用npm
一.使用 1. 在当前根目录初始化package.json npm init -y 2. 安装(自动生成node_modules文件夹) npm i packageName yarn add pack ...
- vSphere Data Protection – a new backup product included with vSphere 5.1
August 27, 2012 By Vladan SEGET This new backup product replaces VMware Data Recovery, which has bee ...
- JAVA的CLASS文件详解
一.事例 1.1 Test.java public class Test { public static void main(String[] args) { System.out.println(& ...
- python 爬虫资料
API Requests PyQuery http://www.tuicool.com/articles/UZrmUb2 http://blog.csdn.net/cnmilan/article/de ...
- CentOS下Crontab安装使用详细说明(转)
来自:http://www.centoscn.com/CentOS/help/2014/1220/4346.html crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的 ...
- 再玩 DevStack(Mitaka版)- 基于 trystack.cn 源
曾经就写过一篇关于DevStack安装OpenStack的文章< 使用 DevStack 高速部署 OpenStack 开发环境 >,时过境迁,如今有更好的方式来实现.想到曾经的复杂性,认 ...
- Java Netty (2)
通过一个实例来说明Netty的使用.用1个服务器连接5个客户端线程,客户端连接上服务器以后就向服务器发送消息,服务器接收到消息后向客户端返回消息,客户端接收到消息以后,等待随机的时间,再向服务端发送消 ...
- JdbcTemplate应用学习
一.Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术 模板类 JDBC org.springframework.jdbc.core. ...
- 批处理/命令行合并js,递归合并子目录js文件
for /r %%i in (*.js) do type "%%i">>xxx-all.js java -jar yuicompressor.jar --type js ...