我的JSF应用中存在重复ID的问题。我读过in this post,其中一个可能的解决方案是使用命名容器。你能给我一些例子来说明如何使用命名容器来避免重复的id问题吗?我使用Facelets。
答案 0 :(得分:12)
这对我使用JSF1.2和facelets起作用了:
我发现<ui:composition>
和<ui:component>
实际上都不是命名容器,因此在同一表单中多次使用同一个组件会因重复的ID异常而失败。这似乎是一个糟糕的设计,因为组件的重点是可重用性。为了解决这个问题,我在每个组件中包含一个<f:subview>
,并在其上设置id作为我的组件标记的参数:
myComponent.xhtml:
<ui:component>
<f:subview id="#{id}">
....component code
</f:subview>
</ui:component>
在其他页面上使用它很简单(在正确设置taglib.xml和web.xml之后):
<myTagLib:myComponent id="myCompA" />
答案 1 :(得分:4)
我建议退一步调查为什么发生重复ID问题。一旦你确定了根本原因,那么只需按照“通常”的方式修复它,而不是创建自己的UINamingContainer
组件。
重复ID错误有几种可能的原因,可以帮助您进一步确定错误:
UIComponent
组件内的不同 UINamingContainer
。UIComponent
属性。f:subview
,而不是包含页面。UINamingContainer
组件中包含多个次。new UIComponent()
),但未分配ID。此处,UINamingContainer
位于<h:form>
,<h:dataTable>
和<f:subview>
之下。
如果上述建议无效,请更新您的问题以包含尽可能小的代码段(因此,不带所有不相关的代码/混乱,如不相关的组件,库,HTML / CSS / JS / etc)通过copy'n'paste'n'running它再现完全相同的问题而没有任何改变。