首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javax.script包:如何导入JavaScript文件?

javax.script包:如何导入JavaScript文件?
EN

Stack Overflow用户
提问于 2012-10-19 19:33:58
回答 1查看 8.1K关注 0票数 1

我使用javax.script包在Java应用程序中运行外部JavaScript文件。

如何在不使用Java代码的情况下将一个JavaScript文件导入到另一个JavaScript文件中?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-27 00:34:37

当您说不使用java代码时,我不完全确定您的意思,但这是一个可以工作的纯javascript (尽管它调用了java):

代码语言:javascript
复制
importPackage(java.io);
function loadJs(name, user) {
    println("Loading " + name);
    var f = new File(name);
    var br = new BufferedReader(new FileReader(f));
    var line = null;
    var script = "";
    while((line = br.readLine())!=null) {
        script += line;
    }
    println(script);
    eval(script);
    hello(user);
}

当然,我有一个命名为...proivided的文件(比如c:/temp/hellouser.js),如下所示:

代码语言:javascript
复制
function hello(name) { print('Hello, ' + name); }

我使用一个groovy脚本测试了这个脚本:

代码语言:javascript
复制
import javax.script.*;

sem = new ScriptEngineManager();
engine = sem.getEngineByExtension("js");
script1 = """
importPackage(java.io);
function loadJs(name, user) {
    println("Loading " + name);
    var f = new File(name);
    var br = new BufferedReader(new FileReader(f));
    var line = null;
    var script = "";
    while((line = br.readLine())!=null) {
        script += line;
    }
    println(script);
    eval(script);
    hello(user);
}
""";

engine.eval(script1);
Object obj = engine.get("obj");
Invocable inv = (Invocable) engine;
inv.invokeFunction("loadJs", "c:/temp/hellouser.js", "Nicholas");

输出结果是:

加载c:/temp/hellouser.js

函数hello(name) { print('Hello,‘+ name);}

你好,尼古拉斯

我希望这就是你要找的东西……

===========================更新===========================

代码语言:javascript
复制
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

import com.sun.script.javascript.RhinoScriptEngineFactory;

/**
 * <p>Title: LoadEnabledRhinoEngineFactory</p>
 * <p>Description: Adding a loadJs function to the standard JS engine</p> 
 * <p>Company: Helios Development Group LLC</p>
 * @author Whitehead (nwhitehead AT heliosdev DOT org)
 * <p><code>org.helios.apmrouter.js.LoadEnabledRhinoEngineFactory</code></p>
 */

public class LoadEnabledRhinoEngineFactory extends RhinoScriptEngineFactory {

    /** The load script source */
    public static final String LOAD_JS = 
        "importPackage(java.io); " +
        "var script = ''; " +
        "var ctx = null; " +
        "function loadScript(name) { " +
            "var f = new File(name); " +
            "var br = new BufferedReader(new FileReader(f)); " +
            "var line = null; " +           
            "while((line = br.readLine())!=null) { " +
                "    script += line; " +
            "} " +
            "_e_ngine.eval(script);" + 
        "} ";
    
    /**
     * {@inheritDoc}
     * @see com.sun.script.javascript.RhinoScriptEngineFactory#getScriptEngine()
     */
    @Override
    public ScriptEngine getScriptEngine() {
        ScriptEngine se = super.getScriptEngine();
        Bindings b = se.createBindings();
        b.put("_e_ngine", se);
        se.setBindings(b, ScriptContext.GLOBAL_SCOPE);
        try {
            se.eval(LOAD_JS);
        } catch (ScriptException e) {
            throw new RuntimeException(e);
        }
        return se;
    }

现在,loadScript(fileName)是引擎的一部分,您可以使用JS轻松地调用它,如下所示:

代码语言:javascript
复制
loadScript('c:/temp/hellouser.js'); 
hello('Nicholas');"

或者,正如我在Java中测试的那样:

代码语言:javascript
复制
ScriptEngine se = new LoadEnabledRhinoEngineFactory().getScriptEngine();
try {
    se.eval("loadScript('c:/temp/hellouser.js'); hello('Nicholas');");
} catch (Exception e) {
    e.printStackTrace(System.err);
}

干杯。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12973386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档