渲染组件后,如何将请求映射中的对象传递到方法表达式中?

How do I pass objects from the request map into a method expression after rendering a component?

我正在编写一个自定义数据表组件,我正试图让其他开发人员使用当前迭代的 var 传递给方法表达式。

这是一个例子:

<my:dataTable value="#{contactController.viewEntities}" var="contact">
            <p:column headerText="Whatever">
                <p:commandButton value="Edit" 
                                 ajax="false"
                                 actionListener="#{contactController.setSelectedContact(contact)}"
                                 action="contact"/>
            </p:column>
</my:dataTable>

如您所见,我正在尝试将 "contact" var 传递给 setter 方法供以后使用。该 var 在渲染期间存储在请求映射中,如下所示:

...
Map<String, Object> requestMap = context.getExternalContext()
                .getRequestMap();
for (Object obj : collection) { 
    requestMap.put(table.getVar(), obj);
    for (UIColumn column : columns) {

        column.encodeAll(context);

    }
    requestMap.remove(table.getVar());
}
...

但是,当我运行项目时,传递给控制器​​的唯一值是null。

问题变成了,如何使该对象可用于每一行以在表达式语言中使用?我查看了 PrimeFaces/ICEFaces 的数据表,但我看不出它们与我的有何不同

提前致谢!

所以,我终于解决了这个问题!扩展 UIData 时,setRowIndex(index) 方法可用。通过设置此值,每行组件的 clientId 将在前面加上索引号,从而使它们在每行中都是唯一的。诀窍是在遍历底层集合时设置这个值。表达式语言现在可以评估 var 参数。

int index = 0;
Map<String, Object> requestMap = context.getExternalContext()
            .getRequestMap();
for (Object obj : collection) { 
    requestMap.put(table.getVar(), obj);
    table.setRowIndex(index);
    for (UIColumn column : columns) {

         column.encodeAll(context);

    }
    requestMap.remove(table.getVar());
    index ++;
}