[英]Making A Javascript Function Available To Java Code
一個有點人為的例子來說明我的問題。 想象一下,我們有一些javascript函數庫已經由前端開發團隊每天維護和更新。 具體來說,假設一個這樣的函數看起來像這樣:
function employeesForStore(store) {
var dictionary = {
"downtown": ["Joe", "Mary", "Steve"],
"uptown": ["Jules", "Vincent", "Matt"],
// and so on for hundreds of locations
};
return dictionary[store];
}
注意:請忽略此功能實現的詳細信息。 實際函數可能比簡單的JSON字典查找復雜得多,並假設我們不知道有關js函數的任何實現細節。 我們所知道的是它需要一個String參數並返回和字符串數組。
現在我們想在Java代碼中利用這個功能。 也就是說,在我們的Java代碼中,我們想要“加載”這個函數,然后能夠多次調用它,傳遞String
args並接收String[]
或ArrayList<String>
結果。
從搜索SO和谷歌到目前為止,我知道這將涉及使用:
javax.script.ScriptEngineManager
javax.script.ScriptEngine
scriptEngine.getContext()
用於將值傳遞給函數並接收結果。 我對上面的細節有點模糊,特別是因為我發現的大多數例子都涉及一次運行javascript代碼,而不是讓javascript函數可用於Java。
employeesForStore("downtown")
並將其結果存儲在名為downtownResults
的變量中的本機java String[]
或List<String>
中。 employeesForStore("uptown")
並存儲在變量uptownResults
創建一個接口,充當JavaScript代碼的外觀 。
以下是使用Oracle Java 1.7實現中嵌入的Rhino實現的示例:
package demo;
import java.io.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import javax.script.*;
public class StoreData {
public static interface Stores {
public String[] employees(String store);
}
public static Stores stores() throws IOException, ScriptException {
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine engine = sem.getEngineByName("JavaScript");
AtomicReference<Stores> ref = new AtomicReference<>();
engine.put("ref", ref);
String adapt = "ref.set("
+ "new Packages.demo.StoreData.Stores({employees:employeesForStore})"
+ ");";
try (Reader myFns = new FileReader("my_functions.js")) { // TODO encoding
engine.eval(myFns);
engine.eval(adapt);
return ref.get();
}
}
public static void main(String[] args) throws IOException, ScriptException {
List<String> employees = Arrays.asList(stores().employees("uptown"));
System.out.println(employees);
}
}
通過指定接口,我們讓Rhino將JavaScript類型強制轉換為Java類型(String,String []等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.