Oct 5, 2014

Δυο χαρακτηριστικά του JSF 2 που είναι χρήσιμα στο ADF

Η 12c σειρά του JDeveloper (αλλά και η παλαιότερη 11g R2) υποστηρίζουν το πρότυπο JSF 2. Ανάμεσα στα πολλά νέα χαρακτηριστικά που έχει αυτή η έκδοση, σε σχέση με την 1.2, θα ήθελα να αναφέρω δυο γνωρίσματα που ίσως να φανούν χρήσιμα στους προγραμματιστές του Oracle ADF.

Το πρώτο έχει να κάνει με το ότι οι action μέθοδοι των navigation components (buttons, menus, links) επιδέχονται ορίσματα. Ενώ μέχρι το JSF 1.2 το managed bean action method signature δεν δέχονταν παραμέτρους, στο JSF 2 μπορούν να δεχτούν ορίσματα οποιουδήποτε τύπου. Ένα παράδειγμα χρήσης έχει να κάνει με το πέρασμα ως παραμέτρου της τιμής ενός attribute binding ή selected row(s) για το οποίο θα θέλαμε είτε UI components bindings είτε ADF bindings κώδικα στο managed bean μας. Στο παρακάτω απόσπασμα κώδικα, η managed bean action method χρησιμοποιεί ως παράμετρο την επιλεγμένη εγγραφή του πίνακα.
Ο δε κώδικας του managed bean μοιάζει ως εξής. Οι επιλεγμένες είναι άμεσα διαθέσιμες μέσω της κλάσης RowKeySet.

Το δεύτερο, αφορά την υλοποίηση συμπεριφοράς όταν συμβαίνουν συστεμικές ενέργειες (system events) σε UI components. Τέτοιες ενέργειες μπορούν να περιλαμβάνουν για παράδειγμα την αρχική εμφάνιση ενός στοιχείου (pre-render) σε μια σελίδα (περισσότερες πληροφορίες εδώ) Κάτι τέτοιο μπορεί να μας είναι πολύ χρήσιμο ώστε να υλοποιήσουμε λογικές τύπου "on component ή page load". Μάλιστα υπάρχει ένα παράδειγμα του ADF code corner για την προβολή ενός pop-up με την αρχική εμφάνιση ενός region. Έστω ότι θέλουμε να επηρεάσουμε το αρχικό rendering ενός πίνακα, ώστε εμφανίσουμε εξ ορισμού μια επιλεγμένη εγγραφή. Τότε μπορούμε να χρησιμοποιήσουμε το JSF component f:event, ενσωματωμένο στο component που μας ενδιαφέρει, στην περίπτωση μας ένα af:table.
 
H ιδιότητα listener μας ανοίγει το δρόμο για να προγραμματίσουμε τη συμπεριφορά του pre-render. Έτσι μπορούμε να κάνουμε μια προγραμματιστική αντιμετώπιση του event, χωρίς να καταφύγουμε σε σύνθετους κώδικες και phase listeners όπως συνέβαινε με προηγούμενες εκδόσεις.

    public void preRender(ComponentSystemEvent componentSystemEvent) {
        UIComponent tab = componentSystemEvent.getComponent();
    }

No comments: