11

我有以下代码:

<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>. 这是如何引起的,我该如何解决?

4

1 回答 1

25

您可以在idJSF 组件的属性中使用 EL,但 EL 变量必须在视图构建期间可用,同时要构建 JSF 组件树。但是,在视图渲染<ui:repeat>期间运行,而 HTML 输出将基于 JSF 组件树生成。在视图构建期间不可用,并且评估完全解释了您遇到的错误。它之所以起作用是因为它在视图渲染期间运行。<ui:repeat var>#{class2.name}null<h:outputText>

如果您替换<ui:repeat><c:forEach>在视图构建期间运行的 ,那么它将按您的意图工作。这<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>

但是,我真的很想知道您为什么需要这样做。通常不需要动态分配组件 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>

也可以看看:

于 2013-08-21T13:36:27.923 回答