Jsf 如何在ui:repeat中设置组件/标记的id

Jsf 如何在ui:repeat中设置组件/标记的id,jsf,jsf-2,facelets,uirepeat,Jsf,Jsf 2,Facelets,Uirepeat,我试图将id分配给中的组件,如下所示: <ui:repeat value="#{bean.columns}" var="column"> <h:panelGroup layout="block" id="column_#{column.id}" styleClass="#{column.id} dashboard_column"> 问题是,{column.id}值被正确地放置在styleClass值中,但它没有被设置在id属性中。id属性中

我试图将
id
分配给
中的组件,如下所示:

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column_#{column.id}" 
        styleClass="#{column.id} dashboard_column">

问题是,
{column.id}
值被正确地放置在
styleClass
值中,但它没有被设置在
id
属性中。
id
属性中设置的所有内容都是由JSF+my硬编码值
列自动生成的
id

如果我删除硬编码的
我会得到一个异常:

java.lang.IllegalArgumentException:组件标识符不能是零长度字符串 在


有什么想法吗?

对于渲染时间标记(如
),这是不可能的。然而,
本身已经通过在生成的客户机ID前面加上行索引来确保其唯一性。因此,只需从组件的ID属性中删除EL部分

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column">

使用视图构建时标记,例如
(它基本上会生成多个
组件,而不是只生成一个多次渲染的组件),可以指定这样的动态ID

<c:forEach items="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column_#{column.id}">

(您应该只了解JSTL在Facelets中的工作方式)

另一种方法是使用静态
元素,而不是JSF
组件

<ui:repeat value="#{bean.columns}" var="column">
    <div id="column_#{column.id}">

另见:

JSF会自动为id添加前缀。如果只写id=“column”,生成的HTML将包含以下标识符:

myForm:0:列 myForm:1:列 myForm:2:列

等等

无论如何:不要在JSF模板中使用JSTL标记(比如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们能工作,应用程序的速度就会大大降低


对循环使用ui:repeat,对条件块使用ui:fragment。注意,c:set没有替代品,这样的构造在JSF2中已经不存在了。

谢谢,我最终使用了div。这意味着我不能在ui中为JSF元素分配动态ID:自己重复?仅适用于正确的简单HTML元素。无法在组件树中注册渲染时ID,它必须是固定值而不是动态值。无论您想通过这样的方式来解决什么功能需求,这都不是“JSF-ish”的方式,您可能需要三思而后行,以避免将来的意外。它非常有魅力,这是一个很好的解释。我还想知道为什么它会有一个向下投票,但我会向上投票,因为它很有意义。向下投票是因为“无论如何:不要在JSF模板中使用JSTL标记(如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们工作,应用程序的速度会降低很多。”这根本不是真的