1. 程式人生 > >使用ADF實現基於Form的CRUD (2)

使用ADF實現基於Form的CRUD (2)

執行環境:JDeveloper 11.1.2.1.0 + Oracle Database 10g Express Edition 10.2.0.1。

接上一個Project,在測試Delete功能時,發現了兩個小問題。
(1)點選Delete時應該有提示,當用戶確認後再刪除
(2)點選Delete後,不需要再點選Commit按鈕提交。
好,我們現在就把Delete功能按照上面的要求修改一下。

重要步驟說明:

1. 拖放Popup元件到Delete按鈕後面,拖放Dialog元件到Popup元件中,拖放OutputText元件到Dialog元件中
彈出的視窗是使用Popup元件來實現的,彈出視窗的內容是用Dialog元件來實現的,提示資訊是用OutputText來實現的。

把popup的id="popupDelete",供後面引用。

2. 拖放Show Popup Behavior Operation到Delete按鈕上
Show Popup Behavior是用來觸發Popup元件的,設定其屬性如下圖:


3. 使用dialogListener來監聽使用者選擇了“確定”or“取消”
找到Dialog元件,設定其dialogListener屬性,選擇新Managed Bean和方法deleteDialogListener。



其中deleteDialogListener方法,程式碼如下:
    public void deleteDialogListener(DialogEvent dialogEvent) { 
       if (dialogEvent.getOutcome().equals(DialogEvent.Outcome.ok)){
            doDelete();
        }
    }

至於doDelete方法,我們在下一步定義。

4. 使用Java程式碼呼叫Delete按鈕
(1)檢視Delete按鈕的頁面原始碼,內容如下:
<af:commandButton actionListener="#{bindings.Delete.execute}" text="Delete" disabled="#{!bindings.Delete.enabled}" id="cb7">
<af:showPopupBehavior popupId="popupDelete" triggerType="action" align="endAfter"/>
</af:commandButton>

(2)雙擊Delete按鈕,選擇如下:

確定後,會生成程式碼如下:
    public BindingContainer getBindings() {
        return BindingContext.getCurrent().getCurrentBindingsEntry();
    }

    public String cb7_action() {
        BindingContainer bindings = getBindings();
        OperationBinding operationBinding = bindings.getOperationBinding("Delete");
        Object result = operationBinding.execute();
        if (!operationBinding.getErrors().isEmpty()) {
            return null;
        }
        return null;
    }


Delete按鈕頁面程式碼變為:
<af:commandButton text="Delete" action="#{myBackingBean.cb7_action}" disabled="#{!bindings.Delete.enabled}" id="cb7">
<af:showPopupBehavior popupId="popupDelete" triggerType="action" align="endAfter"/>
</af:commandButton>

(3)把cb7_action方法的程式碼複製到doDelete方法中,並做一定的修改,最終doDelete方法內容如下:
    private void doDelete() {
        BindingContainer bindings = getBindings();
        OperationBinding operationBinding = bindings.getOperationBinding("Delete");
        Object result = operationBinding.execute();
        if (operationBinding.getErrors().isEmpty()) {
            operationBinding = bindings.getOperationBinding("Commit");
            operationBinding.execute();
        }
    }


(4)刪除cb7_action方法,同時刪除頁面中Delete按鈕的action屬性,因為真正的Delete操作已經dialogListener完成了。
最終的Delete頁面程式碼如下:
<af:commandButton text="Delete" disabled="#{!bindings.Delete.enabled}" id="cb7">
<af:showPopupBehavior popupId="popupDelete" triggerType="action" align="endAfter"/>
</af:commandButton>
<af:popup childCreation="deferred" autoCancel="disabled" id="popupDelete">
<af:dialog id="d2" title="Confirm Delete"
dialogListener="#{myBackingBean.deleteDialogListener}">
<f:facet name="buttonBar"/>
<af:outputText value="The record will be deleted, are you sure?" id="ot1"/>
</af:dialog>
</af:popup>

5. 執行
點選Delete按鈕,會提示是否刪除記錄,確定後,記錄將被刪除,無需再點選Commit提交。


http://maping930883.blogspot.com/2009/09/adf042adfformcrud-2.html