4

仅使用 Java 过渡到 XPage 开发。我已经成功地将 XPage 与表单组合在一起,并将所有 UI 组件绑定到托管 bean。我在 bean 中创建了一个保存方法。我能够提交 XPage,创建一个文档,浏览器在使用 Bean 中的当前值完全刷新后显示 XPage。如果我反复单击保存,总是会创建一个新文档,而创建的第一个文档永远不会更新。

我的问题是,将 XPage 映射到当前文档以使 bean 始终更新文档而不是始终创建新文档的正确方法是什么?

我是否应该创建一个 Bean 成员 Document 以便在第一次保存文档时保留它的句柄?这是否意味着我在创建后不回收 doc 对象?

每次保存unid时我都应该查找文档吗?性能问题?

任何人都有一个好的编程模式?使用 Notes 9,XPage 上没有定义数据源。

4

4 回答 4

4

你不能有一个 Document 成员,因为它是不可序列化的,而一个 bean 必须是(取决于它的范围和 NSF 的持久性选项)。此外,在请求完成后 Document 变得无效,这意味着您无法将其安全地保存在 bean 中。您的 bean 必须拥有对 Document 的引用,以便它可以按需加载/保存它,例如在调用 save() 方法时。如果您的 bean 正在制作数据的副本,那么您应该尽快 recycle() 文档,通常是在加载数据并保存它们之后。豆子不是当超出范围或请求完成时通知。所以它不能安全地管理它所拥有的资源的生命周期。一个很好的数据源,可以查看扩展库中的 ObjectData。这将处理对象(Java 或 JavaScript)的所有生命周期管理,因此您可以专注于业务逻辑。

于 2013-09-05T16:06:07.307 回答
1

好的,这里有几件事在起作用。

首先,我完全同意使用 Java 实现真正的 MVC 模式的概念。我目前正在研究一个数据模型约为的项目。我正在尝试实现正确的 MVC 模式的 30 个实体。我从 Pipalia 的 5 篇系列文章中获得了很大的启发。第一个是:http ://www.pipalia.co.uk/notes-development/rethinking-xpages-part-one/ - 你应该能够在他们的网站上找到下一个 4。

基本上,我有一个 XPage,它只引用一个 View bean(这是一个托管 bean - 会话范围)。View bean 使用外观层(其他名称:CRUD、服务)来执行其数据操作。但是,外观层并不直接与数据库对话。它使用一个接口来定义一个 DAO(数据访问对象)对象,它是数据访问的 Domino 实现。这是唯一知道如何与 Domino 数据库通信的类。它将获得数据库、视图和文档的句柄——将数据读入 Data bean(它只保存带有 setter 和 getter 的字段),然后再次正确丢弃这些 Domino 对象。读取数据后,它们位于内存中的 Data bean 中。只有当我更改数据时,我才需要调用外观层来验证和保存(通过 DAO 层)。

在 XPage 中,我将使用 EL 将字段连接到数据,使用以下内容:ViewBean.person.name(假设视图 bean 是 ViewBean,它的数据 bean 是人员,字段是名称)。然后,我通过创建一个空的 person 对象来控制是否在 View bean 中创建一个新的 person 对象。

附带说明一下,我决定使用 OpenNTF Domino API,这样我就不需要处理回收问题并拥有更现代的 Java 实现(例如,使用地图来创建新文档和更好的迭代器等)

/约翰

于 2013-09-06T08:24:45.597 回答
0

如果我理解正确的话,它每次都创建一个新文档的原因是因为你的 bean 不知道它正在处理哪个文档。对于 XPage 上的 dominoDocument 数据源,这由数据源的 action 和 documentId 属性处理。因此,在该数据源上调用 save 方法不仅会保存到后端数据库,还会更新数据源的那些 action 和 documentId 属性。因此,任何未来的操作都知道它应该对哪个文档进行操作,因为 documentId 已从空字符串更改为创建的后端文档的 UNID。操作也已从“createDocument”更改为“editDocument”。

如果您使用的是 bean,则您的 save 方法需要模拟该过程,为要处理的文档设置变量。然后您的保存方法需要检查该属性是否具有值,在这种情况下检索相关文档,否则创建一个新文档。否则你的 bean 只能创建文档,它永远不能更新它们。

除非您使用 xe:dataObject,否则您还希望避免使用提交类型的按钮。豆子不知道该怎么办。约翰会确认一下,但我不知道 MVC 是否会知道如何处理它。xe:dataObject 有一个特定的 saveObject 属性,所以它确实如此。仅使用普通按钮并在“事件”选项卡上将其指向相关的保存方法会更容易。

无论是使用 bean、xe:dataObject 还是 MVC,您仍然需要告诉代码何时创建文档以及何时/如何检索文档以进行更新。

于 2013-09-06T08:39:36.193 回答
0

基于 Philippe 关于 bean 生命周期的说法,我认为您可能更适合使用普通的旧 Java 对象 (POJO)。然后您可以控制何时实例化 bean。它的工作原理是一样的,额外的你必须自己创建和回收它。

在我的项目中,我遇到了相反的问题,我想要多个文档,但在使用托管 bean 时只能创建一个。当我将其更改为 POJO 时,它工作得很好。我控制了新对象的创建。

我在 SSJS 中创建了对象,如下所示。它很好用,让我觉得在未来,我可能会以这种方式做所有事情。

var s = new com.mycompany.Shipper(requestScope.field1, requestScope.field2, requestScope.field3, requestScope.field4, UNID1, UNID2);
s.saveShipper(POdata);
于 2013-09-05T20:27:48.413 回答