是否有任何方法可以将外部脚本包含(或加载)到脚本引擎,以便外部脚本中定义的所有函数都可以在engine.eval()
方法中使用?
在我们的应用程序中,我们根据用户输入执行一些java脚本代码。当用户请求时,应用程序会创建一个ScriptEngine实例并根据输入参数执行适当的javascript代码。
这里的问题是javascript中有一些重复的功能。考虑一个例子:
场景1:当用户输入为十进制纬度和经度时,计算距离
-
场景2:当用户输入为度-分-秒纬度和经度时计算距离。
-
由于它们是不同的场景,CalculateInstance代码是重复的。那么,有没有办法让脚本包含可重用函数,并在创建ScriptEngine实例时加载它。
注意:我正在使用Java8和捆绑的Nashorn JavaScript引擎。
有什么想法和/或建议吗?
您可以在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'));
如果脚本源不是动态的,那么缓存引擎的实例也很有用,因为第一次冷启动/解析可能会很长。
Vaadin 7.6.2 BeanitemContainer
我正在使用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
问题内容: 我将实体添加到数据库中,并且工作正常。但是,当我检索列表时,会得到旧实体,直到取消取消部署应用程序并再次重新部署它之后,才会显示添加的新实体。这意味着默认情况下会缓存我的实体吗?但是,我没有在persistence.xml或任何此类文件中进行任何用于缓存实体的设置。 我什至尝试调用flush(),refresh()和merge()。但它仍然仅显示旧实体。我想念什么吗?请帮我。 问题答案