2015-01-08 141 views
0

加載腳本有沒有什麼辦法,包括(或負載)一個外部腳本的腳本引擎,以便在外部腳本中定義的所有功能都在engine.eval()方法可用?的Java默認情況下的ScriptEngine

在我們的應用程序中,我們根據用戶輸入執行一些java腳本代碼。當用戶請求時,應用程序將創建一個ScriptEngine實例並根據輸入參數執行相應的JavaScript代碼。

這裏的問題是JavaScript中有一些重複的功能。考慮一個例子:

方案1:計算距離時用戶輸入是十進制的緯度和經度
- >在這裏,我可以簡單地計算,並返回的距離。

情景2:計算用戶輸入時的距離度 - 分 - 秒緯度和經度。
- >這裏將度 - 分 - 秒輸入轉換成十進制緯度和經度,然後按照情景1進行處理。

由於它們是不同的情況,因此calculateDistance代碼將被複制。 那麼有什麼辦法可以讓腳本包含可重用的函數,並在創建ScriptEngine實例時加載它。

注意:我正在使用Java 8以及捆綁的Nashorn JavaScript引擎。

任何想法和/或建議?

+0

你會澄清你的問題嗎? – jermel

+0

更新了問題... – Pratham

回答

0

您可以在您的javascript代碼(doc here)中使用load()函數。像成才:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
engine.eval("load('myScript.js');"); 

這是一個簡單的方法,但不適合部署(相對路徑隨時更改,ressources訪問可能會在你的IDE,JAR,WAR不同的...)。

我personnaly使用一個非常簡單的接口來提供腳本內容,然後來自一個資源,外部文件,DB ...然後使用eval()中的結果。

public interface ScriptLoader { 
    public String getScriptContent(String relativePath); 
} 

ScriptLoader loader; 
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); 
engine.eval(loader.getScriptContent('myScript.js')); 

如果你的腳本源不是動態的,也可能是有用的,讓您的發動機的情況下緩存,作爲第一個冷啓動/分析可能會很長。