【问题标题】:Call external javascript functions from java code从 java 代码调用外部 javascript 函数
【发布时间】:2014-05-16 09:10:31
【问题描述】:

通过使用 Java Scripting API,我能够在 Java 中执行 JavaScript。但是,有人可以解释一下我需要添加到此代码中以便能够调用 C:/Scripts/Jsfunctions.js 中的函数

import javax.script.*;

public class InvokeScriptFunction {
public static void main(String[] args) throws Exception {
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");

    // JavaScript code in a String
    String script1 = "function hello(name) {print ('Hello, ' + name);}";
    String script2 = "function getValue(a,b) { if (a===\"Number\") return 1; 
                     else return b;}";
    // evaluate script
    engine.eval(script1);
    engine.eval(script2);

    Invocable inv = (Invocable) engine;

    inv.invokeFunction("hello", "Scripting!!");  //This one works.      
 }
}

【问题讨论】:

    标签: java javascript rhino function-call


    【解决方案1】:

    使用ScriptEngine.eval(java.io.Reader)阅读脚本

    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    // read script file
    engine.eval(Files.newBufferedReader(Paths.get("C:/Scripts/Jsfunctions.js"), StandardCharsets.UTF_8));
    
    Invocable inv = (Invocable) engine;
    // call function from script file
    inv.invokeFunction("yourFunction", "param");
    

    【讨论】:

    • 是的,它很有用,谢谢。我们如何在提供的 javascript 中使用 Window,因为通过 java 代码将没有浏览器。
    • 你指的是哪个窗口或浏览器?
    • 解决方案是什么?
    • 如果在加载相对路径时遇到困难,请使用下面的代码。 URL fileUrl = getClass().getResource("js/WebWorker.js"); engine.eval(Files.newBufferedReader(Paths.get(fileUrl.toURI()),StandardCharsets.UTF_8));
    • 嗨,我有疑问,我试图调用具有moment.js库依赖项的函数。所以我只是添加了库脚本以及像这样engine.eval(Files.newBufferedReader(Paths.get("/Volumes/Bala/Eclipse Mars/Workspace/ClientWebAccessFullHistory/war/js/Library/Moment.js"), StandardCharsets.UTF_8)); engine.eval(Files.newBufferedReader(Paths.get("/Volumes/Bala/Eclipse Mars/Workspace/ClientWebAccessFullHistory/war/js/newLayout/FullHistory/fullHistory.js"), StandardCharsets.UTF_8)); 但它在全局范围内不可用。
    【解决方案2】:
    try {
            ScriptEngineManager manager = new ScriptEngineManager();
            ScriptEngine engine = manager.getEngineByName("JavaScript");
            System.out.println("okay1");
            FileInputStream fileInputStream = new FileInputStream("C:/Users/Kushan/eclipse-workspace/sureson.lk/src/main/webapp/js/back_end_response.js");
            System.out.println("okay2");
            if (fileInputStream != null){
             BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));
             engine.eval(reader);
             System.out.println("okay3");
            // Invocable javascriptEngine = null;
             System.out.println("okay4");
            Invocable invocableEngine = (Invocable)engine;
             System.out.println("okay5");
             int x=0;
             System.out.println("invocableEngine is : "+invocableEngine);
             Object object = invocableEngine.invokeFunction("backend_message",x);
    
             System.out.println("okay6");
            }
            }catch(Exception e) {
                System.out.println("erroe when calling js function"+ e);
            }
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    【解决方案3】:

    假设您的 jsfunctions.js 文件有一个“显示”函数,并且该文件存储在 C:/Scripts/Jsfunctions.js 中

    jsfunctions.js

    var display = function(name) {
    print("Hello, I am a Javascript display function",name);
    return "display function return"
    }
    

    现在,在您的 java 代码中,我建议您使用 Java8 Nashorn。 在你的 java 类中,

    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    import javax.script.Invocable;
    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;
    
    class Test {
    public void runDisplay() {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    try {
      engine.eval(new FileReader("C:/Scripts/Jsfunctions.js"));
      Invocable invocable = (Invocable) engine;
      Object result;
      result = invocable.invokeFunction("display", helloWorld);
      System.out.println(result);
      System.out.println(result.getClass());
      } catch (FileNotFoundException | NoSuchMethodException | ScriptException e) {
        e.printStackTrace();
        }
      }
    }
    

    注意:获取 javascript 文件的绝对路径并在 FileReader() 中替换并运行 java 代码。它应该可以工作。

    【讨论】:

    • 仅供参考...对于那些由于 Oracle 的 Java 许可变更或任何原因而迁移到 OpenJDK 的人,Nashorn 在 OpenJDK 中已被弃用。 openjdk.java.net/jeps/335
    猜你喜欢
    • 2019-12-13
    • 2013-02-06
    • 1970-01-01
    • 2012-07-29
    • 2014-10-01
    • 1970-01-01
    • 2015-03-02
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多