【问题标题】:JSF2 EL not displayed in components IDsJSF2 EL 未显示在组件 ID 中
【发布时间】:2012-02-21 08:12:34
【问题描述】:

我有以下代码:

<ui:repeat var = "ctr" value = "#{bean.counterList}">
    <h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
<h:inputText id="message#{ctr}" value="#{bean.messageList}" />
</ui:repeat>

counterListList&lt;String&gt;。如果列表在视图中包含 1, 2, 3,则您应该是 3 个带有 id 的输入字段:message1, message2, message3

EL 对 id 属性没有影响,所有组件只接收 message 作为 ID。另一方面,在标签的价值方面,EL 效果很好。

我可以想象这可能是所需的行为,但有解决方法吗?

更新:

我删除了id 属性,ui:repeat 现在负责命名 id。从源代码中我可以看到生成的 ID 是唯一的,但现在抛出此警告:

INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=fm-story:j_idt103:0:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]
sourceId=fm-story:j_idt103:1:j_idt54[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]

【问题讨论】:

    标签: java jsf


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      我还没有检查过,但正确的行为将是以下形式:

      <ui:repeat var = "ctr" value = "#{bean.counterList}">
        <h:outputLabel for="message" value="#{appMessage['No #{ctr} :" />
        <h:inputText id="message" value="#{bean.messageList}" />
      </ui:repeat>
      

      组件标识符 message 不会改变; client identifier(例如fm-story:j_idt103:0:message)将在生命周期处理期间逐行更改。标签组件的for 属性算法将能够使用“消息”找到输入组件,因为它们共享一个命名容器。

      【讨论】:

      • 谢谢!您的回答对我有帮助,但奇怪的是,它并不能解决问题。在property 标签中有List 时似乎有一些奇怪的行为。这是我得到的错误:NFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=fm-story:j_idt59:0:message[severity=(ERROR 2), summary=(Conversion Error setting value '' for 'null Converter'.), detail=(Conversion Error setting value '' for 'null Converter'.)]
      • counterList 是什么类型?该错误可能与将列表绑定为输入控件的值而不是可变行属性有关。表达式语言不知道如何将字符串强制转换为 counterList 的任何内容,如果可以的话,它对您没有任何好处,因为每一行都会绑定到相同的值。正确的绑定通常看起来像 #{ctr.someProperty}
      【解决方案3】:

      我有同样的问题...... How can i set id of h:panelGroup inside ui:repeat

      您不能使用 ui:repeat 即时设置 id(查看上面的链接)

      您可以使用&lt;c:forEach

      喜欢这个

      <c:forEach var = "ctr" items = "#{bean.counterList}">
          <h:outputLabel for = "message#{ctr}" value = "#{appMessage['No #{ctr} :" />
          <h:inputText id="message#{ctr}" value="#{bean.messageList}" />
      </c:forEach>
      

      (但您应该只是 well aware 了解 JSTL 在 Facelets 中的工作方式)

      【讨论】:

      • 谢谢!但是所有这些输入元素都必须保存在托管 bean 中的 List 中。如果没有 JSF 的 h:inputText,我不确定这个过程是否会顺利进行
      【解决方案4】:

      您不应该尝试手动索引完整的 JSF 迭代组件(如 &lt;ui:repeat&gt;&lt;h:dataTable&gt; 等)内的组件 ID。这只会导致你亲身经历的灾难。它将在 JSTL &lt;c:forEach&gt; 中运行,因为它在构建 JSF 组件树时作为视图构建时间标记运行,而不是在生成 HTML 输出时运行。 &lt;c:forEach&gt; 还会在物理上生成与迭代一样多的 JSF 组件。

      只需省略 id 属性中的任何 EL。 JSF 组件将担心自动设置正确的客户端 ID。此外,您可以使用&lt;ui:repeat&gt;varStatus 属性来获取当前循环计数和索引。这样你就不需要 2 个列表。计数将显示当前回合。为了通过索引获取/设置List&lt;String&gt; 的值,索引是强制性的。 &lt;h:inputText value="#{message}" /&gt; 即不起作用,因为 String 类没有设置器。

      <ui:repeat value="#{bean.messageList}" var="message" varStatus="loop">
          <h:outputLabel for="message" value="#{appMessage['No']} #{loop.count}:" />
          <h:inputText id="message" value="#{bean.messageList[loop.index]}" />
      </ui:repeat>
      

      (如果需要,您可以在上面的 sn-p 中省略 var="message",因为它没有在任何地方使用)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 2015-02-14
        • 1970-01-01
        • 1970-01-01
        • 2012-05-27
        相关资源
        最近更新 更多