我想在服务器端运行JavaScript代码。我想在我的Java代码中操纵JavaScript返回的结果。怎么办呢?
答案 0 :(得分:17)
开始显然是要研究rhino。
我认为你会发现这3个链接非常有用
您还可以查看helma
Helma是一个服务器端Javascript环境和Web应用程序框架,用于快速高效地编写脚本并为您的网站和Internet应用程序提供服务。
Helma是用Java编写的,它使用Javascript作为服务器端脚本环境......
答案 1 :(得分:10)
其他答案是正确的如果您希望在服务器端执行Javascript,则需要在JS运行时的上下文中对其进行评估。
但是,我不相信这正是你所要求的。我认为您可能希望运行一些“典型”JS功能,这些功能与页面在客户端计算机上的显示方式或与客户端上的交互方式相关 - 而且不可能在服务器端运行。
作为一个具体的例子:
一般来说,任何涉及document
或navigator
或甚至网页本身任何元素的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());