繁体   English   中英

Jsf如何创建命名容器

[英]Jsf How to create a Naming Container

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

这对我来说使用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" />

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

重复ID错误有几种可能的原因,这有助于您进一步确定错误:

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

这里, UINamingContainer位于<h:form><h:dataTable><f:subview>之下。

如果以上建议没有帮助,那么更新您的问题以包含尽可能小的代码片段(因此, 没有所有不相关的代码/混乱,如不相关的组件,库,HTML / CSS / JS /等),它们通过以下方式重现完全相同的问题:只是复制'n'paste'n'运行它没有任何变化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM