Framework zur Ablaufdefinition innerhalb von Webanwendungen

Spring Web Flow

Markus Stäuble

Eine herkömmliche Webanwendung besteht meist aus mehr als nur einer Seite und einem Geschäftsvorfall. Um mit dem statuslosen HTTP-Protokoll auch die Datenseiten übergreifend griffbereit zu haben, neigt der Entwickler oft zur Verwendung des vorhandenen Sessionobjekts. Probleme entstehen dann dadurch, dass bei mehreren Geschäftsvorfällen auch eine Eindeutigkeit sichergestellt werden muss.

Zur Speicherung der Daten innerhalb der Webanwendungen werden dem Entwickler durch die Servlet-Spezifikation nicht besonders viele Möglichkeiten an die Hand gegeben. Zum einen steht der sehr feingranulare Requestscope zur Verfügung. Zum anderen gibt es den grobgranularen Sessionscope. Bei der Speicherung der Session kommt es dann sehr schnell zu Problemen der Eindeutigkeit – wie gewährleistet man, dass ein Benutzer einen bestimmen Ablauf auch zweimal parallel starten kann? Außerdem müssen die Daten nach dem Ende eines solchen Ablaufs wieder gelöscht werden, sonst kommt es zu einem erhöhten Speicherverbrauch. Außerdem wird in der Anwendungsentwicklung auf Basis von Geschäftsvorfällen entwickelt, anstatt gespeichert. Dieses Problem wird von Spring Web Flow adressiert, der Entwickler erhält den Scope der Conversation, in Spring Web Flow auch Flow genannt.

Den Grundstein gelegt

Bevor anhand eines Beispiels die Konzepte von Spring Web Flow aufgezeigt werden, hier erst einmal einige Grundlagen.
Ein (Web) Flow ist als eine Sammlung von Zuständen definiert. Für einen Überblick sind in Tabelle 1 die möglichen Zustände von Spring Web Flow kurz aufgeführt und erläutert.

Tabelle 1: Mögliche Zustände innerhalb eines Flows
Name des Zustandes Beschreibung
Action State Ausgangspunkt zur Ausführung von Applikationscode – typischerweise findet hier eine Delegation zu einem Dienst statt
Decision State Auswertung einer Bedingung, um eine Überleitung zu einem Status anzuleiten
End State Beendet einen Flow und räumt alle Ressourcen auf, die in dem Flow allokiert wurden. Nach dem Erreichen dieser Zustände kann im Flow nicht mehr zurückgegangen werden. Es ist nur ein komplett neuer Flow möglich.
Subflow Mittels eines Subflow wird ein neuer Flow innerhalb des Elternflows gestartet. Der Elternflow wird solange angehalten, bis der Subflow einen End State erreicht. Der Subflow ist somit ein Strukturierungsmittel innerhalb einer Flowdefinition. Auch die Wiederverwendung von Flows kann mit Subflows erhöht werden.
View State Mit einem View State ist auch immer eine Aktion des Benutzers verbunden. Durch die dargestellte View wird der Benutzer in den Flow mit eingebunden.

Die Übergänge zwischen den einzelnen Zuständen werden durch eine Transition (z.B. <transition on=“cancel“ to “end-state“ />) initiiert. Neben dem bereits in der Tabelle aufgeführten Action State gibt es weitere Möglichkeiten zur Ausführung von Aktionen innerhalb des Lebenszyklus eines Flows, nämlich folgende Punkte:

  • Starten eines Flows (Definition über start-actions)
  • Beenden eines Flows (Definition über end-actions)
  • Betreten eines Status (Definition über entry-actions)
  • Beenden eines Status (Definition über exit-actions)
  • Vor der Überleitung in einen anderen Status (Definition innerhalb von transition)
Setup

Für das Beispiel wird das Spring Framework in der Version 2.0.4 (Spring Web Flow 1.x benötigt mindestens Spring in der Version 1.2.7) und Spring Web Flow in der aktuellen Version 1.0.4 verwendet. In der Webapplikation werden auf alle Fälle folgende Bibliotheken benötigt:

  • spring.jar
  • commons-logging.jar
  • spring-binding.jar
  • spring-webflow.jar
  • ognl.jar

Für den schnellen Start mit Spring Web Flow ist es zu empfehlen, eines der in der Spring-Web-Flow-Distribution mitgelieferten Beispiele als Basis für erste eigene Gehversuche zu verwenden. Sie enthalten auch Ant-Skripte, bei denen die abhängigen Bibliotheken durch Ivy automatisch heruntergeladen und installiert werden. Auch die praktische Einführung von Erwin Vervaet [2] ist ein guter Reiseführer für Spring Web Flow.

Geschrieben von
Markus Stäuble
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.