仅使用Java过渡到XPage开发。我已经成功地将XPage与表单放在一起,并将所有UI组件绑定到托管bean。我在bean中创建了一个save方法。我能够提交XPage,创建一个文档,浏览器在完全刷新后使用Bean中的当前值显示XPage。如果我反复单击“保存”,则始终会创建新文档,从未更新创建的第一个文档。
我的问题是,将XPage映射到当前文档的正确方法是什么,以便bean始终更新文档而不是始终创建新文档?
我应该创建一个Bean成员Document,这样第一次保存文档时,我会保留一个句柄吗?这是否意味着我不会在创建后回收doc对象?
每次保存unid时都应该查找doc吗?性能问题?
任何人都有一个好的编程模式?使用Notes 9,XPage上没有定义数据源。
答案 0 :(得分:4)
你不能拥有一个Document成员,因为它不是可序列化的,而bean必须是(取决于它的作用域和NSF的持久性选项)。此外,文档在请求完成后变为无效,这意味着您无法安全地将其保留在bean中。您的bean必须拥有对Document的引用,以便它可以根据需要加载/保存它,例如调用save()方法时。 如果您的bean正在复制数据,那么您应该尽快回收()文档,通常是在加载数据之后和保存之后。当bean超出范围或请求完成时,会通知 。因此,它无法安全地管理它所拥有的资源的生命周期。 一个很棒的数据源,用于查看扩展库中的ObjectData。它处理对象的所有生命周期管理(Java或JavaScript),因此您可以专注于业务逻辑。
答案 1 :(得分:1)
好的,这里有几件事。
首先,我完全同意使用Java寻找真正的MVC模式的概念。我目前正在开展一个数据模型约为的项目。我试图实现适当的MVC模式的30个实体。我从Pipalia的一系列5篇文章中获得了很大的灵感。第一个是:http://www.pipalia.co.uk/notes-development/rethinking-xpages-part-one/ - 你应该能够在他们的网站上找到接下来的4个。
基本上,我有一个仅引用View bean的XPage(它是一个托管bean - 会话范围)。 View bean使用Facade层(其他名称:CRUD,service)来执行其数据操作。但是,Facade层不直接与数据库通信。它使用接口来定义DAO(数据访问对象)对象,该对象是数据访问的Domino实现。这是唯一知道如何与Domino数据库通信的类。它将获得数据库,视图和文档的句柄 - 将数据读入Data bean(它只包含带有setter和getter的字段),然后再次正确地丢弃这些Domino对象。读取数据后,它们存在于内存中的Data bean中。只有在我更改数据时,我才需要调用外观层来验证和保存(通过DAO层)。
在XPage中,我将使用EL将字段连接到数据,例如:ViewBean.person.name(假设视图bean是ViewBean,其数据bean是person,字段是name)。然后,我通过创建一个空人对象来控制是否在View bean中创建一个新的person对象。
作为旁注,我决定使用OpenNTF Domino API,这样我就不需要处理回收并拥有更现代的Java实现(例如使用map来创建新文档和更好的迭代器等等。 。)
/约翰
答案 2 :(得分: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);
答案 3 :(得分:0)
如果我理解正确,每次创建新文档的原因是因为你的bean没有关于它正在处理哪个文档的概念。使用XPage上的dominoDocument数据源,这由数据源的action和documentId属性处理。因此,在该数据源上调用save方法不仅会保存到后端数据库,还会更新数据源的action和documentId属性。因此,任何将来的操作都知道它应该对哪个文档进行操作,因为documentId已从空字符串更改为已创建的后端文档的UNID。此操作也已从“createDocument”更改为“editDocument”。
如果您正在使用bean,则您的save方法需要模拟该过程,设置要处理的文档的变量。然后你的save方法需要检查该属性是否有值,在这种情况下检索相关文档,否则创建一个新文件。否则你的bean只能创建文档,它永远不能更新它们。
除非您使用xe:dataObject,否则您还希望避免使用提交类型的按钮。豆子不知道该怎么办。约翰将会确认,但我不知道MVC是否知道如何处理它。 xe:dataObject具有特定的saveObject属性。使用普通按钮更容易,在“事件”选项卡上,将其指向相关的保存方法。
无论是使用bean,xe:dataObject还是MVC,您仍然需要告诉代码何时创建文档以及何时/如何检索文档以进行更新。