簡體   English   中英

使Javascript函數可用於Java代碼

[英]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。

我希望看到的示例代碼

  1. 假設js函數位於文件“my_functions.js”中,請將該文件加載到Java中,以便所有函數都可以使用。
  2. 調用employeesForStore("downtown")並將其結果存儲在名為downtownResults的變量中的本機java String[]List<String>中。
  3. 與2相同,但調用employeesForStore("uptown")並存儲在變量uptownResults

您可以使用Rhino API在java中執行JS代碼

教程涵蓋了所請求的示例。

創建一個接口,充當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 []等)

JRE規范不保證應該提供什么腳本引擎,因此依賴外部引擎可能是明智之舉。 我不知道Nashorn是否會改變這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM