SWF allows you to make calls against service beans using an expression language (EL). You can use either Unified EL or else OGNL for that, as mentioned earlier in the article. We happen to be using OGNL though I understand that Unified EL and OGNL are mostly the same, at least where their core syntax is concerned.
There are various places in your flow where you might want to invoke service beans, and SWF provides various mechanisms for doing that. Here's a table showing how to call services from different locations in your flow definition file:
| Location | How to call the service bean |
|---|---|
| On flow start | /flow/on-start element |
| On state entry | /flow/view-state/on-entry element |
| Immediately before rendering a view | /flow/view-state/on-render element |
| On state exit | /flow/view-state/on-exit element |
| On state transition | /flow/view-state/transition/evaluate element |
| On flow end | /flow/on-end element |
Note that the above does not represent a 100% complete list of places where you can use EL, but it gives you most of the major cases and also the basic idea.
In checkout.xml we've used a number of the methods
above. For example, we use <on-start> to grab the
product catalog and shipping options from the cart service and place
them on the flow scope, which allows them to be used for the duration
of the flow. The value attribute on the set
element is specified using EL. (It looks a lot like JSP EL, if you
are familiar with that.) The cartService bean is
available because we defined a Spring bean with that ID.
We also use <on-render> to prepare the
viewCart state for rendering. In this case, we place the
user's shopping cart on the request scope so the JSP can easily
reference it, and we also pull some recommendations off of the cart
service and place those on the request scope as well. Once again the
value attribute is specified using EL.
At the end of checkout.xml, you will see that I've
defined a <global-transitions> element. This
allows me to define a transition that applies to all states in the
flow. In this case, any time the user raises the
cancelCheckout event, the global transition I've defined
will kick in and carry the user to the shop state.
Pretty handy for transitions that occur in multiple places throughout
the flow.
That concludes this tutorial on Spring Web Flow 2.0. We've really only scratched the surface—for instance, we haven't even touched the new AJAX support that SWF 2.0 introduces—but this should give you an overall feel for how things work. The SWF 2.0 distribution comes with a hotel booking sample application that shows you how to get SWF working with form validation and persistence as well (areas I've suppressed in this article so that I could focus on flow definition).
If you have suggestions and especially corrections to the article or the code, please leave them below. SWF 2.0 is new so I have no doubt that you will be able to show me places where I could be doing something better. Thanks!
A Maven version of the
download is available. The target link is in Spanish but there's a zip file at
the bottom called WebFlowExample.zip that you can download. If
you want to read the target link in English, you can use
Alta Vista's free Babel
Fish translation service.