Tuesday, December 15, 2015

ADF fileDownloadActionListener custom validation (ADF Auto Click Button)

Pada adf ada komponen <af:fileDownloadActionListener> yang biasanya digunakan untuk menggenerate mendownload suatu file.
<af:fileDownloadActionListener> biasanya di pasang pada sebuah button.

fileDownloadActionListener bisa dibilang memiliki kelemahan, yaitu saat button di klik maka fileDownloadActionListener akan langsung ter-trigger, tanpa peduli dengan validasi pada form input yang ada, padahal ada field-field mandatory yang harus diisi dengan value yang benar (misalnya sesuai dengan data yang ada pada database). Tetapi asalkan field tersebut tidak di isi kosong maka fileDownloadActionListener akan langsung merespon, padahal field tersebut di isi dengan data yang tidak ada di database.

Dan sepertinya dari sananya (oracle) memang tidak membuat <af:fileDownloadActionListener> ini bisa di intercept begitu ter-trigger.
Jadi untuk mencegah hal ini terjadi kita akan menggunakan sebuah trick, yaitu dengan menggunakan hidden button dan script auto click.

Button yang dipasang <af:fileDownloadActionListener> akan kita hidden (kita sebut saja button H), dan menambahkan button lain (kita sebut saja button D).
Pada saat button D di klik maka akan tervalidasi field-field mandatory yang ada pada form, jika validasi lolos selanjutnya akan di running script untuk mengklik button hidden yang dipasang <af:fileDownloadActionListener>
File akan digenerate dan proses download bisa dilakukan


Berikut penjelasan lebih lanjutnya:

  • Ini adalah gambar structure komponen dari Button dan fileDownloadListener nya


  • Code untuk Button Hidden
<af:commandButton text="Button Hidden"
    clientComponent="true" visible="false"
    binding="#{backingBeanScope.backing_view1.cb2}"
    id="cb2" partialSubmit="false">
    <af:fileDownloadActionListener filename="asdasd"
           method="#{backingBeanScope.backing_view1.downloadMe}"
           contentType="text/plain; charset=utf-8"/>
</af:commandButton>

  • Code untuk Button Download
<af:commandButton text="Button Download" id="cb1"
    binding="#{backingBeanScope.backing_view1.cb1}"
    action="#{backingBeanScope.backing_view1.prepareForDownloadAction}"
    clientComponent="true"
    partialSubmit="true"/>

  • Code javascript untuk file jspx. Ini adalah script Auto Click nya, nanti akan di panggil melalui java code
<af:resource type="javascript">
            function customHandler(event) {
                var exportCmd = AdfPage.PAGE.findComponentByAbsoluteId("cb2");
                var actionEvent = new AdfActionEvent(exportCmd);
                actionEvent.forceFullSubmit();
                actionEvent.noResponseExpected();
                actionEvent.queue();
            }
</af:resource> 

  • dan berikut adalah method action pada Button Download
public String prepareForDownloadAction() {

    // ---- logic validasi ---- //

    // ---- memanggil function javascript ---- //
    FacesContext context = FacesContext.getCurrentInstance();
    ExtendedRenderKitService erks = Service.getService(context.getRenderKit(), 
                                        ExtendedRenderKitService.class);
    erks.addScript(context, "customHandler();");
    return null;
}


Cukup sekian dan silahkan dicoba.












No comments:

Post a Comment