当前位置: 首页 > 知识库问答 >
问题:

Java默认情况下在ScriptEngine中加载脚本

方飞翼
2023-03-14

是否有任何方法可以将外部脚本包含(或加载)到脚本引擎,以便外部脚本中定义的所有函数都可以在engine.eval()方法中使用?

在我们的应用程序中,我们根据用户输入执行一些java脚本代码。当用户请求时,应用程序会创建一个ScriptEngine实例并根据输入参数执行适当的javascript代码。

这里的问题是javascript中有一些重复的功能。考虑一个例子:

场景1:当用户输入为十进制纬度和经度时,计算距离
-

场景2:当用户输入为度-分-秒纬度和经度时计算距离。
-

由于它们是不同的场景,CalculateInstance代码是重复的。那么,有没有办法让脚本包含可重用函数,并在创建ScriptEngine实例时加载它。

注意:我正在使用Java8和捆绑的Nashorn JavaScript引擎。

有什么想法和/或建议吗?

共有1个答案

谢清野
2023-03-14

您可以在javascript代码中使用load()函数(这里是doc)。比如:

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("load('myScript.js');");

这是一种简单的方法,但不适合部署(相对路径总是会发生变化,在IDE、Jar、war中对资源的访问可能会有所不同……)。

我个人使用一个非常简单的界面来提供脚本内容,然后这些内容来自ressource、外部文件、DB...然后在eval()中使用结果。

public interface ScriptLoader {
  public String getScriptContent(String relativePath);
}

ScriptLoader loader;
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(loader.getScriptContent('myScript.js'));

如果脚本源不是动态的,那么缓存引擎的实例也很有用,因为第一次冷启动/解析可能会很长。

 类似资料:
  • 我正在使用Java8 Nashorn来执行一个特定的先前同意的方法。我可以毫无问题地调用特定的方法。不过困扰我的一件事是,当我加载脚本时,它也会执行它。 例如,如果file.js包含一个print("hello world!")scriptEngine.eval(new FileReader("./file.js")将执行并打印hello world。我必须先这样做,然后才能调用我想要的特定方法。

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本

  • 问题内容: 我有一个使用ui.router包进行URL路由的Angular应用程序。我想更改它,以便如果用户尝试导航到他们已经在的页面,则路由器会重新加载该状态,而不是什么也不做。对于每个http://angular- ui.github.io/ui-router/site/#/api/ui.router.state。$ state#go,$ state.go 确实 采用了一个重载参数来实现此目的

  • 默认情况下,我们的路由器是Yaf_Router, 而默认使用的路由协议是Yaf_Route_Static,是基于HTTP路由的, 它期望一个请求是HTTP请求并且请求对象是使用Yaf_Request_Http

  • 我有一个关于Hibernate中乐观锁定的问题。我正试图深入乐观地锁定Hibernate,但我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,可以使用@Version注释(或xml配置)并创建版本属性。另一个选项是在不使用乐观lock=“all”属性进行版本控制的情况下进行配置。 我的问题是,如果你没有定义任何版本属性,也没有指定乐观锁属性,在这种情况下,哪种