7

我的 JSF 应用程序中存在重复 ID 的问题。我在这篇文章中读到,可能的解决方案之一是使用命名容器。你能给我一些例子如何使用命名容器来避免重复的 ids 问题吗?我使用 Facelets。

4

2 回答 2

12

这就是使用 JSF1.2 和 facelets 对我有用的方法:

我发现既不是实际上<ui:composition>也不<ui:component>是命名容器,因此以相同的形式多次使用相同的组件会失败,并出现重复的 ID 异常。这似乎是一个糟糕的设计,因为组件的全部意义在于可重用性。为了解决这个问题,我<f:subview>在每个组件中包含一个并将其上的 id 设置为我的组件标记的参数:

我的组件.xhtml:

<ui:component>      
    <f:subview id="#{id}">
        ....component code
    </f:subview>
</ui:component>

并且在其他页面上使用它很简单(在正确设置 taglib.xml 和 web.xml 之后):

<myTagLib:myComponent id="myCompA" />
于 2010-08-10T20:31:15.963 回答
4

我建议退后一步,调查为什么会出现重复 ID 问题。一旦你确定了根本原因,那么只需以“通常”的方式修复它,而不是创建你自己的UINamingContainer组件。

重复 ID 错误有几个可能的原因,可以帮助您进一步确定:

  • 同一个组件内的不同s使用相同的ID 。 UIComponent UINamingContainer
  • 物理上不同的组件绑定到同一个bean的相同 UIComponent属性。
  • 仅限 JSP:f:subview页面而不是包含页面中声明。
  • 一个包含页面多次包含在同一个 UINamingContainer组件中。
  • 组件是在没有分配 ID 的情况下动态构建的(例如new UIComponent()) 。

在这里,UINamingContainer在每个<h:form><h:dataTable><f:subview>

如果上述建议没有帮助,请更新您的问题以包含尽可能小的代码片段(因此,没有所有不相关的代码/混乱,如不相关的组件、库、HTML/CSS/JS/等),它重现了完全相同的问题只需复制'n'paste'n'运行它而不进行任何更改。

于 2010-08-10T13:34:28.060 回答