Xpages 在会话范围或bean中存储自定义组件的属性

Xpages 在会话范围或bean中存储自定义组件的属性,xpages,Xpages,我已经编写了一个新的后端Java组件(扩展UIComponentBase),作为ExtLib应用程序布局控件的替代。控件需要显示从另一个Notes应用程序中查找的数据集合。数据取决于用户,并且不会在页面之间更改,因此,为了避免重复查找其他应用程序,我希望将其存储在会话范围中。(请注意,因为这是一个布局控件,所以每页只有一个。) 我知道我可以使用会话范围的maangebean(在以前的迭代中已经这样做了),但是数据只需要在这个控件中使用,不应该在页面的其他地方使用,因为它可以与bean一起使用。所

我已经编写了一个新的后端Java组件(扩展UIComponentBase),作为ExtLib应用程序布局控件的替代。控件需要显示从另一个Notes应用程序中查找的数据集合。数据取决于用户,并且不会在页面之间更改,因此,为了避免重复查找其他应用程序,我希望将其存储在会话范围中。(请注意,因为这是一个布局控件,所以每页只有一个。)

我知道我可以使用会话范围的maangebean(在以前的迭代中已经这样做了),但是数据只需要在这个控件中使用,不应该在页面的其他地方使用,因为它可以与bean一起使用。所以我的问题是,我应该采取什么样的最佳实践方法?我应该直接将数据存储在sessionMap中,还是缺少组件状态持有者的技巧?还是我一直在用豆子

谢谢


(为澄清而编辑)

看起来您谈论的是您自己的后端Java组件,而不是单个NSF中的自定义控件

我不确定在什么级别,当您编写自己的本机XPages组件时,属性由状态持有者在调用saveState()时缓存。出于Frantisek所说的原因,我认为这并不比视图更高,否则,如果一个XPage上有多个实例,而另一个XPage上有多个实例,则不清楚要更新哪个实例。它无法在同一页面上同时更新这两个实例,因此我猜每个实例都是一个单独的实例。因此,多个页面上的同一组件将是一个单独的谨慎实例


但是在组件的特定setter中,没有什么可以阻止您向sessionScope和私有属性写入内容,然后在getter上执行相反的操作。我不确定在尝试sessionScope之前是否要尝试内部属性,反之亦然。这将取决于您希望如何处理从多个页面更新同一会话范围的情况(如果集合可以更改)。

我不确定这是否相关,但请注意,即将发布的9#143演示了绑定到组件本身,而不是值。所以可能里面有一些相关的信息。我真的不知道。谢谢你的链接,Simon:-)你应该把它存储在组件的本地数据源(compositeData或自定义数据源)中,而不是会话范围。同一页面上组件的两个实例可能会干扰意外结果(除非您使用sessionScope的组件特定键)。您可以改为扩展com.ibm.xsp.component.UIDataComponentBase。它允许你为你的组件使用你自己的dataContext变量。您可以通过编程轻松创建它。谢谢Paul。我也得出了类似的结论——stateHolder接口缓存属性的级别不高于视图级别,因为组件类的全部目的是“在请求之间保存它们的状态”(参见Mastering XPages Ed.1第462页)。写下这一点,我认为解决方案已经变得更加明显。我怀疑状态持有者会在对同一组件实例的请求之间保存状态。因为这是一个布局控件,即使它是单个组件,它也将是该组件的不同实例(每个XPage 1个,或者每个XPage上的自定义控件上至少1个)。我可能弄错了,但我猜州政府的目的不是在该级别缓存属性。接受Paul的回答是因为它引导我找到了最终的解决方案,即基于extlib中的
com.ibm.xsp.extlib.component.layout.ConversationState
,extlib将应用程序布局所需的数据存储在会议地图