从java

时间:2018-04-12 05:52:37

标签: javascript java

我需要从java类执行javascript方法(它执行一些报告并转储PDF文件)。

面对如何在java方法中加载上下文路径并直接从java调用js方法的问题。

EG。我需要像/webapp/js/orn/workflow/Engine.js这样的js文件的上下文路径,就像我从java类中的浏览器一样: - ocm \ src \ main \ java \ com \ interra \ orion \ util \ workflow \ ScriptEngineUtil.java

关于如何继续的任何想法,我尝试使用Rhino但是对如何上下文路径感到震惊。

1 个答案:

答案 0 :(得分:0)

可用的答案提供了足够的信息来使用Nashorn调用javascript代码,特别是在第一条评论中建议31piy的重复代码。

然后我假设您的真正问题是到达包含您的代码的javascript文件,该文件存在于您的webapp文件夹中。我可以看到一些可能的答案:

这里的一些研究员建议使用Spring方法访问文件的可能方法:Accessing files/directories in webapp folder in Spring您应该考虑是否有可用于特定框架的方法

但是:该文件是否存在于您的webapp文件夹中?它的逻辑在客户端是否必要?由于您需要服务器端的逻辑,我不会(即使是谨慎)将它暴露给您的应用程序的客户端。如果在客户端没有必要,请不要暴露它。请保留它,比如说,在你的应用程序的src / main / resources目录中(假设你用maven或gradle构建它)并从你的类加载器中干净地访问它:

// Access the resource from the classloader
try {
    reader = new InputStreamReader(
        YourServletOrWhateverClass.class.getClassLoader().
            getResourceAsStream("your_javascript_file.js"), 
                Charset.forName("UTF-8")); 
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    engine.eval(reader);            

    Invocable inv = (Invocable) engine;
    inv.invokeFunction("your_function");
}
catch(NoSuchMethodException nsme) {
    nsme.printStackTrace();
}
catch(ScriptException se) {
    se.printStackTrace();
}
finally {
    try {
        reader.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
}