gpt4 book ai didi

jsf 1.2 自动生成组件的重复 Id

转载 作者:行者123 更新时间:2023-12-04 02:39:17 25 4
gpt4 key购买 nike

我有一个包含以下代码的 jsf 1.2 应用程序:

<c:forEach items="#{test.customerList}" var="itm">
<h:panelGroup layout="block">
<h:panelGroup layout="block" style="float:left;">
<h:outputText value="#{itm.customerName}"/>
</h:panelGroup>

<h:panelGroup layout="block" style="float:right;">
<c:forEach items="#{itm.addressTypeList}" var="adrssType">
<h:graphicImage id="addressTypeIcon" url="/images/services/16x16#{adrssType.contactaddresstypeicon}" alt="#{adrssType.contactaddresstypedesc}" title="#{adrssType.contactaddresstypedesc}" style="margin-top:4px;margin-left:5px;" rendered="#{adrssType.contactaddresstypeid lt 6}"/>
</c:forEach>
</h:panelGroup>
</h:panelGroup>
</c:forEach>

我第二次搜索客户时收到“javax.servlet.ServletException: duplicate Id for a component”异常。我已将问题缩小到以以下内容开头的行:

<h:graphicImage id="addressTypeIcon"

如果我删除这一行,我不会得到异常,但我也不会得到我想要显示的图像。是什么原因造成的?

最佳答案

JSTL 标记在 View 构建期间运行,即需要根据 JSP/XHTML 文件填充 JSF 组件树的那一刻。实际上,嵌套在 <c:forEach> 中的所有 JSF 组件在 JSF 组件树中根据需要迭代的次数重复创建。因此,当您使用像 <h:graphicImage> 中那样的硬编码 ID 时,然后它最终会在组件树中重复,从而导致此异常。

当您使用 JSF 组件而不是 JSTL 标记处理程序(例如 <h:dataTable>)遍历集合时,就不会发生这种“重复组件 ID”错误。 , <ui:repeat> , <t:dataList> , <a4j:repeat> , 等。然后将只有一个 <h:graphicImage>在 JSF 组件树中,然后在 View 呈现期间重复重复使用以生成 HTML 输出,此时需要基于 JSF 组件树生成 HTML 输出。因此,JSF 会自动将迭代索引附加到生成的客户端 ID,以便生成的 HTML DOM 树不会以重复的 HTML 元素 ID 结束。

如果除了 <c:forEach> 别无选择,那么您应该自己将迭代索引附加到 ID。例如:

<c:forEach ... varStatus="loop">
<h:graphicImage id="addressTypeIcon_#{loop.index}" ... />
</c:forEach>

或者,您也可以删除整个 id .然后 JSF 将自动生成一个,从而确保唯一性。

另见:

关于jsf 1.2 自动生成组件的重复 Id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com