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 に到達したが、記述したアクション (rowToBeRemoved から rowKey を取得して削除する) を実行していないことを意味します。理由がわかりません。バック Bean はリクエスト スコープであり、関連性はありますか?

4

1 に答える 1

1

私の印象では、selectSingleCBEventでFacesContext.getCurrentInstance().renderResponse()を呼び出すことにより、JSFライフサイクルを短絡させ、actionListenerに到達することはありません。

即時入力のValueChangeListenersは、ApplyRequestValuesフェーズで呼び出されます。ActionListenersは、InvokeApplicationフェーズの後半で呼び出されます。renderResponse ()を呼び出すことにより、残りのサイクルをスキップして、RenderResponseフェーズに直接進みます。

于 2011-10-17T10:55:05.767 に答える