如何使用jsf2中来自辅助bean的POJO的动作呈现commandLink?

时间:2012-11-06 16:26:31

标签: binding jsf-2

我需要渲染一个html表,它可以精确控制行,列,标题,样式等。
我这样使用primeFaces panelGrid:

<p:panelGrid binding="#{myBean.tableComponent}"/>

在我的支持bean中,我有:

private UIComponent tableComponent;

public UIComponent getTableComponent() {        
    if (tableComponent == null) {
        tableComponent = new PanelGrid();
        populateTableComponent(); // Populate datatable.
    }
    return tableComponent;
}

public void setTableComponent(UIComponent tableComponent) {
    this.tableComponent = tableComponent;
}

private void populateTableComponent() {
    PanelGrid tbl = (PanelGrid) tableComponent;
    //...
    for (MyPojo row : data.getRows) { 
        // ...here I create the row/column UIComponent subtree
    }
}

现在,我的问题是: 对于特定列,我必须在每一行中呈现一个commandLink 这个链接应该是AJAX调用bean的方法,该方法应该执行与被点击的行相关的操作 类似于<p:commandLink action="#{myBean.myFieldClick(***row***)}">但是 我怎样才能参考row

其他想法?

提前谢谢

1 个答案:

答案 0 :(得分:2)

只需使用与数据表的var属性中定义的完全相同的变量名称。换句话说,写下与通常在视图文件中而不是在辅助bean中写入时完全相同的EL表达式字符串。

因此,视图中的以下命令链接示例的action属性

<p:dataTable ... var="row">
    ...
    <p:commandLink ... action="#{myBean.myFieldClick(row)}">

可以通过编程方式表示为

MethodExpression action = createMethodExpression("#{myBean.myFieldClick(row)}", null, Row.class);

使用此辅助方法

public static MethodExpression createMethodExpression(String expression, Class<?> returnType, Class<?>... parameterTypes) {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return facesContext.getApplication().getExpressionFactory().createMethodExpression(
        facesContext.getELContext(), expression, returnType, parameterTypes);
}