【问题标题】:XPages - using Java ControllersXPages - 使用 Java 控制器
【发布时间】:2015-08-26 17:23:53
【问题描述】:

我是 Notes/Xpages 技术的初学者,我正面临一个概念问题:

我有一个在 Domino 服务器上运行的 XPages 应用程序。

我们正在尝试使用 Java 和 JSF 的可能性使我们的开发实践现代化,我想在我们的应用程序中引入 MVC 模式。

我会尽量总结清楚:

让我们考虑一个多米诺文档的全局锁定系统。 我有一个代表文档详细信息的 xsp:document_details.xsp。 此表单使用控制器类 DocumentDetailsAction.java。此类也是具有视图范围的托管 bean。

所以当用户点击我的 xsp 上的“编辑”按钮时: boolean DocumentDetailsAction.isDocumentLocked(String unid) 被调用。

如果为 false,则文档更改为编辑模式等。 如果为 true,则添加一条消息以通知用户文档已锁定。

使用 MVC 模式,方法 isDocumentLocked 实例化一个业务服务类: DocumentLockBO,其中包含与锁定系统有关的业务逻辑。 这个业务类有一个 DocumentLockDAO 实例作为属性。该属性在构造函数中实例化。

在我的 DAO 中,我在构造函数中实例化了一个 Domino 数据库对象并将其设置为我的类的属性。

问题: 让我们假设文档被锁定并且用户点击编辑按钮一百万次! 每次都会实例化 DocumentLockBO、DocumentLockDAO 和最后的 Domino-Database 对象。

这对记忆和表演来说真是一场噩梦。 解决方案:使用 DocumentLockBO 的实例并将其设置为我的控制器类的属性。 每次单击时,将使用相同的 BO/DAO/Domino-Database 对象实例 问题:DocumentLockBO 有一个 DocumentLockDAO 属性,该属性本身也有一个 Domino-Database 属性。

Domino 对象出现序列化异常!

我的方向是否正确?有什么建议吗?

【问题讨论】:

  • 欢迎来到 SO。只是一些提示:附加一些代码总是好的。另外,请尽量简化您的问题 - 这是一个很长的问题:)。
  • 对于文档锁定,您可能需要考虑 Domino 中内置的文档锁定。请参阅 Mastering XPages 的相关部分。请记住,内置文档锁定还需要您在删除之前锁定文档。

标签: jsf model-view-controller xpages


【解决方案1】:

Domino 后端类不可序列化,无论如何都会在每次请求后回收。因此,虽然您可以使其余对象可序列化,但您必须确保将任何 Domino 成员变量标记为 transient 并根据需要重新获取它们。 DominoDocument 包装类是可序列化的,但您必须在反序列化后调用其中一个方法(可能是restoreWrappedDocument),因此在这种情况下它不会为您节省太多。

从本质上讲,Domino 后端对象可以看作是一种特殊的网络资源,在每次 HTTP 请求时都会被拆除并重新创建。

【讨论】:

  • 好的,谢谢您的回答。我将进行一些测试以确保性能合理。我对某些项目的性能表示怀疑,例如 Session.getDatabase(..., ...) 的重复
【解决方案2】:

我会说你绝对是在正确的轨道上! MVC 在 XPages 中是一个非常好的东西。我经常使用它。

但是,正如 Jesse 所说,您不能缓存任何 Domino 对象。我只是创建一个“数据”类来保存来自 DAO 类的信息并传递它。如果您可以使用文档的通用 ID 作为键,那么无论如何您都将拥有非常快速的数据库访问。使用视图会减慢速度。因此,以某种智能方式缓存所有(或者可能只是键)数据可能是您的一个不错的选择。

您必须了解您使用的 bean 的各种范围。尤其是 Session 范围会对您的应用程序造成不利影响...我收集了一些我在 short article about tuning XPages 中使用的建议。另一方面,您可以使用应用程序范围轻松地在 Java 中实现全局锁定机制。实际实施显然取决于具体需求。

您应该考虑OpenNTF Domino API - 它还附带一个图形数据库,对于某些类型的数据结构非常有效。

我做了一个presentation on the concepts 我如何做 MVC。也许您可以得到一些想法(有一些可以进一步帮助您的资源 - 以及示例数据库)。

/约翰

【讨论】:

  • 非常感谢您的回答和 MVC 项目上的链接。我会非常仔细地看它。还有一篇关于范围超时的好争论的帖子。你的建议给了我很多灵感。我已经使用了 OpenNtf API(也许这是我开始使用 XPages 时做的第一件事:)但我不知道 Graph DB。
【解决方案3】:

在我看来,对于 XPage 本地的 NSF,这种请求会非常快。在请求期间(而不是更多)重用数据库对象(以及前视图)应该是获得出色性能的充分方​​法。顺便说一句,我个人的看法是,虽然我重视 MVC 模式,但当 XPages 专门处理 NSF 数据时,您会发现在使用原生 XPages 元素(声明数据源、重复、面板、视图)时进行了大量的性能优化。

【讨论】:

  • 感谢您的回答。尝试在 DAO 层中仅使用 Notes 对象时,我看到了一些优势。如果我们从 Domino 更改为另一个供应商,将只有 DAO 层需要修改。所有的业务逻辑和控制器都将被维护。此外,我们不会只与 nsf 存储进行通信,也许是其他一些关系数据库..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多