【问题标题】:how to use java to get a js file and execute it and then get the result如何使用java获取一个js文件并执行然后得到结果
【发布时间】:2010-01-14 17:24:09
【问题描述】:

如何使用java获取位于web服务器上的js文件,然后执行js文件中的函数,得到结果并在java中使用。

你们能给我一些代码sn-p吗?非常感谢。

【问题讨论】:

    标签: java javascript


    【解决方案1】:

    您可以使用Java内置的脚本引擎:

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    
    public static void main(String[] args) throws Exception {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
    
        Object result = engine.eval("my-java-script-code") 
        System.out.println("Result returned by Javascript is: " + result);
    }
    

    这里有一个更详细的example

    【讨论】:

      【解决方案2】:

      这个过程分为三个步骤:

      1. 从服务器获取 JS 文件。
      2. 从文件中执行一些 JS 函数。
      3. 提取结果。

      第一步相当简单,Java 中有很多 HTTP 库可以做到这一点 - 您实际上想要模拟 wget 或 curl 之类的简单功能。执行此操作的确切方式将根据您希望 JS 文件在下一步中采用的格式而有所不同,但获取字节流的过程很简单。

      第二步需要在 Javascript 引擎中执行 JS。 Java 本身无法解释 Javascript,因此您需要获得一个引擎来运行它 - Rhino 是一个常见的选择。由于您需要在 Java 之外运行它,您可能必须使用 ProcessBuilder 在 Rhino 中生成一个执行进程。此外,根据 Javascript 的格式,您可能需要创建自己的“包装器”javascript,其功能类似于 Java 中的主类并调用相关方法。

      最后你需要得到结果——显然你不能从你的 Java 程序中直接访问 JavaScript 对象。最简单的方法是让 JS 程序将结果打印到标准输出(可能序列化为 JSON 之类的东西,具体取决于对象的复杂性),由于您启动的方式,这些结果将直接流式传输到您的 Java 应用程序犀牛工艺。如果有的话,这可能是您的 JS 包装器脚本的另一项工作。否则,如果 JS 函数具有可观察到的副作用(创建文件/修改数据库),那么您将能够直接从 Java 中查询这些副作用。

      工作完成。

      我希望你意识到这个问题太模糊了,无法得到完整的答案。要求公众设计一个完整的系统超出了您将获得有用的、可操作的响应的范围。

      【讨论】:

      • Rhino 的链接已损坏。这是新的:mozilla.github.io/rhino
      • 这就是十二年对链接的影响,我猜。感谢您的更新。
      【解决方案3】:

      网上有很多关于如何download a file from a URL的例子。

      Suns 版本的 JDK 和 JRE 包括 Mozilla Rhino 脚本引擎。

      假设您已将 javascript 文件的内容存储在一个名为“脚本”的字符串中,您可以按如下方式执行脚本

       String result = null;
       ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
        try {
          jsEngine.eval(script);
          result = jsEngine.get("result")
        } catch (ScriptException ex) {
            ex.printStackTrace();
        } 
      

      结果将从引擎中提取并存储在“结果”变量中。

      这是一个关于scripting in Java 的教程,可能有用。

      【讨论】:

        猜你喜欢
        • 2020-07-07
        • 2021-07-14
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多