Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java代码调用外部javascript函数_Java_Javascript_Rhino_Function Call - Fatal编程技术网

从java代码调用外部javascript函数

从java代码调用外部javascript函数,java,javascript,rhino,function-call,Java,Javascript,Rhino,Function Call,通过使用Java脚本API,我能够在Java中执行JavaScript。但是,有人能解释一下,为了能够调用C:/Scripts/Jsfunctions.js中的函数,我需要向这段代码添加什么吗 import javax.script.*; public class InvokeScriptFunction { public static void main(String[] args) throws Exception { ScriptEngineManager manager = n

通过使用Java脚本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.      
 }
}
var display = function(name) {
print("Hello, I am a Javascript display function",name);
return "display function return"
}
用于读取脚本

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");

假设您的jsfunctions.js文件有一个函数“display”,该文件存储在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.      
 }
}
var display = function(name) {
print("Hello, I am a Javascript display function",name);
return "display function return"
}
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.      
 }
}
var display = function(name) {
print("Hello, I am a Javascript display function",name);
return "display function return"
}
现在,在java代码中,我建议您使用Java8Nashorn。 在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代码。应该有用。

是的,很有用,谢谢。我们如何在提供的javascript中使用窗口,因为通过java代码将没有用于此的浏览器。您指的是哪个窗口或浏览器?解决方案是什么?如果在加载相对路径时遇到困难,请使用下面的代码<代码>URL文件URL=getClass().getResource(“js/WebWorker.js”);eval(Files.newbuffereder(path.get(fileUrl.toURI()),StandardCharsets.UTF_8))您好,我有疑问,我已经尝试调用了依赖于moment.js库的函数。所以我也添加了库脚本,比如
engine.eval(Files.newbufferederader(path.get(“/Volumes/Bala/Eclipse-Mars/Workspace/ClientWebAccessFullHistory/war/js/library/Moment.js”)、StandardCharsets.UTF_8);eval(Files.newbufferederader(path.get(“/Volumes/Bala/Eclipse-Mars/Workspace/ClientWebAccessFullHistory/war/js/newLayout/FullHistory/FullHistory.js”)、StandardCharsets.UTF_8)但它在全局范围内不可用。感谢您提供此代码段,它可能会提供一些有限的即时帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。仅供参考……对于那些由于Oracle Java许可证变更或其他原因而迁移到OpenJDK的人,Nashorn在OpenJDK中不受欢迎。