如何将对象从richface Datatable传递给actionlistener

时间:2011-10-25 10:36:47

标签: jsf java-ee richfaces

我从richface数据表传递一个对象,如:

<rich:column>
<a4j:commandLink
value="Transfer inside Group" 
actionListener="#{adminBean.init_machineTransferInsideGroup}"
reRender="transferInsideGroupMachinePanel"
oncomplete="#{rich:component('transferInsideGroupMachinePanel')}.show()">
    <f:setPropertyActionListener
            target="#{adminBean.machineToChange}"
        value="#{Machineassg3}" />
    </a4j:commandLink>
<rich:column>

点击命令链接时,我对上述代码的期望是什么:

  1. 将对象(Machineassg3)分配给bean的变量(adminBean.machineToChange)
  2. 然后调用actionlistener(init_machineTransferInsideGroup)
  3. 之后的富模式面板
  4. 但正在发生的步骤是:

    1. 调用actionlistener(init_machineTransferInsideGroup)
    2. 将对象(Machineassg3)分配给bean的变量(adminBean.machineToChange)
    3. 之后的富模式面板
    4. 如何执行预期的步骤(意味着先分配然后再调用actionlistener)

2 个答案:

答案 0 :(得分:3)

您应该在action而不是actionListener开展业务工作。动作监听器旨在保持自包含的逻辑,以准备/预处理真实的业务操作和/或记录某些事情,来完成业务工作。

所以,替换

actionListener="#{adminBean.init_machineTransferInsideGroup}"

通过

action="#{adminBean.init_machineTransferInsideGroup}"

并从ActionEvent方法中删除init_machineTransferInsideGroup()参数。在所有动作侦听器(也是<f:setPropertyActionListener>之一)完成其工作后,将调用动作。

另见:

答案 1 :(得分:1)

您可以使用ValueExpression获取行变量。

假设你在dataTable声明中有属性var="machine",那么在托管bean的action方法中你就可以这样了

FacesContext fCtx = FacesContext.getCurrentInstance();
ELContext elCtx = fCtx.getELContext();
ExpressionFactory ef = fCtx.getApplication().getExpressionFactory();
ValueExpression ve = ef.createValueExpression(elCtx, "#{machine}", Machineassg3.class);
machineassg3 = (Machineassg3)ve.getValue(elCtx);

我不知道machineassg3变量的实际类,所以我就像Machineassg3一样。

我希望它有所帮助。