【问题标题】:Call js methods from java从java调用js方法
【发布时间】:2018-09-22 03:45:51
【问题描述】:

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

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

例如。我需要像 /webapp/js/orn/workflow/Engine.js 这样的 js 文件的上下文路径,这与我们在我的 java 类中从浏览器获得的相同:- ocm\src\main\java\com\interra\orion\util\workflow \ScriptEngineUtil.java

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

【问题讨论】:

标签: javascript java


【解决方案1】:

可用的答案提供了足够的信息来使用 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();
    }
}

【讨论】:

  • 感谢您提出解决方法。通过在java中加载上下文并使用它来读取js文件然后调用js方法来解决。由于我使用 js 库以 PDF 格式导出图形和图像,因此需要将逻辑保留在客户端。
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 2017-02-09
  • 2016-03-26
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多