如何在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 …有意义吗?