Forms 如何将EL与<;ui:重复var>;JSF组件的in-id属性
我有以下代码:Forms 如何将EL与<;ui:重复var>;JSF组件的in-id属性,forms,jsf,el,identifier,Forms,Jsf,El,Identifier,我有以下代码: <ui:repeat var="class2" value="#{bean.list}" varStatus="status"> <h:form id="#{class2.name}"> <h:outputText value="#{class2.name}" /> </h:form> </ui:repeat> 但是,当我打开页面时,它会出现如下错误: 组件标识符不能是零长度字符串 但是它正确地打
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<h:form id="#{class2.name}">
<h:outputText value="#{class2.name}" />
</h:form>
</ui:repeat>
但是,当我打开页面时,它会出现如下错误:
组件标识符不能是零长度字符串
但是它正确地打印在
中。这是如何造成的,我如何解决它?您可以在JSF组件的id
属性中使用EL,但是EL变量必须在视图构建时可用,而JSF组件树是要构建的。但是,
在视图呈现时间运行,而HTML输出将基于JSF组件树生成。
在视图生成期间不可用,并且{class2.name}
的计算结果为null
,这完全解释了您遇到的错误。它在
中工作是因为它在视图渲染期间运行
如果将
替换为在视图构建期间运行的
,那么它将按照您的预期工作。
即在JSF组件树中物理上生成多个
组件,每个组件分别生成各自的HTML输出(与
相反,其中相同的
组件被多次重用以生成HTML输出)
或者将其设置为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>
另见:
ui:repeat
在页面呈现时有效,并且c:forEach
在页面构建时,我建议您使用第二种方法。这个问题让我发疯+1以清楚地解释为什么它不起作用,而不仅仅是提供问题的解决方案。在我的例子中,多个表单可以工作,但是它们不能正确地提交表单数据(只有最后一个表可以)。数据没有设置,我一直在那里得到空值。这实际上解决了这个问题。谢谢因此,请记住,如果您在ui中创建了多个表单:重复,并且表单中的数据为空,请阅读@BalusC的帖子和+1他的解决方案!;)
<ui:repeat var="class2" value="#{bean.list}" varStatus="status">
<h:form id="form">
<h:outputText value="#{class2.name}" />
</h:form>
</ui:repeat>
<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>
<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>