Φτάσαμε αισίως στο 4ο μέρος της σειράς μας για το Spring. Στο προηγούμενο κομμάτι του αφιερώματος μας είδαμε την αρχιτεκτονική του Spring MVC και τις δυνατότητες που προσφέρει το framework στον προγραμματιστή για να υλοποιήσει μία εφαρμογή στηριζόμενη σε αυτό το J2EE pattern.
Σto σημερινό μας άρθρο θα δούμε μια εξελιγμένη μεθοδολογία που εισήγαγε η ομάδα του Spring που απλοποιεί τη διαδικασία κατασκευής εφαρμογών MVC ιδιαίτερα εκείνες που απαιτούν πολύπλοκες αλληλουχίες φορμών όπως για παράδειγμα ένας wizard, ένα shopping cart κτλ. Η τεχνική αυτή είναι το Spring Webflow.
1. ΕΙΣΑΓΩΓΗ
Φτάσαμε αισίως στο 4ο μέρος της σειράς μας για το Spring. Στο προηγούμενο κομμάτι του αφιερώματος μας είδαμε την αρχιτεκτονική του Spring MVC και τις δυνατότητες που προσφέρει το framework στον προγραμματιστή για να υλοποιήσει μία εφαρμογή στηριζόμενη σε αυτό το J2EE pattern.
Σto σημερινό μας άρθρο θα δούμε μια εξελιγμένη μεθοδολογία που εισήγαγε η ομάδα του Spring που απλοποιεί τη διαδικασία κατασκευής εφαρμογών MVC ιδιαίτερα εκείνες που απαιτούν πολύπλοκες αλληλουχίες φορμών όπως για παράδειγμα ένας wizard, ένα shopping cart κτλ. Η τεχνική αυτή είναι το Spring Webflow.
2. ΤΙ ΕΙΝΑΙ ΤΟ SPRING WEBFLOW
Για να καταλάβουμε το Spring Webflow ας δούμε καταρχάς το κενό που πάει να καλύψει. Τα frameworks βασισμένα σε MVC τα χρησιμοποιούμε εδώ και πολλά χρόνια. Από τα πολλά πλεονεκτήματα που προσφέρουν, σε σύγκριση με την απλή χρήση servlets είναι ότι μας δίνουν τη δυνατότητα ελέγχου της ροής. Ένα τέτοιο απλό παράδειγμα ελέγχου πάνω στη ροή είναι η εμφάνιση μίας σελίδας για την επιτυχή εκτέλεση ενός request από κάποια φόρμα και μια άλλη σελίδα για την αποτυχημένη εκτέλεση.
Σαφώς όμως υπάρχουν και πιο σύνθετα παραδείγματα ροών από σελίδα σε σελίδα όπως για παράδειγμα ένας wizard που εκτείνεται σε πολλές σελίδες (αλληλουχίες σελίδων) και ο οποίος ενδεχόμενος να επαναχρησιμοποιείται σε διάφορα μέρη μίας εφαρμογής ώστε, για παράδειγμα, να δημιουργήσει μια σχέση μεταξύ δύο ή περισσοτέρων οντοτήτων στη βάση δεδομένων (ένα shopping cart πρέπει να συσχετίσει τα στοιχεία του βιβλίου, με τα στοιχεία παράδοσης κτλ.). Παρόλο που αυτά τα σενάρια μπορούν να εφαρμοστούν με οποιοδήποτε MVC framework, η κλασική προσέγγιση MVC έχει μια σειρά από μειονεκτήματα.
Ένα από τα ποιο σημαντικά είναι ότι δεν διαχειρίζονται αυτόματα την κατάσταση (state) των σελίδων που συνιστούν μία αλληλουχία. Aν ορίσουμε ως κατάσταση σελίδας το σύνολο των παραμέτρων με τις τιμές τους σε μία ορισμένη φάση, τότε καθώς μετακινούμαστε από σελίδα σε σελίδα στην αλληλουχία, θα πρέπει να έχουμε έναν κεντρικό τρόπο παρακολούθησης, διατήρησης ή και μεταβολής της κατάστασης καθώς πάμε από request σε request. Πχ. στη σελίδα 1 του wizard έχω ένα checkbox η τιμή του οποίου μπορεί να καθορίζει άλλες σελίδες ή και να αλλάζει η ίδια κάτω από ορισμένες προϋποθέσεις σε επόμενες σελίδες. Σε ένα κλασικό MVC θα πρέπει να γράφουμε κώδικα για κάθε τέτοια κατάσταση μέσα στους handlers ή στα actions αλλά προφανώς αυτό γίνεται αρκετά πολύπλοκο όταν σε ένα wizard πάμε μπρος και πίσω.
Αυτό ακριβώς το πρόβλημα έρχεται να επιλύσει το Spring Webflow. Πρόκειται για ένα extension του Spring MVC το οποίο δίνει την απάντηση στην περιορισμένες λειτουργικές δυνατότητες που υπάρχουν στη ροή από σελίδα σε σελίδα των κλασικών MVC framework καθώς είναι δυνατό με ένα τυποποιημένο τρόπο, να διαχειριζόμαστε κεντρικά τις καταστάσεις σελίδων και ανά πάσα στιγμή να είναι εύκολη η πρόσβαση στις τιμές των παραμέτρων οποιασδήποτε σελίδας (είτε από μία άλλη σελίδα ή ακόμη και προς εκτέλεση κάποιου κώδικα πχ. για εξαγωγή/καταχώρηση δεδομένων)
3. Η ΦΙΛΟΣΟΦΙΑ ΕΝΟΣ WEBFLOW
Η λογική του Webflow λέει ότι κάθε ροή σελίδων μπορεί να αναπαρασταθεί ως ένα απλό διάγραμμα ροής (τα γνωστά flowcharts) όπου το κάθε state (δηλαδή τα παραλληλόγραμμα ή οι ρόμβοι στο flowchart) είναι είτε μια οθόνη (ένα View ) ή η εκτέλεση κώδικα (ένα Action). Έτσι το Webflow διαχειρίζεται τη μετάβαση μεταξύ των states απαιτώντας ένα input από τις Actions ή τα Views (δηλαδή από τον χρήστη σε μία φόρμα) για να καθορίσει το επόμενο βήμα στην πορεία εκτέλεσης της ροής.
Για να καταλάβουμε καλύτερα τι σημαίνουν πρακτικά τα παραπάνω ας πάρουμε πάλι το παράδειγμα μιας σελίδας με μια φόρμα που με την υποβολή της θα οδηγούμαστε είτε σε μία σελίδα με ένα μήνυμα για την επιτυχή ολοκλήρωση ή μία σελίδα με ένα μήνυμα σφάλματος. Σε αυτή την περίπτωση υπάρχουν 4 διακριτά States:
- To Αρχικό state (Initial State) όπου ο χρήστης φορτώνει η σελίδα με τη φόρμα. Φορτώνει τη σελίδα και πιθανώς τη προ-συμπληρώνει με δεδομένα από τη βάση
- To state υποβολής (Submit State) όπου ο χρήστης υποβάλλει τη φόρμα. Εδώ γίνεται το validation των δεδομένων της φόρμας και από το αποτέλεσμα καθορίζεται ποιο θα είναι το επόμενο βήμα
- To state επιτυχούς υποβολής (Successful State). Εμφάνιση ενός μηνύματος στον χρήστη ότι όλα πήγαν καλά !
- To state ανεπιτυχούς υποβολής (Unsuccessful State). Εμφάνιση ενός μηνύματος στον χρήστη ότι κάτι πήγε στραβά !
Θα πρέπει να τονιστεί εδώ ότι παρόλο που όλα τα states μπορούν να αντιστοιχούν στην ίδια σελίδα (πχ. το μήνυμα λάθους μπορεί να εμφανίζεται πάνω στη φόρμα υποβολής), αυτό δε σημαίνει ότι αλληλεπικαλύπτονται. Αντίθετα ο συνδυασμός των παραγόντων μιας ροής σε κάθε στιγμή καθορίζει σε ποιο state είμαστε.
Είπαμε νωρίτερα ότι το Webflow είναι μία extension του Spring MVC. Όπως είχαμε δει στο 3ο μέρος του αφιερώματός μας, το MVC στηρίζεται στο Front Controller J2EE pattern. Αυτό συνεχίζει να ισχύει και στην περίπτωση αυτή. Ο front controller παραμένει o DispatcherServlet ο οπόιος όμως μεταβιβάζει το request, στην περίπτωση ενός webflow , στον εξειδικευμένο Controller που ονομάζεται FrontController. Αυτό φαίνεται διαγραμματικά ως εξής
Παρακάτω θα δούμε τι κρύβεται πίσω από τον Webflow Controller και πώς παραμετροποιείται.
4. ΑΠΟ ΤΗ ΘΕΩΡΙΑ ΣΤΗΝ ΠΡΑΞΗ
Είδαμε τη θεωρία του Webflow. Για να κατανοήσουμε όμως καλύτερα το Webflow ας δούμε ένα παράδειγμα. Ως μέρος μίας εφαρμογής διαχείρισης προσωπικού, θα πρέπει να φτιάξουμε μία διαδικασία για την εισαγωγή νέων υπαλλήλων. Μας έχει δοθεί ρητά η απαίτηση για κάθε κατηγορία στοιχείων (Προσωπικά στοιχεία, Μισθολόγιο, Ρόλος)να υπάρχει ξεχωριστή σελίδα και να μπορούν οι χείριστες να πλοηγούνται μπρος και πίσω από μία σελίδα σε μία άλλη. Το μαντέψατε σωστά: ένας wizard.
A. Στήσιμο Σκελετού Εφαρμογής
Για το στήσιμο της εφαρμογής θα χρησιμοποιήσω, όπως και στα προηγούμενα άρθρα, το Springsource Tool Suite (2.5.1). Ξεκινάμε λοιπόν το project μας από το MVC Template του Springsource Tool Suite (το άρθρο αναφέρεται σε template της συγκεκριμένης version. Σε προηγούμενες version υπήρχε Webflow Template με διαφορετική μορφή).
Αφού φτιάξουμε τα POJO Beans μας για την κάθε κατηγορία στοιχείων του υπαλλήλου (πχ τις class EmployeePersonalInfo, EmployeeSalary, EmployeeRole) και τις προσθέσουμε μέσα στο src/main/java είμαστε έτοιμοι για να προσθέσουμε τα κομμάτια για το webflow. Επίσης φτιάξτε μία class DataHandler με μία μέθοδο που θα καλούμε για να γίνεται καταχώρηση δεδομένων και βάλτε μία κενή μέθοδο public boolean addEmployee(EmployeePersonalInfo personalInfo, EmployeeSalary salary, EmployeeRole role).
Προσοχή: τα 3 POJOs πρέπει να είναι Serializable για να τα χρησιμοποίησουμε μέσα στο webflow.
B. Υποδομή για Webflows
Καταρχήν θα πρέπει να προετοιμάσουμε την MVC εφαρμογή μας να για να διαχειρίζεται webflows. Πάμε να δούμε αναλυτικά τα βήματα που απαιτούνται για αυτό.
- Βιβλιοθήκες: Προσθέτουμε το artefact του webflow στο pom.xml
[xml]
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
[/xml]
- Spring setup: Προσθήκες στο servlet-context.xml
Ας δηλώσουμε καταρχήν τον Controller (θυμίζουμε ότι το webflow είναι ένα MVC) ο οποίος μπορεί να χειριστεί όλα τα flows της εφαρμογής. Του περνάμε την παράμετρο flowExecutor που θα δούμε σε λίγο. Επίσης δηλώνουμε και ένα και έναν adapter που επιτρέπει τη δυνατότητα χρησιμοποίησης plain controllers δηλαδή του FlowController.
[xml]
<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
<!– Enables plain Controllers (e.g. FlowController) –>
< bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
[/xml]
Επίσης δηλώνουμε ποια URL θα γίνουν handled από τον Webflow Controller
[xml]
<!—Define the mappings for URLs corresponding to webflows –>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/employeewizard=flowController
</value>
</property>
<property name="alwaysUseFullPath" value="true"/>
</ bean>
[/xml]
Θέλουμε να χρησιμοποιήσουμε τον κλασικό viewResolver ώστε να κάνουμε το mapping των views που αναφέρονται στο webflow με τα αντίστοιχα jsp
[xml]
<!– Resolves view names to protected .jsp resources within the /WEB-INF directory –>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!– To use the already defined resolvers –>
<bean id="viewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers">
<list>
<ref bean="viewResolver"/>
</list>
</property>
</ bean>
[/xml]
Θα βάλουμε την παραμετροποίηση του webflow σε άλλο xml οπότε ας το συμπεριλάβουμε και αυτό:
[xml]
<beans:import resource="webflow.xml" />
[/xml]
Ας δηλώσουμε επίσης και τον DataHandler που θα τον χρειαστούμε για να αποθηκεύουμε δεδομένα
[xml]
< bean id="dataHandler" class="gr.zenika.web.app.example.webflow.DataHandler">
[/xml]
- Ειδικές παράμετροι για το webflow: Προσθήκη αρχείου webflow.xml
Ξεκινάμε τώρα να ορίζουμε τους παραμέτρους του webflow
A) Τον flowExecutor που είναι ουσιαστικά η πύλη για τον κόσμο του web flow.
B) To flow-Registry δηλαδή ένα registry των flows που έχουμε. Εκεί ορίζουμε και το path των αρχείων webflow
Γ) Ένα builder-Services που παραμετροποιεί περαιτέρω το σύστημα και συνδέοντάς το με το ViewResolver που είδαμε πριν ουσιαστικά συνδέει τα states του flow με τις αντίστοιχες jsp
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:webflow="http://www.springframework.org/schema/webflow-config"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/webflow-config
http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
<!– Configures the engine that executes web flows in this application –>
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry" />
<!– Registers the web flows that can be executed –>
<webflow:flow-registry id="flowRegistry" base-path="/WEB-INF/flows" flow-builder-services="flowBuilderServices">
<!– Register all flow definitions within the /WEB-INF directory ending in "-flow.xml" –>
<webflow:flow-location-pattern value="**/*.xml" />
</webflow:flow-registry>
<!– Configures settings used to build web flow definitions; development=true enables flow definition refresh on change –>
<webflow:flow-builder-services id="flowBuilderServices" development="true" view-factory-creator="viewFactoryCreator" />
</beans>
[/xml]
Εδώ ολοκληρώνεται η υποδομή για τα webflows. Αξίζει να δούμε σε αυτό το σημείο διαγραμματικά πώς θα γίνεται η επεξεργασία των requests. Αυτό το βλέπουμε από τον Spring Explorer του STS
Γ. Φτιάχνοντας ένα flow
Πάμε τώρα να δούμε πώς φτιάχνεται ένα flow. Καταρχήν το XML αρχείο μέσα στο οποίο ορίζουμε το flow θα πρέπει να βρίσκεται μέσα στο φάκελο WEB-INF/flows (έτσι τον δηλώσαμε ποιο πάνω) και το ποιο σημαντικό να έχει όνομα αρχείου employeewizard.xml δηλαδή το όνομα που κάναμε assigned στον flowController ποιο πάνω.
Ας το δούμε αναλυτικά λοιπόν:
Δηλώνουμε καταρχήν τα beans που θα κρατάνε τις μεταβλητές από τις jsp’s
[xml]
<var name="personalinfo" class="gr.zenika.web.app.example.webflow.beans.EmployeePersonal"/>
<var name="salary" class="gr.zenika.web.app.example.webflow.beans.EmployeeSalary"/>
<var name="role" class="gr.zenika.web.app.example.webflow.beans.EmployeeRole"/>
[/xml]
Το αρχείο διαβάζεται σειριακά και έτσι όποιο view είναι πρώτο καθιστάτε ως η πρώτη σελίδα του flow. Οπότε αν θέλουμε o wizard να ξεκινάει με την employeepersonal βάζουμε αυτό το view πρώτο (θα πρέπει να έχουμε αντίστοιχη employeepersonal.jsp στο WEB-INF/views/employeepersonal.jsp ή να δηλώσουμε ποιο είναι το view με την παράμετρο view=”myjsp.jsp”). Επίσης δηλώνουμε ποιο είναι το bean που κάθεται πίσω από τη σελίδα.
[xml]
<view-state id="employeepersonal" model="personalinfo">
[/xml]
Δηλώνουμε τι θα κάνει αν λάβει εντολή για να κάνει transition.Εδώ αναμένει να δει στο request μία παράμετρο που ονομάζεται _eventId. Αυτή θα πρέπει να τη δηλώσουμε σε κάθε jsp του flow για παράδειγμα ως:
[html]
<input type="hidden" neme="_eventId" value="proceedToSalary">
[/html]
Αν αυτή έχει την τιμή proceedToSalary, όπως παραπάνω, τότε προχωράει στην employeesalary.
Έτσι έχουμε:
[xml]
<view-state id="employeepersonal" model="personalinfo">
<transition on="proceedToSalary" to="employeesalary" history="preserve"/>
</view-state>
[/xml]
Αντίστοιχα φτιάχνουμε και τα επόμενα 2 βήματα
[xml]
<view-state id="employeesalary" model="salary">
<transition on="proceedToRole" to="employeerole" history="preserve" />
</view-state>
<view-state id="employeerole" model="role">
<transition on="proceedToSave" to="employeesave" history="preserve" />
</view-state>
[/xml]
Τέλος κατασκευάζουμε το τέταρτο και τελικό βήμα πού θέλουμε να εμφανιστεί μετά την ολική επεξεργασία όλων των δεδομένων.
[xml]
<view-state id="employeesave" >
<on-entry>
<evaluate expression="dataHandler.addEmployee(personalinfo, salary, role)" result="flowScope.isSuccessful" />
</on-entry>
</view-state>
[/xml]
Παρατηρήστε το on-entry το οποίο χρησιμοποιείται για να τρέξει μία μέθοδος του dataHandler μας και να επιστρέψει true αν ήταν επιτυχής η καταχώρηση ή false αν δεν ήταν. Αυτό γίνεται assigned σε μία variable isSuccessful που έχει scοpe μόνο μέσα στο flow.
Το ποιο σημαντικό σημείο εδώ είναι ότι όλες οι μεταβλητες του flow είναι ταυτόχρονα και implicit variables προσβάσιμες από το jsp. Πχ ${personalinfo.Name} για να δείξουμε το όνομα του υπαλλήλου.
Έτσι έχουμε για το αρχείο αυτό συνολικά:
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<var name="personalinfo" class="gr.zenika.web.app.example.webflow.beans.EmployeePersonal"/>
<var name="salary" class="gr.zenika.web.app.example.webflow.beans.EmployeeSalary"/>
<var name="role" class="gr.zenika.web.app.example.webflow.beans.EmployeeRole"/>
<view-state id="employeepersonal" model="personalinfo">
<transition on="proceedToSalary" to="employeesalary" history="preserve"/>
</view-state>
<view-state id="employeesalary" redirect="false" popup="false" model="salary">
<transition on="proceedToRole" to="employeerole" history="preserve" />
</view-state>
<view-state id="employeerole" redirect="false" popup="false" model="role">
<transition on="proceedToSave" to="employeesave" history="preserve" />
</view-state>
<view-state id="employeesave" redirect="false" popup="false">
<on-entry>
<evaluate expression="dataHandler.showEmployee(personalinfo, salary, role)" result="flowScope.isSuccessful" />
</on-entry>
</view-state>
</flow>
[/xml]
Το παραπάνω flow μπορούμε να το απεικονίσουμε διαγραμματικά με τη βοήθεια του STS σας flowchart πάλι από το Spring Explorer
Παρατηρήστε ότι το STS μας δίνει τη δυνατότητα να κατασκευάσουμε αυτό το flow σχεδιαστικά !!!
Δ. Συμπληρώνοντας τα υπόλοιπα κομμάτια
Μας μένει τώρα να φτιάξουμε τα jsp τα οποία θα πρέπει
1) Να έχουν την ίδια ονομασία με τα view-state που ορίσαμε ποιο πάνω μέσα στο WEB-INF/views (αφου εκεί ορίζει ο viewResolver μας) δηλαδή employeepersonal.jsp, employeesalary.jsp, employeerole.jsp, employeesave.jsp
2) Να χρησιμοποιούν τα implicit variables που έχουμε ορίσει στο employeewizard.xml που είναι personalinfo, salary, role, isSuccessful
3) Να έχουμε beans και jsp με properties και input names που να έχουν ίδια ονόματα
[java]
package gr.zenika.web.app.example.webflow.beans;
import java.io.Serializable;
public class EmployeePersonal implements Serializable{
private static final long serialVersionUID = 1L;
private String employeeName;
private String dob;
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
}
[/java]
και το αντίστοιχο jsp είναι το employeepersonal.jsp
[html]
<%@ page language="java" contentType="text/html; charset=ISO-8859-7" pageEncoding="ISO-8859-7"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>
ΠΡΟΣΩΠΙΚΑ ΔΕΔΟΜΕΝΑ
</h1>
<form action="employeewizard" method="post">
Όνομα: <input name="employeeName" value="${personalinfo.employeeName}" /><br/>
Ημ. Γεννησης: <input name="dob" value="${personalinfo.dob}" />
<BR>
<input type="Submit" value="Βήμα 2: Μισθός"/>
<input type="Submit" value="Έξοδος"/>
<input type="hidden" name="_eventId" value="proceedToSalary" />
</form>
</body>
</html>
[/html]
Ε. Έτοιμοι για δοκιμή
Σηκώνουμε το project στον TC server (ή σε άλλον της αρεσκείας μας) πηγαίνοντας απευθείας στο URL http://localhost:8080/WebflowExample/employeewizard
Αν όλα δούλεψαν ΟΚ πρέπει να βλέπουμε κάτι σαν το παρακάτω
ΣΤ. Βάζοντας επιπλέον δυνατότητες
Τώρα που έχουμε μία ροή που τρέχει μπορούμε να προσθέσουμε και τα ακόλουθα
- Ένα view employeecancel στο οποίο θα μπορούν να πηγαίνουν όλα τα βήματα του wizard πατώνταςτο κουμπί “Ακύρωση” και πηγαίνοντας με _event_id=”proceedToCancel”
- Δυνατότητα να πηγαίνουμε από οποιοδήποτε βήμα σε ένα άλλο εκτός από το Βημα 4 δηλαδή την καταχώρηση (αυτόι να παραμένει ως δυνατότητα μόνο για το Βήμα 3). Πάλι μετο_event_id βλέπουμε σε ποιο view θα πάει. Αν έχουμε ήδη πάει στο βήμα αυτό τα στοιχεία που συμπληρώσαμε θα εμφανιστούν αν έχουμε βάλει το implicit parameter μέσα στο value του πεδίου πχ
[html]
<input name=”employeeName” value=”${personalinfo.employeeName}” />
[/html]
4. ΣΥΜΠΕΡΑΣΜΑΤΙΚΑ
Σε αυτό το άρθρο παρέθεσα τις γενικές έννοιες του Spring Webflow και, μέσα από το παράδειγμά μας, προσπάθησα να αποτυπώσω κάποιες τεχνικές λεπτομέρειες της τεχνολογίας αυτής. Υπάρχουν βέβαια πολύ περισσότερες δυνατότητες και αξίζει να αφιερώσετε περισσότερο χρόνο διαβάζοντας σχετικά με αυτήν και πειραματιστείτε.
Για μένα η πραγματική δύναμη του Spring Webflow κρύβεται στο γεγονός ότι μπορώ να ξαναχρησιμοποιήσω τα flows που έχω φτιάξει, είτε στην ίδια εφαρμογή είτε σε άλλες, με μία τυποποιημένη διαδικασία η οποία τελικά μειώνει το χρόνο δημιουργία πολύπλοκων αλληλουχιών από φόρμες όπως αυτή των wizards, ερωτηματολογίων κτλ. Και το κερασάκι στην τούρτα είναι ότι τα definitions των flows μπορώ να τα παράγω σχεδιαστικά μέσα από το STS, κρατώντας μία πλήρη εικόνα της αρχιτεκτονικής τους και χωρίς να γράψω γραμμή XML κώδικα !
Κλείνωντας να προσθέσω ότι αν θέλουμε οπωσδήποτε να χρησιμοποιήσουμε και άλλες μεθοδολογίες στην εφαρμογή μας πχ. το Spring MVC, το JSF, το Struts, το ΖΚ και άλλα, το Webflow ενσωματώνεται πανεύκολα με αυτά.
Περιμένω τα σχόλιά σας αφού το χρησιμοποιήσετε.
5. REFERENCES
- Η homepage του Spring Webflow
- Το επίσημο (και εξαιρετικά περιεκτικό) documentation
- Εξαιρετικό tutorial στο Java Beat