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>

另见:

您可以在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>

另见:

问题是,你真的需要它吗?为什么要创建多个表单?嗨,是的,我为每一行创建了一个表单,以确保只保留这一行(在输出文本旁边将包含一个按钮)…但是我告诉我EL不适用于ID,我将尝试搜索另一种方法查看此答案,考虑到
ui:repeat
在页面呈现时有效,而
c:forEach
在页面构建时,我建议您使用第二种方法。问题是,您真的需要吗?为什么要创建多个表单?嗨,是的,我为每一行创建了一个表单,以确保只保留这一行(在输出文本旁边将包含一个按钮)…但是我告诉我EL不适用于ID,我将尝试搜索另一种方法查看此答案,考虑到
ui:repeat
在页面呈现时有效,而
c:forEach
在页面构建时,我建议您使用第二种方法。问题是,您真的需要吗?为什么要创建多个表单?嗨,是的,我为每一行创建了一个表单,以确保只保留这一行(在输出文本旁边将包含一个按钮)…但是我告诉我EL不适用于ID,我将尝试搜索另一种方法查看此答案,考虑到
ui:repeat
在页面呈现时有效,并且
c:forEach
在页面构建时,我建议您使用第二种方法。这个问题让我发疯+1以清楚地解释为什么它不起作用,而不仅仅是提供问题的解决方案。在我的例子中,多个表单可以工作,但是它们不能正确地提交表单数据(只有最后一个表可以)。数据没有设置,我一直在那里得到空值。这实际上解决了这个问题。谢谢因此,请记住,如果您在ui中创建了多个表单:重复,并且表单中的数据为空,请阅读@BalusC的帖子和+1他的解决方案!;)这个问题让我发疯+1以清楚地解释为什么它不起作用,而不仅仅是提供问题的解决方案。在我的例子中,多个表单可以工作,但是它们不能正确地提交表单数据(只有最后一个表可以)。数据没有设置,我一直在那里得到空值。这实际上解决了这个问题。谢谢因此,请记住,如果您在ui中创建了多个表单:重复,并且表单中的数据为空,请阅读@BalusC的帖子和+1他的解决方案!;)这个问题让我发疯+1以清楚地解释为什么它不起作用,而不仅仅是提供问题的解决方案。在我的例子中,多个表单可以工作,但是它们不能正确地提交表单数据(只有最后一个表可以)。数据没有设置,我一直在那里得到空值。这实际上解决了这个问题。谢谢因此,请记住,如果您在ui中创建了多个表单:重复,并且表单中的数据为空,请阅读@BalusC的帖子和+1他的解决方案!;)
<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>