Java 在c:forEach标记中添加循环索引

Java 在c:forEach标记中添加循环索引,java,jsf-2,primefaces,richfaces,jstl,Java,Jsf 2,Primefaces,Richfaces,Jstl,在此之前,我一直在使用渲染时间标记(如a4j:repeat、ui:repeat)基于项目集合创建面板。所有这些都改变了,现在我必须改用c:forEach。 在每个面板上,我都会进行大量AJAX调用,并对页面进行部分更新。这就是为什么我使用自定义id来标识我要更新的组件。因此,我的渲染属性如下所示: #{cc.clientId}:pnlRepeat:#{row}:radioAplicar 其中pnlRepeat是id属性,{#row}是同一标记中的rowKeyVar属性。现在。。。当使用c:fo

在此之前,我一直在使用渲染时间标记(如a4j:repeat、ui:repeat)基于项目集合创建面板。所有这些都改变了,现在我必须改用c:forEach。 在每个面板上,我都会进行大量AJAX调用,并对页面进行部分更新。这就是为什么我使用自定义id来标识我要更新的组件。因此,我的渲染属性如下所示:

#{cc.clientId}:pnlRepeat:#{row}:radioAplicar

其中pnlRepeat是id属性,{#row}是同一标记中的rowKeyVar属性。现在。。。当使用c:forEach时,它们都不存在,因此,我得到了重复的id异常。我知道我可以使用varStatus,创建一个带有#{row}Id的面板,但另一方面。JSF不允许id属性对EL表达式求值。解决办法是什么?。非常感谢。

您不应该试图将任何ManagedBean逻辑或EL表达式建立在重复组件(如
的生成ID)的基础上。正如您已经提到的,EL表达式不允许您动态计算Id表达式,因此处理重复组件中的单个项触发事件的情况的适当方法是以
标记的形式传递唯一标识值

使用
标记将指定的值放入请求属性中,以便可以在操作侦听器中检索该值

<ui:repeat value="..." var="repeatedVar">
  <h:inputText id="newTxt" value="#{repeatedVar}" >
     <f:attribute name="unique_id" value="#{repeatedVar.uniqueId}" />
  </h:inputText>
</ui:repeat>
<h:commandButton actionListener="#{managedBean.someMethod}" ...
public void someMethod() {
    String uniqueId = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("unique_id");
    //Get the unique data object
    //Do some business logic and other stuff...
}