如何在JSF组件的id属性中使用<ui:repeat var>

我有以下代码:

<ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <h:form id="#{class2.name}"> <h:outputText value="#{class2.name}" /> </h:form> </ui:repeat> 

但是,当我打开页面时,它的错误如下:

组件标识符不能是零长度的string

但它正确地打印在<h:outputText> 。 这是如何造成的,我该如何解决?

您可以在JSF组件的id属性中使用EL,但在构build视图时 ,ELvariables必须可用,而要构buildJSF组件树。 但是, <ui:repeat>视图渲染时运行,而HTML输出是基于JSF组件树生成的。 <ui:repeat var>在视图构build期间不可用, #{class2.name}赋值为null ,这完全解释了您得到的错误。 它在<h:outputText>起作用是因为它在视图渲染时运行。

如果你通过在视图编译期间运行的<c:forEach>replace<ui:repeat> ,那么它将按照你的意图工作。 <c:forEach>将在JSF组件树中物理地生成多个<h:form>组件,它们分别生成各自的HTML输出(与<ui:repeat>相反,其中<h:form>组件被多次重复使用以生成HTML输出)。

 <c:forEach var="class2" items="#{bean.list}" varStatus="status"> <h:form id="#{class2.name}"> <h:outputText value="#{class2.name}" /> </h:form> </c:forEach> 

不过,我真的很想知道为什么你需要这样做。 通常不需要dynamic分配组件ID。 JSF已经确保了这个ID的唯一性。 下面的例子,

 <ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <h:form id="form"> <h:outputText value="#{class2.name}" /> </h:form> </ui:repeat> 

将以多种forms结束,每个forms具有唯一的ID,后缀为<ui:repeat>迭代索引。 如果你实际上需要为一些JavaScript / jQuery目的使用#{class2.name} (你没有在你认为这是正确的解决scheme的问题中没有提到具体的function需求,那么只是猜测),然后只是将其包装在一个普通的香草HTML元素中:

 <ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <div id="#{class2.name}"> <h:form id="form"> <h:outputText value="#{class2.name}" /> </h:form> </div> </ui:repeat> 

或者将其设置为JSF组件的样式类,也可以通过CSSselect器进行select:

 <ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <h:form id="form" styleClass="#{class2.name}"> <h:outputText value="#{class2.name}" /> </h:form> </ui:repeat> 

也可以看看:

  • JSF2 Facelets中的JSTL …有意义吗?