【发布时间】:2011-01-01 06:04:33
【问题描述】:
我想在服务器端运行 JavaScript 代码。我想在我的 Java 代码中操作 JavaScript 返回的结果。怎么办?
【问题讨论】:
-
This question 类似,但答案不同。
标签: java javascript
我想在服务器端运行 JavaScript 代码。我想在我的 Java 代码中操作 JavaScript 返回的结果。怎么办?
【问题讨论】:
标签: java javascript
开始显然是查看rhino。
我想你会发现这 3 个链接非常有用
你也可以去helma看看
Helma 是一个服务器端 Javascript 环境和 Web 应用程序框架,用于快速高效地编写脚本并为您的网站和 Internet 应用程序提供服务。
Helma 是用 Java 编写的,并在其服务器端脚本环境中使用 Javascript ...
【讨论】:
其他答案是正确的,如果您想在服务器端执行 Javascript,您需要在 JS 运行时的上下文中对其进行评估。
但是,我不相信这正是您要问的。我认为您可能希望运行一些“典型”的 JS 功能,这些功能与页面在客户端机器上的显示方式或在客户端上的交互方式有关——这不可能在服务器端运行。
作为一个具体的例子:
广义而言,任何涉及document 或navigator 甚至页面本身的任何元素的Javascript 都可能属于后一类。
如果您确实需要获取有关客户端环境的信息以控制页面的呈现方式,则必须从上一页的客户端中提取这些信息,并将其编码到请求中(作为查询参数或表单数据)。然后可以直接在服务器上读取这些参数并用于控制输出。
请记住,当您的代码在服务器端运行时,您正在创建一个页面(最终是一堆 HTML、CSS 和 JS),一旦完成就会发送到客户端——此时 还没有客户,所以你不能和他们互动。
抱歉,如果我在这个问题上搞错了,但这类问题通常是由没有掌握客户端/服务器分离的人提出的。
【讨论】:
您需要在 Java 运行时中包含 JS 运行时。一种方法是Rhino
【讨论】:
您使用 Rhino 执行 JavaScript,这是一个用于 Java 的 JavaScript 库。
【讨论】:
您可以使用 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);
}
【讨论】:
这个例子应该清楚地说明如何在 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());
【讨论】: