如何在服务器端Java代码上运行JavaScript代码?

时间:2010-01-04 13:22:20

标签: java javascript

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

6 个答案:

答案 0 :(得分:17)

开始显然是要研究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
  4. 您还可以查看helma

      

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

         

    Helma是用Java编写的,它使用Javascript作为服务器端脚本环境......

答案 1 :(得分:10)

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

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

作为一个具体的例子:

  1. 如果你想在JS中运行某种算法而不将其移植到Java - 比如说,你有一些不透明的Javascript代码,它会在给定种子的情况下生成一个特定的序列 - 如果你在服务器上的Rhino上运行它,它会正常工作
  2. 如果你想在创建页面时调用Javascript函数,而不是在它运行时 - 比如说,获取用户的颜色深度/屏幕分辨率并改变页面的生成方式 - 那么这个将从服务器,因为 此时没有客户端要查询。
  3. 一般来说,任何涉及documentnavigator或甚至网页本身任何元素的Javascript都可能属于后一类。

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

    请记住,当您的代码在服务器端运行时,您创建的页面(最终是一堆HTML,CSS和JS)将在完成后发送给客户端 - 此时 还没有客户端,因此您无法与他们互动。

    如果我在这个问题上得到了错误的结论,请道歉,但这类问题通常是由那些没有掌握客户/服务器分离的人提出的。

答案 2 :(得分:3)

您需要Java运行时内部的JS运行时。一种方法是Rhino

答案 3 :(得分:2)

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

答案 4 :(得分:2)

您可以使用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);
}

答案 5 :(得分:0)

此示例应明确说明如何在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());