JSF2 EL未显示在组件ID中

时间:2012-02-21 08:12:34

标签: java jsf

我有以下代码:

<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<String>。如果视图中的列表包含1, 2, 3,那么您应该有3个带有ID的输入字段:message1, message2, message3

EL对 id 属性无效,所有组件只接收消息作为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'.)]

4 个答案:

答案 0 :(得分:2)

答案 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属性算法将能够使用“message”找到输入组件,因为它们共享一个命名容器。

答案 2 :(得分:1)

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

你不能用ui重复设置id:重复(看看上面的链接)

您可以使用<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>

(但你应该只是JSTL在Facelets中工作的well aware

答案 3 :(得分:0)

您不应尝试手动索引完整的JSF迭代组件(如<ui:repeat><h:dataTable>等)内组件的ID。这只会导致你经历过的灾难。它将在JSTL <c:forEach>内部工作,因为它在构建JSF组件树时作为视图构建时标记运行,而不是在生成HTML输出时。 <c:forEach>也会生成与迭代一样多的JSF组件。

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

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> ,因为它在任何地方都没有使用过)