Xpages:重新计算应用程序范围变量的最有效方法
我有一个应用程序,我需要在其中显示一些计数,如门票总数、打开/关闭的门票数量、类型X、Y、Z的门票数量 希望使用application.Scope计算和存储这些总计,但希望在某些内容发生更改(如新的或更改的文档)时更新它们 我怎么能这样做呢 以下是我发布的一个相关问题的链接:。看起来这正是我需要的。不过,有一些澄清 API具有数据库和文档的侦听器。我很困惑,我不想使用文档侦听器吗?我只想捕获对一种类型文档的更改 我不知道为什么我必须产生的功能,所以我一定是不理解的东西。添加两个侦听器,就像您在应用程序中使用的那样 在//do something中,我调用了一个名为computeTotals的Java类(InitApp)方法,该方法加载applicationScope.whatever变量Xpages:重新计算应用程序范围变量的最有效方法,xpages,xpages-extlib,Xpages,Xpages Extlib,我有一个应用程序,我需要在其中显示一些计数,如门票总数、打开/关闭的门票数量、类型X、Y、Z的门票数量 希望使用application.Scope计算和存储这些总计,但希望在某些内容发生更改(如新的或更改的文档)时更新它们 我怎么能这样做呢 以下是我发布的一个相关问题的链接:。看起来这正是我需要的。不过,有一些澄清 API具有数据库和文档的侦听器。我很困惑,我不想使用文档侦听器吗?我只想捕获对一种类型文档的更改 我不知道为什么我必须产生的功能,所以我一定是不理解的东西。添加两个侦听器,就像您在应
我缺少什么?OpenNTF Domino API有
数据库侦听器的概念,可以将其分配给数据库,并连接到save()
和createDocument()
方法。因此,基本上,当调用createDocument()
或save()
时,它也会在侦听器中运行自定义代码
您需要基本上重现该功能。但是,由于applicationScope
只能从XPages代码中获得,因此它只能从XPages代码中工作
对于后端代码,您可以更新“配置文件”文档,并在每个XPages页面上检查该文档的上次修改时间是否晚于applicationScope
从中检索值的上次时间。这样,您就可以包括后端创建/保存。但是,您需要更新创建/保存相关文档的所有地方。此答案适用于不能或不想使用Java和OpenNTF Domino API的用户:
在beforePageLoad
event of application's welcome或home page中,或在每个XPage中包含的自定义控件中创建应用程序范围变量。
仅当应用程序范围变量为null或空时才创建它=在所有用户中仅创建一次
在控件的onchange
事件上更改应用程序范围变量
下面的代码是应用程序范围变量的工作示例,该变量包含名称映射及其出现次数
(与你的前一个问题相对应):
在多个浏览器选项卡中打开XPage。您可以看到数字是如何在浏览器选项卡之间“同步”的。这甚至在不同的浏览器和用户之间也能起作用。这太棒了,我问了两个澄清问题。如果您只想捕获一种类型的文档,那么创建后的文档将不相关。这会在Database.createDocument()
之后立即触发,此时表单字段尚未设置;-)使用AFTER\u UPDATE\u DOCUMENT(在save()
之后立即触发),源(event.getSource()
,可能需要转换为org.openntf.domino.DOCUMENT
)可以访问文档对象,因此可以检查表单名称。因此,这里只需获取ApplicationScope并增加总数。事件。更新之后,文档是文档级侦听器。但是所有侦听器都添加到数据库
对象中。然后,为数据库保存的任何文档都将触发AFTER_UPDATE_文档侦听器。您需要做的就是确保获取数据库的所有代码都通过一个函数,在该函数中还添加了侦听器。(如果您还没有这样做,一开始可能会觉得有很多重构,但是如果是当前的NSF,它总是getCurrentDatabase()
,所以查找和替换很快-已经完成了,完成了!;-)
public List<EnumEvent> getEventTypes() {
ArrayList<EnumEvent> eventList = new ArrayList<EnumEvent>();
eventList.add(Events.AFTER_CREATE_DOCUMENT);
eventList.add(Events.AFTER_UPDATE_DOCUMENT);
return eventList;
}
public boolean eventHappened(IDominoEvent event) {
try {
if (event.getEvent().equals(Events.AFTER_CREATE_DOCUMENT)) {
// Do something and return true if successful;
}
if (event.getEvent().equals(Events.AFTER_UPDATE_DOCUMENT)) {
// Do something and return true if successful;
}
return false; // something went wrong, maybe an EnumEvent not implemented
} catch (Exception e) {
return false;
}
}