Jul 8, 2007

ADF Faces - Δυναμικός υπολογισμός μέσω Partial Page Rendering (PPR)

Όσοι είχαν χρησιμοποιήσει την πάλαι ποτέ τεχνολογία του Oracle UIX, θα είναι ήδη εξοικειωμένοι με την ορολογία της τμηματικής παραγωγής σελίδων (Partial Page Rendering - PPR), δηλαδή της ενημέρωσης ενός τμήματος μιας web σελίδας με δεδομένα, έπειτα από την εκκίνηση ενός γεγονότος (event), χωρίς να είναι απαραίτητη η συνολική της ενημέρωση (refresh) έπειτα από επικοινωνία με τον Application Server. Για εκείνους που δεν γνώριζαν το PPR, η πλατιά εξάπλωση του AJAX, ως υποστηρικτική τεχνολογία του Web 2.0, επέβαλλε την ευκολία στον προγραμματισμό δυναμικών και πλούσιων διεπαφών στο web. H Oracle, διαθέτοντας μια μεγάλη εμπειρία σε αυτόν τον τομέα, ενσωματώνει στα JSF UI components της (όπως αυτά του ADF Faces στην έκδοση JDeveloper 10.1.3 και ADF Faces Rich Client στην αναμενόμενη 11g), δυνατότητες προγραμματισμού PPR, δίχως να είναι απαραίτητο να καταφύγει κανείς σε λεπτομέρειες υλοποίησης του AJAX.

Ένα ενδεικτικό παράδειγμα, προσφέρει η δυναμική ενημέρωση του συνόλου της αξίας μιας γραμμής παραγγελίας, όταν μεταβληθούν είτε η ποσότητα, είτε η αξία του επιλεγόμενου είδους. Τούτο αποτελεί ένα άμεσα δοκιμαζόμενο υπόδειγμα στο σχήμα OE, που παραδίδεται με κάθε Oracle βάση δεδομένων. Για την επίδειξη της ικανότητας, θα χρησιμοποιήσω τα ADF Business Components για τη δημιουργία της επιχειρηματικής λογικής, κάτι όμως εξίσου ανάλογο θα μπορούσε να συμβεί και με EJBs.

Κατασκευάζω λοιπόν από το σχήμα της βάσης το OrderLines Entity, και μετά το αντίστοιχο updatable view object.


Στο view object, προσθέτω ένα καινούργιο attribute, το LineTotal, που δεν θα αποθηκευτεί στη βάση δεδομένων, εφόσον πρόκειται για υπολογιζόμενο πεδίο. Σε αυτό το σημείο, ορίζεται και η αρχική τιμή που θα λάβει.

Επίσης, για να έχω προγραμματιστικό έλεγχο πάνω σε κάθε πεδίο του καινούργιου View object, θα παράγω και την κατάλληλη Java κλάση, για να έχω στη διάθεσή μου τα getters/setters σε επίπεδο εγγραφής.

Τώρα αν ανατρέξω στον κώδικα, στο επίπεδο εγγραφής (row) για το OrderItems View Object μου, θα χρειαστεί να μεταβάλλω τις μεθόδους μου setQuantity(), setUnitPrice(), ώστε η κλήση τους (που ενεργοποιείται όταν ο χρήστης αλλάζει δεδομένα) να οδηγεί και στην αντίστοιχη ενημέρωση του πεδίου LineTotal, δηλαδή να επαναπραγματοποιείται ο υπολογισμός.

Τώρα είμαστε έτοιμοι να μεταφερθούμε στην κατασκευή της σελίδας μας. Διαλέγουμε το view μας και το κάνουμε drag-and-drop σαν ένα updatable grid.

To σημείο κλειδί για να ορίσουμε πως στο user interface μας ότι η μεταβολή της ποσότητας ή της αξίας οδηγεί σε ένα νέο event, είναι η ιδιότητα Auto Submit = true , για τις δυο αυτές στήλες, όπως επίσης και ένα αναγνωριστικό (Id) για αυτές. Αυτό πρακτικά σημαίνει πως μπορούμε να έχουμε μεμονωμένα submits στοιχείων σε μια φόρμα, αντί για συνολικά που προκαλούνται από ένα submit button.

Τέλος, για να δηλωθεί και η δυναμική ενημέρωση του LineTotals, αρκεί να ορίσουμε στις ιδιότητές του, ότι το PartialTriggers θα "ακούει" στα αναγνωριστικά (Ids) των στοιχείων που παράγουν το event (χωρισμένα με κενό μεταξύ τους) Μια υλοποίηση του Observer design pattern.

Τρέχοντας το παράδειγμα, εμφανίζεται η αρχική σελίδα,

όπου η μεταβολή της τιμής ενός είδους, θα οδηγήσει δυναμικά σε ενημέρωση της αξίας της γραμμής.

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

Ακόμα πιο σύνθετες δυνατότητες αξιοποίησης του PPR, είναι εφικτές με την χρησιμοποίηση του ValueChangeListener των JSF, ώστε προγραμματιστικά να γίνει η μεταβολή κάποιων στοιχείων της οθόνης (χρώματα, ενεργοποίηση στοιχείων, κτλ)

No comments: