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

Nik*_*iko 10 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>
Run Code Online (Sandbox Code Playgroud)

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

组件标识符不能是零长度字符串

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

Bal*_*usC 25

您可以在idJSF组件的属性中使用EL ,但EL变量必须在视图构建期间可用,同时要构建JSF组件树.但是,<ui:repeat>视图渲染时运行,而HTML输出将基于JSF组件树生成.该<ui:repeat var>不是在视图生成时可用,#{class2.name}计算结果为null这完全说明你得到了错误.它的作用<h:outputText>是因为它在视图渲染时运行.

如果你替换<ui:repeat><c:forEach>,在视图构建期间运行,那么它将按你的意图工作.的<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>
Run Code Online (Sandbox Code Playgroud)

但是,我真的很想知道为什么你需要这样做.通常无需动态分配组件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>
Run Code Online (Sandbox Code Playgroud)

将以多种形式结束,每个形式都有一个唯一的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>
Run Code Online (Sandbox Code Playgroud)

或者将其设置为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>
Run Code Online (Sandbox Code Playgroud)

也可以看看:

  • 这个问题让我发疯了.+1清楚地解释为什么它不起作用而不只是提供问题的解决方案.在我的情况下,多个表单可以工作,但他们不会正确提交表单数据(只有最后一个表).数据未设置,我在那里保持为空.这实际上解决了这个问题.谢谢!所以请记住,如果您在ui中创建了多个表单:repeat并且表单中的数据为null,请阅读@ BalusC的帖子并+1他的解决方案!;) (4认同)