如何使用EL用 在JSF组件的id属性 如何使用EL用 在JSF组件的id属性(How t

2019-05-08 18:53发布

我有下面的代码:

<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> 这是怎么造成的,我该怎么解决呢?

Answer 1:

您可以在使用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 ...有道理?


文章来源: How to use EL with in id attribute of a JSF component