Question ad "arguments" and ScriptEngine.ARGV
Rony G. Flatscher
Rony.Flatscher at wu.ac.at
Thu Feb 25 15:31:28 UTC 2021
While using Nashorn from Java 8 in the context of a Java based web server for which I authored a tag
library for scripting engines, I noted that "arguments" does not get set to the arguments passed via
the engine ScriptContext [1] entry ScriptEngine.ARGV [2] (i.e. "javax.script.argv" a single
dimensioned Java array of type Object of positional arguments) when invoking the Nashorn script via
engine.eval(script).
Is this really to be expected? If so, how can I cause the Nashorn engine to supply the Java
arguments to the script or have the script fetch the supplied arguments in a different way?
To illustrate, this is an example of three Nashorn fragments in a single JSP (one 'script' element
with type 'nashorn', one 'expr' element with type 'javascript' and a 'script' element with type
'javascript'):
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/script-jsr223.tld" prefix="s" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<style>
body { background-color: ivory; }
</style>
<title>Sample Application JSP Page Using JavaScript Via JSR-223 (Title)</title>
</head>
<body>
<div style="float: left; padding: 10px;">
<img src="images/Unofficial_JavaScript_logo_2.png" alt="" />
</div>
<h1>Sample Application JSP Page Using JavaScript Via Script (JSR223)</h1>
This is the output of a JSP page that is part of the Hello, World
application.
<p>Here is the text partially generated by a simple JavaScript script: <br />
<!-- note: a script can be of any size and complexity -->
*<s:script type="nashorn">****print("<p>Hello, world, this is Nashorn (JavaScript) speaking at ", Date(), "</p>")****print("<p>arguments: ", arguments, "</p>")****</s:script>*
<p>Here is the text generated by a simple JavaScript expression: <br />
<!-- note: an expression only creates a value that is automatically fetched -->
<p>It is now exactly *<s:expr type="javascript">Date()</s:expr>*.</p>
<p>The following script includes a syntax error (division by zero) intentionally.
The error in the script will not inhibit the creation of the page.</p>
<!-- note: by default an error in a script will not inhibit the creation of the page -->
*<s:script type="javascript">****print('cause a Nashorn/JavaScript error ...')****throw Error("This error is just for testing how the host behaves ...")****</s:script>*
<p>Done.<p>
</body>
</html>
The resulting HTML text will show "arguments: " but no arguments going with it, although there are
three arguments supplied via the engine scope ScriptContext with the entry ScriptEngine.ARGV as
mentioned above.
Here the resulting HTML text from the JSP above:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<style>
body { background-color: ivory; }
</style>
<title>Sample Application JSP Page Using JavaScript Via JSR-223 (Title)</title>
</head>
<body>
<div style="float: left; padding: 10px;">
<img src="images/Unofficial_JavaScript_logo_2.png" alt="" />
</div>
<h1>Sample Application JSP Page Using JavaScript Via Script (JSR223)</h1>
This is the output of a JSP page that is part of the Hello, World
application.
<p>Here is the text partially generated by a simple JavaScript script: <br />
<!-- note: a script can be of any size and complexity -->
<p>Hello, world, this is Nashorn (JavaScript) speaking at Thu Feb 25 2021 16:30:38 GMT+0100 (CET) </p>
<p>arguments: </p>
<p>Here is the text generated by a simple JavaScript expression: <br />
<!-- note: an expression only creates a value that is automatically fetched -->
<p>It is now exactly Thu Feb 25 2021 16:30:38 GMT+0100 (CET).</p>
<p>The following script includes a syntax error (division by zero) intentionally.
The error in the script will not inhibit the creation of the page.</p>
<!-- note: by default an error in a script will not inhibit the creation of the page -->
cause a Nashorn/JavaScript error ...
<p>Done.<p>
</body>
</html>
---rony
[1] "Java Scripting Framework (JSR-223)":
<https://docs.oracle.com/javase/8/docs/api/index.html?javax/script/package-summary.html>
[2] "javax.script.ScriptContext":
<https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptContext.html>
[3] "javax.script.ScriptEngine":
<https://docs.oracle.com/javase/8/docs/api/javax/script/ScriptEngine.html>
[4] "Nashorn and Shell Scripting":
<https://docs.oracle.com/javase/10/nashorn/nashorn-and-shell-scripting.htm#JSNUG158>
P.S.: It seems from samples on the Internet that when using the shell to invoke Nashorn that the
arguments get passed on to the script [4].
More information about the nashorn-dev
mailing list