JSF中的复选框和按钮交互

时间:2011-10-17 09:01:25

标签: jsf button checkbox valuechangelistener woodstock

我有一个复选框:

<webuijsf:checkbox immediate="true" valueChangeListenerExpression="#{user$recentreports.selectSingleCBEvent}" id="selectCB" binding="#{user$recentreports.selectCB}" toolTip="#{msg.report_select}"/>

的valueChangeListenerExpression方法是:

List<RowKey> rowsToBeRemoved=new ArrayList();
public void selectSingleCBEvent(ValueChangeEvent event) throws Exception {    
     RowKey rowKey = tableRowGroup.getRowKey();
     System.out.println("rowKey" + rowKey);
     System.out.println("tableRowGroup.getRowKey().toString()" + tableRowGroup.getRowKey().toString());
     rowsToBeRemoved.add(rowKey);
     FacesContext.getCurrentInstance( ).renderResponse( );

}

我有一个按钮,必须用于删除选中复选框组件的行:

<webuijsf:button actionExpression="#{user$recentreports.deleteButton_action}" id="deleteButton" text="#{msg.report_delete_selected}"/>

其支持bean是:

public String deleteButton_action() {

        for(RowKey rowToBeRemoved:rowsToBeRemoved){
            try {
                System.out.println("rowToBeRemoved" + rowToBeRemoved);
                GeneratedReport generatedReport = (GeneratedReport) reportList.getObject(rowToBeRemoved);
                Query resultQuery = queryGeneration(generatedReport.getId());
                List<String> dropTableQueries = resultQuery.getResultList(); // generated the queries to drop r tables
                for(int i=0; i<dropTableQueries.size(); i++){
                   String aDropTableQuery;
                   aDropTableQuery = dropTableQueries.get(i);   // get single drop table query
                   entityManager.createNativeQuery(aDropTableQuery);
                   reportList.removeRow(rowToBeRemoved);
                   reportList.commitChanges();
               }
                generatedReportJpaController.delete(generatedReport);
                reportList.commitChanges();
                analyzerResultService.drop(generatedReport.getId().longValue());
            } catch (Exception e) {
                error("Cannot delete report with row key " + rowToBeRemoved + e);
            }
        }
        return null;
    }

此表格的输出是:

[#|2011-10-17T11:47:14.304+0300|INFO|glassfishv3.0|null|_ThreadID=25;_ThreadName=Thread-1;|rowKeyRowKey[0]|#]

[#|2011-10-17T11:47:14.304+0300|INFO|glassfishv3.0|null|_ThreadID=25;_ThreadName=Thread-1;|tableRowGroup.getRowKey().toString()RowKey[0]|#]

[#|2011-10-17T11:47:14.304+0300|INFO|glassfishv3.0|null|_ThreadID=25;_ThreadName=Thread-1;|rowKeyRowKey[1]|#]

[#|2011-10-17T11:47:14.304+0300|INFO|glassfishv3.0|null|_ThreadID=25;_ThreadName=Thread-1;|tableRowGroup.getRowKey().toString()RowKey[1]|#]

这意味着我的deleteButtonAction已到达,但没有执行我写的动作(从rowsToBeRemoved获取rowKey并删除它们),我不明白为什么。返回bean是请求作用域它有任何相关性吗?

1 个答案:

答案 0 :(得分:1)

我的印象是,您通过在selectSingleCBEvent中调用FacesContext.getCurrentInstance().renderResponse()来短路JSF生命周期,并且永远不会到达您的actionListener。

立即输入的ValueChangeListeners在ApplyRequestValues阶段调用。稍后在InvokeApplication阶段调用ActionListeners。通过调用renderResponse(),您可以跳过周期的其余部分并直接进入RenderResponse阶段。