2009-11-30 100 views
0

我已經在Rhino 1.7下使用Javascript編寫了一些腳本,其中一個腳本啓動了一個最小的http服務器並接受輸入中的JS命令。現在從腳本調用javascript解釋器

,如果我叫(從內部犀牛):

engine = ScriptEngineManager().getEngineByName("JavaScript"); 

我得到的內置JS引擎(從Java 1.6),這是犀牛的舊版本,並且缺少某些功能(如JavaAdapter的對多個接口)。

如何獲得Rhino引擎而不是?我需要ScriptEngineManager.getEngineFactories()還是其他什麼?

+0

對不起冗餘,但是:「engine = ScriptEngineManager()...」是在你的JS中調用的嗎?哪個在Rhino 1.7中運行,但是返回默認的Java 6 JS腳本引擎而不是Rhino?爲什麼你需要在你的JS裏面有一個新的腳本引擎?或者你想獲得當前的引擎/爲什麼你需要引用JS中的當前引擎? – 2009-11-30 16:10:34

+0

是的。我需要一個腳本來啓動另一個解釋器,以避免使用eval()。 第一個腳本啓動一個HTTP服務器,它爲單個頁面提供HTML表單。 POST方法向服務器發送命令或文件名,服務器端腳本執行代碼。 – 2009-12-01 11:19:57

回答

1

我自己發現了它(試錯)。如上所述,Rhino不會註冊引擎工廠。你可以得到當前的發動機(如上下文和腳本化的對象):

cx = Context.getCurrentContext(); 
scope = new ImporterTopLevel(cx); 

與這些對象,我可以運行我的腳本或使用evalString/evalReader命令行。

0

在調用你的初始腳本之前,爲什麼不在你的腳本中設置你用作上下文變量的引擎?這樣,在腳本內部,您將可以訪問運行它的引擎。

+0

我不確定我明白你的意思。 但是:更改運行javascript引擎的java代碼是我試圖避免的(否則我會在Java中實現整個http-server)。 – 2009-11-30 14:41:39

1

你想實現的是選擇一個實現「JavaScript」的腳本引擎的特定版本。正確的方法是調用ScriptEngineManager.getEngineFactories(),然後檢查getLanguageName()getEngineVersion()的結果。

+0

我已經做了,但犀牛不註冊引擎工廠。 – 2009-12-01 11:15:55