2010-08-06 101 views
2

,昨天搞清楚如何配置我的Eclipse项目以便能够运行JS代码(如果您感兴趣:Build a JS server inside of Java for Google AppEngine),我有下一个问题与此有关话题:我有一个JS文件和一个函数。我需要在Java代码中运行该函数,并在其中传递一个(Java字符串)变量。我的文件是非常基本的,但目前看起来是这样的:在Java中调用一个(Rhino)JS函数,并在通过一个变量

public class Com_feedic_readabilityServlet extends HttpServlet { 
public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws IOException { 
    resp.setContentType("text/html"); 
    Context cx = ContextFactory.getGlobal().enterContext(); 
    cx.setOptimizationLevel(-1); 
    cx.setLanguageVersion(Context.VERSION_1_5); 
    Global global = Main.getGlobal(); 
    global.init(cx); 
    Main.processSource(cx, "server_js/js_init.js"); 
} 
} 

我现在需要做的是调用js_init.js -file中的函数run()。我如何管理?

+0

?另外,你发布的这个功能与什么功能还不完全清楚。 – Pointy 2010-08-06 13:52:43

+0

它只是显示我如何导入.js文件。我使用的是一个导入的Rhino js.jar文件,它不完全是ScriptEngine机制(但我认为它是基于它的,除此之外:我没有任何线索)。 – fb55 2010-08-06 14:05:03

+0

嗯......我读过那篇博客文章,它看起来不像我曾经用过Rhino做过的任何事情。我一直使用JDK ScriptEngine框架和Rhino的内置(有些过时的)版本,这非常容易使用。 – Pointy 2010-08-06 14:23:10

回答

7

你需要通过绑定对象传递的参数值,如下所示:

package rhinodemo; 

    import java.util.Date; 
    import javax.script.*; 

    public class RhinoDemo { 

    public static void main(String[] args) throws Exception { 
     ScriptEngineManager mgr = new ScriptEngineManager(); 
     ScriptEngine engine = mgr.getEngineByName("JavaScript"); 

     Bindings bindings = engine.createBindings(); 
     bindings.put("currentTime", new Date()); 
     engine.eval(
     "function run(x) { println('x=' + x); }" + 
     "run(currentTime);", bindings); 
    } 
    } 

如果你希望你的Java代码来调用名为run()一个JavaScript函数,然后创建一个脚本(一)定义run()函数和(b)调用这个函数,传递一个参数给它。然后,在Java方面,您需要创建一个Bindings对象并设置此参数的值bindings.put(currentTime, new Date())

+0

我收到错误“println未定义”。如何将通过Rhino评估的内容传递给变量(请记住,我正在使用JS服务器)? – fb55 2010-08-07 12:05:24

1

试试这个:

Object jsOut = Context.javaToJS(System.out, scope); 
ScriptableObject.putProperty(scope, "out", jsOut); 

和js您使用的是JDK 6的ScriptEngine机制文件out.println(<text>);

相关问题