我有一个xpage,我想让用户输入四个输入字段,然后创建一个新文档,并立即将文档显示在同一页面上的dojo数据网格中。我正在使用托管bean来处理所有后端数据。我有一个bean用于主文档,第二个bean用于每个相关数据。我将使用UNID将它们绑在一起。输入字段都绑定到shipperBean。
我的问题是创建了父文件,只创建了 第一个 子文档。看起来我需要实例化一个新bean,但我认为这是为你完成的,就像你在'托管'中一样。
在我的按钮中,我有以下SSJS:
var POdata:NotesDatabase = session.getDatabase(database.getServer(), "PO\\PO-data");
lineItemBean.saveLineItem(POdata); //MUST save line item in order to tie Shipper to Line Item
var liUNID = lineItemBean.getThisUNID();
var poUNID = lineItemBean.getParentUNID();
shipperBean.saveShipper(POdata, liUNID, poUNID);
shipperBean.deleteCurrentShipper();
该按钮对保持输入的表执行部分刷新。 saveShipper()方法将bean保存到不同nsf中的新文档。 deleteCurrentShipper()方法只是将实例变量设置为null。这会导致它们被清除并为下一个文档做好准备。正确更新前端以反映擦除值。在第一次未保存到新文档后输入任何值,尽管每次都在前端清除它们。
我是否每次都需要创建一个新实例,或者我可以重用我正在尝试的相同实例吗?
我应该使用POJO并自己创建吗?
我是否应该使用SSJS并在另一个java方法中完成所有操作并调用它?
我应该将第二个bean作为第一个bean的属性吗?
我缺少一些简单的东西吗?
答案 0 :(得分:1)
如果在faces-config.xml中定义“托管”bean,则意味着它会在第一次使用时自动实例化。但是,它只存在于您定义的范围内的一个实例(例如会话)。托管bean的每次使用都会引用这个实例。
在您的示例中,这意味着仅在第一次按下按钮时创建lineItemBean
,然后在每次下一次按钮单击时使用相同的实例。
我认为在你的情况下,最好采用这种方式:
List<lineItemBean>
shipperBean
lineItemBean
的列表中添加新的saveShipper()
,并在数据库中创建文档getAllLineItems()
,返回List<lineItemBean>
以向数据网格提供数据答案 1 :(得分:1)
我建议不要使用托管bean,因为它似乎没有给你的进程增加太多价值。实际上,尝试重置bean及其内容可能会导致问题发生。相反,定义一系列java类并使用范围为预期生命周期(通常是视图或请求)的对象数据源。然后,每次创建新的“对象”时,create方法将建立父类的新实例。尝试在SSJS中编写尽可能少的业务逻辑.SSJS的目的应该是绑定前端(XSP)代码)到后端(java类)。即,当我点击按钮A时,它应该触发适用于父类的单个方法调用。创建其他(子)类来封装不同的对象。由于Knut建议我们收集如果你有多对一的关系,那么你的父类的save方法可以触发将子类保存回Notes文档。
答案 2 :(得分:1)
我建议使用这种方法:http://www.mindoo.de/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm
您的bean应该实现Map接口,并且在get()方法中根据key参数提供子对象。这样你就可以拥有非常简单和“漂亮”的绑定。
假设您有“table”bean提供对象“line”(子对象未在faces-conig.xml
中定义为bean!)。在表的get()方法中,您将实例化并缓存或从缓存中检索正确的行对象。某些单元格的EL是“#{table [row_key] .attribute}”。