2010-08-06 31 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>);

相關問題