Sep 11, 2006

Μεταφορά εφαρμογών Struts σε Java Server Faces

Αναμφίβολα, η δημιουργία πλούσιων διεπαφών με εύκολο και γρήγορο τρόπο αποτελεί μια από τις μεγαλύτερες προκλήσεις ακολουθώντας το πρότυπο J2EE (ή μάλλον καλύτερα Java EE εφεξής) και ένα προφανές σημείο που υπολείπεται σε σχέση με άλλα προγραμματιστικά πρότυπα (όπως το Microsoft .NET) Δείγμα αυτού του προβληματισμού είναι η ύπαρξη πολλών πλαισίων ανάπτυξης που καταπιάνονται με αυτό το θέμα.

Δυο από τα επικρατέστερα, είναι το παλαιότερο Apache Struts καθώς και το νεώτερο Java Server Faces (JSF) Το μεν πρώτο φαίνεται να οπισθοχωρεί, παραχωρώντας τη θέση στο δεύτερο ή σε ενδιάμεσες λύσεις (πχ project Shale - http://shale.apache.org/) Το δε δεύτερο, μετά από πολλές συζητήσεις προσπαθεί να βρει το δρόμο του και να κερδίσει την αποδοχή της Java κοινότητας, αποτελώντας μέρος του προτύπου Java EE 1.5. Στο επόμενο χρονικό διάστημα αναμένεται να είναι αρκετοί αυτοί που θα προχωρήσουν στα νέα τους έργα σε επένδυση στο JSF, ενώ δεν θα λείπουν οι περιπτώσεις μεταφοράς μιας εφαρμογής από το Struts στο περιβάλλον του JSF, που προσφέρει τυποποίηση, ένα επεκτάσιμο πλαίσιο ανάπτυξης συστατικών στοιχείων (UI components) και χειρισμού της εφαρμογής (πχ υποστήριξη διαφορετικών συσκευών τελικού χρήστη) Ερευνώντας αυτό το ενδεχόμενο το τελευταίο διάστημα, έχω καταλήξει πως υπάρχουν κάποια βασικά, κοινά στοιχεία που μπορούν να βοηθήσουν την μετάπτωση, όπως:
  • Τα δυο πλαίσια ανάπτυξης ακολουθούν τις σχεδιαστικές επιταγές του Model View Controller, που απομονώνει τα δεδομένα από τον τρόπο παρουσίασής τους, ενώ ένα ενδιάμεσο συστατικό στοιχείο της αρχιτεκτονικής αναλαμβάνει την επικοινωνία μεταξύ τους (Controller)
  • Συνέπεια του προηγούμενου, είναι πως αρχιτεκτονικά παρουσιάζουν αρκετές ομοιότητες, για παράδειγμα με την ύπαρξη ενός Servlet που παραλαμβάνει τις αιτήσεις HTTP, ενός αρχείου XML που περιγράφει την μετάβαση μεταξύ των σελίδων, ένα κεντρικό αρχείο μηνυμάτων ανάλογα με το locale, κλπ
  • Την προσφορά ειδικών tags ώστε να δομηθεί μια σελίδα JSP

ενώ διαφοροποιούνται σημαντικά ως προς:
  • Την απεικόνιση, εσωτερική υλοποίηση και διαχείριση των στοιχείων που εισάγονται ή εμφανίζονται σε μια σελίδα (το Struts χρησιμοποιεί ειδικές κλάσεις που κληρονομούν από το (Dyn)ActionForm ενώ τα JSF απλά αντικείμενα Java (POJOs))
  • Τον μηχανισμό επικύρωσης (validation) των στοιχείων που έχει εισάγει ο χρήστης
  • Τη διαχείριση των γεγονότων (events) που συμβαίνουν σε μια σελίδα

Έχοντας όλα αυτά κατά νου, η μετάβαση μιας εφαρμογής Struts στο περιβάλλον JSF μπορεί, ανάλογα με την περίπτωση, να είναι μια εύκολη ή δύσκολη διαδικασία. Μια απλή, ενδεικτική μεθοδολογία μετάπτωσης, που θα μπορούσε να βοηθήσει στην εκτίμηση αυτού του κόστους, αποτελείται από τα ακόλουθα βήματα:
  1. Μετατροπή όλων των υφιστάμενων Struts Form Beans σε απλά POJOs (στην ουσία Value Objects). Σε περίπτωση που υπάρχουν διαδικασίες αρχικοποίησης (μέθοδος reset() του Struts) τότε προσθέστε τον κώδικά της στον constructor του αντίστοιχου POJO. Σε περίπτωση που χρησιμοποιείτε validators (μέθοδος validate()), τότε μπορείτε να την κρατήσετε στο POJO που μόλις δημιουργήσατε και να την καλέσετε από το Backing Bean που θα παραλάβει το γεγονός (βλέπε επόμενο βήμα)
  2. Μετατροπή όλων των Struts Actions σε απλά POJOs που θα περιλαμβάνουν μεθόδους που θα απευθύνονται στην διαχείριση του event που συνέβη Ας ονομάσουμε τα τελευταία ως εvent handling beans. Στην πραγματικότητα πρόκειται για αντιγραφή όλου του προηγούμενου κώδικα που βρισκόταν κάτω από την μέθοδο execute() σε μια ξεχωριστή μέθοδο του backing bean (πχ public String onSubmitClick()) Τα δεδομένα που έχουν εισαχθεί από τον χρήστη (τα Value objects του βήματος 1) θα μπορούν να γίνουν διαθέσιμα στα event handling beans διαμέσου της EL των JSF (ανατρέξτε στο άρθρο μου - JSF - Πρόσβαση στα Managed Beans)
  3. Δήλωση όλων των κλάσεων του βήματος 1) και 2) στο αρχείο faces-config.xml ως backing beans.
  4. Αντικατάσταση των Struts tags στις σελίδες, με τα τα κατάλληλα JSF tags. Για τους περισσότερους τύπους πεδίων δεν υπάρχει καμία ουσιαστικά διαφορά, ενώ για τη δημιουργία List Of Values (LOVs) θα πρέπει να ακολουθήσετε τις επιταγές των JSF και να κατασκευάσετε εσείς τις μεθόδους που θα τα γεμίζουν κατάλληλα. Τέλος, στα submit buttons, θα γίνει η κλήση διαμέσου EL, της κατάλληλης μεθόδου του event handling bean (πχ )

Εφαρμόζοντας τα προηγούμενα βήματα, θα πρότεινα ανεπιφύλακτα σε οποιονδήποτε ενδιαφέρεται για μια περίπτωση μετάπτωσης, να δοκιμάσει τη δοκιμαστική μεταφορά μιας σελίδας ή καλύτερα ενός use case Struts, στο περιβάλλον JSF, ώστε να αποτιμήσει το κόστος. Από τη δική μου εμπειρία, το συνεπαγόμενο κόστος είναι σχετικά μικρό, πράγμα που κάνει την απόπειρα μεταφοράς εξαιρετικά συμφέρουσα. Αλλά όπως ήδη είπαμε, αυτό ποικίλλει από περίπτωση σε περίπτωση.

No comments: