Thursday, June 28, 2007

Πρώτες εντυπώσεις από το JBoss Seam

Μέρος της δουλειάς πολλών είναι να προσπαθούν να δουν αν νέα framework και λύσεις μπορέι να χρησιμοποιηθούν σε ένα production - project. Να σας πω την αλήθεια ακόμα δεν έχω ιδέα αν το Seam είναι έτοιμο για ένα production και αν πραγματικά μπορείς να το πάρεις και να το σκίσεις με άλλα λόγια να για να καλύψει τις ανάγκες σου. Ο G.King είναι πραγματικά λαμπρό μυαλό και αρκετά έξυπνος για να καταλάβει που χωλαίνει μεγάλο μέρος του Enterprise Java Development. Μας έδωσε το Hibernate το οποίο άλλαξε για πάντα τον κόσμο του Database Access, τελικά έγινε και Spec και το EJB3 spec δανείστηκε αρκετά κομμάτια του. Στην συνέχεια προχώρησε με το JBoss Seam, σε έναν κόσμο που πολλές Java Enterprise εφαρμογές είναι είτε γραμμένες με απλά JSP/ Servlet ή με το Struts προτείνει έναν μηχανισμό ένα framework το οποίο έρχεται να δανειστεί χαρακτηριστικά από
Είμαι απο αυτούς που για καιρό όταν λέμε web layer το πρώτο πράγμα που έρχεται στο μυαλο ειναι το Struts. Αν μάθεις την λογική του ξεκινάς ακόμα και στο μυαλό σου να φαντάζεσαι την δομή του project σου τα actions σου τα πάντα. Η δυσκολία με το JSF όταν ήρθε στην ζωή μας ήταν ότι η λογική του ήταν αρκετά μακριά απο αυτή που μας έχει μάθει το ΠΟΛΥ ΑΞΙΟΛΟΓΟ Struts, βάλε και μερικές άλλες προχειρότητες γενικά - ο κόσμος ξεκίνησε να γκρινιάζει!

To Seam έρχεται να μα δώσει μια ελαφρώς πιο ευγενική προσέγγιση στο JSF, να μας παρέχει τα αυτοματοποιημένα εργαλεία του Ruby On Rails, την δύναμη και την απλότητα των EJBb3, την λογική σε γενικές γραμμές του Struts (γενικά λέμε), πλήθος απο tag libraries , τα facelets και την υποστήριξη by default γνωστών εργαλείων όπως το Eclipse και το Netbeans.

Αυτά που μου αρέσουν για την ώρα είναι τα εξής!

1) άριστο integration με EJB3 ακόμα και στο web layer (το ξέρω σας τα έχω πρήξει με αυτό - αλλά το θεωρώ τόσο σημαντικό)
2) Η λογική του Struts και γενικότερα του Action δεν ειναι τόσο διαφορετική σε γενικές γραμμες - πράγμα που κάνει εναν οποιονδήποτε Struts developer να νιώσει σχετικά comfortable.(ο G.King έλεγε γελώντας στο Session του στο JavaONE, ναι λέει ξέρω ότι εδω μέσα οι πιο πολλοι , αν δεν σας αναφέρω την λέξη Action στο web layer θα πάθετε κάτι, οπότε επειδή ο κόσμος αυτό καταλαβαίνει - αποφασίσαμε να προσθέσουμε στο Seam αυτο τόν όρο). Ο ίδιος μπορεί να μην το θεωρούσε σημαντικό αλλά για το δικό μου μυαλό αυτό ηταν ένα πολυ σημαντικό πράγμα. Εξάλλου το Struts δεν ήταν ένα κακό web framework- νομίζω ότι το γεγονός ότι πολλά πράγματα τα οποία έκανε το Struts γίνονται και στα νέα framework- δεν είναι τυχαίο!

3) Η ενσωμάτωση της τεχνολογίας Facelets και η χρήση της XHMTL πραγματικά ειναι αρκετα καλή! Ως Struts developer μου αρέσει εξαιρετικά το tiles framework με χαρά είδα ότι η αντίστοιχη λογική υπάρχει και στα facelets (δες template.xhtml).

4)Το Seam-gen ειναι πολυ ευκολο και μέσα σε λίγα δευτερόλεπτα σου δημιουργεί όλο τοproject και μάλιστα μπορείς να το κάνεις export σε project του Eclipse η του Netbeans

5) Ο μηχανισμός του bijection, φαντάζει αρκετά χρήσιμος - αν και στην αρχή μπορεί να φανεί περίεργος - για το πως μπορουν να σεταρουν τα διαφορετικά layer data το ενα στο αλλο αυτόματα - χωρίς ιδιαίτερο κόπο απο τον προγραμματιστή.

6) Facelets ξανά και XHTML πραγματικά πολυ πιο καθαρή κατάσταση!

7) Τα navigation rules ειναι αρκετά πιο φιλικά απο τον συνδιασμό struts-config , tiles-defs .

8) Απλοϊκό project structure - poly straight forward!

9) Αυτόματη δημιουργία απο τα seam εργαλεία - κώδικα για testing η αυτόματη δημιουργία της υποδομής για CRUD operations.Παίρνει τα entity beans και δημιουργεί όλη την υποδομή για απλά Create, Retrieve Update Delete. Πίστεψε με θα πεις οκ, σιγά και τι έγινε..αλλά απο το να γράφεις μόνος σου πραγματικά έχεις κάτι να αρχήσει- άσε που μπορείς να τα αλλάξεις πιο εύκολα!

Τώρα που είπα CRUD αν χρησιμοποιείς Struts τότε ένας έλληνας και παλιός μου συνάδελφος έχει φιάξει κάτι αρκετά αξιόλογο και παρόμοιας φιλοσοφίας - το Project ονομάζεται MD4j και χρησιμοποιεί το Struts και EJB2.x τεχνολογιία. Με παρόμοιας λογική όπως τα εργαλεία του Seam, αυτοματοποιεί την δημιουργία του project - δημιουργεί σελίδες και ολες τις απαραίτητες υποδομές για CRUD operations - απλά και εύκολα - αρκετά αξιόλογη προσπάθεια και νομίζω ότι για όσους επιμένουν στο παλιό καλό Struts ειναι πραγματικό boost παραγωγικότητας. Μπορείς να το βρείς εδώ.

Είμαι σχεδόν στα μέσα του JBoss Seam : Simplicity and Power beyond Java EE , το οποίο σας το προτείνω ανεπιφύλακτα αν θέλετε να κάνετε μια εισαγωγή ουσιαστική στο seam. Να μην ξεχάσω να τονίσω ότι ο συγγραφέας έχει κάνει αρκετά καλή δουλειά με τα online παραδείγματα - που είναι ολα έτοιμα projects για το IDE σας (στην περίπτωση μου το Netbeans). Το μόνο που πρέπει να κάνετε όταν ξε-ziparete τα folders ειναι να δηλώσετε το JBoss_HOME για τον Jboss με EJb3 support. Τα υπόλοιπα τα αναλαμβάνει το Ant.

Θα επανέλθω με μερικούς πειραματισμούς με το Seam σύντομα!


5 comments:

  1. Υπόψην ότι στο MD4J θα προστεθούν generators για Struts 2 και EJB 3. Δέν είναι πολύ δουλεία να γίνει κάτι τέτοιο, και θα βοηθούσε πολύ αν κάποιος έδινε σαν παράδειγμα τις αντίστοιχες Java classes του tutorial [1] σε Struts 2 ή/και EJB 3.

    [1] http://dev.abiss.gr/md4j/tutorial-with-maven.html

    ReplyDelete
  2. Το Seam φαίνεται όντως πολύ καλό...

    αλλά αφού το project σου είναι στη μέση και μία τέτοια αλλαγή θα ήταν μεγάλη γιατί δεν χρησιμοποιείς το Guice. Αν θυμάμαι καλά χρησιμοποιείς το guice για να κάνεις το injection στα action σου...

    Δες com.google.inject.jndi.JndiIntegration και την αναφορά στο JNDI στο manual του Guice.

    ReplyDelete
  3. οχι δεν το χρησιμοποιώ ..κάνω plain JNDI calls..άντε ενας dummy service locator..

    αλλα πραγματικά είναι σπαστικό!

    ReplyDelete
  4. Το Struts2, έχει ένα plug-in interface το οποίο λέγεται ObjectFactory και είναι υπεύθυνο για την δημιουργία όλων των αντικειμένων του Struts. Το ObjectFactory συνήθως είναι ένας IOC container όπως το Spring, Guice, Plexus, κτλ. Είχα την εντύπωση ότι σε είχα ρωτήσει στο παρελθόν αν χρησιμοποιείς το Spring και μου είχες πει ότι χρησιμοποιείς το Guice.

    Αν χρησιμοποιείς το Guice, παρακάτω θα προσπαθήσω να περιγράψω τι πρέπει να κάνεις για να έχεις DI (field, setter ή contructor) των EJB(3) στα Áction σου.

    Στόχος είναι να μπορείς να γράφεις:

    class MyAction {

    @Inject MyEJB businessLogic;

    public void execute() {
    businessLogic.doDirtyThings();
    }
    }

    Λοιπόν

    1) Χρησιμοποιείς το guice-struts2-plugin

    2) Στο struts.xml όρίζεις ότι χρησιμοποιείς το guice

    <constant name="struts.objectFactory" value="guice"/>

    και λες στο guice να χρησιμοποιήσει και το MyCoolEJBs module

    <constant name="guice.module" value="mypackage.MyCoolEJBs"/>

    3) Ορίζεις το MyCoolEJBs module

    class MyCoolEJBs implements Module {
    public void configure(Binder binder) {
    // use the binder to bind all your ejbs
    binder.bind(MyEJB.class)
    .toProvider(JndiIntegration.fromJndi(MyEJB.class. "the jnbi name"));
    }
    }

    Βασικά δεν τα θυμάμαι καλά τα EJBs (τόσο καιρό με το Spring :-)), και μολις θυμήθηκα ότι από το JNDI παίρνεις το EJBHome και όχι το EJB :-( Οπότε όπαραπάνω κώδικάς δεν κάνει αυτό που θέλεις (τον αφίνω για να δεις πως δουλεύουν τα guice modules) και θα πρέπει να γράψεις δικό σου guice Provider (δεν σου κάνει ο JnidiIntegration). Δες το πάραδειγμά του JNDI στο User's Guide του Guice kai δες και το Dynamic Delegate για μία γενική (factory based) λύση με dynamic proxies (WARNING δεν το έχω τεστάρει πολύ γιατί όταν το έγραψα είχα μετακομίσει από τα EJBs).

    Ακόμα αν χρησιμοποιείς κάποιο συγκεκριμένο name convention για τα JNDI names (δεν ξέρω έδω τι κάνει το EJB3) θα μπορούσες στο Provider που θα γράψεις από το EJB interface short name να βρεις το JNDI name και να αποφύγεις να το δηλώνεις συνέχεια στα bindings.

    Ελπίζω να βοήθησα λίγο.

    ReplyDelete
  5. Μόλις είδα ότι στα EJB3 τα Home interfaces είναι προαιρετικά και άρα το παράδειγμα που έγραψα (με το JndiIntegration) είναι ΟΚ.

    Καλημέρα :-)

    ReplyDelete