loading table of contents...

4.3.7. Integrating with Spring Web Flows

Spring Web Flow is a framework for building complex form based web applications. Since it is based on Spring MVC, it can be easily integrated into any existing CAE web application.

CoreMedia provides an integration for merging Web Flows into a content based CAE application: a typical page that is delivered by a CAE application is composed of several hierarchical structured content beans, each of them representing a certain fragment of the page. Typically, a (Web Flow) form application should be embedded in a page as a fragment only.

In other words: Spring Web Flow result beans need to be merged into the CAE bean model.

Embedding Web Flows

First of all, creating web flows for the CAE does not differ from creating "standard" web flows: writing flow definitions, form beans etc. is exactly the same in the CAE.

The main difference lies in the way the flow execution is controlled: The standard org.springframework.webflow.mvc.servlet.FlowController takes over the control of the request including the rendering of the model. It uses an org.springframework.webflow.context.servlet.FlowUrlHandler for building and parsing adequate URLs pointing to this controller.

The CAE integration works in a slightly different way: the request can be still controlled by a custom controller which builds its ModelAndView traditionally. After that, it temporarily delegates the request to the Web Flow engine (by invoking FlowRunner#run). This runner executes the Web Flow logic and returns an enriched model consisting of the original model merged with the Web Flow model, a form and binding results, for instance. This merged model can be passed to the view rendering process (for instance the templates) that render the entire page containing the fragment with the flow results.

Example

A typical handler/controller method may look like this:

// step#1: build content model
ModelAndView modelAndView = ...;

// step#2: fetch flow id similar to
// FlowUrlHandler#getFlowId(HttpServletRequest)
String flowId = ...;

// step#3: run flow and enrich model
ModelAndView mergedModelAndView = flowRunner.run(
        flowId,
        modelAndView,
        request,
        response);

// step#4: pass merged model to rendering engine.
// Note, that it might be null in case that webflow has handled
// the response directly, e.g. by sending a 302 redirect
return mergedModelAndView;

Configuration

In order to use the Web Flow integration, the artifact dependency coremedia-webflow as well as a Spring bean configuration <import resource="classpath:/com/coremedia/cae/webflow/webflow-services.xml"/> must be added to the application. The latter contains CAE specific web flow infrastructure setup as well as the bean flowRunner. This bean can be used by custom handler in the way described above.

Finally, custom flow definitions still need to be registered:

<webflow:flow-registry id="flowRegistry"
                       flow-builder-services="flowBuilderServices">
  <webflow:flow-location-pattern
         value="classpath:/com/mycompany/**/*-flow.xml" />
</webflow:flow-registry>