0

我有一个复选框:

<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 并删除它们),我不明白为什么。Back bean 是请求范围的,它有什么相关性吗?

4

1 回答 1

1

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

在 ApplyRequestValues 阶段调用即时输入的 ValueChangeListeners。稍后在 InvokeApplication 阶段调用 ActionListener。通过调用renderResponse () 您可以跳过循环的其余部分并直接进入 RenderResponse 阶段。

于 2011-10-17T10:55:05.767 回答