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].

Reply via email to