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