【问题标题】:How can I run JavaScript code at server side Java code?如何在服务器端 Java 代码上运行 JavaScript 代码?
【发布时间】:2011-01-01 06:04:33
【问题描述】:

我想在服务器端运行 JavaScript 代码。我想在我的 Java 代码中操作 JavaScript 返回的结果。怎么办?

【问题讨论】:

标签: java javascript


【解决方案1】:

开始显然是查看rhino

我想你会发现这 3 个链接非常有用

  1. JavaScript EE, Part 1: Run JavaScript files on the server side
  2. JavaScript EE, Part 2: Call remote JavaScript functions with Ajax
  3. JavaScript EE, Part 3: Use Java scripting API with JSP

你也可以去helma看看

Helma 是一个服务器端 Javascript 环境和 Web 应用程序框架,用于快速高效地编写脚本并为您的网站和 Internet 应用程序提供服务。

Helma 是用 Java 编写的,并在其服务器端脚本环境中使用 Javascript ...

【讨论】:

    【解决方案2】:

    其他答案是正确的,如果您想在服务器端执行 Javascript,您需要在 JS 运行时的上下文中对其进行评估。

    但是,我不相信这正是您要问的。我认为您可能希望运行一些“典型”的 JS 功能,这些功能与页面在客户端机器上的显示方式或在客户端上的交互方式有关——这不可能在服务器端运行。

    作为一个具体的例子:

    1. 如果您想在 JS 中运行某种算法而不将其移植到 Java 中 - 比如说,您有一些不透明的 Javascript 代码,可以在给定种子的情况下生成特定序列 - 如果您在服务器上的 Rhino 上运行它就可以了.
    2. 如果您想在创建页面时调用 Javascript 函数,而不是在页面运行时调用 - 例如,获取用户的颜色深度/屏幕分辨率并更改页面的生成方式 - 那么这个将不会从服务器获得,因为此时没有客户端可以查询。

    广义而言,任何涉及documentnavigator 甚至页面本身的任何元素的Javascript 都可能属于后一类。

    如果您确实需要获取有关客户端环境的信息以控制页面的呈现方式,则必须从上一页的客户端中提取这些信息,并将其编码到请求中(作为查询参数或表单数据)。然后可以直接在服务器上读取这些参数并用于控制输出。

    请记住,当您的代码在服务器端运行时,您正在创建一个页面(最终是一堆 HTML、CSS 和 JS),一旦完成就会发送到客户端——此时 还没有客户,所以你不能和他们互动。

    抱歉,如果我在这个问题上搞错了,但这类问题通常是由没有掌握客户端/服务器分离的人提出的。

    【讨论】:

      【解决方案3】:

      您需要在 Java 运行时中包含 JS 运行时。一种方法是Rhino

      【讨论】:

        【解决方案4】:

        您使用 Rhino 执行 JavaScript,这是一个用于 Java 的 JavaScript 库。

        【讨论】:

          【解决方案5】:

          您可以使用 RHINO 或 NASHORN。

          public class RhinoApp {
          private String simpleAdd = "var z=9; z*=9";
          
          public void runJavaScript() {
              Context jsCx = Context.enter();
              Context.getCurrentContext().setOptimizationLevel(-1);
              ScriptableObject scope = jsCx.initStandardObjects();
              Object result = jsCx.evaluateString(scope, simpleAdd , "formula", 0, null);
              Context.exit();
              System.out.println(result);
          }
          

          【讨论】:

          • 不错的答案。但是你可以改进它。您能否添加导入和 maven 依赖项,以便复制粘贴驱动!
          【解决方案6】:

          这个例子应该清楚地说明如何在 Java 中加载、评估和执行 Javascript 函数:

          ScriptEngineManager factory = new ScriptEngineManager();
          ScriptEngine engine = factory.getEngineByName("JavaScript");
          URI source_js = JavascriptExecutor.class.getResource("/file.js").toURI();
          String source_text = Files.readAllLines(Paths.get(source_js)).stream().collect(Collectors.joining("\n"));
          engine.eval(source_text);
          Invocable inv = (Invocable) engine;
          Object returnValue = inv.invokeFunction("functionJsName", "functionJsParameter");
          System.out.println(returnValue.toString());
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-10
            相关资源
            最近更新 更多