从java代码调用外部javascript函数

IT技术 java javascript rhino function-call
2021-01-15 13:57:00

通过使用 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.      
 }
}
3个回答

使用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");
解决方案是什么?
2021-03-18 13:57:00
您指的是哪个窗口或浏览器?
2021-03-24 13:57:00
如果在加载相对路径时遇到困难,请使用以下代码。 URL fileUrl = getClass().getResource("js/WebWorker.js"); engine.eval(Files.newBufferedReader(Paths.get(fileUrl.toURI()),StandardCharsets.UTF_8));
2021-03-25 13:57:00
是的,很有用,谢谢。我们如何在提供的 javascript 中使用 Window,因为通过 java 代码将没有浏览器。
2021-03-28 13:57:00
嗨,我有疑问,我试图调用具有 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)); 但是它在全局范围内不可用。
2021-04-12 13:57:00
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);
        }
感谢您提供此代码片段,它可能会提供一些有限的即时帮助。一个正确的解释将通过展示为什么这是一个很好的问题解决方案来极大地提高其长期value,并且会使它对未来有其他类似问题的读者更有用。编辑您的答案以添加一些解释,包括您所做的假设。
2021-03-17 13:57:00

假设你的 jsfunctions.js 文件有一个函数“display”,这个文件存储在 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 代码。它应该工作。

仅供参考...对于那些已经迁移到 OpenJDK 的人,由于 Oracle 的 Java 许可更改或出于任何原因,Nashorn 在 OpenJDK 中已被弃用。openjdk.java.net/jeps/335
2021-03-26 13:57:00