我有下面的代码:
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<h:form id="#{class2.name}">
<h:outputText value="#{class2.name}" />
</h:form>
</ui:repeat>
然而,当我打开网页,它的错误如下:
组件识别器不能是零长度的字符串
但它是正确打印在<h:outputText>
这是怎么造成的,我该怎么解决呢?
您可以在使用EL id
JSF组件的属性,但EL变量必须在视图生成时可用,而JSF组件树是要建。 然而, <ui:repeat>
运行视图中呈现时 ,而HTML输出是基于JSF组件树来产生。 在<ui:repeat var>
是不是在查看生成时间和可用#{class2.name}
计算结果为null
这完全说明你得到了错误。 它工作在<h:outputText>
是因为它视图期间运行渲染时间。
如果更换<ui:repeat>
按<c:forEach>
这在视图生成时运行,那么它会工作,你intented。 所述<c:forEach>
将即产生物理上的多个<h:form>
在JSF组件树组件,其中每个单独生成自己的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>
不过,我真的不知道为什么你需要做到这一点。 有通常不需要动态分配组件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>
将多种形式与每个唯一的ID,与所述的迭代指数后缀结束<ui:repeat>
。 如果你确实需要使用#{class2.name}
对于一些JavaScript / jQuery的目的(你也无处说明在为您所想,这将是正确的解决方案的问题的具体功能要求,所以它仅仅是猜测),那么就包装在一个普通的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组件,这也是通过CSS选择器只是可选的:
<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>
也可以看看:
- JSTL在JSF2的Facelets ...有道理?