一个很正常的情况:
我们有一个“portlet”复合组件,它有两种状态:展开和折叠。Portlet 以展开的形式开始,但用户可以通过单击它们来折叠它们。这个状态应该保存到会话中,这样一旦用户刷新页面或导航到新页面,portlet 就会记住它们是否展开/折叠。
这是问题的核心:您将如何将这种状态保存实际实现到可以在页面上多次插入的组件中?
一些背景/想法:
使用会话范围的 bean 很容易为一个 portlet 实现状态保存。通过创建固定数量的会话范围 bean 或将不同的属性声明到一个 bean 中,也可以支持固定数量的 portlet。但是,我什至不想提及为什么这些方法不好。
我最初的想法是在单个会话 bean 下创建一个 Map(或一些对象结构)来保存所有 portlet 的状态。但是,我不能直接从 JSF 引用这些数据(这样 JSF 也会更新它们)。我考虑编写一个特定的 getter/setter 来获取/更新地图中的正确值,但这是不可能的,因为在执行 getter 和 setter 期间没有识别数据。
但是,很明显我需要将状态保存到会话 bean 中。通过使用提交的数据发布表单f:ajax
并执行特殊方法,我可以很容易地进行状态保存。listener
为了支持组件的多个实例,我可以使用(多个实例)请求范围的 bean 来处理每个展开/折叠。但是,为了实际发布标识 portlet 及其状态的数据,我需要首先在呈现时将其插入到表单字段中。
那么,如何在渲染时为每个 portlet 提供正确的数据(在这种情况下实际上只是状态布尔值/枚举,但考虑应该处理更多数据的情况)?
看起来:
h:inputHidden
并且h:inputText
不支持设置除 value-attribute(指向 )以外的初始值#{portletBean.portletState}
。- 我无法在创建时自动加载具有正确初始值的请求 bean,因为没有可用的识别信息。
再一次感觉我错过了一些东西......指针?
我想至少一个答案是使用UIComponent
而不是复合组件,但我想将其保留为复合组件,因为它包含大量原始 HTML 元素。
更新:
- 有一个相当相似的问题,建议使用视图范围的 bean。但是,我认为这在这里不可行。