0

我有一个高度可参数化和动态的 web 应用程序。我将 JSF 2 与 Mojarra 2.1.19 和 Primefaces 3.5 一起使用。

组件是指高级组件:与 xhtml 文件关联的 backbean。xhtml 模板中支持的 bean 始终具有 EL 名称“comp”。

我实现的功能如下:

  • 我有一个容器组件(一个选项卡、一个面板……),我希望能够在其中呈现任何组件。容器是通过用户操作和配置文件动态提供的,无法预测哪些组件将包含该容器以及有多少组件。
  • 组件“A”可以在组件树中的任何位置刷新组件“B”,而无需硬耦合。组件“A”不知道组件“B”,组件“A”只知道它需要刷新组件“B”实现的功能。

使用组件模式,我可以使用组件树构建高级应用程序。我实际上使用 c:forEach 模式来动态添加组件:

<c:forEach items="#{comp.values}" var="value">
    <ui:include src="#{value.uri}">
        <ui:param name="comp" value="#{value}"/>
    </ui:include>
</c:forEach>

我使用通用通道消息来链接组件。要刷新我使用绑定

我读过以下所有模式都可以创建不一致的状态并抛出令人恐惧的重复 Id 异常:

  • c:forEach
  • 会话绑定
  • 通过java添加组件

我总有一种走在雷区的感觉。现在我遇到了一个令人讨厌的重复 id 错误。

有没有办法创建一个健壮的模式来向 JSF 2 添加动态和通用组件?

感谢您的回答!

4

1 回答 1

0

确保您没有在整个视图范围内将物理上不同的组件绑定到同一个 bean 属性。该binding属性必须指向一个请求范围的属性,并且在视图范围内绝对不能在物理上不同的组件之间共享,即使它最多同时被一个组件使用。

仅当您将唯一组件绑定到会话范围的 bean 属性,但在同一会话的不同浏览器选项卡/窗口中多次打开同一视图时,“会话绑定”问题才适用。

于 2013-02-18T11:41:03.437 回答