Jsf如何创建命名容器

时间:2010-08-10 13:21:30

标签: jsf facelets naming-containers

我的JSF应用中存在重复ID的问题。我读过in this post,其中一个可能的解决方案是使用命名容器。你能给我一些例子来说明如何使用命名容器来避免重复的id问题吗?我使用Facelets。

2 个答案:

答案 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错误有几种可能的原因,可以帮助您进一步确定错误:

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

此处,UINamingContainer位于<h:form><h:dataTable><f:subview>之下。

如果上述建议无效,请更新您的问题以包含尽可能小的代码段(因此,不带所有不相关的代码/混乱,如不相关的组件,库,HTML / CSS / JS / etc)通过copy'n'paste'n'running它再现完全相同的问题而没有任何改变。