Jan 27, 2008

Εκτέλεση υπό συνθήκες (conditional execution) ενός ADF iterator

Μια από τις πιο συχνές ερωτήσεις, ιδίως από ανθρώπους που προέρχονται από το περιβάλλον προγραμματισμού των Oracle Forms, είναι το πώς είναι δυνατόν η εμφάνιση ενός πίνακα δεδομένων (grid) να μην γίνεται αυτόματα με την είσοδο μας στην σελίδα, αλλά έπειτα από την ενεργοποίηση κάποιας συνθήκης. Και τούτο διότι στο ADF, όταν κάνουμε drag and drop ένα ViewObject ως table, τότε όταν θα ζητηθεί η σελίδα μας, θα εκτελεστεί αυτόματα το query του ViewObject μας. Μια εκτέλεση υπό συνθήκες μπορεί να μας προστατεύσει πολλές φορές όταν το μέγεθος των δεδομένων είναι αρκετά μεγάλο ή όταν οι κανόνες της λογικής μιας σελίδας μας το επιβάλλουν.

Η παραμετροποίηση αυτής της συμπεριφοράς είναι εύκολη. Αρχικά κάνουμε drag and drop ένα στοιχείο ως table και έπειτα προσθέτουμε στην σελίδα μας ένα JSF command button. Έπειτα προσθέτουμε έναν setActionListener μέσα στο command Button, ώστε η τιμή της μεταβλητής που θα κατασκευαστεί εκείνη τη στιγμή να χρησιμοποιηθεί για την υπό συνθήκες εκτέλεση των αποτελεσμάτων.

Στο παράδειγμά μας, γίνεται η ανάθεση της τιμής true στην μεταβλητή retrieveDataFlag που βρίσκεται σε request scope.

Ανατρέχοντας στο page definition της σελίδας μας, επιλέγουμε τον iterator του πίνακα (κάτω από την κατηγορία executables) και έπειτα τον structure editor. Αλλάζουμε την τιμή της ιδιότητας Refresh σε "always" και έπειτα το RefreshCondition σε :

${adfFacesContext.postback == true && requestScope.retrieveDataFlag == true}

που σημαίνει πως τα αποτελέσματα θα εμφανιστούν μόνο αν γίνει postback στην σελίδα και έχει πάρει η μεταβλητή που κατασκευάσαμε νωρίτερα την τιμή true.

Δοκιμάζοντας το παράδειγμά μας, μόλις θα εμφανιστεί πρώτη φορά η σελίδα, δεν θα υπάρχουν δεδομένα.

Μόλις κάνουμε click όμως στο command button μας, τότε θα ενεργοποιηθεί ο iterator των αποτελεσμάτων.

Μια ενδεχόμενη μάλιστα βελτίωση της λύσης είναι να αντιγράψουμε τον κώδικα του RefreshCondition στο rendered attribute του πίνακα, ώστε αρχικά να μην δούμε καν τον πίνακα με την περιγραφή "No rows found".

No comments: