From 8f0e8daca006433943c6c620a6c5b0a7b3555f12 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Mon, 10 Mar 2008 03:32:14 +0000 Subject: [PATCH] reference manual updates --- .../docs/reference/src/defining-flows.xml | 60 + .../docs/reference/src/flow-definition.xml | 2462 ----------------- .../src/flow-execution-repository.xml | 247 -- .../docs/reference/src/flow-execution.xml | 673 ----- .../docs/reference/src/flow-executor.xml | 230 -- .../src/images/actionadapter-classdiagram.png | Bin 3361 -> 0 bytes .../src/images/actionstate-classdiagram.jpg | Bin 27211 -> 0 bytes .../src/images/architecture-layer-diagram.png | Bin 20834 -> 0 bytes .../docs/reference/src/images/flow-search.png | Bin 4908 -> 0 bytes .../images/flowdefinition-classdiagram.png | Bin 68013 -> 0 bytes .../src/images/flowexecution-classdiagram.png | Bin 2631 -> 0 bytes .../src/images/flowexecution-persistence.png | Bin 6605 -> 0 bytes .../src/images/flowexecution-restoration.png | Bin 9682 -> 0 bytes .../src/images/flowexecution-sessionstack.png | Bin 12914 -> 0 bytes .../src/images/flowexecution-statediagram.png | Bin 5046 -> 0 bytes .../flowexecutorfacade-classdiagram.png | Bin 5437 -> 0 bytes .../images/globaltransitions-statediagram.png | Bin 3315 -> 0 bytes .../src/images/hotels-site-bookhotel-flow.png | Bin 0 -> 14050 bytes .../docs/reference/src/images/hotels-site.png | Bin 0 -> 12411 bytes .../reference/src/images/junit-greenbar.png | Bin 6236 -> 0 bytes .../reference/src/images/logo-ervacon.png | Bin 2777 -> 0 bytes .../reference/src/images/logo-interface21.png | Bin 14330 -> 0 bytes .../src/images/sellitem-configuration.png | Bin 20855 -> 0 bytes .../src/images/subflowstate-classdiagram.png | Bin 3109 -> 0 bytes .../src/images/swf-highlevelarchitecture.png | Bin 5653 -> 0 bytes .../src/images/transition-statediagram.jpg | Bin 42018 -> 0 bytes .../src/images/viewstate-classdiagram.png | Bin 7882 -> 0 bytes spring-webflow/docs/reference/src/index.xml | 17 +- .../docs/reference/src/overview.xml | 628 +---- .../docs/reference/src/practical.xml | 2195 --------------- .../docs/reference/src/spring-faces.xml | 382 --- 31 files changed, 87 insertions(+), 6807 deletions(-) create mode 100644 spring-webflow/docs/reference/src/defining-flows.xml delete mode 100644 spring-webflow/docs/reference/src/flow-definition.xml delete mode 100644 spring-webflow/docs/reference/src/flow-execution-repository.xml delete mode 100644 spring-webflow/docs/reference/src/flow-execution.xml delete mode 100644 spring-webflow/docs/reference/src/flow-executor.xml delete mode 100644 spring-webflow/docs/reference/src/images/actionadapter-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/images/actionstate-classdiagram.jpg delete mode 100644 spring-webflow/docs/reference/src/images/architecture-layer-diagram.png delete mode 100644 spring-webflow/docs/reference/src/images/flow-search.png delete mode 100644 spring-webflow/docs/reference/src/images/flowdefinition-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecution-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecution-persistence.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecution-restoration.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecution-sessionstack.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecution-statediagram.png delete mode 100644 spring-webflow/docs/reference/src/images/flowexecutorfacade-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/images/globaltransitions-statediagram.png create mode 100644 spring-webflow/docs/reference/src/images/hotels-site-bookhotel-flow.png create mode 100644 spring-webflow/docs/reference/src/images/hotels-site.png delete mode 100644 spring-webflow/docs/reference/src/images/junit-greenbar.png delete mode 100644 spring-webflow/docs/reference/src/images/logo-ervacon.png delete mode 100644 spring-webflow/docs/reference/src/images/logo-interface21.png delete mode 100644 spring-webflow/docs/reference/src/images/sellitem-configuration.png delete mode 100644 spring-webflow/docs/reference/src/images/subflowstate-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/images/swf-highlevelarchitecture.png delete mode 100644 spring-webflow/docs/reference/src/images/transition-statediagram.jpg delete mode 100644 spring-webflow/docs/reference/src/images/viewstate-classdiagram.png delete mode 100644 spring-webflow/docs/reference/src/practical.xml delete mode 100644 spring-webflow/docs/reference/src/spring-faces.xml diff --git a/spring-webflow/docs/reference/src/defining-flows.xml b/spring-webflow/docs/reference/src/defining-flows.xml new file mode 100644 index 00000000..bc6bd102 --- /dev/null +++ b/spring-webflow/docs/reference/src/defining-flows.xml @@ -0,0 +1,60 @@ + + + Defining Flows + + Introduction + + This chapter begins the Users Section of this guide. + It shows how to implement flows using the flow definition language. + By the end of this chapter, you should have a good understanding of language constructs and capable of authoring a flow definition. + + + + What is a Flow? + + A flow encapsulates a reusable sequence of steps that can execute in different contexts. + Below is a Garrett Information Architecture diagram illustrating a reference to a flow that encapsulates the steps of a hotel booking process: + + + + + + + + + + A BookHotel Flow Definition + + + + + What is the makeup of a typical Flow? + + In Spring Web Flow, a flow consists of a series of steps called "states". + Entering a state typically results in a page being displayed to the user. + On the page, user events occur that are handled by that state. + These events can trigger transitions to other states which result in page navigations. + + + The example below shows the structure of the book hotel flow referenced in the previous diagram: + + + + + + + + + + Hotels Site Diagram that references a "Book Hotel" flow + + + + + How are Flows authored? + + Flows are authored by web application developers using a XML-based flow definition language. + The next steps of this guide will walk you through the elements of this language. + + + \ No newline at end of file diff --git a/spring-webflow/docs/reference/src/flow-definition.xml b/spring-webflow/docs/reference/src/flow-definition.xml deleted file mode 100644 index b1b74c6a..00000000 --- a/spring-webflow/docs/reference/src/flow-definition.xml +++ /dev/null @@ -1,2462 +0,0 @@ - - - Flow definition - - Introduction - - Spring Web Flow allows developers to build reusable, self-contained controller modules - called flows. A flow defines a user dialog that responds to user events to drive - the execution of application code to complete a business goal. - - - Flows are defined declaratively using a rich domain-specific language (DSL) - tailored to the problem domain of UI flow. Currently, XML and Java-based - forms of this language are provided. - - - This chapter documents Spring Web Flow's core flow definition language. You will - learn the core domain constructs of the system and how those constructs are - representable in an externalized XML form. - - - - FlowDefinition - - A flow definition is a instance of org.springframework.webflow.definition.FlowDefinition. - This is the central domain artifact representing the definition of a user dialog or task. - - - A flow definition consists of a set of one or more states, where each state defines a step in - the flow that when entered executes a behavior. What behavior is executed is - a function of the state's type and configuration. The outcome of a state's - execution, called an event, is used by the flow to drive a state transition. - - - Exactly one of a flow's states is the startState - that defines the starting point of the flow. Optionally, a flow can have one or more end states - defining the ending points of the flow. - - - An example definition of a simple flow to carry out a search process is shown graphically below: - - - - - - - - - - Search Flow - - - - The default FlowDefinition implementation in Spring Web Flow is - org.springframework.webflow.engine.Flow. Its configurable properties are - summarized below: - - - Flow properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - id - The identifier of the flow definition, typically unique to all other flows of the application. - - 1 - - - - attributes - Additional custom attributes about the flow. - - 0..* - - None - - - states - The steps of the flow. - - 1..* - - - - startState - The starting point of the flow. - - 1 - - - - variables - The set of flow instance variables to create each time an execution of the flow is started. - - 0..* - - Empty - - - inputMapper - - The service responsible for mapping flow input provided by the client each time an - execution of the flow is started. - - - 0..1 - - Null - - - startActions - The list of actions to execute each time an execution of the flow is started. - - 0..* - - Empty - - - endActions - The list of actions to execute each time an execution of the flow ends. - - 0..* - - Empty - - - outputMapper - - The service responsible for mapping flow output to expose to the client each time an execution of the flow ends. - - - 0..1 - - Null - - - globalTransitions - The set of transitions shared by all states of the flow. - - 0..* - - Empty - - - exceptionHandlers - An ordered set of handlers to be applied when an exception is thrown within a state of the flow. - - 0..* - - Empty - - - -
- - Below is a high level example of how these properties can be configured in XML form - or directly in Java code. - - - XML-based Flow template - - <?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-1.0.xsd"> - - <attribute .../> - - <var .../> - - <input-mapper .../> - - <start-actions> - ... - </start-actions> - - <start-state idref="yourStartingStateId"/> - - <-- your state definitions go here --> - - <global-transitions> - ... - </global-transitions> - - <end-actions> - ... - </end-actions> - - <output-mapper .../> - - <exception-handler .../> - - </flow> - - - - Java Flow API example - - Flow flow = new Flow("id"); - flow.getAttributeMap().put("name", "value"); - flow.addState(...); - flow.setStartState("startingPoint"); - flow.addVariable(...); - flow.setInputMapper(...); - flow.getStartActionList().add(...); - flow.getEndActionList().add(...); - flow.setOutputMapper(...); - flow.getGlobalTransitionSet().add(...); - flow.getExceptionHandlerSet().add(...); - - - A Flow is typically built by a FlowBuilder rather than assembled - by hand. The flow building subsystem is contained within the - org.springframework.webflow.engine.builder package. - The XML Flow Builder and spring-webflow.xsd schema are located - within the org.springframework.webflow.engine.builder.xml package. - The XML-based format is currently the most popular way to define flows, though - Groovy-based and Java-based formats are emerging. - - -
- - StateDefinition - - A StateDefinition defines the behavior for a step of a FlowDefinition. - The base implementation class for all Flow state types is org.springframework.webflow.engine.State. - This abstract class defines common properties applicable to all state types, which include: - - - State properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - id - The id of the state, unique to its containing flow definition. - - 1 - - - - owner - The owning flow definition. - - 1 - - - - attributes - Additional custom attributes about the state. - - 0..* - - None - - - entryActions - The list of actions to execute each time the state is entered. - - 0..* - - Empty - - - exceptionHandlers - An ordered set of handlers to be invoked when an exception is thrown within the state. - - 0..* - - Empty - - - -
-
- - Transitionable State - - A central subclass of State is org.springframework.webflow.TransitionableState. - This abstract class defines common properties applicable to all state types that execute - transitions to other states in response to events. These properties include: - - - TransitionableState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - transitions - The eligible paths out of this state. - - 1..* - - - - exitActions - The list of actions to execute each time this state is exited. - - 0..* - - Empty - - - -
- - Below is a mock flow definition snippet showing how properties may be configured for - a TransitionableState in XML and in Java code: - - - XML-based state template - - <?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"> - - <start-state idref="myStateId"/> - - <xxx-state id="myStateId"> - <attribute name="..." value="..."/> - - <entry-actions> - ... - </entry-actions> - - <transition on="..." to="..."/> - <transition on-exception="..." to="..."/> - - <exit-actions> - ... - </exit-actions> - - <exception-handler .../> - </xxx-state> - - </flow> - - - - Java state API example - - Flow flow = new Flow("id"); - TransitionableState state = new XXXState(flow, "stateId"); - state.getAttributeMap().put("name", "value"); - state.getEntryActionList().add(...); - state.getTransitionSet().add(...); - state.getExitActionList().add(...); - - - A State is typically constructed by a FlowArtifactFactory, used by - a FlowBuilder during flow assembly. The flow building subsystem is contained within the - org.springframework.webflow.engine.builder package. - - -
- - TransitionDefinition - - A transition takes a flow from one state to another, defining a path through the flow. - This is modeled using a TransitionDefinition. - - - Recall that all TransitionableStates have a set of one or more transitions, each defining a - path to another state in the flow (or a recursive path back to the same state). - When a transitionable state is entered, it executes a behavior. - For example, a transitionable state called "Display Form" may display a form to the user - and wait for user input. The outcome of the state's execution, called an event, is used to drive execution of - one of the state's transitions. For example, the user may press the form submit button which - signals a submit event that matches the transition to - the "Process Submit" state. - - - This event-driven transition execution process is shown graphically below: - - - - - - - - - - Transition execution - - - - The transition definition implementation is defined by an instance of - org.springframework.webflow.engine.Transition. - Its properties are summarized below: - - - Transition properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - attributes - Additional attributes describing the transition. - - 0..* - - None - - - matchingCriteria - The strategy that determines if the transition matches on an event occurrence. - - 1 - - Always matches - - - executionCriteria - The strategy that determines if the transition, once matched, is allowed to execute. - - 1 - - Always allowed - - - targetStateResolver - - The strategy that resolves the target state of the transition. - Most transitions always resolve to the same target state. - This strategy allows for dynamic resolution. - - - 1 - - - - - -
- - Below is a high-level example of how a Transition can be configured in XML form - or directly in Java code. - - - Transition XML template - - <transition on="event" to="targetState"> - <attribute ... /> - <action ... /> - </transition> - - - - Transition Java API example - - Transition transition = new Transition("targetState"); - transition.getAttributeMap().put("name", "value"); - transition.setMatchingCriteria(new EventIdTransitionCriteria("event")); - transition.setExecutionCriteria(...); - - - - Action transition execution criteria - - In the XML transition template above, note the support for the action element within the transition element. - - - A transition may be configured with one or more actions that execute before the transition itself - executes. If one or more of these actions do not complete successfully, the transition will not be allowed. - This execution criteria makes it possible to execute arbitrary logic - after a transition is matched but before it is executed. This is useful when you want to execute - event post-processing logic. A good example is executing form data binding and validation behavior - after a form submit event. - - - - Dynamic transitions - - A transition's target state resolver can be configured to dynamically calculate the target state. For example: - - - <transition on="back" to="${flowScope.lastViewStateId}" /> - - - This will transition the flow to the state resolved by evaluating the - flowScope.lastViewStateId expression. - - - - Global transitions - - As outlined, one or more transitions are added to all TransitionableState types, - attached at the state-level. Optionally, transitions may also be added at the - flow-level where they are shared by all states. These shared - transitions are called global transitions. - - - When an event is signaled in a transitionable state, the state will first try and - match one of its own transitions. If there is no match at the state level, the set of - global transitions will be tested. If there still is no match, - a NoMatchingTransitionException will be thrown. - - - Global transitions are useful in situations where many states of the flow share - the same transitional criteria. For example, consider a navigation menu that displays - alongside each view of a flow. Logic to process navigation menu events is needed - by all view states. This is the problem global transitions are designed to solve. - - - Global transitions - XML example - - The following example shows transitions defined at the state level, as well as - global transitions defined at the flow level. - - - <?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"> - - <start-state idref="state1"/> - - <xxx-state id="state1"> - <transition on="localEvent1" to="state2"/> - </xxx-state> - - <xxx-state id="state2"> - <transition on="localEvent1" to="state1"/> - </xxx-state> - - <global-transitions> - <transition on="globalEvent1" to="state1"/> - <transition on="globalEvent2" to="state2"/> - </global-transitions> - - </flow> - - - In this mock example, state1 defines one transition and also inherits - the two others defined within the global-transitions element. - Any other states defined within this flow would also inherit those global transitions. - - - This example is shown graphically below: - - - - - - - - - - Global transitions - - - - - - Transition executing exception handlers - - The <transition/> element contains an exclusive on-exception - attribute used to specify an exception-based criteria for transition execution. This allows you to - transition the flow to another state on the occurrence of an exception. Transition executing exception handlers - may be attached at the state and flow levels. - - - State exception handling - XML example - - The following example illustrates a state-level transition executing exception handler: - - - <?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"> - - <start-state idref="state1"/> - - <xxx-state id="state1"> - <transition on="event1" to="state2"/> - <transition on-exception="example.MyBusinessException" to="state3"/> - </xxx-state> - - ... - - </flow> - - - In this example, state1 defines one transition and an exception handler - which executes a transition to state3 if a MyBusinessException - is thrown within the state. The handled exception will be put into flash scope under the - key stateException, where it will be automatically exposed to the next view (typically an error view). - - - - Flow exception handling - XML example - - The following example illustrates a flow-level transition executing exception handler: - - - <?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"> - - <start-state idref="state1"/> - - <xxx-state id="state1"> - <transition on="event1" to="state2"/> - </xxx-state> - - <xxx-state id="state2"/> - - <global-transitions> - <transition on-exception="example.MyBusinessException" to="state3"/> - </global-transitions> - - ... - - </flow> - - - In this example, the exception handler is defined as a global transition. This reads "any time - a MyBusinessException occurs during flow execution, transition the flow - to state3". - - - Exception handlers attached at the state level take precedence over those defined at the flow level. - This is illustrated by the following example: - - - <?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"> - - <start-state idref="state1"/> - - <xxx-state id="state1"> - <transition on="event1" to="state2"/> - <transition on-exception="example.MyBusinessException" to="state4"/> - </xxx-state> - - <xxx-state id="state2"/> - - <global-transitions> - <transition on-exception="example.MyBusinessException" to="state3"/> - </global-transitions> - - ... - - </flow> - - - In this example, if MyBusinessException is thrown in state1 the - flow will transition to state4. For any other state, the flow will transition to state3. - - - - - Custom exception handlers - - Custom, user-defined exception handlers may be attached at the flow and state levels by using the - exception-handler element. This element delegates to Spring to locate - the custom exception handler instance with the specified bean name. - - - An example of attaching a custom exception handler is shown below: - - - <?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"> - - <start-state idref="state1"/> - - <xxx-state id="state1"> - <transition on="event1" to="state2"/> - <exception-handler bean="myCustomStateExceptionHandler"/> - </xxx-state> - - <xxx-state id="state2"/> - - <global-transitions> - <exception-handler bean="myCustomFlowExceptionHandler"/> - </global-transitions> - - <import resource="flow-beans.xml"/> - - </flow> - - - flow-beans.xml - - <bean id="myCustomStateExceptionHandler" class="example.CustomFlowExecutionExceptionHandler"/> - <bean id="myCustomFlowExceptionHandler" class="example.AnotherCustomFlowExecutionExceptionHandler"/> - - - - Custom exception handlers must implement the org.springframework.webflow.engine.FlowExecutionExceptionHandler interface. - - -
- - Concrete state types - - Spring Web Flow has five (5) built-in concrete state types, all contained within the - org.springframework.webflow.engine package. These states execute common - controller behaviors including: - - allowing the user to participate in a flow (ViewState) - executing business application code (ActionState) - making a flow routing decision (DecisionState) - spawning another flow as a subflow (SubflowState) - terminating a flow (EndState) - - - - Each of these state types, with the exception of EndState, is transitionable. - This hierarchy is illustrated below: - - - - - - - - - - FlowDefinition class diagram - - - - As you will see, with these five basic state types you can develop rich controller modules. - - - ViewState - - When entered, a view state allows the user (or other external client) to participate - in a flow. This participation process goes as follows: - - - - The entered view state renters a view to issue a response to the caller. - - - - - The flow execution 'pauses' in this state, and control is returned to the calling system. - - - - - After some 'think time', the user signals an input event to resume the flow execution - from the 'paused' point. - - - - - - Spring Web Flow gives you full control over the view selection process and, on resume, - how a view state responds to a user input event. - - - The properties of a org.springframework.webflow.engine.ViewState are summarized below: - - - ViewState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - viewFactory - The strategy that makes the view selection when this state is entered. - - 0..1 - - Null - - - renderActions - - The list of actions to execute each time a renderable view selection is made. - Allows for execution of pre-render logic. - - - 0..* - - Empty - - - -
- - The org.springframework.webflow.execution.ViewFactory type is an interface, - encapsulating knowledge about a particular view rendering technology. - with the flow. Concrete subtypes exist for each of the supported view technologies. - These subtypes are summarized below: - - - Concrete ViewFactory types - - - - - - Type - Description - - - - - JsfViewFactory - Requests the rendering of Java Server Faces (JSF) view. - - - MvcViewFactory - - Requests the rendering of a Spring MVC view. - - - - -
- - ViewState class diagram - - The class diagram below shows the ViewState and the associated types used to carry - out the view selection process (TODO - needs updating for 2.0): - - - - - - - - - - ViewState class diagram - - - - - ViewState XML - application view selection - - The following example shows a view-state definition in XML that makes an application view - selection when entered, selecting the searchForm view for display and, on resume, responding to - two possible user input events (submit and cancel) in different ways: - - - <?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"> - - <start-state idref="displaySearchForm"/> - - <view-state id="displaySearchForm" view="searchForm"> - <transition on="submit" to="processFormSubmission"/> - <transition on="cancel" to="processCancellation"/> - </view-state> - - ... - - </flow> - - - View name expressions may also be specified for the view attribute to - achieve runtime view name calculation. - For example, view="${requestScope.calculatedViewName}". - - - - ViewState API - application view selection - - The following example shows the equivalent view state definition using - the FlowBuilder API: - - - public class SearchFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - addViewState("displaySearchForm", "searchForm", - new Transition[] { - transition(on("submit"), to("processFormSubmission")), - transition(on("cancel"), to("processFormCancellation")) - } - ); - ... - } - } - - - - ViewState XML - flow execution redirect - - The following example illustrates a view-state definition in XML that makes an - flow execution redirect selection when entered, redirecting to the - yourList view for display. - - - <?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"> - - <start-state idref="displayList"/> - - <view-state id="displayList" view="redirect:yourList"> - <transition on="add" to="addListItem"/> - </view-state> - - ... - - </flow> - - - This example is called a flow execution redirect because the application view selected - is rendered only after a redirect to the flow execution. The redirect request is sent to a - URL that refreshes the flow execution paused in the displayList - view state. Refresh then triggers the rendering of the yourList application view - on the next request into the server. - - - POST+REDIRECT+GET in Spring Web Flow - - The above example is one way to achieve the POST+REDIRECT+GET pattern in Spring Web Flow. - When the redirect is performed, the GET request issued hits a stable flow execution URL - which remains active for the duration of the conversation. This URL may be freely refreshed. - Browser navigational buttons may be used freely without browser warnings. - - - The execution attribute alwaysRedirectOnPause, which enforces this pattern by default, - is discussed later in this document. In that case, each time a view state is entered a redirect is always performed. - - - - - ViewState API - flow execution redirect - - The following example shows the equivalent view state definition using the FlowBuilder API: - - - public class SearchFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - addViewState("displayList", viewSelector("redirect:yourView"), - transition(on("add"), to("addListItem")) - ); - ... - } - } - - - - ViewState XML - null view - - The following example illustrates a view-state definition in XML that makes a - null view selection when entered. This causes no additional response to be issued. - - - <?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"> - - <start-state idref="displayPdf"/> - - <view-state id="displayPdf"> - <render-actions> - <action bean="pdfWriter" method="write"/> - </render-actions> - </view-state> - - ... - - </flow> - - - - FlowDefinitionRedirect and ExternalRedirect - - The FlowDefinitionRedirect and ExternalRedirect are not - generally used by a view state. They are typically used by an end state, either to start - a new independent flow or redirect to an arbitrary external URL. - Examples are provided in the discussion of the end state. - - - - ViewState XML - form state behavior - - The following example illustrates a view-state definition in XML that encapsulates - typical "form state" behavior. - - - Consider the requirements of typical input forms. Most forms require pre-render or - setup logic to execute before the form is displayed. For example, such logic might - load the backing form object from the database, install formatters for formatting - form field values, and pull in supporting form data needed to populate drop-down menus. - - - In addition, most forms require post-back or submission logic - to execute when the form is submitted. This logic typically involves binding form input to the - backing form object and performing type conversion and data validation. - - - This "form state" behavior of form setup, display, and post-back is handled elegantly in Spring Web Flow - by the capabilities of the view-state construct. See below: - - - <?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"> - - <start-state idref="displayForm"/> - - <view-state id="displayForm" view="form"> - <render-actions> - <action bean="formAction" method="setupForm"/> - <action bean="formAction" method="loadFormReferenceData"/> - </render-actions> - <transition on="submit" to="saveForm"> - <action bean="formAction" method="bindAndValidate"/> - </transition> - </view-state> - - ... - - </flow> - - - This reads "when this flow starts enter the displayForm state - to execute the setupForm and loadFormReferenceData methods - before rendering the form view. On submit, - transition to the saveForm state if the bindAndValidate method executes successfully." - - -
- - ActionState - - When entered, an action state executes business application code, then responds to the result of that - execution by deciding what state in the flow to enter next. Specifically: - - - - The entered action state executes an ordered list of one or more - org.springframework.webflow.execution.Action - instances. This Action interface is the central abstraction that - encapsulates the execution of a logical unit of application code. - - - - - The state determines if the outcome of the first action's execution matches a - transition. If there is a match, the transition is executed. If there is no match, - the next action in the list is executed. This process continues until a transition is - matched or the list of actions is exhausted. - - - - - - Spring Web Flow gives you full control over implementing your own actions and configuring when they should be invoked - within the lifecycle of a flow. The system can also automatically adapt methods on - your existing application objects (POJOs) to the Action interface in a non-invasive manner. - This means in many cases you can implement your flows without needing to develop custom glue code to bind SWF - to your service layer operations. - - - The properties of a org.springframework.webflow.engine.ActionState are summarized below: - - - ActionState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - actions - The ordered list of actions to execute when the state is entered. - - 1..* - - - - - -
- - Action execution points - - As outlined, the ActionState is the dedicated state type for invoking one - or more actions and responding to their result to drive a state transition. There are - also other points within the lifecycle of a flow where a chain of actions can be executed. - At all of these points, the only requirement is that these actions implement the central - org.springframework.webflow.execution.Action interface. - - - - Other points in a Flow where an Action can be executed, and how those points - can be defined in a XML-based Flow definition. - - - - - - - - Point - Description - XML Configuration Element - - - - - on flow start - - Each time a new flow session starts. - - - A flow's <start-actions/> - - - - on state entry - - Each time a state enters. - - - A state's <entry-actions/> - - - - on transition - - Each time a state transition is matched but before it is executed. - - - A transition <action/> - - - - on state exit - - Each time a transitionable state exits. - - - A transitionable state's <exit-actions/> - - - - before view rendering - - Each time a renderable view selection is made. - - - A view state's <render-actions/> - - - - on flow end - - Each time a flow session terminates. - - - A flow's <end-actions/> - - - - -
- - - - The other points above where actions may be executed do not - allow you to execute a state transition in response to the action result event. - If you need such flow control you must execute the action from within an action state. - - - -
- - Action attributes - - An Action may be annotated with attributes by wrapping the Action - in a decorator, an instance of org.springframework.webflow.engine.AnnotatedAction. - These attributes may provide descriptive characteristics, or may be used to affect - the action's execution in a specific usage context. - - - Support for setting several common attributes is provided for convenience. These include: - - - Common Action attributes - - - - - - Attribute name - Description - - - - - caption - - A short description about the action, suitable for display as a tool-tip. - - - - description - - A long description about the action, suitable for display in a text box. - - - - name - - The name of the action, used to qualify the action's result event. - For example, an Action named placeOrder that returns success - would be assigned a result event identified by placeOrder.success. - This allows you to distinguish logical execution outcomes by action, useful when - invoking multiple actions as part of a chain. - - - - method - - The name of the target method on the Action instance to invoke to carry out execution. - This facilitates multiple action methods per Action instance, - supported by the org.springframework.webflow.action.MultiAction. - - - - -
-
- - ActionState class diagram - - The class diagram below shows the ActionState and the associated types used to carry - out the action execution process: - - - - - - - - - - ActionState class diagram - - - - - ActionState XML - simple action execution - - The following example constructs an ActionState definition from - XML that executes a single action when entered and then responds to its result: - - <?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"> - - <start-state idref="executeSearch"/> - - <action-state id="executeSearch"> - <action bean="searchAction"/> - <transition on="success" to="displayResults"/> - </action-state> - - ... - - </flow> - - This state definition reads "when the executeSearch - state is entered, execute the searchAction. On successful execution, - transition to the displayResults state." - - - The binding between the searchAction id and an - Action implementation is made at Flow build time - by querying a service locator, typically a Spring BeanFactory. For example: - - <beans> - <bean id="searchAction" class="example.webflow.SearchAction"/> - </beans> - - ... binds the searchAction action identifier to a singleton instance of the - example.webflow.SearchAction class. - - - A simple SearchAction implementation might look like this: - - public class SearchAction implements Action { - private SearchService searchService; - - public SearchAction(SearchService searchService) { - this.searchService = searchService; - } - - public Event execute(RequestContext context) { - // lookup the search criteria in "flow scope" - SearchCriteria criteria = - (SearchCriteria)context.getFlowScope().get("criteria"); - - // execute the search - Collection results = searchService.executeSearch(criteria); - - // set the results in "request scope" - context.getRequestScope().put("results", results); - - // return "success" - return new Event(this, "success"); - } - } - - - - - ActionState API - standard action - - The following example constructs the equivalent action state definition using - the FlowBuilder API: - - - public class SearchFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - ... - addActionState("executeSearch", action("searchAction"), - transition(on("success"), to("displayResults"))); - ... - } - } - - - - ActionState XML - multi action - - The next example constructs an ActionState definition from XML that - executes a single action method on a org.springframework.webflow.action.MultiAction - and then responds to its result: - - <?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"> - - <start-state idref="executeSearch"/> - - <action-state id="executeSearch"> - <action bean="searchAction" method="executeSearch"/> - <transition on="success" to="displayResults"/> - </action-state> - - ... - - </flow> - - This state definition reads "when the executeSearch - state is entered, call the executeSearch method on the - searchFlowAction. On successful execution, - transition to the displayResults state." - - - A SearchAction implementation containing multiple action methods - might look like this: - - public class SearchAction extends MultiAction { - private SearchService searchService; - - public SearchAction(SearchService searchService) { - this.searchService = searchService; - } - - public Event executeSearch(RequestContext context) { - // lookup the search criteria in "flow scope" - SearchCriteria criteria = - (SearchCriteria)context.getFlowScope().get("criteria"); - - // execute the search - Collection results = searchService.executeSearch(criteria); - - // set the results in "request scope" - context.getRequestScope().put("results", results); - - // return "success" - return success(); - } - - public Event someOtherRelatedActionMethod(RequestContext context) { - ... - return success(); - } - - public Event yetAnotherRelatedActionMethod(RequestContext context) { - ... - return success(); - } - } - - As you can see, this allows you to define one to many action methods per Action class. - With this approach, there are two requirements: - - - - Your Action class must extend from org.springframework.webflow.MultiAction, or - another class that extends from MultiAction. The multi action cares - for the action method dispatch that is based on the value of the method - property. - - - - - Each action method must conform to the signature illustrated above: public Event ${method}(RequestContext) { ... } - - - - - - MultiActions are useful for centralizing command logic on a per-flow definition basis, as - a flow definition typically carries out execution of a single application use case. - - - - ActionState API - multi action - - The following example constructs the equivalent action state definition using - the FlowBuilder API: - - - public class SearchFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - ... - addActionState("executeSearch", invoke("executeSearch", action("searchAction")), - transition(on("success"), to("displayResults"))); - ... - } - } - - - - ActionState XML - bean action - - The next example constructs an ActionState definition from XML that - executes a single method on a Plain Old Java Object (POJO) and then responds to the result: - - <?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"> - - <start-state idref="executeSearch"/> - - <action-state id="executeSearch"> - <bean-action bean="searchService" method="executeSearch"> - <method-arguments> - <argument expression="${flowScope.criteria}"/> - </method-arguments> - <method-result name="results"/> - </bean-action> - <transition on="success" to="displayResults"/> - </action-state> - - ... - - </flow> - - This state definition reads "when the executeSearch - state is entered, call the executeSearch method on the - searchService passing it the object indexed by name criteria - in flowScope. On successful execution, expose the method - return value in the default scope (request) under the name results - and transition to the displayResults state." - - - In this example the referenced bean searchService would be - your application object, typically a transactional - business service. Such a service implementation must have defined the - the Collection executeSearch(SearchCriteria) method, - typically by implementing a service interface: - - - public interface SearchService { - public Collection executeSearch(SearchCriteria criteria); - } - - - With this approach there are no requirements on the signature of the methods that carry out - action execution, nor is there any requirement to extend from a Web Flow specific base class. - Basically, you are not required to write a custom Action implementation at all--you - simply instruct Spring Web Flow to call your business methods directly. The need - for custom "glue code" to bind your web-tier to your middle-tier is eliminated. - - - Spring Web Flow achieves this by automatically adapting the method on your existing - application object to the Action interface and caring for - exposing any return value in the correct scope. - - - This adaption process is shown graphically below: - - - - - - - - - - Bean->Action adapter - - - - - ActionState XML - decision bean action - - The following example constructs an ActionState from - XML that executes an action whose execution result forms the basis for the transition decision: - - - <?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"> - - ... - - <action-state id="shippingRequired"> - <bean-action bean="shippingService" method="isShippingRequired"> - <method-arguments> - <argument expression="${flowScope.purchase}"/> - </method-arguments> - </bean-action> - <transition on="yes" to="enterShippingDetails"/> - <transition on="no" to="placeOrder"/> - </action-state> - - ... - - </flow> - - - This state definition reads "if the isShippingRequired method on the - shippingService returns true, transition to the enterShippingDetails - state, otherwise transition to the placeOrder state." - - - - Note how the boolean return value of the isShippingRequired method is - converted to the event identifiers yes or no. - - - - This conversion process is handled by the action adapter responsible for adapting the method on your - application object to the org.springframework.webflow.execution.Action interface. - By default, this adapter applies a number of rules for creating a result event from a method return value. - - - These conversion rules are: - - - Default method return value to Event conversion rules - - - - - - Return type - Event identifier - - - - - boolean - yes or no - - - java.lang.Enum - this.name() - - - org.springframework.core.enum.LabeledEnum - this.getLabel() - - - org.springframework.webflow.execution.Event - this.getId() - - - java.lang.String - the string - - - any other type - success - - - -
- - You may customize these default conversion policies by setting a custom ResultEventFactory - instance on the bean invoking action performing the adaption. Consult the JavaDoc documentation for - more details on how to do this. - -
- - ActionState XML - decision bean action with enum return value - - The following example constructs an ActionState from - XML that executes a action that invokes a method on an application object that - returns a java.lang.Enum: - - - <?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"> - - ... - - <action-state id="shippingRequired"> - <bean-action bean="shippingService" method="calculateShippingMethod"/> - <method-arguments> - <argument expression="${flowScope.order}"/> - </method-arguments> - </bean-action> - <transition on="BASIC" to="enterBasicShippingDetails"/> - <transition on="EXPRESS" to="enterExpressShippingDetails"/> - <transition on="NONE" to="placeOrder"/> - </action-state> - - ... - - </flow> - - - This state definition reads "if the calculateShippingMethod method on the - shippingService returns BASIC for the current order, transition to the enterBasicShippingDetails - state. If the return value is EXPRESS, transition to the enterExpressShippingDetails state. - If the return value is NONE, transition to the placeOrder state." - - - - ActionState XML - evaluate action - - The following example constructs an ActionState from - XML that executes a action that evaluates an expression against the - flow request context and exposes the evaluation result: - - - <?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"> - - - <action-state id="getNextInterviewQuestion"> - <evaluate-action expression="flowScope.interview.nextQuestion()"/> - <evaluation-result name="question"/> - </evaluate-action> - <transition on="success" to="displayQuestion"/> - </action-state> - - </flow> - - - This state definition reads "evaluate the flowScope.interview.nextQuestion() expression, - and expose the result under name question in the default scope." - - - The expression can evaluate any object traversable from the flow's - org.springframework.webflow.execution.RequestContext. This example expression evaluates the - nextQuestion method on the interview - business object in flow scope. - - - - ActionState XML - set action - - The next example constructs an ActionState from - XML that executes an action on a success transition that sets an attribute in "flash scope": - - - <?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"> - - <view-state id="selectFile" view="fileUploadForm"> - <transition on="submit" to="uploadFile"/> - </view-state> - - <action-state id="uploadFile"> - <action bean="uploadAction" method="uploadFile"/> - <transition on="success" to="selectFile"> - <set attribute="fileUploaded" scope="flash" value="true"/> - </transition> - </action-state> - - </flow> - - - This flow definition reads "display the fileUploadForm. - On form submit, invoke the uploadFile method - on the uploadAction. On success, allow the user - to select another file to upload. Report that the last file was uploaded successfully by - setting the fileUploaded attribute in flash scope to - true. - - - - Flash scoped attributes are preserved until the next user event is signaled into - the flow execution. In this example, this means the fileUploaded - attribute is preserved across a redirect to the selectFile - view state and any subsequent browser refreshes. Only when the submit - event is signaled will the flash scope be cleared. - - - - - When to use which kind of action? - - Simple action, Multi action, bean action, evaluate action, set? When to use one or the other? - - - - Action implementation usage guidelines - - - - - - - Action type - Usage scenario - - - - - Simple (extends AbstractAction) - - You have a specialized behavior that stands on its own; - for creating lightweight stubs or mocks for testing purposes. - - - - MultiAction - - To group related command logic together. Particularly - useful for when there are multiple related behaviors - called by a flow. - - - - Bean action - - When the logical behavior maps well to a method call on a service - layer bean. When there is no "special" or exotic glue code - required. - - - - - EvaluateAction - - - When you need to invoke a bean in flow scope or evaluate - any other flow expression. - - - - - SetAction - - - When you need to set an attribute in flow or other scope - during the course of flow execution. - - - - -
-
-
- - DecisionState - - When entered, a decision state makes a flow routing decision. This process consists of: - - - - Evaluating one or more boolean expressions against the executing flow to decide - what state to transition to next. - - - - - - The properties of a org.springframework.webflow.engine.DecisionState are summarized below: - - - DecisionState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - transitions (inherited from TransitionableState) - - The transitions that are evaluated on an event occurrence that - forms the basis for the decision. - - - 1..* - - - - -
- - DecisionState XML - expression evaluation - - The following example constructs a DecisionState from - XML that evalutes a boolean expression to determine what transition - to execute: - - - <?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"> - ... - - <decision-state id="shippingRequired"> - <if test="${flowScope.order.needsShipping}" then="enterShippingDetails" else="placeOrder"/> - </decision-state> - - ... - - </flow> - - - This state definition reads "if the needsShipping property on the - order object in flow scope is true, transition to the enterShippingDetails - state, otherwise transition to the placeOrder state." - - - - - Caution: flow definitions should not be vehicles for - business logic. In this case the decision made was controller logic, reasoning on a - pre-calculated value to decide what step of the flow to transition to next. That is the kind of logic that - should be in a flow definition. In contrast, having the state itself embed - the business rule defining how shipping status is calculated is a misuse. - Instead, push such a calculation into business application code where it belongs and instruct - the flow to invoke that code using an action. - - - - -
- - SubflowState - - When entered, a subflow state spawns another flow as a subflow. - - - Recall that a flow is a reusable, self-contained controller module. The ability for one flow to call another flow - gives you the ability to compose independent modules together to create complex controller workflows. Any flow can be used as subflow - by any other flow, and there is a well-defined contract in play. Specifically: - - - - - - A Flow is an instance of org.springframework.webflow.engine.Flow. - - - - - A newly launched flow can be passed input attributes, which it may choose - to map into its own local scope. - - - - - An ending flow can return output attributes. If the ended flow was launched as a subflow, - the resuming parent flow may choose to map these output attributes into its own scope. - - - - - - It is helpful to think of the process of calling a flow like calling a Java method. Flows can - be passed input arguments, and can produce return values just like methods can. Flows are more powerful because - they are potentially long-running, as they can span more than one request into the server. - - - The properties of a org.springframework.webflow.engine.SubflowState are summarized below: - - - SubflowState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - subflow - - The definition of the flow to be spawned as a subflow. - - - 1 - - - - - attributeMapper - - The strategy responsible for mapping input attributes to the subflow and - mapping output attributes from the subflow. - - - 0..* - - Null - - - -
- - When a SubflowState is entered, the following behavior occurs: - - - - The state first messages its attributeMapper, an instance of - org.springframework.webflow.engine.FlowAttributeMapper, - to prepare a Map of input attributes to pass to the subflow. - - - - - The subflow is spawned, passing the input attributes. When this happens, - the parent flow suspends itself in the subflow state until - the subflow ends. - - - - - When the subflow ends, a result event is returned describing the flow outcome - that occurred. The parent flow resumes back in the subflow state. - - - - - The resumed subflow state messages its attributeMapper to - map any output attributes returned by the subflow into flow scope, if necessary. - - - - - Finally, the resumed subflow state responds to the result event returned by the ended subflow - by matching and executing a state transition. - - - - - - The constructs used in spawning a flow as a subflow are shown graphically below: - - - - - - - - - - SubflowState class diagram - - - - SubflowState XML - with input attribute - - The following example constructs an SubflowState from - XML that spawns a shipping subflow: - - - <?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"> - - ... - - <subflow-state id="enterShippingDetails" flow="shipping"> - <attribute-mapper> - <input-mapper> - <mapping source="flowScope.order.shipping" target="shipping"/> - </input-mapper> - </attribute-mapper> - <transition on="finish" to="placeOrder"/> - </subflow-state> - - ... - - </flow> - - - This subflow state definition reads "spawn the shipping flow, - passing it the value of the shipping property on the order - object in flow scope. When the shipping flow ends, respond to the finish - result event by transitioning to the placeOrder state." - - - - The inner structure and behavior of the shipping flow is fully encapsulated within - its own flow definition. A flow calling another flow as a subflow can pass that flow input - and capture its output, but it cannot see inside it. Flows are black boxes. - Because any flow can be used as a subflow, it can be reused in other contexts without change. - - - - - SubflowState API - input attributes - - The following illustrates the equivalent example using the FlowBuilder API: - - - public class OrderFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - ... - addSubflowState("enterShippingDetails", flow("shipping"), shippingMapper(), - transition(on("finish"), to("placeOrder"))); - ... - } - - protected FlowAttributeMapper shippingMapper() { - DefaultFlowAttributeMapper mapper = new DefaultFlowAttributeMapper(); - mapper.addInputMapping(mapping().source("flowScope.order.shipping").target("shipping").value()); - return mapper; - } - } - - - - Flow input mapping - input contract - - Within a flow definition, input attributes can be obtained by configuring an input-mapper. - Any input attributes must be explictly mapped. - The list of permitted input attributes defines the input contract for the flow. - - - If you think of calling a Flow as analogous to calling a Java method, it - is helpful to think of input-attributes as analogous to method arguments. - - - - - <?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"> - - <input-mapper> - <input-attribute name="shipping"/> - </input-mapper> - - ... - - </flow> - - - This short-form input mapper declaration reads "when a new execution of this flow starts, - map the provided shipping input attribute into flowScope under - the name shipping." - - - - Had this input mapping not been defined the shipping attribute made available as input - to this flow by a calling parent flow or external client would have been ignored. - - - -
- - EndState - - When entered, an end state terminates a flow. A EndState represents exactly one logical - flow outcome; for example, "finish", or "cancel". - - - If the ended flow was acting as a top-level or root flow, the - entire flow execution ends and cannot be resumed. In this case, the end state is responsible - for issuing a final response (for example, a confirmation page, or a redirect request to another flow or an external URL). - - - If the ended flow was acting as a subflow, the spawned subflow session ends and - the calling parent flow resumes by responding to the end - result returned. In this case, the responsibility for any final response - falls on the parent flow. - - - Once a flow ends, any attributes in flow scope go out of scope immediately - and become eligible for garbage collection. - - - As outlined, an end state entered as part of a root flow messages its finalResponseAction - to make a ending view selection. Typically this is a redirect-based response type, - allowing for redirect after flow completion. An end state entered as part of - a subflow is not responsible for a view selection; this responsibility falls on the calling flow. - - - EndState result events - - When a EndState is entered it terminates a flow and, if used as subflow, - returns a result event the parent flow uses to drive a state transition from the calling subflow - state. It is the end state's responsibility to create this result event which - is the basis for communicating the logical flow outcome to - callers. - - - By default, an EndState creates a result event with an identifier that matches the - identifier of the end-state itself. For example, an end state with id finish - returns a result event with id finish. Also, any attributes in - flow scope that have been explicitly mapped as output attributes - are returned as result event attributes. This allows you to return data along - with the logical flow outcome. - - - Spring Web Flow gives you full control over the ending view selection strategy, as - well as what flow attributes should be exposed as output on a per EndState basis. - These configurable properties are summarized below: - - - - EndState Properties - - EndState properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - finalResponseAction - The strategy that makes the ending response when this state is entered and the flow is a root flow. - - 0..1 - - Null - - - outputMapper - - The service responsible for exposing flow output attributes, making those attributes eligible for output mapping by a calling flow. - - - 0..1 - - None - - - -
-
- - EndState XML - redirect to flow after completion - - The following example constructs an EndState from - XML that terminates a shipping subflow and requests a - redirect response to another flow: - - - <?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"> - - ... - - <end-state id="finish" view="flowRedirect:searchFlow"/> - - </flow> - - - This end state definition reads "terminate the order flow, - and redirect to a new execution of the searchFlow". - - - - EndState XML - redirect after flow completion - - The following example constructs an EndState from - XML that terminates a shipping subflow and requests a - redirect response to an external URL: - - - <?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"> - - ... - - <end-state id="finish" view="externalRedirect:/orders/${flowScope.order.id}"/> - - </flow> - - - This end state definition reads "terminate the order flow, - and redirect to the URL returned by evaluating the /orders/${flowScope.order.id} - expression." - - - This is an example of the familiar redirect after post pattern where - after transaction completion a redirect is issued allowing the result of the transaction - to be viewed (in this case using a REST-style URL). - - - - EndState XML - flow output attribute - - The following example constructs an EndState from - XML that terminates a shipping subflow: - - - <?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"> - - ... - - <end-state id="finish"> - <output-mapper> - <output-attribute name="shipping"/> - </output-mapper> - </end-state> - - </flow> - - - This end state definition reads "terminate the shipping flow, - and expose the shipping property in flow scope as an output attribute - with name shipping." - - - - EndState API - flow output attribute - - The following illustrates the equivalent example using the FlowBuilder API: - - - public class ShippingFlowBuilder extends AbstractFlowBuilder { - public void buildStates() { - ... - addEndState("finish", - new DefaultAttributeMapper().add( - mapping().source("flowScope.shipping").target("shipping").value() - ); - } - } - - - Since this end-state does not make a view selection, it is expected this flow will be always used - as a subflow. When this flow ends, the calling parent flow is expected to respond to the - finish result, and may choose to map the shipping output - attribute into its own scope. - - - - SubflowState XML - mapping an output attribute - - The next example shows how a subflow-state can respond to the ending - result of a subflow, and map subflow output attributes into its own scope: - - - <?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"> - - ... - - <subflow-state id="enterShippingDetails" flow="shipping"> - <attribute-mapper> - <output-mapper> - <output-attribute name="shipping"/> - </output-mapper> - </attribute-mapper> - <transition on="finish" to="placeOrder"/> - </subflow-state> - - ... - - </flow> - - - This subflow state definition reads "spawn the shipping flow - as a subflow. When the shipping flow ends, map the shipping output - attribute into flow scope under the name shipping, then respond to - the finish result event by transitioning to - the placeOrder state." - - - - Had this output mapping not been defined, the shipping attribute made available as output - to this flow by the ending subflow would have been ignored. - - - -
-
-
\ No newline at end of file diff --git a/spring-webflow/docs/reference/src/flow-execution-repository.xml b/spring-webflow/docs/reference/src/flow-execution-repository.xml deleted file mode 100644 index b6009062..00000000 --- a/spring-webflow/docs/reference/src/flow-execution-repository.xml +++ /dev/null @@ -1,247 +0,0 @@ - - - Flow execution repositories - - Introduction - - A flow execution represents an executing flow at a point in time. - At runtime there can be any number of flow executions active in parallel. A single user - can even have multiple executions active at the same time (for example, when a user is - operating multiple windows or tabs within their browser). - - - Many of these flow executions span multiple requests into the server and therefore - must be saved so they can be resumed on subsequent requests. This presents technical - challenges, as there must exist a stable mechanism for a new request to be associated - with an existing execution in the view state that matches what the user expects. This problem - is more difficult when you consider that many applications require use of browser - navigational buttons, and use of these buttons involves updating local history without - notifying the server. - - - The problem of flow execution persistence is addressed by Spring Web Flow's flow - execution repository subsystem. In this chapter, you will learn how to use the system - to manage the storage of active web conversations in a stable manner. - - - - Repository architecture overview - - Recall the following bullet points noting what happens when a flow execution enters a ViewState: - - - - - - When a flow execution reaches a ViewState it is said to have paused, - where it waits in that state for user input to be provided so it can continue. After pausing, the - ViewSelection returned is used to issue a response to the user - that provides a vehicle for collecting the required user input. - - - - - User input is provided by signaling an event that - resumes the flow execution in the paused view state. - The input event communicates what user action was taken. - - - - - - Each time an active flow execution is paused, it is saved out to a - repository. When the next request comes in for that flow execution, it is restored - from the repository, resumed, and continued. This process continues - until the flow execution reaches an end state, at which time it is removed from the repository. - - - This process is demonstrated over the next two graphics: - - - - - - - - - - Request one (1) - Paused flow execution persistence - - - - - - - - - - - Request two (2) - Paused flow execution restoration, removal on end - - - - - Flow execution identity - - When a new flow execution is created, it marks the start of a new conversation between a browser - and the server. A new flow execution that is still active after startup - processing indicates the start of a conversation that will span more than one request - and needs to be persisted. When this is the case, that flow execution is assigned - an persistent identifer by the repository. By default, the - structure of this identifier consists of a two-part composite key. This key is used - by clients to restore the flow execution on subsequent requests. - - - Conversation identifier - - The first part of a flow execution's persistent identity is a - unique conversation identifier. This serves as an index into - the logical conversation between the browser and the server that - has just started. - - - - Continuation identifier - - The second part of a flow execution's persistent identity is a continuation identifier. - This identifier serves as an index into a flow execution representing the state of the conversation - at this point in time. - - - - Flow execution key - - Together the conversation id plus the continuation id make up the unique two-part - flow execution key that identifies a state - of a conversation at a point in time. By submitting this key - in a subsequent request, a browser can restore the conversation at that point - and continue from there. - - - So on a subsequent request, the conversation is resumed by restoring a flow execution - from the repository using the two-part key. After event processing, if the - flow execution is still active it is saved back out to the repository. - At this time a new flow execution key is generated. By default, that key - retains the same conversation identifier, as the same logical - conversation is in progress; however the continuation identifier - changes to provide an index into the state of the flow execution - at this new point in time. - - - By submitting this new key in a subsequent request, a browser can - restore the conversation at that point and continue from there. - This process continues until a flow execution reaches an end state during event processing - signaling the end of the conversation. - - - - - Conversation ending - - When a flow execution reaches an end state it terminates. If the flow execution was associated - with a logical conversation that spanned more than on request, it is removed from the - repository. More specifically, the entire conversation is ended, - resulting in any flow execution continuations associated with the conversation being purged. - - - Once a conversation has ended, the conversation identifier is no longer valid - and can never be used again. - - - - Flow execution repository implementations - - The next section looks at the repository implementations that are available for use - with Spring Web Flow out-of-the-box. - - - Simple flow execution repository - - The simplest possible repository (SimpleFlowExecutionRepository). - This repository stores exactly one flow execution instance per conversation - in the user's session, invalidating it when its end state is reached. - This repository implementation has been designed with minimal storage overhead in mind. - - - - It is important to understand that use of this repository consistently prevents - duplicate submission when using the back button. If you attempt to go back - and resubmit, the continuation id stored in your browser history will not - match the current continuation id needed to access the flow execution and - access will be disallowed. - - - - - This repository implementation should generally be used when you do not have to - support browser navigational button use; for example, when you lock down the browser and - require that all navigation events to be routed through Spring Web Flow. - - - - - Continuation flow execution repository - - This repository (ContinuationFlowExecutionRepository) stores one to many flow - execution instances per conversation in the user's session, where each flow execution represents a - paused and restorable state of the conversation at a point in time. This repository implementation is - considerably more flexible than the simple one, but incurs more storage overhead. - - - - It is important to understand that use of this repository allows resubmission when - using the back button. If you attempt to go back and resubmit while the conversation - is active, the continuation id stored in your browser history will match the - continuation id of a previous flow execution in the repository. Access to - that flow execution representing the state of the conversation at that point in - time will be granted. - - - - Like the simple implementation, this repository implementation provides support for conversation - invalidation after completion where once a logical - conversation completes (by one of its FlowExecutions reaching an end state), - the entire conversation is invalidated. This prevents the possibility of - resubmission after completion. - - - This repository is more elaborate than the default repository, offering - more power (by enabling multiple continuations to exist per conversation), - but incurring more storage overhead. This repository implementation should be - considered when you do have to support browser navigational button use. - This implementation is the default. - - - - Client continuation flow execution repository - - This repository is entirely stateless and its use entails no server-side state - (ClientContinuationFlowExecutionRepository). - - - This is achieved by encoding a serialized flow execution directly into the - flow execution continuation key that is sent in the response. - - - When asked to load a flow execution by its key on a subsequent request, this - repository decodes and deserializes the flow execution, restoring it to - the state it was in when it was serialized. - - - - This repository implementation does not currently support - conversation invalidation after completion, as - this capability requires tracking active conversations using some - form of centralized storage, like a database table. - - - - - Storing state (a flow execution continuation) on the client - entails a certain security risk that should be evaluated. Furthermore, it - puts practical constraints on the size of the flow execution. - - - - - \ No newline at end of file diff --git a/spring-webflow/docs/reference/src/flow-execution.xml b/spring-webflow/docs/reference/src/flow-execution.xml deleted file mode 100644 index 8f7176e7..00000000 --- a/spring-webflow/docs/reference/src/flow-execution.xml +++ /dev/null @@ -1,673 +0,0 @@ - - - Flow execution - - Introduction - - Once a flow has been defined, any number of executions of it can be launched in parallel - at runtime. Execution of a flow is carried out by a dedicated system that - is based internally on a state machine that runs atop the Java VM. As the life of a - flow execution can span more than one request into the server, this system - is also responsible for persisting execution state across requests. - - - This chapter documents Spring Web Flow's flow execution system. You will - learn the core constructs of the system and how to execute flows out-of-container - within a JUnit test environment. - - - - FlowExecution - - A org.springframework.webflow.execution.FlowExecution is a runtime instantiation of a flow definition. - Given a single FlowDefinition, any - number of independent flow executions may be created. - These executions are typically created by a FlowExecutionFactory. - - - A flow execution carries out the execution of program instructions defined within - its definition in response to user events. - - - - It may be helpful to think of a flow definition as analagous to a Java Class, and a - flow execution as analagous to an object instance of that Class. Signaling - an execution event can be considered analagous to sending an object a message. - - - - Flow execution creation - - FlowDefinition definition = ... - FlowExecutionFactory factory = ... - FlowExecution execution = factory.createFlowExecution(definition); - - - Once created, a new flow execution is initially inactive, waiting to be started. Once - started, a flow execution becomes active by entering its startState. - From there, it continues executing until it enters a state where user input is required - to continue or it terminates. - - - - Flow execution startup - - ExternalContext context = ... - execution.start(context); - - - When a flow execution reaches a state where input is required to continue, it is said to have paused, - where it waits in that state for user input to be provided. - - - User input is provided by signaling an event that - resumes the flow execution by communicating what user action was taken. - Attributes of the signal event request form the basis for user input. The flow execution - resumes by consuming the event. - - - Once a flow execution has resumed, it continues executing until it again enters a - state where more input is needed or it terminates. Once a flow execution has terminated - it becomes inactive and cannot be resumed. - - - - Flow execution resume - - ExternalContext context = ... - execution.resume(context); - if (execution.isActive()) { - // still active but paused - } else { - // has ended - } - - - - Flow execution lifecycle - - As outlined, a flow execution can go through a number of phases throughout its lifecycle; - for example, created, active, paused, - ended. - - - Spring Web Flow gives you the ability to observe the lifecycle of an - executing flow by implementing a FlowExecutionListener. - - - The different phases of a flow execution are shown graphically below: - - - - - - - - - - Flow execution lifecycle - - - - - Flow execution properties - - The Spring Web Flow flow execution implementation is org.springframework.webflow.engine.impl.FlowExecutionImpl, - typically created by a FlowExecutionImplFactory (a FlowExecutionFactory implementation). - The configurable properties of this flow execution implementation are summarized below: - - - Flow Execution properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - definition - The flow definition to be executed. - - 1 - - - - listeners - The set of observers observing the lifecycle of this flow execution. - - 0..* - - Empty - - - attributes - Global system attributes that can be used to affect flow execution behavior - - 0..* - - Empty - - - -
- - The configurable constructs related to flow execution are shown graphically below: - - - - - - - - - - Flow execution - - -
- - Flow execution impl creation - - FlowExecutionFactory factory = new FlowExecutionImplFactory(); - factory.setExecutionListeners(...); - factory.setExecutionAttributes(...); - FlowExecution execution = factory.createFlowExecution(definition); - - -
- - Flow execution context - - Once created, a flow execution, representing the state of a flow at a point in time, - maintains contextual state about itself that can be reasoned upon by clients. In addition, - a flow execution exposes several data structures, called scopes, that allow clients to set - arbitrary attributes that are managed by the execution. - - - The contextual properties associated with a flow execution are summarized below: - - - Flow Execution Context properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - active - - A flag indicating if the flow execution is active. - An inactive flow execution has either ended or has never been started. - - - 1 - - - - definition - - The definition of the flow execution. The flow definition serves as - the blueprint for the program. It may be helpful to think of a flow - definition as like a Class and a - flow execution as like an instance of that Class. - This method may always be safely called. - - - 1 - - - - activeSession - - The active flow session, tracking the flow that is currently executing - and what state it is in. The active session can change over the life of the - flow execution because a flow can spawn another flow as a subflow. - This property can only be queried while the flow execution is active. - - - 1 - - - - conversationScope - - A data map that forms the basis for "conversation scope". Arbitrary attributes placed in this map will be retained - for the life of the flow execution and correspond to the length of the logical conversation. - This map is shared by all flow sessions. - - - 1 - - - - -
- - As a flow execution is manipulated by clients its contextual state changes. Consider how - contextual state is effected when the following events occur: - - - An ordered set of events and their effects on flow execution context - - - - - - - Flow Execution Event - Active? - Value of the activeSession property - - - - - created - false - Throws an IllegalStateException - - - started - true - - A FlowSession whose definition - is the top-level flow definition and whose state is the definition's start state. - - - - state entered - true - - A FlowSession whose definition - is the top-level flow definition and whose state is the newly entered state. - - - - subflow spawned - true - - A FlowSession whose definition - is the subflow definition and whose state is the subflow's start state. - - - - subflow ended - true - - A FlowSession whose definition is back to the - top-level flow definition and whose state is the resuming state. - - - - ended - false - Throws an IllegalStateException - - - -
- - As you can see, the activeSession of a flow execution changes when a subflow - is spawned. Each flow execution maintains a stack of flow sessions, where each flow session - represents a spawned instance of a flow definition. When a flow execution starts, the session stack initially - consists of one (1) entry, an instance dubbed the root session. - When a subflow is spawned, the stack increases to two (2) entries. When the subflow ends, - the stack decreases back to one (1) entry. The active session is always - the session at the top of the stack. - - - The contextual properties associated with a FlowSession are summarized below: - - - Flow Session properties - - - - - - - - Property name - Description - Cardinality - Default value - - - - - definition - - The definition of the flow the session is an instance of. - - - 1 - - - - state - - The current state of the session. - - - 1 - - - - status - - A status indicator describing what the session is currently doing. - - - 1 - - - - scope - - A data map that forms the basis for flow scope. - Arbitrary attributes placed in this map will be retained for the scope - of the flow session. This map is local to the session. - - - 1 - - - - flashMap - - A data map that forms the basis for flash scope. - Attributes placed in this map will be retained until the next - external user event is signaled in the session. - - - 1 - - - - -
- - The following graphic illustrates an example flow execution context and flow - session stack: - - - - - - - - - - Flow execution context - - - - In this illustration, a flow execution has been created for the Book Flight flow. - The execution is currently active and the activeSession indicates it - is in the Display Seating Chart state of the Assign Seats flow, - which was spawned as a subflow from the Enter Seat Assignments state. - - - - Note how the active session status is paused, indicating the flow execution - is currently waiting for user input to be provided to continue. In this case, it is - expected the user will choose a seat for their flight. - - -
- - Flow execution scopes - - As alluded to, a flow execution manages several containers called scopes, - which allow arbitrary attributes to be stored for a period of time. There are four scope - types, each with different storage management semantics: - - - Flow execution scope types - - - - - - Scope type name - Management Semantics - - - - - request - - Eligible for garbage collection when a single call into the flow execution completes. - - - - flash - - Cleared when the next user event is signaled into the flow session; eligible for garbage collection when the flow session ends. - - - - flow - - Eligible for garbage collection when the flow session ends. - - - - conversation - - Eligible for garbage collection when the root session of the governing flow execution (logical conversation) ends. - - - - -
-
- - Flow execution testing - - Spring Web Flow provides support within the org.springframework.webflow.test - package for testing flow executions with JUnit. This support is provided as convenience but is - entirely optional, as a flow execution is instantiable in any environment with the standard - Java new operator. - - - The general strategy for testing flows follows: - - - - - - Your own implementations of definitional artifacts used by a flow such as actions, - attribute mappers, and exception handlers should be unit tested in isolation. - Spring Web Flow ships convenient stubs to assist with this, for instance - MockRequestContext. - - - - - The execution of a flow should be tested as part of a system integration test. - Such a test should exercise all possible paths of the flow, asserting that - the flow responds to events as expected. - - - - - - - A flow execution integration test typically selects mock or stub implementations of application - services called by the flow, though it may also exercise production implementations. - Both are useful, supported system test configurations. - - - - Flow execution test example - - To help illustrate testing a flow execution, first consider the following flow definition - to search a phonebook for contacts: - - - - - - - - - - Phonebook Search Flow - State Diagram - - - - The corresponding XML-based flow definition implementation: - - - <?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"> - - <start-state idref="enterCriteria"/> - - <view-state id="enterCriteria" view="searchCriteria"> - <render-actions> - <action bean="formAction" method="setupForm"/> - </render-actions> - <transition on="search" to="displayResults"> - <action bean="formAction" method="bindAndValidate"/> - </transition> - </view-state> - - <view-state id="displayResults" view="searchResults"> - <render-actions> - <bean-action bean="phonebook" method="search"> - <method-arguments> - <argument expression="flowScope.searchCriteria"/> - </method-arguments> - <method-result name="results"/> - </bean-action> - </render-actions> - <transition on="newSearch" to="enterCriteria"/> - <transition on="select" to="browseDetails"/> - </view-state> - - <subflow-state id="browseDetails" flow="detail-flow"> - <attribute-mapper> - <input-mapper> - <mapping source="requestParameters.id" target="id" from="string" to="long"/> - </input-mapper> - </attribute-mapper> - <transition on="finish" to="displayResults"/> - </subflow-state> - - </flow> - - - Above you see a flow with three (3) states that execute these behaviors, respectively: - - - - - - The first state enterCriteria displays a search criteria form so the user can enter who - he or she wishes to search for. - - - - - On form submit and successful data binding and validation, the search is executed. - After search execution a results view is displayed. - - - - - From the results view, the user may select a result they wish to browse additional details on - or they may request a new search. On select, the "detail" flow is spawned and - when it finishes the search is re-executed and it's results redisplayed. - - - - - - From this behavior narrative the following assertable test scenarios can be extracted: - - - - - That when a flow execution starts, it enters the enterCriteria state and - makes a searchCriteria view selection containing a form object - to be used as the basis for form field population. - - - - - That on submit with valid input, the search is executed and a searchResults view selection is made. - - - - - That on submit with invalid input, the searchCriteria view is reselected. - - - - - That on newSearch, the searchCriteria view is selected. - - - - - That on select, the detail flow is spawned and passed the id of the selected result as expected. - - - - - To assist with writing these assertions, Spring Web Flow ships with JUnit-based flow execution - test support within the org.springframwork.webflow.test package. - These base test classes are indicated below: - - - Flow execution test support hierarchy - - - - - - Class name - Description - - - - - AbstractFlowExecutionTests - The most generic base class for flow execution tests. - - - AbstractExternalizedFlowExecutionTests - The base class for flow execution tests whose flow is defined within an externalized resource, such as a file. - - - AbstractXmlFlowExecutionTests - The base class for flow execution tests whose flow is defined within an externalized XML resource. - - - -
-
-
-
\ No newline at end of file diff --git a/spring-webflow/docs/reference/src/flow-executor.xml b/spring-webflow/docs/reference/src/flow-executor.xml deleted file mode 100644 index 8ebd1ed8..00000000 --- a/spring-webflow/docs/reference/src/flow-executor.xml +++ /dev/null @@ -1,230 +0,0 @@ - - - Flow executors - - Introduction - - Flow executors are the highest-level entry points into - the Spring Web Flow system, responsible for driving the execution of flows - across a variety of environments. - - - In this chapter, you will learn how to execute flows within Spring MVC, Struts, - and Java Server Faces (JSF) based applications. - - - - FlowExecutor - - org.springframework.webflow.executor.FlowExecutor is the - central facade interface external systems use to drive the execution of flows. - This facade acts as a simple, convenient service entry-point into - the Spring Web Flow system that is reusable across environments. - - - The FlowExecutor interface is shown below: - - - public interface FlowExecutor { - public void executeFlowRequest(ExternalContext context); - } - - - Execution typically consists of either: - - - - Launching (start) a new execution of a flow definition. - - - - - Resuming a paused flow execution by signaling an event against its current state. - - - - - - The ExternalContext provides normalized access to properties of an external system that has called into Spring Web Flow. - This context allows access to environment-specific request parameters as well as - externally-managed request, session, and application-level attributes. - - - ExternalContext implementations exist for each of - the environments Spring Web Flow supports. If a flow artifact such as an Action needs - to access native constructs of the calling environment it can downcast a context to its - specific implementation. The need for such downcasting is considered a corner case. - - - FlowExecutorImpl - - The default executor implementation is org.springframework.webflow.executor.FlowExecutorImpl. - It allows for configuration of a FlowDefinitionLocator responsible for loading the flow definitions to execute, as well as - the FlowExecutionRepository strategy responsible for persisting flow executions that remain - active beyond a single request into the server. - - - The configurable FlowExecutorImpl properties are shown below: - - - FlowExecutorImpl properties - - - - - - - Property name - Description - Cardinality - - - - - definitionLocator - The service for loading flow definitions to be executed, typically a FlowDefinitionRegistry - - 1 - - - - executionFactory - The factory for creating new flow executions. - - 1 - - - - executionRepository - The repository for saving and loading persistent (paused) flow executions - - 1 - - - - -
-
- - A typical flow executor configuration with Spring 2.0 - - <?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:web="http://www.springframework.org/schema/webflow-config" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://www.springframework.org/schema/webflow-config - http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"> - - <!-- Launches new flow executions and resumes existing executions. --> - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry"/> - - <!-- Creates the registry of flow definitions for this application --> - <web:flow-registry id="flowRegistry"> - <web:flow-location path="/WEB-INF/flows/**/*-flow.xml"/> - </web:flow-registry> - - </beans> - - - This instructs Spring to create a flow executor that can execute all XML-based flow definitions - contained within the /WEB-INF/flows directory. The default flow execution - repository, continuation, is used. - - - - A flow executor using a simple execution repository - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry" repository-type="simple"/> - - - This executor is configured with a simple repository that manages - execution state in the user session. - - - - A flow executor using a client-side continuation-based execution repository - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry" repository-type="client"/> - - - This executor is configured with a continuation-based repository that serializes - continuation state to the client using no server-side state. - - - - A flow executor using a single key execution repository - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry" repository-type="singleKey"/>> - - - This executor is configured with a simple repository that assigns a single - flow execution key per conversation. The key, once assigned, never changes - for the duration of the conversation. - - - - A flow executor setting custom conversation management attributes - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry"> - <web:flow-repository type="continuation" max-conversations="5" max-continuations="30" conversation-manager-ref="conversationManager"/> - </web:flow-executor> - - <bean id="conversationManager" class="example.MyCustomConversationalStateManager"/> - - - This executor is configured with a continuation repository configured with custom settings for: - - The maximum number of active conversations per user session (5) - The maximum number of restorable flow execution snapshots (continuations) per conversation (30) - Where conversational state will be stored (via a custom conversationManager) - - The flow:repository child element is the more flexible form for configuring the flow execution repository. - Use it or the convenient repository-type attribute, not both. - - - - A flow executor setting system execution attributes - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry" repository-type="continuation"> - <web:flow-execution-attributes> - <web:alwaysRedirectOnPause value="false"/> - <web:attribute name="foo" value="bar"/> - </flow:execution-attributes> - </web:flow-executor> - - - This executor is configured to set two flow execution system attributes - alwaysRedirectOnPause=false and foo=bar. - - - - - The alwaysRedirectOnPause attribute determines if - a flow execution redirect occurs automatically each time an execution pauses - (automated POST+REDIRECT+GET behavior). - Setting this attribute to false will disable the default 'true' behavior. - - - - - - A flow executor setting custom execution listeners - - <web:flow-executor id="flowExecutor" registry-ref="flowRegistry" repository-type="continuation"> - <web:flow-execution-listeners> - <web:flow-listener ref="listener" criteria="order-flow"/> - </web:flow-execution-listeners> - </web:flow-executor> - - <!-- A FlowExecutionListener to observe the lifecycle of order-flow executions --> - <bean id="listener" class="example.OrderFlowExecutionListener"/> - - - This executor is configured to apply the execution listener to the "order-flow". - - -
-
\ No newline at end of file diff --git a/spring-webflow/docs/reference/src/images/actionadapter-classdiagram.png b/spring-webflow/docs/reference/src/images/actionadapter-classdiagram.png deleted file mode 100644 index f09de8c88a91ede8633a5b53a45f6d401db49a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3361 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 diff --git a/spring-webflow/docs/reference/src/images/actionstate-classdiagram.jpg b/spring-webflow/docs/reference/src/images/actionstate-classdiagram.jpg deleted file mode 100644 index f6a6a7c27c737d311783fd01f9a778094e7c6d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27211 zcmeFZ1yEdVw=USYOXJeGLql+v#vKBLpush`OCY$r28RHFP}7F-Bn$+_I~#(tKPl#TF-jcewlw+2Vg76$jbm=U;qFZ=nwF+1dxPE z|GneyPX2p6K<|F(005C;v|tI~V5kAGKo~e6%u5e|^#7b3;C~#*NGOP?2x!oY64(G3 zco>U(y$F`Lxm+8k^=&1#oET z8Gtl&j6A&D&_3|~R>kY%@3X-F`RpP99S#OMGdLhX3~-;0i(AdBKCo6QEOc$Tj-7@$ z?k|y0YljL@v)y<uvpKWPwZb|l$&$Qtq4^LekpDCZG zFv${<#wYv(llB(?rhE0hb%mJrFao3qV`D5fBCM-R;^a2LI3mJy*m3=P+V|ZVQhQ%}^FT5o2?DdRk0$si^5u$c*#edL& z#lbBLdVgQO5Dvy^8=Hl5l=x00%JF$3!!(W7Kt7)4BZtsC7l!7aDm#f22b!Bfs{(Hf zG+-%(80u^C+#Y`XjJ&Ecd;x?B>G*O_zmnz{*|LLva=c4t{fMW1-{CoFP@lJod?Oi` z$IC)PuumqZhW<&~oZW*7rI2&;AX9TNAdaL`zJB%ej(IobdwtQ;Q z5rLx1CspJw=U>GZ))l85sXhVC%HAPV{rtbBr-WdVZ}!6*VE8|#?l2V-*iKV?DY(-Q za!|LI4CZ7&>fAO#zl$d5*}N&raC;?nVD3bz*hN`0 z7nab?-P#+O#2uiI(Yufl%T*50%kBKEn#NO$k>c5%`@+z~(+r8Pv2h}EA!~DD&-%c$ z-Krx_EC~G0QQAp}9+@e7Trq9tWWS&CIhHmP=7Su!-R-P$L8-gF{TGM4jeRO}#$~%R zZ{2{>JD!xGBm=S5l)S(@Bia?wpl9C7xf{`bZ|KxFqWp1#O*dYwHTe#}1DsH}ZgGB z0cVQrYw-MuUT})h;mxucPALzzvSUq*E+KE`h%onB@frR_qx#RrJ|n7%f-UZ|#qp)T zvQQl_(-D#R_fy{OwcydEePp28Gk}#(?2ISJ(d;JkNrTCCK>pAtivNb5>sR`y|6#$` ztaZE>z^ffx{7U)`Yca-wzF$~t=M1;7a2rtfh4ex+z6+NOnucuXO4zT->b_T%hBZW)iD zR=j)-WvBa|dI>g`uCgOGCr96hTRJwzu%qPTV#|XOTeLy?;cE6}p1)RD9lYFbibqiT;x3Cb z>Bu??j@4E?Z2fQr0`n24%2+-6ESJdp9k=6)C7Z~cPw)>Mv$itE-mprZKMtbn++NTo zS-zcr9*FC&9(MWF^#UNj*zo05Snqb#S%jCpUgQIH#L^QikjUkr77~qdrowD#%;VY5 zlGmdmSvF_RS197Y0B&9CzDz3%zLJ!H<~h~XpDN)IkVPfWT_dPQNQW}_6g0H;*DOQy zOc$A&+*6Eg;2q*zz}s)_^2I5)RA3R(DsC@hxh-+{WbLbhEfH&F&HPKxPQ(EAN!EM* zN1r6Sy`OP)Tx}8O&rZ>v7p2*=BYcXmRhFg6S$f7?vEw?MD+dTmzGbs-L`Tfp3Y3Io ziIkj5WLYLam-XAhvkYHmi+FD#(H3 za8laCl1-@GTM%i&CvDZ|6V04s`OYT7y5JYU$&Sv+Ov9D9zoWhMv9Z`g)B8_#42atX zv$!vSmK4ht^|eVvn18m-`p-TT{iKMH{@L~)eXu@Z8~yL${R=xm|i@LMK>cx`FE*k&7 z;J9)-_Y%y?zk>hlIwSR`?;~4-2nl|A8l!tFF!sM(|9^IGW-&V6y)wGN5lx7(-4cMpUqV ztC>&2PCIW$=<~T<`79%{;wpqc+o=7p zHJ2_)!bhC&B7{1fN|nB&1N9eZ>nSzc9G_#s8=T8nu#@hH#*1)xR;1|C1KBLs(xpwHs*^Q)Smo$xa= zh{p1na>c38(2QKY!T1_#WMb9bZDWzRcy_K#vQ*_%>1a^PQOjN1B$6WqGWJQj`Nm)` zU`e-hV?MW$b!gJTTS7j2-Al~Rm1G#?Jv^2-wg5>Ed2 zB3>%r!Ep~n!V#N4N3*#O0fWiaeOT|JM0<_KWzU1hiY@Gt8%S)@l@T1T5S<+R6lotx z1oCWU#G;}J$l{_$&hFAyzUI+$6?}^soHn-E-n{n3c1DW(Wa+e2MxibQGiy_87{BKj zE9Cd+f%*K$JK`Mf79>>_&zRe?)vRbHsU> zJv8TJoUV*Ud()bwVZs+SGTsqi{Ilj;Tbh$@!aNFJxB<`fGnK7Nqj;{0ut!jv&@^Vk zBp+Ln=bD!H3t&tCdaI42W5DCsZ?BuO-0bjzavMEL)gFXt+u9Q6^f z>cH?JZAdUds(0)}o*XxR(D9It($>+gZSI~LmYS0Kzwy_B{CM!S{VjpkH9>Jc@NQc2 za~`;`?vcoCCJXD3Cr_$MP?WM4!554u|?fqglJU<-vk;DDN!~Y-rV}}(Jv~rk1 zNO_X}u^;>oqxWjqL%=Jm^Ixu<308fXKCrXjp~`m7^CP?%ebl9;e8CTeVTtp*`BRaa zh6FB`{Rra{aX49_xRyH6dY7QjVsSN14NaR*Ain zUj(065P_b88-<&~0*uLl>t#=a55}jl@AD+5C#JF-9I^UL;cGS0?P}p=GcsiFYCqIB z);T!WH#hZb2PscV3SJ5#C4~)xu+O@AbciFBtgtp8TYdqU(W8=6v&JVQhCf)~X24Nh z1S{!sT~7uVB8l3@?M{fu@`*seGM_z%9qsHKop+a`gAWr-e&RN~05*AN4b^*!o}Kin zKKb=i^rkL;Y)}3cUX2Own_SeyCKk3u_1X4-JBo=IQ+7S5_2z6%!hG3W$x zGSjm#hDr1+dbYc|5Ovek)VN6UmC|jX${=Ft1#nJk^X7-iYiRB>IK6FBXllHa$M@zy$v7F&B~qNiq?Nq^&tl zyU#Y+TY|UDt9ta!*jA>Z*d`H?F>nAm^{X^b&E)0Z4;#cW`N-kgyYCYRNPEK~F)4`s zgOHbHO((XjF&>C(X~939^5`*}2v{bC{GMs-%&);J{}gl{)moHQ;%SN&$c|bvWmnD6 zKy#6*gq4H5%wWRc4K!8$*^UQku2J?QdvRhdXr#)yAs)i%*xDqB4d~I8j8?Z~%2xnW zgl^*^4#64R&m6&3uk#J+<@+LUvIQ+?IHS=9%z=u--Lk?1je+=eq2eQM$rq4t9SPbm zOa_98sROZF`r4s(GrVLb>seLnnCLHna_Pt`m9-Z@_>zvVBJL{**zJm{-7z-5Z%#b` zEXh3b?l2hx(o&^&L0PE2D(Nu=9T2CO_Mhgy7)}e*!ZiDv47ao z>QSNyL=YK|DgzHdfwCXMsPC?xO$dl_%5jT4iLA(+!CLw5&WttH#_+isI{+q>ek7&#Do2%t9vf8Zs~e3UG}nh84qdyfQ}mQ z$km;3$v)Xe&>nR%KfwdUywN;c5Tp`Ua2l@HN~Qc23Hqz?3Z-S`0|ecYSjSaWkYNSE}pNWF$Bs0@Dtn#i5>R37{WUI4wRJJ1aWH3390 z6xrN-zhQ@-^JlIk{$cO~FrGG-unf0y>oR5R6v(fY?AMB!`cR zL@L|_amvog{eDBV3xRp>(-oxYFN#k-4o=ZD!4jf^*?f16mmDWVC&#uiPcT9AJu~y; z0bAtE^J^g?-@e9tGrZ$Itk~pv0o+yDXRcBG%YIwW8TQz`04_~d_}V1A{y%m-Dh=O2 zs5hwMS9=J&85%&1nC~4b5))VSSgLowPFrmD0Itk7ti@^mIIqOJlyHP*buqkt5UNN#80E*!29q18b0-$XTKns{u{#WY;5}oe`|T=M z7BZ!YvTy%JLynpdZ)tku^7Hbqy0Ilt>sQWxB6{;OcZ^y;8Vx;A5Gg%&b-eZarnl?E z(5JAFFPov8)6?CHkVxfbH*1K7pWCZ-m13J)vU~Sv>VvvFOQUwm=Y_^SIn^E7-b5-Q zj8FvLQOf4Dg~d~XZjuKi`ypmwh|&4CJTBpuZEcOE2-OoH25>}tLX05+`TBc=X(r5o zSe53RXD15}9sU|!lx)+^`0_B-kg6xYcz!=4T4b3nS7&o!Jdn+LyGl>Z2lKr7b@MBh zn*}-Gss?8W>6(v;a@^MKlsX&nZhs7$6?_`GE)k>2~j?JOsvV)i!qBQXF4ITsg1UBrfnxeqw!W(k{W+!ZQ-qN+TCIW=Gggh zV@+VnX1i*sKT!%j9K(-ETYXE7phGu8Y$Iko53C_a(E23amAjG0@(aLu0cUVfM9|WM zW1yfWf_x{8-PUhBU53r8S@SVpIi8t&_*XERmYjT|yT?|Q&-+PsBl)6v`NTrSZ-lfn ze^8rUtCd+Au5Ld1d%*5lsdoNS$&*aukyII&5lxTJsb9(?=iBf0fN2Q97M8O!9KYZ8 z%}TcI4FS(*JH9EJ`ArYZ|vx^h8G>%I0 zAa=|S8x$UGWCGOydVq_9P(BKlgz*;k0~B^59dVcV6ipX1?^=j*VnS4V;W|w*w~3@3 zxzehOWbp3z4N~eNS`=d}(&WXPM5g=<`2;C30Z-E3I`EoFvH0CsrM92&@D-=! zQxC5mUH~$PLZ-4!0tA>tlJ|l!%_oy}=WP@GY`^i3dkS~uC#bSx%90024VfNMrF55N zL+yR*!wB~K^aG4Rn?H*l-^aFJ+k1*eF%o5YFgY?qvgf}u=5oo^&EAn+26G4yW>>rI z?>!>2=}4_uW^PT~iyHW(r8g?K5Km4M1+kDa`YTx~%9$yBpX^WEw0buJ8c#|b1C89D zhKhxrJOrg_>!b(eF~hUuUAVel@Z<1HNX%V!Biem2Er{Q1qSqkb%-$nuc#s!}(-G0} zU>u3*q7GTl{=Q+?Y0g;KB}r>X3A5$-$Y&pD3m3)|E11dJsx3N%!CWN|`^ZFe=5;30 zzI#Jx8tpjbBTlm2xNr|-&Lzu~zb<+Em!x~72V2SX%wSGGV`nf89p5emLZpetAP#R; zOGYm+XQyjSpkFYfC+WOyJ`Iw`etKqhN<2_Gqa_v~h)pcb_4ZLhha^7QUrv?n&1Owe zV^OlRaw3^O>wko(T{qenZ~2E-h$C+e6t|b-&yAhKLj7Q3oNf9vXa;2xB9LfxB8`as zT_P_`1|86~49vj|2+5k|A{KNb2ot6>l)bga4!}X)@S9IX{(A04S;?mHy?8l+S-{7$ z*`M`g;Yx4hB&&Xl0WkB@UH}fjrO1Q+#zpx>Kn1Yz;*p3bf_gF5q$9xJ7v zl!g0-jQ4R*PU(`b&DaE+3bBf6p2!lj1A|q4IcGK}MddLT@8{A{r$U2^4c%yv8He`a zW6&Q+!!(U&4ycB@%D)mDZ-V9h@W5biynH8VWQaw+mHEP4$7ux(GEdmdZ#GERTf@Z@ z6qaD4hRze ztCd&CW3N||UySbjGm$d4S|OY?Tc^_5`A8`5yG1CP2MZP#Q~K13ZplxhYh+Y69*!&d z%xkbk7EkapJ3|6lSHeb3be9{4*Hf|IuhhlQ9e8UuhoHRn$-m!xKp_0Tz5B#?I)T|i z_zpNpx&u7tX#*UJ2=d}_+l-+~aLm2-ZYF0*GE
  • KH6C!I-c;bb!-1N*U8wTD60S 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 JFZb7}zX8~eooxUB diff --git a/spring-webflow/docs/reference/src/images/architecture-layer-diagram.png b/spring-webflow/docs/reference/src/images/architecture-layer-diagram.png deleted file mode 100644 index c8d707ef4a42bbf8399fd1e09b4ffbf63508cad5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20834 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

    g((KY~*G)TptyS zIxpc)Zrho_!p+AOn=KT^a+32dk}8!bklhm-8ygd0?C!b3OECr_rN0xUtKQiMy0Iw4yeD`#<&}4v`{*SbSG$Ug;KU9(- zgInRLIhT=mF9XU=w%t@Bf>DyGDtcxs`X2fRN3;4vU-zZ)*&$WGV`BEzH}az z(Xnt3Js0~tUh9HmT^Be~xwIlL7XVQ!e^kwM;3vsXRcViJs1lTXIg|A?Mc=rl84x-? zB9lgTHMMkz%3dkr8I`NuVWFd2ub!_J$IWwlF(81Q1|>DMMriZvsogBf_EKY5$U<|# zEB@V&vTS*yo1`{3&d@Xn%crT*zVn1?x%0I4CdF=ic3~g{fH`(iv>n7@88=#z-|d*5Mk^ZO(Plc*D&OGLzHeTj`bn!aE}2;PNJrd@cv6q>>XfKW9m zKV&l^jOw$>{4VeawRz-Gj;0Z#-bhDrRAbqVKD0Ht-~fobw6aHTOjqg@R{} zrHK2^qZ6OPqNAQF3TN~6n*j}xZ5;3Q%*pMAT-$}b{LRUBcBRRs4;^W5U!8ZCVx}}} zG?;iwuWokFnPR({U3=#78;%N(HO?aRik-NV1t#ICluxnX zO=7W;)T|X|9H7C{Ri6LtFAmmhHS8vjdm1l$NcEhQXrq4acQYGY@5j%2b=t)dtxq1? z+YfIZ1^HNKY-JxVrO)nv7PdK&zFy>hfnlj7iNWpM@ja~y!GVCpp}edDA#pXN12(x_ zF{!7;6IU)5H$eY(HBvysI3FBH6o?PJ$RziVcI?SLN0-`%ONqbIb4OQaG8hanLsraxR=!$iha|ly|Byi|dVf58x7JA}7@sskUXSGdlX4Hbmvs zS3h)I>&t+YfvNF59StS)ZeC0mvbNqBjxukX$yY~s6mz$73^#6DM4)5jI?d`rRdn}j z$v|G^7a1MpqndGQz!sf}IpwnHZyTnz)a22;=dl6pmYKZySGB5?5rJ_Ti;$JBNr=?s zP&P|yK24ly{Wq#y|+IZ%?eds}gRa?3BIQuqbJa#>}%ePPL6;=gB}0)}Au9 zI*(c8g0+F8NHx#o3&zcIo=FtMq-3IrlfaR@KC_&_G@(7=+fT@%{olmCuHRYvQ`tQk{q&ROUjdR zyzX+Z`HeOhmr_;0g+H})G$?qpl4#x#GwT})0oJgWeP;4weCX5E&kj%Phx$6l?KRhH=_81M8V z<8$`deYSD?YDzZky!wt;3YKixy$>XqnHAlpe(pvnie4S+jYdR9x@zwix_e*zlo_M< z>GJL9=wM`EsI(a`bKaD6+$1-)QrDP08&(Odbww(qUH7`Cc`v!L+v=svwAESfE1xN4 z47#C;sF)_u|C!peSCiJ1pMvsJV`}1f|R^b;Ve{%~d6YJr;1v8G70DnJj2f z)?Vflp~1sBBTKzp6YMXWAHL^3*gk9Yjh~jPzQ|zQzhHNw$TOixNJxOdI%`)ED&8-6 zc+8TrAT1o9Sam9GrfZxhD{X;a2w=ljNEAxVeIOMAlfs1}X5_oM-=Zkx<>dH$MQ_?& zr!T)1KZLdkiq<-ea^oWTstbV3Fx9c2|Aknma#yw?kag7W`X3mMS*gXjczNjt;UMLg zb_;c?x?A#{Rkxj9q~@IU;L`JcWeMFfWRzB!l*SV}nQ{cOz)QygVU7OrvMo=AWx=qe z=~Rc>RDd8^O>yiWDb(p$)yQ$Z!vcuvG)3ySYrBJZ*=MWdoCxnSRoqon`nkY_T5`X3 zr-O{g)zsKnf^Lmh@fW6mUih|F*e$1Vo<*^vt45P2@{8kBDIPbC$HpIK&tYnSFQ^xm z-Q0M&q8*n9b;S3&-m$CQ6Rkg-x1VvI{`m=e;AT2l)WlUUdD7FlUfwnQ~Lg#2bYK1BRz+$gPg^YDlvc(*xH zc>W!j8L0TokKY>jt^{M--)d=*yqS5!WS$w9151!GJD!AfbeO^swb5k{Zh4OIw|nie z#;Q-PDyzcDHxPvkO4oc>E_YZsb8N56^uJAOKU$T}F{cJ+|9Z^_S76nq=Hn5u1Mlrl z8eG5AnIB5;(%)8{?K*!l@G^^Cc0eu9MFt=4;8VsXQ;g+kDlhyx_cdei+L5vYdbNN< zHPb9v;da`2oDx(nkcYfZ6|6!j6W50#SHK^#iq)f(j+6Hm%=@ci7lRd?$FNm~4e%DA zwd5x(hYuemJ~gqK5cumf|Kb-g`+rg3p5^Lej?B2f?vpR}B2-Yx(BI6WjhKm%qqg9d z{VMBg#_t(kLV+v$iy`&^p@9s~8=ojM4f9gZV@|Aw0n?Qp2qajsW`~(MkF%IQo6sj( zf3p&IPzUC!QrEBF){l=a%0Av<(eZ0IE{fpY6jb^%mfSDt#0`_$Z|^ALk=gNB_0fv- z{K8auV;kD8{NJ=)uLQRd5R6ai01?2i0ili6nb(4gkyTq6ELH2G9M;_}I;by4sb{RJ z98p$CWaS#oqJJ7IOHZ_SEMkaNPIy;EjW{bOU!joh^XiFX4H`+79{?)&&gA$*`@z|E4#99uPfNZY3^fMig7-2DIH$e1-)4;+ zP=#a`ymzxIvFv!GFoBA~)*8MV(p z(@HYU!9DIpu^U6IF>zZJOL=oj=1%idYuT=>FDhIlViR>0Gp(qfb@gAA9n@axn0_r) zZ^;*tW7S~yV~J#{%#TxeKoF~-+F+Aig;i5oK0`KoweV1qTP zmf>F-T;#wO??kMkxRxn$#=Gz$LJ};o8+*Vt^xcBLc;~sPdHTNH5LOxzQ1@3*Qfd4N&j56}U3}$**04kTE$7u@+@1y~85?9M}|gCNZHRt>iY7vWg2Hf1e%LTRr62eM?71~BiD-0C+jYISAh4#{?5T` zNp^ful}s(Tv&d!|p6E66L@0(mU&%~JAF0<*t^ayiy&{iYiwxQg&~My&lPRyNkwSUD z&zG$5CbC)cd1KhSqLv?5pjbm^NCqCgQ@MWj&wl-vC07Jw(f>#v zOINAaTa)QbkA>MV zyE-1RW6ZDb=NApp7HT3s6`v;>*$36zlwBO`%$3+&R;PZfrtC0>N?N-o9rRHr5V=%` zC015fG4)cBNVD)`ZWn$zrf}AljHE~ZjVZB7&NKfibp@4p{W#cbELLcCGb5LLIzbwx0B03eZ9R^AT6=afNmu1);v_PR|i?9bNoO_TyoO zJ#D>PnvSv}Y`XD5z3O>q>aW2YJNAUMrHLxv?43+mrAfdCy+RM8d!<>`ctQ`GKc%*8 z;V>W|-%E7kROnarypi1B^X~1y@oKt3 zo`Q;>UuVWsQ~JOI{GR>t3O=(bOk?ND)pX}M3Z`RAy5A;gc{E_4ROBko#Y?Y!G-Czc zZF~`UaET+;i$l2z;nVKjKg$`;>qo*b4!Sy#z)B3Pp{~giu^p*R6&@ZMb8c4>14wqe zf}?SZIH|%wPYI;l-<1jQbff=q_(%^Q8NM|jMEr-vw(LntS50zF&mTc30!j>IGir-; zDIZgo3gqBS0rY=l+k0Cot|;Fkg)8?R#B=bGMMqcbpH-Dru(ESha<5k>QtH?<3%=!D zkL1H9O|b6S_``ovvZ>8(&sfXzlsdIqxF-&%*E7f=!#4`u>U-6XJ%64xKdP6A74grk z7ZURoKYcgy;tLoKPLw=1{PhO*B5)b$QDTOs$63y?9RY`#e4H@Vn%!};vAl1a$uuYF z?vA!s#P2RD6NdeLm8n8L4$|b8^ZKR#X=dEB_)MnO!+y>ES)a+lFVgn4LPvAu8?0}_ zg@a9(UdSKJ2;-h9WLqJbZfJt5AuSNM<;zcL_Cyn zGUN2@tN8403JD1^xk=S4h!(mb+cE@*r=yHwn->GvLph#}R#kQ&HI}TmKM3R4)f-5A z=S@sB>@yyx-dnv~$@b;g3y{8E1@=yMsXsUO^a;mOJM#8f!$oh-1{%*sd2{AFW}N4m zhtv`)Hkk4I$EfPe_L+f9Pv4X0MrSpheKzx_n&)qg3$?P^!|~|VdezEAFD+a2Gs_+- zg&E3nXOeN{9zvbJM^@B)I0z1OeSnZw8S0xIs(9AS&eeH`1y8zXY)W5<+4tA|e^rG$ z7$X0QMk{nKakKi`gdQp@g>$$&b!P-$)kGhR$S5%PSMVh$ge=uf4hm++dp0`m#vqCS~|Xq_&vSl1Ee9gBQrlLsJ@sl>Z1_=A3Xd!pqaR||VcLC_%M z{dfcK^b(G~YV6r^$Ms0jpN92j!Q+Wm2VTl^x<|$uDG0eWa&0u}@lAzj263+VJkUrT?{2LG?GB<3*#7orciN z<;sC9@k#9v`FelHQe7`sAJ(j^T+ojdOlw3`ubH+wZK5{_RV7uy}${BKQF<{#1a(Q>Q39GLRW z__=pI#I&idIO}VC;a`DEKXa2Xb^pA@zV0RwkZlGT)w$FtrG;r5*@1m{5(gsjg1`u_ z)}5E^JF7}bCsb`|txu9+yy@XNli*<-9nN)3C5i2#9{Z##Q{ zVgB2|YuydVr_+2656T|OPM!X$CmjVCt3=G3OZMf@qHJC!@p4wkuvw2)&uuKxV|+%d z+w6NJ^@SF0y@P`DWFE?@Y`LQTAWk>zV}^G995?Sysi@%DVWNzwEpW-BJW<=a?t{sq zde?`^Rg=vnK*KjzkvB+BDn+k#_SE(%_pO=D&7=FxKP&F$g$F=uac}4JQM+_t}H^Zxr_oy&VxzIK`9=dqNzU?`=}#d#Re8>Giz8n3{R zc6i)_+&EL~AvGf*PHL!njeXJQ=WJ(spTsp2cubC5vn=+ap)^(nQW7ipXT#2|9NHAu zX+4cImSn>yYd{$>BKs9+@4iDleLV&w_X~?*jCgwGn}=0TVlplVJ$-jtfFfE0d=hOP zDy!a88Q|H|elF|cYMX*A!VooHYh<2!hA|)eK`D!@$g`d@miov9?XVT=I#yd3q&A9U zgByu1J40?caC4DfYkH!`C|J07(s+Pt-sx#yQv@MkroO}Cmf-tGOE_>_#mc+_f5YXp zMp~Viv{Uz9heP ztDntf2M8Ta2NBwnv8Su7)-yXW5E;c$2}a`Ur267C&$T0sx_n`uag{`CAP(z2?GY}ygm@~Q=uH72S7N=DRC_>lM0}aAw&5Q_M zPbv)^<+qu%OUg-^-1*kl*02z6?jLYKY4suWyS&4KyYNr{Y4hsLx%R-{YgS4}-C1;$ zRr^bT$jcm=QULmG9?0=YhN~ngw%mN+;cBcT5b7WG*U}Y^Xyl!Q0n&X_i58QOCCYF> z*sE5?aOYxwK;$yX3aPGhHtTzW8jpd22Xjy+`v8$zYqev$(1`{Ezh9!pPsH!EoN>R( zH@SMd_-e8k^8G0SvQRk?E9zEwb^aRp77#Rm#=rl;;Y39C%@@I(JXm2CJGqGEXI8pDXqb3!k3znL+#!ZKcl;Ki~wKp9* zdW#bY9$>C~6rf8Lk0Kw!ZpBa**$|`|hZF5rFPXyM`r6CL*mJRT;N-#O?)0Bos`8u5 zMc>PEJ=>ETZi*wbjx&wFY2}!ryK@2ik%vdc%2XTdbv9K8d!>wr5yyZc|1!PqD5Z;>TvyOh6`WEYhn4{!V+w zFd-n+g>)P5(XVt|?WYtuRO9wKU!=ac>PhO0?<)iQZT&uzRvc*u{9*U|jvsNOXW?%N5zlyILK3kex-kHo0I(s+iZ)K+Exe}C8 zsb9>?e9h8>=cV0ZH6}Y~AN~c)CdT`~GD6bNn_!dt4hx%W1tJg_6F5b&RdW{E-XX#U zNORL701;gkX*7!LlB|&2dBMd6yX{MzWHuT1W?53MzEdRdayvz zqMCj6MUC`dA7wCfze+dJHF8y#h)0{j_QfabXh+(3B0!M1D5{zBrXp3fU*qq$D?;@P zANy-3o9JzKj))N^d}Y9yf3zf%L=)c^xWU#$t)8J@ymLP5b8Nf)O$)YFf3nvhT2sp( z{d?fBc-%Aj+~fox6Uks;HF`RPTUWB<>{-9Rj#|zg7Ff0p9fBfPheNJ<%m#8lNX4-! znB2PT6zd<8yZBZd*6(=l+<5i4l#g@v5cVaQcP8q4uL5*p@le*}QB=p1i`SC^+NAaK zouda;R*Tc;zj>dy2bb%)=uTw5-p?4FaXxQkeTr=M+_~!35U`UQeO%FqqQub+D_LEz zsrWEVLFT~5sK~QJ$r>vI3y}!Mv-SCV%PtZuS(W>d7VE7kFbp<8DvN7-NGsxoC+ zQUsNn_QU}>#|c2vjRUmJ%hcA~^xJ;rdHEI3su&A_~_5dVH`^m~}pz`6ZR10I6+)+hEZJ>%!Jp3m-0@db5MlD^A1HOBDyggMr8+5@9>9`7@vQc1?nkMkV6XA&)gWyR&ynv8 zIM58A8XwZ9%ENo@JN_VoA54jdyHJ&|%~w+A7xYJF;_JcE)FnF~iMz&yvFfXTbKoSx zR4HO^x~*7|78-936Z4mb>nq|+)MPAAn7j)cwYQluy}XLri$y`Zv&+VM2`L1SdgYFB#j9S$*xXZv%BgAPw&XPZ$SYGl zihjtM#tl!ihFhqLDa{w_7gH*rW#$hAFvV(18+S~KTm*=|MH!csCv8BpMG0HpZ7eN~ zye&r^q<34LBhD+z3?1aW<&QpCX=_=3$J&j#!y?CQ@;`8C9$tis$~<~q|DLtHxT^k`W|vg7guNwYwpBDz5L=}Z4Ik0I${80jO#=NIzmld zF75*qwK(00bN`9B1Th+qSn9CpOC@`B2WK);+p6}TcmW<395@mq9Jy(WOi?+H8B&P9 zW72RlbGIHxuTiCW=wf>Zd6>HZgC@L1tS&UFq$YyebWU7S4NrX-uk*63!s85;m#goZ zhOHcUcqvem5>#W8gG+;eJ_|8u9u-qEfieQd&YgkogMA4M#^5KXSF4tuJbN^t

    j@|xta=RlH>ndsmmhYw_Tb0say)hz- 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 Xqm=LOqL)Duz*`8`*b?1n=y~lwx-M7w diff --git a/spring-webflow/docs/reference/src/images/flow-search.png b/spring-webflow/docs/reference/src/images/flow-search.png deleted file mode 100644 index 2faaa307e71bd6511a7f833766e0679ccc3c3af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4908 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 diff --git a/spring-webflow/docs/reference/src/images/flowdefinition-classdiagram.png b/spring-webflow/docs/reference/src/images/flowdefinition-classdiagram.png deleted file mode 100644 index 911629fd97fca5778c67fc41883626e3a07bdc4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68013 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 LXHMnoJKp>coktJi diff --git a/spring-webflow/docs/reference/src/images/flowexecution-restoration.png b/spring-webflow/docs/reference/src/images/flowexecution-restoration.png deleted file mode 100644 index 0b8ad8a5ac59ea3d1bd12347c867011deb258337..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9682 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 diff --git a/spring-webflow/docs/reference/src/images/flowexecution-sessionstack.png b/spring-webflow/docs/reference/src/images/flowexecution-sessionstack.png deleted file mode 100644 index 3b258ef813aa7bc1d789fc1241b8cd0ba8620e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12914 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 PIDqM;YZuEeINkj(R02JS diff --git a/spring-webflow/docs/reference/src/images/flowexecutorfacade-classdiagram.png b/spring-webflow/docs/reference/src/images/flowexecutorfacade-classdiagram.png deleted file mode 100644 index 961d9ece296513ae803ec3aa14a02a8785ed2963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5437 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 diff --git a/spring-webflow/docs/reference/src/images/globaltransitions-statediagram.png b/spring-webflow/docs/reference/src/images/globaltransitions-statediagram.png deleted file mode 100644 index 60820668eea5df2b0538ab073f540544bb3cd032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3315 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 diff --git a/spring-webflow/docs/reference/src/images/hotels-site-bookhotel-flow.png b/spring-webflow/docs/reference/src/images/hotels-site-bookhotel-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8a2f9b53b3267a660893c03d236e6685daded6 GIT binary patch literal 14050 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ð3Ck1;VV>P4lh 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 literal 0 HcmV?d00001 diff --git a/spring-webflow/docs/reference/src/images/hotels-site.png b/spring-webflow/docs/reference/src/images/hotels-site.png new file mode 100644 index 0000000000000000000000000000000000000000..529f7372ffc1c48d0abf6ceaa1282c9b3f12ff66 GIT binary patch literal 12411 zcmc(lWmFu|w&$BbkU($?PU8;2J%q-gakt>^?gT<`x8T7Yf_o!Df&_Ph2M_K(m3QyV zTl3bMx$ncwdmm1%t~%9qs`oi(@BjYo4p)Loy?#aX3IqbZmXU_2fIx7BK#M|t0bGe8 zW{d%WFrZfA;z}~&;uK2G4(3+2W+0GfX0oOi-?YP==qg9Q$W;wz3iCog%#75OP7uYU z|Lv^RAGwlo#iV*=EQZPV3@9|ZA+pNhwGXvL@4<4B+qdGEZB;vdIoB;K=W{zEb32)1 zEypf~bAIF?10(Ec{O}inCA)mB2kxltO|fj*W|;FJBq0jqAZlmkpTGM0;GXg;VJ{Fs zYaxu`l93N%?awpcTph>_L6Daqg!jBPZ$QWhcE%ncOzEinJ~#>^5XC!mDrHa{7f30$ ztqmJ4&KlJ9*?vP3)P-obVGrt}jT7Gl#ZiLL47oyxUU$7k3gpN|7)XHo#t3?s+nbON z`X&WZvQ}2+zy)RVfRw1GcAY>%b)c{NhntbB%xSfVAHop3+HVI4SYIo-puW?)BhTp( z1{q;@T~% z7(J#~W8DooCjg_WN?7LA7&~p8V#_3ys-)d8?=h#r*CK79JMdEmNapI*=#oE`?uGbSc zpx#U#e7JwaTeHje-uK;m|BdB>1>6<2M6Si`+KZ~F_>u6Asr&6KHgguU>TTPHkkKun z9~pFC*qo$KziE7&z&d}QkuMnIMRqN`9+031VTs|xb4vIAtb=VptHl&P&z^v>vm6|nD537Ah_q*z_SM=@T*ujC@Fz>blbPi*6-@((lt*)lDwCZ+0 zOU`4gA+z11`SOFV#{Ei667=qI7ij{6s!e*imrQT0H=j6`GkgB>)#a#AWkAZz&LZ24 z=yUs_#QJa`+{{OZYBCJ`*YO7Bu&2B2b;s_oos!<&X|12D7fr1WoiV(M1yCYr6_i`P z_~(~S6Yn|BjOUd-__0s|^2qJ>osgYS{0LDmwpVQEzN~uAI@>x&w+Ri#upX_Brj**M zI@nFawr;OS;W4KuBhQNf*+<{+^FKd;zK+ZLT9VX(B;!Idl7pj@?Sdbf2Ixi^s^;bm zj@+{aR$jq29~NGO2VphqzaQ;^V8JWvbKp6-p>WISGvKr**Ox}YD#|j4@bPXdUm-}~ z(e!BOo8?7hl{FEm3#Y}EE0-;Ny_EM6OVw1=UHwVXcak^pm7_d7X3xHk=v+Im*6h;^ z_kkNR(~?jdCDQ8wu3~?J8q(aV*GFNY`8&$hSmZQ@i=)K;HcxkOJ}-1-h)tZ@4gDX36;|qUZxRNjvXOK70wPg`+7Y+ zRbtUA5)PYrTG_#4!!{In{R6F{eg6&fn+Pwvr_a|vcTZ;G>ymPfNe zxu9feuQGVDu+q~4JOZw!?{_gY$R$MlzqAPkSQ^dIH7KqUw26@GpBZZC7~DBq&{)iv zDR|nMc5ErL zOlgavi{*`v?K!4+hxr>{um2KNA8Qo*6o)2^Bl2~GrfjdAj*OFB^afL5zA2g+M{V_Q zRy�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 literal 0 HcmV?d00001 diff --git a/spring-webflow/docs/reference/src/images/junit-greenbar.png b/spring-webflow/docs/reference/src/images/junit-greenbar.png deleted file mode 100644 index 04d2f6b14c51d09bf82a3f9057faf0cd631e3feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6236 zcmb7JWl$W-vR>Tf;10pvC1^Hy7PrME1lM4}SqK(91b2eFEe?wX2mylY;=vt)``h#H zy{cRF>i(FXnX0j#?)h3KN>g1451R@b007{+54P_P8@D9(lKuogselpmpVdW-v21_Y0C73S_vXV5Cc+ z5VYb440G#4HHmS8rgIcLvOf10jz+f$hN*uy028rgPOcO)7_g_N0KWK0^~EgOG~O@u zy&wTE+M!k_Ka$CM*ltyynSh=ud&T_SxdRPEeCdttXVcr)&*Qz8cdv~p5P)fen zlvpp%>#7zzv21ISg(0s9ooBlePD@1qlJIJW|wBd!{RGZqCyY$fr*&58cA3WzNwr7|pytDzE07>C53nVzPv8l zyF^OCkxx$Q3MWJbvhnLjCymfEWZ<;(NK@6-_$Vk(;i8dk1aH_ug86m(JxglT#?|Oj zEzaYxc~N@gsIVF(#-gxwlYNO1aSGN1$@XaQfQ%g36j*@B8pq2NUJ)3;g2gqO`hq8WdXFH;zv%{*9j%E=tZtORpAi?b8&`Uh+ zsBLsArdIo|zNOS2n?ykX;!LD;o7TPk@;nkELXSEZKzRF0H?c3FF^A`K%TV3Vsgp*clA zIr_Q&iI%{_@W3F+_uH^vUEDDOA1!J*l?4|uSjfw&v`2j<3Qb1IS&u74x1sJDhHtgq zQ(rIY1`DQEvn*9<+X%H;B!o5nk}3afCYunM$Th$%vPr(geZkpK5*Cl**!at!A;FT* zObR>SZrXgQzc;XNYz52rSbYd-MF;v=5Vs%Ea^1{+XhdY*LF_-X&To8SX^u31ePn&? z{fmwR+~m3|s%3!5V32HF3!bSYy$av3_uU3w+(l^+mH2nJ0+z&+opngeZBo> zC>C?Di%|y^fM|}`$EpoD?MEPU^$rWN8re&Nv=gJ6{8hAIwsKlhLZYd9@vB4GjMht1 z&;@Qbi5yc(J`P*=2jA2JvmCn3v!YZODt?a?W%H25UES*uzgwsVX?Jf`mh+MRLZfy* zd+^y}XmD1YzG&XFL0bs5#t~M-pDH3*r!LkvFC%`qe(!)D&rA2yT<&x=L1VdbGgLMFuk=n1+~ z#tkTXsbj}^FyWX}aPHw0P}sYN_+5<_XhOWPkgIJJ z=j7jDeL|vF#x_ZzD#HU840@+BgXE_fxgBA!(kh=UyK8%-qPfKib&_A;(j7Vbe~Nyx zv3UM-@-X5R~c`u|j%WUG#- zfu!9I0Dy<93BtB^MFCc~eqL)J8*`Y;BpBt2Jwcotud!hpG~H;Fc9XP5zjkiqrY&?> z3AVMi4ho6CehC&opM0k8xy+LHf4zC9b~ojHUT+*t%3KmhD){5WNa6AX#F^gfc=E!D01I+C>NQAr*kpDDK4)W_I5|K7#E!N&H?xsGuE{yQFE>Xn~~qeDMdGtOUN=sCTPP zKP@FGWL7kr+I-gTTNPLiE>uCTnNO~vTYq9KA1iTW(AiTkH{V!+5$GFlpK^v1!TGvw zGlz>$fO_{9>zZtHCbFYZex=u#>E)fwnt+_&JRQz-2bJq%klu?c2J4EnUMtQmRB#(_ zE7A1?Q<}zm7x%_*wbl%2{pMEkoJnr4zE#rpmb`C}nkyp(Z-}Lx=8SJJJbGzts^-McC~|tbJ1~)Ukh0*VAIxG$<NCte|;_O|`KpELU8Sx6u!l%bH9p<=d>JE5m+0qDVx$Nl}A%Jxp zU+&scyZU8DnS5_Hr&F|-{AUDK`9z*BfI&lxkb-ym>V8?Wd)S+$Rr{mjZwSPjQIczN z-Im``(Zz{1Mpx(pu#aHFHTgGz1wb$H0?kBvynF;$pJwoez|`1gDpcOrbYs5iUJ}}u z|CIB_3~VUq6>ZscmI1Fc3KiYky&vw@d*X+H`aFJwx!5r3m({Mc(-8utC9H0r{MF2) z@*+CCPgWs-a9fe5gD)L3KSP0qJ(!och9y4zwrXe2j4kxmOKKjUgIA9V zvviU)L}Btnyj<1aKBv(rKZ$>vRMdJ@Jap0V0!1$hp^iB_A>2?MM_cttUK95EtdVxN zBjW|)E$pl0@+4zpyz1%*4xK_cn`oOXEh(w}#33Gf;7qczhLAYq`{317Jmc|W&?y6? zwp|iW=6*v)_oeusrO1R!X?=gim5*#iwcaN;{wt$DYc=vP)YN2FyH?F)1QH8^5-zJd z43}n#_74vawR}C%sd_B-j?;{9?vaMR9@SQM4pw!n{}wZYdQ;oIEJ~=<#EQn^98QUK zT)g)d{QMPjYv2M33ZZcGi-l!?IBf3~OFF)qf-92U$#X+S14lZgTK8~|q1JhD=U6%G zt8<#kUyYsabGh#I@3PgMoeoa&OG=9@NTc-JdM_6X2x3%dMbp%H5PZww`oZ4T&L4WB z!^SQOU+I^zsZrHVH|=@yNI1u+FA3UD`Dl=G(MZfJA~;8C^?Pb~?ouyzahh7iSV!yL z{)hg_5AGA_C{(7zS*zcck)U4M;eFbrUWx*o?%ZSBlvN7b!}H5cYf;*sJb(cvl0%Ez z-2lN)5JO?FzK=F5B2EJmGn`c?rqWEH0O6-YLoLwc}Otc~6# zD;<=rS?Y{55e;rc1}JE4{=^#3)$#H4*4NXs&ZD5Bf_Hru5w*{9r1q?C$KWAIC&3Ox z{nBlcL$`kV66}5u-5;^kLXBHpZB(7QSY%HJnK*;)ZU;Wm`&wC0OTWtMdCRnJHTP8g z@bsy(d!=z3oNF^6;ej!|N-kc3eBR~204k8lWvb}3T%*R8WwfGfvliu0VBzf9>mQ=x zdQptGkkEc`q9wjMI_UghU4r{Ff`XPxFf`y3YlV)s;jQwHZC{n1ttkE>{zImE3)OT4ACyN6wNqtf+ zdkAz2RYbu%N<&Xl;n$dy^1Z>MZWv{SU-zlR@+rNfA0X?M`$dtiOPcC*8O~V zpm2>u#NJ4XRKEK;0slzu;qGh{M@?(=Px#=%UfDwWuX=$b*u@xZG_6d69o&NA0)o3Xrv$%tJfrL@!_Ob3{`IDAXz&NVc++n} zJITa(j1k7tC02`>&6+gJzB20F%|x;Tv;^kgFo5NSll&EU@N(72Q9s6#$0th+1lIkR*7 zcj4)8%mgo?ywVSOCH4+O`L6&}r@~aY==Ah?wz-+U4a-pd$LA;X*~hh#icDDmiefbd zY18srq{|#7KuXka=F*-RP(fN&3;SazodYDLS?C?LWJ@CSN7@Oh-N|Hh+40!9{Ih9} zPwNu!YvWlHT%#Eoftn#!nS4cu7dmcUMtN{(th2qII5jcxU4-g4@rRt%Ua}F;4xcj2 z(9vIQb>;$0V?@91tQ=#868${Ao8iYNca0<7^stL>c*_wCfAT=;FOi@t$T(CGTdjXb zLw++Oru4?wGI}qfA@iMEX~W-drmH-*dADA?!58LLN0L%OGmZKHJFf^+`dzjzegYs@ znOt~e8k?$vP>bj*#L1}>!twmMoeYk2G!7e$E{Gmxrd8WZ+bAz3E~eu9?1bYZ`X=n) zk`#3P)7>-|1^Y!sih9^Vu{fy^9zUZ`G_zM(PcHyWzYzJ*??Li}*Vm(W|Wy()k~x_L=zW!KUP+&{P~e>VbZ}h|mmrYkrUH%ejyAche?mr)8w_*I z%0f^sNQF~bB})GMVR)ZrTfxCj9EibP*PzZs>$qURMISP6P}}Ca`R)E-3D6mUOm!%t zXN!-4masc%=kOi-Sqq4iKXGuvR42;de(WrddFLK3q02wS3IlmTscl&A?j^LjCXm{Y zF;C}DuYSEt&+d1cLoT~xL&vo3Zl?tZuifLH#i{tU`8YZqRmRKF&zN?UIJ?k^1T7as zcPXkXDjYdLhx8NX?6~3lmnS)XuJor$cS!ExaKnz3t_D8)0Y8WJ*qAo~lr*BfwQK8a z5Rsxi3s$w4fATYp>V!oS>mPlTc70x0+>gWgqw%nsI}dfhVxA-1eMnthC}Htz=*_m@ z!iX((tf$oK&$+;sz%ubk^2{9@Zx8-UNSJ-&`$sbK7l4NZn*K_GnQcCDsVwC5L3=-i zK4JX+m>vMC6`IIr$Ii6D21Z!Dyzpk%*xM^L(EzvLlJB{iSB#E*Sfex5b&I)dx<36~ z@6buVLaUsY)$!u5J-ZWo*&GczJKK2mp^q;|TFl|`^|nTe{;UZ9EO{#gb`UVrXs0&) zbdL^;F*DL^J)1ItjS1l(l1x-A!}RU@~~P6eo# zqPX&vm^YOo`V^uri{uYHy&#P=5@gJb#(+^&`W_5SR7D?yYlLdBTynxmIG1mc+%L!- zMjHn{l<<72G{`~qJq7JW^+(w(j3+V>wh>`whYY0v*Kt$*_5ZZy0QWWwwm_DsLf5(&V_9hLJ=jS?F6Sw_7M~gvqYC)hAbR-9sYCS1&JH)@bZ@JA{)2fA3x*f(h z6Iew0w_rV;2oL#z?IVq*jt%}2WOR5R>{PFrw)!r1UUi(VmV4|Hs#IqT!_B>pyh@Ml zo!DzyzVEv8aILapT*y);uau3zP<)7yx&hc?t>Z6nW7qM zB?$%%sZ9DE4*~X-zb1>>3pj~(%w;kV)O0ljFb~6*ZJv}*))tA zNcg^mD;_mCEydaKJ$cn4=W>UyX>oFlU`slrd!8(bqW6^~<9)0b6SiZA#)lTRzs=_ts*>8tpI;;Rjl8KL&0ri4(l20kP=HCC z7$~_;geph=~g4q^blN`{!>Kuhr8pocA^m*_CwjFFqc6YExcRf0t!Y zTa|8VtPL%fD0WMW_y-NW>slmR{m#w?s*c)AFvy_|wRBR;&#@*LhNqe;645Mcv;n*i z&qMQTWNGFSf3I5dM!LKYDH6}uj&G?v+|aO(3jV!mX~-#6PLRaES)AeQ=w+ToF1Ekn zAIbjG#LEWzdq(nNCP6K~{-iM9Q2tlrrCnf_B5O(jMD)Jl#P&(6=5v*I6^rTMw^K&= zMYP`6bW!k7V{WLU>es!$*j6oULZdqY)b8AVe&zB$PN}j)E6pq+6A$Zi%<>~YJdroZ zF?+jMhiS_g6nXD$T(4DE8tW+PLM|~QQ zK}vUrX_hq{H{!nohW`&kLZ?qnclnf?UY6s544zEt+YT3$k|DsoPeT^z2$1@ZVDq2X bd?EP5%<80z1bsq$7XaQVsLR*LT73Q=5d#}h diff --git a/spring-webflow/docs/reference/src/images/logo-ervacon.png b/spring-webflow/docs/reference/src/images/logo-ervacon.png deleted file mode 100644 index 62b3b1e8fc3a2995a0776a790a45a98be86056db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2777 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 I+P2~U2F{W&_5c6? diff --git a/spring-webflow/docs/reference/src/images/logo-interface21.png b/spring-webflow/docs/reference/src/images/logo-interface21.png deleted file mode 100644 index 81889731474ee29627b4928568f67ede028184fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14330 zcmYM5byOTp^Y0f4y1?QD2<{p@xNC404-(u01b26bpo=?;yIT_6-6aX`!5uDneuww| zv9oh(dS=dirnAVNyIr6cn}7>N^S0s|4fovPNL3E7IqE*Xyu5^iwWrTVv;a* zGp?28%cpIP&>gRP~lIiQ

    jbzON$z^FA^d9wwsf*F1(Y05(Z0X{$V!NU z-7=0kEE7%V)oE^yyvMvxdL!8=DIKy35);!Pv>$72WV2w5iHM@oR)gt*!@yZiNlmrc zj#fgO6`Y?&xRN|L6K@hzqNBgMcMniDQZEyhPeSRbO&MsnGUC}fey@3sJ>B)UTuT-d z$S?ZJ*J>OlF|z;ZxF6%c&ZxV7x^fGq(y$0-0aN6O$c7D|u8~Use!#=Zv=V@nB}E8w zVBdE%NrYH+JDqI>Q~n9A>Pj^U{-Uu9OPfF;1_=Wt_K@Smf7gW%;uIOlD}|`QQ*f%` ziXbV^egm$FN;qxCb;6z~BvZ0prcHNp3JSX6P8q3+Fq`66 z7N{V%btH1P6TrF+be;x&%zvgw(~mGPLWvlO0EU-!-0-xin;M2% z8A;ngSXl~;Hg#h7LN#-&SYp7MfpZ_=+_>kX{s)K6iNlqzQ#3Se?CeVUY_m_iS2F5?M76YR?T3?sKXsbdO8uON~?Md``!`!xxQW zOEzUX%bP#JmGs%X{Yk6%&X#+LsOj_1R%Y!v0H+R#81lpjfUwo?M|(3mJ!+;J^+xoI zWB;FDm~Y3t^X$}g(u}U3H)#Jd|JS~4(xx#qeY7vG6cNE?%-wkuWx0GJSjh~}_|V1k z(PwRMgp}`LWhCv}GK-G$=~cy=XM$vW8J%U0T47o|Cf4YP76B>;M6xa*QQw`y!S?I- zEMa9%`@yTDl-Sr<3=9lY?fh9{gpy-ZH-!JdeCQ=OZ(l#bjm+#d?$7dl+U@*;U)5sM zkLQoaD=A+H1EPXA3`+Kkn~a*s3N9KH0~+N9^?_PL9BMf5ZE7a%S8cx<8t`TuwO%BY zg-Uys@h;h7cq(D~K517}kD}<2afVfakcB@0nBfh`&=1wtYh6Vuc4@tjj7~O4jSbEE zqThbG4TVBaPbW3Xl1$S|`K{$-j`#MHa2vIAQ3Ljo`$P+MZR=w$`ke=NE^UJB?E4%aMw5H(v3{2SdrHH4lSph+qz-*o7ni5Mxp2~o zUiZ#bzJ=pnbi1o@j@zqY(|DGOg+M_}YMBcrRq$xk2)UU?L}E^zj8!O*GklIGvX9`N z9C!Pbg-z$cu%YSOGmuw4ls0Coj&@Gpd#fxYG~L+v+i0?;EFU5#re1`9<^Lf@`b^R1 z(=^ZP?QlBr`!VuXt!e#fs21dJ)@iAdK5Fw^Gk*Cq{PZej^6E~5d-bmx1)j0!Mfj8j za?*E^J=CCG)Y<{`v~TqmxluE>AaNvMJo%<+&ala6a^Z)O3w6y-2O}dlBcmnHot1>r zw|_5(Q-v7o#nu_I2qi`O^s5BCt*!>*DPL||ru*;&j{DBp_4D)#6(?s_D{ z&h)2s-*GCW+2gY3axB^cM@Lf~9;Q^5K2D6OJEL0mBD0j!p$@_F&n_oQJ3~Y*!8@g> zO}JMUUu@bQW{y{{SM49a^b8KFTa!&%N~MZOYKSbM=qXExfW${4A1?ONcCv-tHgAlp zIv)vfX(`qkz=RZe3D8y$zpLO?-KrP5T;N1WUWJX@@&!M)!aCbbD)%s&U>%t<1uc+C zCazEh01}JktV2R((+R5q;!#AfYo6@v;Kv-TyN%9P5t9;;l9IZv4JX)%*gttS;OgX_ zyhCQv(NCcu`!bs8Ix$rsYwn}{m+!Z7?u#FRtzD`Au*SH>Ln`pLhO$<5vX>XTZ=K2Q`mA5n8; zPUW3?W#NdrYRlSZq+JAC{ezp)$saUmSTlc+l_prXv$s0G!kMQCU$iel|3{J_Fw9Nd zcDM3fhsLgCAaV)KlJY59D8-e_$@50&m3NLNv6??phD_8OfU%|7gb+Yklr@J=UB~Z3 z@miW=ni{EGrS|%MVw+MX9~V!P@+PNvW)s4Hu1;n$*}8hXvU2$QC!$mzpEXU>RNii! zScZj695EC8*#J zEUnzmFL35?yW`r&?S{i7eil37wv*qscAss1gnDF#{2VnF%z`_MFA^F#2ifsf6|YAQ zgD~77uPjFPT2?hb)sdgz!;3^jn#m<6`j{4y5!|n#MRE?LVkN^Ugz!N@mV7V6=6#mC zFQ#G~&5(t6Zrqz5csYhb983rd4yN;d#`&20PNteV`Qu%rqR{z8-RiMd*L@R&AI zFYf_PW@y&!xZ-GBnTX!r%y)rFM2b{Q6$vo>ECEHr1mv8BF>~tMWUD<|Gpbq z6mtdtFWCAozOYh2p$ZrZfuY!LA9c!F_kAD@VkS$N93hh;=tYWXj?e>Os^j9S;Ho>X zWelI```(Y`7GDW`N`4eL0fM*wO);WAM*>nGQIr+eVgS}?XGo$PZ=i{S=kUB+%IEL>~3Di00Ku) z4whL#t{oFnR;u@cA&6#0Gbtq=R+a_u6@C|dM=tDeC!{P%2~z!$E&_w0rOH{NYLO}e zaom3{r7U}8F$)zd#2jii3nb=qD_Lh8rl{sFc!_^HUF%mGWsxfAB5a#H_b(=E2IJgW zl@oHp@ZMv(v5T~tRAN~Mhv96Uemjr-pjil*(1OyCi-e&F0O2ihhM;5E@p^z97^i&z zK&2;vA*B_ zswIHS@gAa}s#+OG%2Vl491&U>H3xGfK(pS)F~qTgkv`|VugUCbd8%norNxS+3!?Co zfQamK!zKv8mOSBWQq#HN)~J`QKCFDw-z0}`PyM3h-i*d73a@{5d9fyPyY!1a4-f8R zS2jn{p2sVTcRYNo>d2C;-jBTcKEJt=uHHR3uSMQEXvQP0FJ8FMB`~FrFIIIvWbB8Z z^0#e$zxhadTRHbk+@djz|F=9X!T&>MrHG#nbs|qmv=>~hygULd~5|7T`-@#73B0Pe0i_^W#Kfq0_sg^jTaTw;7QcRqi}R5qZz^eMm^as>?beJYVr%r-f8V5tRKrN<=Jfe^jtSFr2P$; zs70H~Wblwm5pM3=-R%SxyKFU_*tPk~j9hT(@tBr2J?eri`#4Mt?enRRk)&+h2S?HH zlIyR0SIgEqWC_Co1QCAxA&`fJQ$S8j{F{sgqKY$-2sTFU7Y%lT1vAeJAQ!YqBDKGj z&^`q!sOK;CnA9x`V-9I0n;H?lORScCgEk#2y7NQpsDJo^I*#y@hHqh!9rViLHera} z`2s6nB*j}35{NEE3g0hsld&abcoJJU_e>+< zVkP^RAwaQU$o}-cvM7Tr^QLePvI1|&^?Z-t5irRF`sYf)5|5vl0_bW%cJf>rWn@x9~+uZLI;{D)d-j`}$jHOTVl2YRAJIQdtF}zP^@C1t_((fXR z1eMB)ma&P@4T>^Ll_K3g3XD4fP(E-FWdL=U=}qlJ;;61&{dR+?f=jr_kaKCO6BU0C zJ5RwR;~08dX?^sVBdfNOx~mQGFU)dE!h541bB?$|;XM7Bs9kmM_twrvVLu2QkvH{~ z9<92Q3$eM?a{smu(~PYn;gto{kP)4@ki(KC4P;GY(C!&SGgD;aiY#_ zwHaB0>L~s&PKg!PA4_Uk^)eM846cfwskTm3$CFsuB8aT-Qyd>$0+S`V!=#Y`fPMXO zCDdapueH9Jg5qfV?jky096!(s0TK#pMJ^RaC>LSP9a7gPQ7zJ~HTPj)I?hb7Zl(h? zn4+NaRrPZ=QfUM?A=VH@pM@DoPN_KayyP?qEx~71>svk~Panf};sG=h^(`8u4i9Um zVaF@fBr5Z1T7~@zMFC}=_POtx87Zk(n#rku+n1ygab1MVSdA;3Qy!f=MVp<}?{ZOK z+3CK8BBd&mj;&j3?O&}$VqZMHvVaHoc8u_7s?`OJPFcsDI6O|XQAp$@tq~gDP=Dik zyK*@%$JI|YG-f5sg7fYBsHXERdv&}K(3DR6&^#?PRWg!^!%dEbe%(M0vr5Zr|L?rg z$h$#8OO7Zf#V^-S>zJ4vtDc8dnG_8RoLI_L@B0Wc<2EWPj-<+%KKkV`IK`_d|HMq9 zf}cXnm)zl$@LNyA;-E^#W7GaXWl;I~_b>P!_@k-nf`UgH zh7-4n0eu~NjUrsbs9}r+}JCFKcZlFY&=Pb2|`l3t? zg5}QLnp{1B!U1kRc&Dk+s^G~|Y25ae#knc3uwGH1uHf|}dI+C&`io=qi?m^Z^yW&= zn830?6XcYdpcygRf-KoRiCJk2=%TyF@Q6$w0U4%I4mPH-(t8AWOml=C;?#FSmjh2~ z&zlehEf8j)*e*QfPu(p3r(BNA;>Zbnx*7P1{UGI>F=QbA7q{qnV3wbF=~g{~7(6rr zB%W+4HOx*eD-$JK!$<&+lG?jlw{UVfedO7#IC6M$r4(ReRyJ3$$nv+r9;bV3FRrqU?!{zXjWu7&67W)BVcz#vP&yLwre60(`W|6Ie72s=S|FmGdL zk`GH>PKO_x>89~XHliC_1)#xP-iGy(zxuyeOHw~TDs)ak(MApqMY(V6^xJr9uOqZ1 zC~%}C0gbD_Skn%RbAKa2G3xTpTycyT_J;^+`{sih9ife)g6%u2ic)|?`)+K*rdn;Ut* zX3?v&s#813gmT}xPwp{a-9<`HuGfDpD z<@GKZg`XDd&y)Ou9;V@ZFaE0ens4Ib`#vx0U+Wr+A0R-q5b}zCsNWUdzu3mTbR-SF zZYi}ta*>u(Cq6$2l6qM^r%tc{7-{ z^K{|cE{-Ha^@+MQxEe)d?i{()immPVtf}KX+BfwV{hN-bKfaGMu_==Hei2hq6!7Xe z^(N;q=&FD*>qhs{2H~s6=kc2X$X1xq$#2iJWP$&EvkQCe+|#LdCYHokdi22|Tba&4 z^F@1o_7R`Y&LYK zh`4WWjcO=0Kbjp8zeeBv6ESip_BxX%QctB90dAkE$_O9-cV30Pb z?;HmigH;rsn8YMv##WY(Sck|$V)yA`a2)w0n)6ckwj!fLL?=#yznOcCG7V=~Hx%rx zZtmV}mTq5c4$SP=>HXg9P}tSe@q^Ob2WTBchk}s86ReUU#}D4L*cV9qzMnwZ#R{@zeEr5W$DK? zhohJ#T1L@tc-@(aRVHF#<*5ww!%Bb0o)Su5Y$RQ z)VpuAgq__haPz`2@Pu5ieIv})xaQ^cT@GikX|9y6AD;?!4W@^rEI_8M(4_>bU+5(6 zGMPG2W9Cizk6C8iK`D9D=ZGY0=fY&@_Qht`6}sN^zqEAO8@6PJFke~tn^PX`&9B~A zkMXj&H%B|=iT;ui+ntF9Rwz=lU>BymYAoFMP`o_3{= zAKdeqT$Iq!qMsHp9%Q31v7SzkF`U{QDPWY}L$8O5Pr#DkS^t<3F}j(i5hjQmw}f)Y z!$Ml9bv{mx7_;dBKnwvUs>8y23Z6t6S7~^8w67OG+D5BkJK~G5Fju*=9}+~vxzVk$4Mv*UT7Zq1Y|v)KaS6z^kLZyYiE+>!m!rgE|=K%iNm@%>FO zmohe}09u+>l4EkBX7IQkleO}gyzIMdjUqZcg-4ZIE58g9?L8?o6EuHiv2<0Gx$IYH z-ZR;4>udHrc|RzX+`_MaDpXbBG%!uufF+-#E)VHO4nSgA^tz93^8qLP);s;O#a4EB zu-xUealgLN9)72NzS`aE2iPpTJ;t`5Dm@KL>rapF#Eu_#+~*2=Zj5%Z zKolEwx9>Forn^KR!`!}f9B&&~oBm`Sgv_*qNRgH;5-)A&D)R)nuC8rUFi znAKaMRh<`K206~Q?w_isdDUe7_j4`OFR+!>PwIc`wJoP&rBTzu3}aoAATB(CxQkd~`VYd>}W%EDLZ!>X!;Nm&h+G*IK%IrnUfb8KCLNxuV#- z7+v}Pu0~*qsh<|Yo(sTg2ZZ!-9fFWjNO_=oBTDWU4jX1duX+mTd5^?Q_{UgH^Oc3f zH|z;Gm@xCxkwx%kB>M#LBRc|YC_{`2v&;{r)u+Rh&Rb7-@MBrkbMNVID8KCuPfmV| zC&{f{zj+pdD*L1%BZKZIPU?LIKOZ62%G<<8pY4^Nfu%1*wiyJ=NJVjxq6I$3lOl12 z-YR4$>Ir0JbMs&Td~X5Hbm# zsdtW!v?-)ZNrez8u=4Xf-Ta-fl6XJHSX)Fiv6@?d?&luem&mv`C;S4t^eTJuz!w!49^m}Vh)=8c1Kt3VP^C$QW-`&Kp$5< z85TESpS&n3$H0RR%2w*v-MQ1HPs^hsq3UG*IJ0$7T&dM(93EL8)0R7Sc9!&nDN6lS zg&u|4UtcIi$RggHHn3p11h!;f2cFtJ)L(9vdd$G3sf5DnF4o}rNbwm6pJLl_RLfk2 z{kMF8L_9`;%aVqmYC;J$x1o;>3hi!(~Q@oc7!zQEtbTvFpHPfKp8^!6U&tv0Yy|~2Z z-XEgAJPaC4y`2oJHh<1H=zKnxHb(<&6MPbAiqF`O+Hoh!;b;|lMl)Dj&fO_7s;rqCE z)u$fu%EGnlwsGBSwxNqI@CKp#;$`6f-Ac$$-SntR>_<_~Bvuhc@fPXFW=rD|s9Y#M z^*+8>=yCU3b^xJ*0^R%I_WdP;PdwhYwP7}wE$|x&=4s%tBf*OX{S(fdJvOMSByUo+ z;z`dmViyX$zos*5gg@1dEFimW$F=ix7lJ~EBD(sa<3OS6VU)UFM^XT{`<#~a@oGAo zyY{z^UGo;tlnxr#za8JF8~mqC3%9F@j@aYdO=tc!nu#UxkiF>kQ53%xDwrl6HUz2&pxL!#a(yl5-5T0UkiWmcpa>F?#%wQ%_AJ1D*xs?vL6Jd z)$k@sePt2yd(O=io+F}J`r2zh^7?6QM;Da7xCDF!Tb>AF8t|YM;*6* zs`~S+IzM;EcO%jP!ciNus|y~Io5R3+5;_Ww-5!~9uKA9=)^}BTQ)2Y{z#Kkom|oSV z&jo48x#>WhDLk{$!J7%?Vb7}4&ZU6D@`|l?HC{mp5spY|va)`jt{rKiv&E{%xyM*v zI#a5L4ZSYMzYE8tK1U}FkkJUGWVW1{uZ^wmcFCqF4Ea*NrhQF_37}c#ER4|{L7lZ4 z1u8qsX^n{Iyt4RkN^jRf9u-~A^_Ok7xLtLJ3@nO6RdTj6iHJ_@Js=Z?7E|H}(nLmf z!_;p)YGD0~G9LgBODuS~$tFZirdIJKF)!7e?_lElT+w~&x%COFF*(Cah;|%3tqETI z9&q5&c|KVze173yl^Vpldf%2}@X%L88UkdJ!i6a)2&d(@+>P!STQP}tImS+ zU#e9W2hVdV|Kj4vp{{nZ7HckmDNv>5TE+&E%Y(}}J@+TmXoat%F@zj{9iWh}LZFfB z_S01c&Vv|p;|pQ1(gaiq`c#5_i^;M(L83D)ePL5fJ6e)>Fh?ZtXvt{U;@<*>?(CjcLT5=6{1E!3=$`eV)v<31r5K4Pv)=)ilCTrLf!@>iC6T6Q);!j z1YW0I>r-X6S?Q5MDHMUqa;B&1A^CD|hzI0#g)f#c6qWSvTB@EEt26$%2%lrr)!qBt z+&|ShDyU%cX%9V>4u>XFU3U{``ism2%*sLe-VT~KTzvL3N(NH3&aYp5)YLoU4hv0m zzDluf>i@*udUOL{V%7B=+_jX>0mp9d_97fZTT z?y=|#+5jYK!Hu!>7tzfB=gyMtZJo|{6!bTei5 zbH=2Vy)ZEEz7$WyWu);t%)|Mf_31v%>nLhoqqX9YsaAYHW`F+aSF^*{k5208<}n*H zc#4*0?SGjJD?$|yoA@oC$oFp4_gIhdoq?Fh;Dd7AWU2JrU6%G`Jt&m$M?{W+%ZdAq zUFTIdDgGS!?&B`A=JUmY?bB8WsV=)nE*z#7{~6F~xMCOHsBQ!U4ULO%abVzPa6_8g zjtDuP0m$ZoFG;97x6-&Xk=X~2AE-rxg*-~OYVVrE()dW#I`4{Ay-r1Pm>ZauD_6ZN_5;E_q#iF9_o@mzTiUS;|C!lbeN!w>fffU&URAL9b*~_@)mkJA*oEenye1y!VP-iP; zKK!tXwGyYhwMSE7v=Ql+$b)Ipf3C7^JN8!OWEZ&Ukrwitw~O@Xd(T(D{jTacklDHl zdQ(4z3oVNar<2hEVWvJzSPM0KpMS{-lY)G_viJf?)es}>FnU5=f6#Nr!i+vH!+4^n z<8)+kS5?^UNt0A>Xd`);#!RTudS$`L;(Z+8A~cq-31|NeeR&Pf2)B zbg!eas;=jo5fXL3R^tQf^@siEYBL9Exm)eStgJL&+oKs%G~wh!sXCloprRMBr}k%@ z!zRE)o12}z)@=0dr!>0V5{j}>y#*WlII1vjt@TkUT)$aX9z+D37UvQpGK}Y`R8G=n z<*u?lo{!S6Mj=WR-l||o_>`x>6rIG@w3Uqb#HUqTOGs3c{aTNQa zTs#k2;pb5dfr}p69ELx0Rcn_JBHyi{BjMCd%$$Nz7LuE~*vEm=8ilHkJx#mjhklU~ zH)CaIifyO3Gsih(3r@oP{Cvuvld9rJWf)Bie&>-yz^YLE5Ai&zp~{S8-QmKX;C<{G?GixTK_C}F(zyj`x#G0pTZ+-I z#E)xQZ${xeUA#nlR-Lxmq?WCP?s{K3(v!{g-*vD3j;gLLU-wbQHQEHGpe2dVK@v#O z@Z~17)E5QL^6Y%{lHKs=7okdmPot~8wm^pCOP;5`Mg^XD!K5f+Dwin{OrgIE(j?w@ z9PrtKH_`oBkB74`3FeBLUVox4d1|~`w1lkTyjp1X6*WX#%Gn8XkG<*XO z(((Sv%LU##N_Qra*=H`-g6Tx#-UnCecF@+8zI*kHy0mB@u)d`?-}e@p{eibm_)QG! zn$y7%&(oiqzuT0>By|MxL1Btp3s7_DSF_W<@!ynIlo#LA{E;-IpUy856)O%i(Vnwy zqSa6+*KKltUhA*ysCg%cz(pVE2+6llVO_pShE8TmEBYFnoq`HP+2Z4Fw`+Ps?B)yVfYkKR1(n;$&B2U7}FBv#RIpwsEHrV=*} zK8sX=g*dnYf26Fx+EO8lZT#;a} zleQ<@gC!!wb8n*){Fh}7c%;%Wey_vHuG<;U=r_Y3(*CFKL@q|EFKvfsX&KRo{vz-7 zmOf7Ayp)+ehXD?6d5ecr|K`9I zM`lN;;@UK$5{@W^c=0qZ_x&RC^vROIW#x38LA&R56MLZ>L#E%gu=~7VthaU#KAXn} z;~eZ%Yr1r_;u$G5Bk-))EM2f2=ZIFaJEoX+2&jC~O5kY#%A9UTK$>mQv>aWYWL60{ z^D#i`BN*!J4r~3OB5#-r{6RM(aI&YGRx=w>!XBXSe%W=`;_Bs9E=Yf&_(_`u%fmJc zCf9TlU*ttJS#0I3+Ra-@D@z$50)$~HD5a7qpmLLg-NF0+>t=Z|Al1kT=`CYGPT$0d zYi0@ZF#Aksr5X1CHId!pyzs;6UU=lxR}Yi%;-}%zu9IJTXgRe$S4hAHn;*=ToUZ>uwcSd5A zijY!NMWnPqAYVIiMxNJMX8+1ubw|qrX^xedXA>mGMDaBOj48isZ+%f)QKj@TmvAVr zSe2&ika|2YjFT{09lNZrpSGxIPPn1%8&^G0vYwq)97&AyWao9fh>AC5x|i&#cbFX* zJ7{|Tak;$ic)Q(Xm)2}%<972mJT~H2p0hA7Z!04PEnmxK%T?sUs4)-gIaWt|5IGOy zcV&slT(uq_9{twav(w*bW`e3iT6pew`4{H|6vk1xoa$qvE_mZnN{Wi|QA#h7n&?m} z;@^m}HD|M9JTV%nc~;krf(?f)YT@@ne3Grq2UWWIHdN**iAdGXKQD!!DYGBuuu0L$ z*BgH$@HXWp#2my#9uIiwCZf%cIc+|y1-=A7Rh?HIuu6#xX}y4AqlBrTl+rKOFao@t z%!2kWdW%Ng{Fixd#~6vG*=;)75_S-Yf@uq1LCMBlOBfKsQ>&xYC}YbCvip*wyTU4B+03Bc{;HHolgENPWUjo^ zW?oYG{lMtk8G)C%CYDs#xuaAyAp|dMlFA(w;b&L@*#0e%zS>a;onIvPn#VF)=1|zj zCe7US&95B61hc&Jw$TPHkBGGWJhXw+!+)7IA3y1{_-S#~?orpVNc8Z|6Al#>72)IU zC<)v>r}CJr-}7al}f- zO~#w>8*SEjg&IA)yb2aa5ad*4I0ne%SwF%+35_rl86Z9`t(v$5IlzQP>a?fRn*G!La144Q%+b!J0D^}RS{sw25Vy|tk*Ob_yzLA8pKw{hf+O@npr8P2e3u<7YS<`vmopL-bR;1`R zp8tt#Qc_UhOlMXQ%=b?U1yxSG5jESrZYx$AC;m|VJV={8aMaDH-_T0u=>O8gnZAv* zg?t=jPRPrq54HZKQ=(fWv#Ny9-Cd`%gEyZhB^3#k8DoMZnKBvCMYIFyhJNt#2&V|& zPE2gIv8>ly9&C@MFCSr^q!2tk2>tmdpv8ph)GZPd5v4=)y(cB{Q#wvJi&msxSxA$9 zSheCtPLyPdB%p|l!zagKW0fn|ATa{6LDJF+qdwCp(He+I6;=5zhAB>|BkNJ@p5tn@md;bGh!aOwnvge@#D@KGxKF#3(M0X$0J31jSf$v^v_i=CS?MWjUSv`**xX89l25;6G_N z2yBW4M0;wrcCwQIfM@-3ewxO8%?^Hzt&|A-$l77Sm zf$482nfeGS*e#9fLFII)A{o+EKczdl>U{P~qltKI7Hi#YY|2+jRGKzZp+p-0$^5lU z#w_b5Gg4DUw!pwpbm8mKD&nrExl@g@mv@ntSomh%bu3Ng&G$5<3`eYdFci%Gm%T^^ zCtBm$pG7>14GW1p$k2})^1&+*iahpF&<99cDNH^fC-q`n=o;y{BXltu73DToD?Sp$Qsk8*+ z?dipVRHIR#1hyU%*kF(<1Ul}Ob?quVlg&HV>9te2$2FbKZJU+xY1OtVv#8ksvaIR> z&>)_8QCcg%ThNYJ3MPnX|D=`5>+SKhJGm1}B7F9cOX*{=9bw(yr)i2;b{qs~R~j{a zC@$VcL7x^RwNPj*~VZNJoDq8=4NJ!SsA?E`!g?fCH;!WcCq#zdW~j!)+I-fQK=}iK8xV61XWs6#0o>A zj8@Q}5$MB&v?Px5VQL5i*7HsUa!lPp^lqN$%K>@ioZc-b`ygGN3 zbQL9B+}$jN4h}+VY9?pZzHMx580Q-wUD?+yma87`_XM0%Q9=GUr%wEn-o8)YUCF=N4~waR5UGA=FB9=P zUQWI_D~#yq*a|`t%ckX@#>SM@3g4dNvVI;hm3}lT4SJjo-7^3yLdLQ+M;1JWe!84i}(XX$+7v;zxOYeXCDR(UdpVV}*>o@%AW p{*grSp08K^P%XxIp*Q`Ek@S>(D|h|;ufz=?E2$_^DP|b({{XHHFWmqD diff --git a/spring-webflow/docs/reference/src/images/sellitem-configuration.png b/spring-webflow/docs/reference/src/images/sellitem-configuration.png deleted file mode 100644 index cb4204806840478c9b5748845b540fa452e308d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20855 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 diff --git a/spring-webflow/docs/reference/src/images/subflowstate-classdiagram.png b/spring-webflow/docs/reference/src/images/subflowstate-classdiagram.png deleted file mode 100644 index 59e3c466c31c3331def153a6b8d4a5f1b03d594b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3109 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

    =K~X+FHxSXdbwe<2jFSmfku&N%-_MIi@CVXrFX$ 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

    $UTakm=wKWk~k zKNUJBT{!!`KyK?w(nqq79-Rv2T$3W2ZYv9N7q$o7$XC-i*g^Z{ZQ+Qp%YYR2aR<^qKi{py-ZwQ#Khr2K^rquL%SnCh!W z$Am6JxS#5VTZn*@XlFyNIRP-o!8f;>=4}EXkv5hR7E;PUBo^!@#OEU2gXYn*@%ID_ zzPtiZl47$-WOIAlR(qdoes@s5Eq(@gfB5yZ#o$@-XCu+rR~}Z!zj1GR1r)eY8yO`l7>ww0o^Q4h6EN7W4i%QPnubagiEn1p0RdQtobG@RiU`o{>qta_Fk$M5 z?aqDVT1$#C^hAdrtyUDG91MYHQ`8IHx91Yhy0+s=TzeVw3DVsQ=0BwGWD~W zi@7f~YX7-%tlM>YoSFoWkW)R4qrwaIs9B^BGezXT5N$EB0MSuD00*nG0%&)^k^)$m zhu>C<4$va<(k)qEqt!7wV|QO877H_49FcBUb2y4XmxE!?M6Q)!$qK~d>;jw1@4NlQ zdPQC|LiAs1M9Uxkw5baxOof3Fw+TUWb_k#~#pLsWRUsgT^Zl;@O>#<(5lldIB)Zg7$03viBj$)5=^6)p4hGz!#czk-VY6M3JSEf2pU4f9Po! znqVLZ##2_T+-wA1|Q^XqM(_kZnB zgRt5*%(ntsx5<8P#6a4%TscNI`bcgf1U5bymI9 zY*x{s1HxwZ9%jHhIOQ*qrj)=#>??x6c*>*5n#kWD1fuwJH0=Xe*B*7-tHvMZbPR0D zzn?EwSeokkT4vUD&QerV)Zr2iyRzYhMo>7T4O43}`yGSAv?N=#`3&u+g@-&Kr4Dd2 zG{`cRgo161?&)yZqGpsZ)TE@=J5X^BEN{RL68;-f!Dvd0Qv_ICNl6eba;_%)dmcUMZ=;dD1DYfRRz-pf*<}i7nIc&lnCb^4{iY5R%5?&yc zUdU&1L^^r&{~_%?gPM%CHDFW_1wlc2@4ZNGQl$412qmHS7J3m75fr2&z4sa*lt2h1 z6zRQ(7MfJ0D+maPew=f^d*_}r_q+GUH`k94G7PaThu(+Ez; zOz9t7t4i1(?;HOAa$WxbgtNamGEe>!HvfZ9Y}_YPknEIyoCt`H+5|jS7{J*hO&j2% zx{HDP?@;Pdu`b7N{ReOKCHn6%#@djkt@Qq?AkD%F#=Xn%eUV}L$8=JiB|h;poz5TS zC)fqA3~WLAXm!2tomZ1TyvzjzSn$Z}ytH^LC+CZr`A;YD&&~IrMj81Jl4H>?PZgt} z5U?w^%1*K(PX8f*{pIQ5u?7aSw9ARf3@BPC4;eqvw z0n4BdGxt*8o~7Ypj_cE&bR2dmp{(Z zolpN?g7wd_|8+r*S>8b6Er#sKR=&LCOvB;iZu!dfNqkH2MH+tI1Fu-zsb?#=xVXej z%oF#`Z1J)@2No3~m<-Pj@9^Uh@n>=QJM323sNH_9*6J=a!D+gd1^RlPq&f4DCXiw3 z4kJIlMj6>5f4oloi!=4-M0P&&zq1LY|4w#FjzlLIm>EdJpWsR6=Dr)?*2a4geQ5Yt zR|$u>hh0khUgP`VO9cs`pusI)zq7R4vF=TH18eyQo! zo~XRpT7y}Hk9zY)nf38YneID;uvky$T>p!MOrp>4;AC7~M@|2apXZ+()FK~)BSFH2 z^E_Vdt+n6)gY31WIP=xD9CzCvuA?En+3_)b2L8V|a3(sX*5B{&7JEBaR(^L+lF1Ww zaq$U~`aCVYXIFwtUaj_>OIz^f#)y7ri)?2~_k%QY)xr8PeK*fBb=f35SX0rNi@2!GVi?+=*6sfSC7L zxQa=4cB(MJx=pDr36X@*TZK3;;ZJd%s$E9ud3DobLTP40UF76fw>FOMv=de}XaAR# zh|E*MiP7WhZp8P=!o}sFa~NGNEKIb10)Kjucpq?Vz4+>7guVm`ZV3*P^$V})$3&uc zmEX7z4Rl`Mhkl3@>fL-7ZPsi3LZFTF9JaTx|YpAdr2zb(dc2{rr*ZBZ>Ay?$!VyLZ$m#Q zNWTA}94x62g#1d>@-(x8x9#HImpe>(;4bqh`W+5_p7Pz%7(^{7+n(T=| zmJJTKf`W37brw4g(XS86@QP@6y1QPJk3vKUMJGy%<)=7@p>4l(TF+>0ewB_fH=G?m z_@ne4dm3vFT2uHL@_C>y-h-e!Ko^`(Jst?7ObYNm`ZIC6dh@@< zBP*QG1R0je)U02;`~EW;(%;!5^Db)b8P(QmT-Q?)$+k{`jjor|DRe8~v+;XrjDNm8 z>Gbu*O}hI47MX=b^sE^JY@SyeAs(;1?)6FEmC#T#-AU3d$*VSZf$m6^9QEBX-d$Vf z_mkEC%_4ioH#bOQ?xM{5-xGg>@0#k!6x6(_tvQL1zus|t71$!clM z_2gl?#M_-0l4^OW;tadiE0v3{l>=fjH(GY?CG3HR7*f7znZYmJcw5Il5LJ8uC4SL( zKzj`rF8wy2d7$yY4wN#%nx)Q zJ(01Fe}Jj{$KaYt=)vD%o~i#Ua)yf%{VFl|${qAEEZ&Pd+R|oENcR<&-<<#!&a)Su z23brtOy9%b;V75>`uy-gjIvhe4Hf&?v)!+cou2(RggCyDp!u2q`@M_sd|Qv2T8(EC z(Llh9w;BWHFVrP_lK#OyIR7gWF#rEvf(FMlWrByqtl=NZS0od9yC@%dwuT2VFyqj- z&|fUSF4k$d^S;V=PW}FUCfj$9-o5jC{5qC}p6R~jyJu^4zdXeL(Czv>FEyXvq6PK* zS|E96?ggRW4)3$8_qoF>bHciib@>{p-o_NkLByD@@)@||`I_z)<>vF zOVb2KeQD(fj=mz`qGl6InPf}#)3GbD1K)zz2;O^`W%ME@S%x!4+i+ zlVM?H)9eb7wZa=2eS@4?<)8Z`!=I4?m&?GH`hefh(S2XN%*{Sg;n&)HN8*FYYNm{w zAnWu*yHciS8}IWx@egH{J@}b>>+k(babUuJ&;P$t2l9WOUMu6ySzR~yGu|rsoLz=` z*@ou+LtQ2Madp?Z^}hUd)XvxA>o0?($lJT$NaC4B2>)^P>omcA`tsH(aj{>0Sxtug$C&}rSNwgt<_rY1Al;R!%4)qDlgu0z zY?9d5XdFF~&Bce#N%)Km%Td4S$B0DYcE6Jiu6sOt?oP6yu^S5s|BK_#sMlq&=9@MR z=QnCD=2PaEjiv?$C_!UOGvDBmt6M}GnSUgdT-vW~iSZMj!pwbyJ{H5QzwdgU!?ITd z!=lr|3Ijm2%>X5T3TmDT^q?&J9yTXRAS0n=1gjZ1N?&{#oHQ~9EqWU9vhRwJx$x)v zt?DbxcNT$86E{R zKhu^0=W2T59f7hW9_Jh+CX0-@*RqwU;u+oRZl1OE zGOPp>2-tJad|$shK1B^V7pp135>iqK5DwgJDdx7%fOi<7G&qC%B21d$<;4O4mFi!1 zD{JlB#P^M=H*?H?qEcqP>)!9@3#IaAm{6JZ17;?QTI@Ku78|iC37Qx~?&(C$be3%! zR(O($LdmJDaSxY;{0GmK^j;fqbmD}Xy zrAps97fx@oO5ZzAne*0OtDLIKeet6y(PH4r7>gqI&*(%DoJ+*u-I97-tivbCZC%Fn zO`U1|Ri;}_k;CP9OI8l8%g}bv+tREp#fy3@dOyViFaKE-oR@=luhuPYV`l-ozEU)B zxp~^IyOa#fG4%*;- z{UYM3y0Gd(dGTf!XLPd}!_Vft)(-CHW_$~ESqqzhopfbg0|Bs_66;y=xoNF?ELq1K zFMH>ZXNOs8fHEs(fDDn6Xm-A4gDK2Ad?2Szscfn4#(gSpoZhO6qiW~=0r0^Q1|v=b zLe+e)`L*mpT-&zBeXu90?U&leC-h2B3r|^)f1zs_?A>bXXol_YL^(O ziz0Z(+yzociJQCRMk4ZgKKf@I1><_kQqt>@8`e@6euSBS&;-=|IAMGf-uj$4jy)U( zq>mA9FY|)9sS8yEU>KlWH@WIP!r1gp4SZQyzAi7aInOeQ)*~+ zP%?!=pfodnU;m(*+f-LgtaDH))d9E736cl=po5RUX7AGA)6OW6 z%(Ab+C;0Y;liH}aTzzsqEi+g}sD7`^fBsB&txX~W zN`nOJg9WNu`hzb((@j(rZ9~8z16KY$ifJz-Try5k5~kdIo`^zBsS=cVm?urE-4K#jo2gSzLuMC{pa-T} zNj9|r^h=Xcop>H7hY`zhVn(H(ZUl(*T%Fj(Z2+=E;r5X!f zR37=(qt#Yhx^p{R6*nTvHRXrshGLoSve$j!b!7KZSj zOpF)=5|&iM(E6xUKDZ@zq*6^s_fkzJTX&&7oJ|2DcI@@(o$doduXRm@fcJJXmLE+D zel;mE%fGVh08_iRWOQZZIlsNnSlYF~+vM`yMaV0+Y|u4e*YM2Q7?gU9C7OS@zn@eN zS`Z}&Z*#jeI<^Tb!e;@*ZNsRvK6pg9nl8jjA%wv8LxX3E*0aJpGjA~h>mlRq77??QqyVJ3rSh{qgT~C&6ZAL z`sebaG@vtkBYrzMUy|~Q%@&O)@oDDFbgVoVUC~cPrHMpf*3-f70c-wzjV|B(b{w!M z#Izc{V@*OP>ITA2oQ0U}?3^w8;#UjV@8ls&hC%&hY+4mZLm;&E0{&8Ogb;}Wd!QAf zcZ&~)eB&qC1rEc%E$FW@#2KI=yxK zqp(@OZfcl1num9GWK!xvLQKQk!{>2vodr^B$~k@S0=2)%ptE*qcOEtQf;!N3&(K|q z_YjG8_{!wCg?92nfEQ+6%*p-YT`NbV+h)QZgN=?7b4H3>x&iH;#>0pQpZcUADk6T( z3hfdy@3Xn(a%0Xxj zk+COFHC{#I!@UT;>aSaLk>6gipf%@UF6w|039^0EXz``h!e7w+${<)h|K+_-Yi92F zO!|bO2xU1lsM5#HJSiw8k;vE1*Ex@}=vy|?bJuUHlotm&&?jq>ytr6|H@ER3hUo|y z=Qc4hSK~=h$gxD3@Jj0C3bbx6lRJYT{jNGS;rO-yKvqP4yzO4mO z4Hbm>fT6P*+V;O>mu%CmXBeH^_(Cr(LEB022IJKl;L8tVWqd8|h=5N0| zdry$kU5@li)As`=CW^XRi9(EauwcEM#wT$>EK)SpBdI*b?L-8<}X zYYUOAwk@Z2-IA=rosCG(gp});Vr6<$lU;SJj zDqvdl7Ee2k7;>tix!7)=y} zX1gS&(_s9pvWB*njBVzCcw<|;$PI(SS0DHpufZJ3Mp(H z$#vMccilpSE2c(*lEc7_|gU~^(8p43$-|7p>hU>F`93VSf?lYh*=v3!$mRJ{^J1scT9DhprQpf6y!x4> z7}f`E=oULaWoTq#yaw~nl-Y`0OO)nK^TPmy*Go8Zumfv#6yxy<7iS^rPslyr3U!Aw69;Volzh&_EgieN zBcFh16Yejv(vAli>kcCG0h5vvG=3tEqlReqrc%tj@)2wnNRDJxh`&<^c$~``-CkzK zY|L98CndzMiON`Hx1?pM`z4`zE+@uKD4p_qeQAHyK7!=4eSC@EA#`utM-%hQjINJ} z6}P5~7p5@?_4KQP(D1@xgF05VqMdct%yio{=9s2EpR3oTw7sgHh0IupBQp+0v{wu-`Yq=Fks+@wFY}Ni46Q5=uXi}n z2FVV0%&|FkNwS?(@&dW5!TA^1!XD)cQkKJE-j!?K9?P|IeMyQ#p;RH&_R=y9(jg~; z77IjI>vAobXtfUesLq+}uk;>7&ZvW$qjeHLkOitZDAWoVb4_gRKTCead`@Hm0tKp`xy}wunz#c->tDSb-bc#Ll`0ua zA#pct-7jK8$wfj1B7TM6{5mtMP6z@X@dmg1my5=AIN?Umz{I<{rZb`U2}+==iD?}wdZ^X+>cq0gX3T)2IbCI4Q9=CIkgxdrL0m_oz67e@*BNRJ78-0J>qRv z08Ey=vzKsLM)d4lg`UjYWR+F4LB-NOcF$1H!->T=Q23=1t?4wf!D~j>F4K;ECiT|( zy_6gAY@E6;jb-Qaz=GO{;Y};i19G0Gx0VWrbDDs5n|K_s0?P`U$jqFBA#gq$^$COW z8wG%s;c-4`<1E6Mr{D>q&%715{#>WSRzsfOFg|TjNAInkX{x^fsGxJn&6mgPG<2o_ zvZ`CsT8cMXlq~Esu=&2#JiSGi+T~kRuRosbFt@|tCV(BRDDuti#wC`2R{1BCWX5fl zlQ2WQ)3F0aUhkGJ5YA92xIx3P^0{T-pQt++YAGH|vp+vHp7GTJ8&rrfMT`f0!qDWT z8uq^;Vo08yNNH)AlMQj^_rWX-ni$wbym~s~v%;18%FN)IQ@>MPY;hWb;yPdkf9;RR z6CcH1-ObD47yNEpE}x>85|H?|FBTxyDRfh>e9iSR#TZ}|vQ_YudsMo+3F<8D(HpnN zn-X3fthNy|*kw1DaERp0U3Nw^a~js3Y^io>7n3~7otZN_#A|D;^K{_-cFG)qfO%YD z-)*YEWP**j3b>=2{qsmOpP9FQbCPQDSm5?Y$9{C3^$0QA;7v9zOZ_~h0g~d6lurKP zT<>a}!0+Ox?*Zu0aa5|CmB=mJs_Z>~GM3aTd!7g@1Ej)x1~URa5V3k%N}zbJ8t$pR z8}SR>^R`4~zY2s~)sjCpA)XVD?1YbL8ZDN;nS)1Vam738la8NAe!2$0a`d@KFHG~#0PX;=k*td z@Y9nmH$6vl_5$KT*IBxudZV8R34UO0^Wj&Wz5Uo~8669M9nR5bATx4oWL@?2IXNQ( zw7#MW5~{6QF{fr?L9T+5M%xqH4A^(!kIZ+|_Bv!YQo3(9NK%yra60#f<316)A!6>Y z57@ip6r>7!-_zEw&qt)db1GgGSLt9m{Ip7P7oiD^AkclG>G5?toLmgnHx=x_#?f+i zoNAUG_GGtM#AOwz^8I11!A0ozQ37*2&!YwZWFCIq+b?lo8l5Ztjz?v#DOuwo)ew3B z^vAhCnmfIl3nL;wd{9Hna$z1$`Lo6yD%w%4d1<#f}j8K53*R7UR z+`9#n9@V8OC0cLOD-uEb;L>C9C`qGkm$uGF)w{o7qB~Q4r|W&mh)*w?<>Zn-i{guF zDraG{`$YR_nSN>~V3+W{I2UQgHf-{E4J859L*Uukcqa_$$sSwCe6x4>IlEf=8zQ2R|20|=_1{>0gN^7+8xDXU*T;?2i%^Q*uPRAg( zfrtT(Ro)b>pXbSbNqH1zCU~Ux6cJjLe03ixX0FS%ODuVLNKXRW8tMSC>A0sP6uUqy zpFhc+ia?~|0t@ZDYyMB96?KTp>=W}$>DVt*b8mS0*2dTrwph4PT@s_%1yK33c?r#! z)=y(5HO~kFEWQFvu&x#|-1)iupki(>kK3c)_u1^JQruke}HgtqWi_m$=%c+n1Yb6R}?z+k!dUyD--6cD= z2i>%Lbzc`&nmI5Qu{0V=L8-pgv?o>ZV*Z*qG$IY7^3GsKBsmrsX~D9f9tk6KPAUZ= zJS|$T&m>!_aq)a})mNu1K*KHMG!9iN9ekVB$B1T0^2@!W{vF4Qb$w%PfCdL6-uV@< zih&t>c&P%4To&eMxBE?ApV4MnO!+P9$~xa%ikl*82<2#U(46DX^rJ};>9riOwyqj` z3Uf@3*{OLAGw0)TiR?%`@jX%6uto4@F%EcTR>P3Bi0f9l8GVw$&u z;3bry%5Io$A|y$4oJ&z(wQ_fu(8vPPTMUv)MgP9^s2X7cWkN-c3=^b z3qSOysB@&$Di>3#$HMzP%VwlS*GkH3Yib2BViZ?f7%zhuzfhND@=pMi;`K-U9sx1( zmNO%+Ts!~K69~4CWF%ns+b~Wrld28&w@s^yfY-`{@AHVylzy>R%}Xjtf)TMDG;?jn zc((9a`6%U3k z4Q-!f`7oC9GeeFJfjxoTerXlI90b!DNSApngFw`+&^|Y$-QvZLVaf&VL6CKun4f=Q zPJ$0YS;qmq8;Wd&WfES`r7C`5F5@OmJd=*|k}WUq3wJaBpp^RSwLkusNZn$w=8R|R zn#cnCmEWTnal-|}nFY+M10Gz-T>0_zj4Q88jqCiZAR-gh)$Iz>(gdJ)W;Y2kEY&R- zr6&3to{OCJ^k!VJ(IZfGJW<$kj>5~|j{t0SZp$gZ<`44gt{lj6lN_NX3X6%!wMee% zKolM%U&Y>_RP>_8N(@XUQ;tT^-LLsbSU3Q!C8T1=OpBteT} zGg{WgLg^?*IE>_IGY9sek$l+}r|8XixOhKTe(?=6n&UYw-B)_32CblPc9dktMp={n z%j5uyGf!%musbEs$A?$a5$ATWPRqLaisBVRklD}MM!hh#)%q)T0~eJQHd~tDo_dYe z7%_(}4tCLtIMVR)z~|M3cTMwyZQI(RE6KqtjwR($I*9Qe_A!vWo{pQmb5pBsS)kEF!fIXm^{J`M~Cn7QECJD@UnbNmsQ z3zIF#K(yrSi5A!RSIl{~tKnV-&Zrr2l|%C}n8O@UFn*_|Zxpp>ikf6Wc5+4*t}4sp zfZ5#HcZ{q{-;k0M_c(p?!{ek2UyzE&YT>nEgf%ivIoHHkd2W`BZb1i)`(LjPn$Dir8s`x9B)@^a z!dOyL7#~k1`z}`QAp?wfc6g|Jz)bwcQ3(T()Fk0V*ti}-7nojzT23+K*At0IMGF&& zfnal@xj4TMqA2H9pR88x%1EFeAUxkvED0Q;xJ7+}<3}!ad_PWDGUzWzL`Od9w-rMp zThz;ah_f4;q3#oVnx9-C8ORLi7Ympz`sFh-H~)~G>4tdO z;_89R6dMw)M031fw1P}7Am74J9IoHEuND$b6oOrN^j?@+)Xt547l31DKBM$OGQ|Ev{HZ+w!Vtu% z+djvB2thN!wasUs63q4ob;iV7kr`YntWq|EMvC`$e;P_3k&UT(dDM+?BrwbNsu)bw zK@xKw-_x8B6wD}8EE)anU!yL?3-u5an&n&OQoEfjnv{N& z0Z%H=%b*}bf~eR~A&Y@V^M$o!EzunW(BQHtnW9Up8(Lup}A&p33Fry`DN*?qix5vnjJtjuUK$MIAv-zdihlrGStkyKMFXDLPnMieW8JU3Yhe%BxdM`o{u@1 zca^sDtE+GM9iyj1-;-J1x>mJcbtDjx(6XNu3sDHGt%xRlc$RsOEu|5LtHvxt^3g9* zhM4vV^9;U>bBLUS*p_B6?`8nc4%RE417R;aYUMlA(RlYa#-N}!rl#{UU8)km8rkH ze{4AUdJc$kzG^xJ{q`e?CE_i07%+2k>gu)Q0yVhOAECUTWIrK8XeDz7Bs(V?B zCBCM(-jBk4dvkuR1nl&Na!NLkf@yD`p(^$bK8O-(Z!+#bGVU);$>CrjNG#qX^avnen_b8x$o#V0-;et>ONGi(|N=H>d1&;4N+)1GY?3*X4oAgPMt;(ymLP;VMMiHw_mSRNA=yjG#p~6jiu9H z*{XmRp&r$VVoo);C~^>^52|75k)g4FH_ zV`i)mo!&PxJsEacCMNa(Jr?4}VkYTw{pRi`NN^AP@L-7D#A9^zK~(K2$(kEw`Ck+6 zFRxoVIw+}+T0(+wmsp>><>FloH8_MlF>sR^iOF^4BWy6XfB(oKbADJym8$(t87KD2 zH#4qZgexY%qnTnEY;;cD>bF8s(o=%wGP}6FhPRkF!gL!oO*qIg#4rS*kCA2ejiKw2 zKt63~xM1Q55x{QpK=jgQ7rTOzVf}?=_aIo%Nb-lw&b;ne0_63acYjQ!P2u*kjpOqg6TO@6(+nWbd(RxGRNk} zb?~|#NW9&!n|;}DWmdV_=~`3HPlSipQ+;AZKJ$A&ZcfQ|cGf^2)0iXh;g#OYk{d{6 zRe2Nve2={b7AmS;;yTxNPv;Tfr-D7knb(-q=Dv zv)4U(CZ$tOUHtqe{w~kR7y~S`oe(b*l(_SjS>9eRixc032fhLzYkfaABYBg{G#Wj6 zmMD&atL7OK+h6v;4F3|J{4_^1%7E<-vgZi%0yB$s_L0>G zHlC#E7=GtzK9lo6qib@OnTjdO$dT?-a4i|XjB~1y6kqj*n94RejUUJ}o0*f1f;oXF z5}qD_dFfF-bM`SBLAxQe=sE?P5m2|gnQF4C9_njCUM1WIw8L(HbOq6sna_n3Ks^{R zaZx2IJTyt#K@I1M2Qs=3@>Rc?9g6qodd7;QZ9#`vW1cz+&P)P$s8xErZ=`7jzKW1u z7{tSkJ-=Ugr`cyF2B?|M&H`!VI&XenqX8By`MtLLkr-AKyAG`<$2xA5?&SOcn^+iM z9b!vl)hgD^)LCb@w#W_}J8yNK0A_*RGImkOipr{IpQS>@4mMBKf6>y_=0$J0;K6&R z)v3(23*zD{NDrmTJUz=ql3uIG!%9Cy7)wEe;y}wR6v0vH_Ng-Zhh_|-=i^fLJe?Jj z-nJfGxx7a%!1d$>TFoCk(J;?Q`!D6ds<OqL&BI-G0Z(N#OIW1dkUtBGU1dV}O&9P_EA`1(=AsK&rDq`^Jl1G zv3|9m*m-|;EiGS(>yFgE7`AilOWR~fq3#h%A`L6NxsFWF9JO;^ZGtYls@w|&p_mhODL?jFwp ztCp<1ibI14nUsl(8fwl(rnd?~SiV~_{OQ88OQQ&E3IkqZRMxKC(3RZA^L;EL!18Zb zmHiT20Y@5Qp*s78;S;` zvv0a?`d?Y6Ay&U4CuAF&jA74GP7E`NO2{ueN^0Xr^LCk|^Gpr-a@ly_Re)G(z)mzP z6^&rG9FzON+|Tt_@7naxiTxGOOeI}g5M7RqkcR3uKqm0YV`r{^=;wu)g??s;A&s$h z%yNYE7;My@)WXHgC#)8c_W0UiHrz>zx8BD+0kQt28T*qw|2S7p?n%rsc;pAz zsJXR073mP#?|frLmwVbXw6PPq|Kly18!ThdJp)`O4JeZ_U68!^nI2iGU9|#K45CAn zgvb`-N7Z7%%nW&XolIb{)Tw>R46z>IFj^EU6aI--FjJgceN?^^}g|y zX*EB5)>~^DY%iJl69G)wQ#3;ouGZM>mX_8_XK3m4T-L$7eLOu9=k)v?+{wjgHnq;h zWZm^UqqLqOhuqhxvy6=3=PoTB$G+V4{`%eOXZD@C1Nh1#PU1yJ6cnGVNmA&(Y;a5o z+wps-(XG5qPd-y%~eAaL-Zt*eit+k1@=Z?a+h zdvwDSZ7mf3q~Vk5ralfvpLB!>Rc4)RH0pRWheYEt-x?#~*agvQv`UGu!k63a#?eB_ ztrw9+H~Xi0CVJH5GgzLN+9Rd*M2ecVsoG8eU5U9SrpsBOxj7N;)aH8g-HGx_o(bS^ zyYTk|nryQ7+g$wODdT5rZGof+zF>iJ_2#g=?Ss6;z6z%<>CYSXI(C^s#?&h5TGxRL z;im7@RxQ#!zwp@346>7P!YgSq=3HyRVj7jqFVC^FemlN+9k?noD0OqLkrnt99Z?j;X(3P?qLbVjabl(l% zLs6`JHXkC*0ByCuXPq)zxpw91TA6U%s;6h^Dd_jYdHFq42Bn$`n;%PMam*5NufQ_C732~j>6XlqpW?3hTAyR(&H+Pb5YXhiPT z#&3$KXT=y`%&AcZ9E#I{O&HwbxzcYGth2c%lrDmwr=+Iah%Qi%xEdVe6%S^sS?8te z>-bGUBbwFNc7W`Qp)yR562R>HST>CsTH48iLA`MaR)=dma|O11!4 zfM2E7jPYBKKphhPF2FiJ$oBGKN&6e)S+AZla8$(+l0nKhsuh`Rl>XLxH7aO{JTBa?T4@;BKz@ANz4wdRmG3FJ zrpNwC{cNV+GMHHxCU!2Igw9QP)zG*ERo3woCc!DjmwcY??1Do;C>FZg*90wVsWdu; zETGvtOQt@dTNgrn`K89uBSp#&jWo;pz~%c%9NgXQnY39)BIJiy3vn!PJMFy2fFJzf zm~@F1GzQ{FViBs3#C}yIIJ<)9y6JMTeK5dzV9ap2$etT`3I)w=3VYqc4C;1CcUi9K z?C6*V`KNQldIFqYPx_?2cMz>|+*wgURuvU`rB+ZVS*~jkP?IsW779=6{v7SZR6Hrz zs+aNg%209OA9w2!-wY;(&a~f230m@-7r73M><5F~Y>))lSW4Lz)N2k{YroI5x6z;h zzgu~m2?)v&O9dut09EhX)kP#O4MtcfZu|ih2)!3tqj}sL6I1F~N-IER?HeBO-SVD` z?=3ZRt_ILjt>yKRZc5jRfB-N_w9d!GMfq$vSfP^lhX~7_89~|6l7+v0?c-&KITfD@ zW5P&|ZD?sji`IuzSv(d*aQT{!Idk_-c- z6GzqFXdsa1XKxp)!E8-E&8Z=3OSvt8uK^-`-&XQ6A_m?oS7C@ph$CNpB^qFcf;n|c zeGcn@6)oXJff!+*Hr@bFUP3Pbr^qsA?UI_nupMBTPJ^rpeWr<0E8_!d`f!?1?3DN@ z=D@?HvkF6+#&vFYDgHfbr7RVTeKUvqdcQ?b9FP3$cDRa~wRJ3*?WuiFU#@>^ETaPum~V&WJuSW4zR=cK zdat+paJ+nVXpY}3B*Y^!1kt?7H9-zc2Xv|QpdL{&?OYUk3?c}|UllD51+xE`1<}4d_r@4c zcWd%6(mfwG)IJK+g68vj>oBS=+TpfMN9^UA^5Oa*Q)^4s4+Cr1aF4w7NDo}O%_k)-Hv4KM^uO+)f_s(^)A=dLAyoyTr;i@ zTW2aXa`YJdg%~LcwT?*Jjs`Lw?*Orf7-)^d?Yz?`UCqRG8^oN&aZ4O|qjIaB1#gvm zvzRM6-UtwXwa{A~z0Uh*r;1%Y$NJjWBeDnr#_)REKXzy;O3_FQMM0$fNk6fxkOJl) zaDZ`ycbj&}C+@R_uA-_0pD23Rl09 z=_Tc0^I)@7_%a+v3ip1X9j<3LZc1Z~VN7dnzvJ6%f(tcjp`#pQbDtj*dMo4!yj;sI zn!K^WNL}~aHa)!s3sPd4!tUN0nZns%})Z&5XOk|jE%th>NewHJo;nPy^>I%eUt9D z4ZAoyyE1;eP>Oey9}i5oVs8OMrS{rSq7NI3VZ(NTQO!7y@A^_R0so@p$a*b+N}2nM z1Dc#D#=FMR{4-6juJqp@UQvX3|H}>D$|3)*?ucu2chArh1s!8tsTX35jH&Gsf>M8R z{&Y&RUikLiyzsbB^2nc8i-%I$@9PNvv)nGedCf!q5hIieT{?V)EH=_L=Xy{8VoWvy zk#Q+)U9DfZIiIP{m~(FRver=l}h}qpmql0uye*IN(Hy#O+k(s(@qZjl2j37%;m>rxY@d9#d1OR z897PMlRT5EN4T}c`Si9bp*(~gTR~yKv-3^)u zx=y^5Wn?yoVgTbIXgTVl841nk-4Es*etM*apLY*CC64f&95%Ygs19z4^xihL{5XH4ZPZT;Mrk8gX;wsU3BFT}VnRS(Wzvnnx)68lXfj+~h2YKYqDeh+u< z)O+rBRBkR2(}NQq;RZShPVkDKjQG6_qe==hpLj9?axjY-Cm|T1v)+~m;1K*wjS3pP}I_I2R6t=R~tjM8eR4_v1{mC zZZq+y5;S@Vr>&KWiZe>dzzpq?#(5q+7|1Adlhzgc2ORG!a zP(74{RZTbXzpbf?ny96Jf;-HKslB#A^V?{zpU$CZ^bkK@7g_gROXa%BYifGCs@lQo zuZr@fNgo;Ii=c1rjW3)MukSVZsu1AZ8}E`IlAk>Lll%<*e+;FZ=)AHYm-W>*Z0FT7 zN%ZHdk0ChCo-STw%WFLvZZRvqt;eHZ$uk3Yq#5de_k~Ox-G+1(`ec^qGbA%U)ib@@ zV}Egy&b;tHgj#lbgkAS3{`*?V{M!V`Urx2nLS(mc|KjizpYZ>Tis`!lKw-sO`yO^3 z(Q5C3gCoKy>Av&_Q#^3APL=f0BP`?3(ag_BI5Kxq40%4$;p+|aK^zmuV?>&v)2Lg^ zM}dc81sYB0rU!sRKaVbx2%a@(x^LLsR^K-}>W9dCmC9BvT1cDY`+1}rU2g;bglE&l zjxPHa%h#&PwEihvUMc@|_U>bpNvF42XH)UuP2Zclln!6Pj-W!(J>=P+dPhR+bFlNF3zh0*6%g2dSywcngp2&jKoF!46YsF#n z)lU~~n5ABDyxJ972fG%0cSnW<9v(jf`GdaVgX7c(tdrV(4Xg6UAp zsF~_!ZA&`|!L%remWo!3Ry$hz+EKSHN-KypYTwFKN`k}|rnU+qk;Hv_@7(9P*L=u* zp8Mf`@%??D|MENM{LcG+_?_N3ak=W^B!?7|Mgv0H5f=_7a2G+EoA55-LZ6a~B-;3; zro+u{Cpu-`2q_63dfk++&QlHcmMV-Nm<)hbK^Juom{(v-pEr2+i)Jt+t#Rhb1_lvV zP0lEIzYa%1EO;6*2*x1)El0>pxV613+o5nUB0ID|!Ostv;MLiJ$M>E$Ik%DK z4K2kEdV>*D3anUqwd-Yhqh5Ta!vXW(bX0#Er3)*X9LE&LquYq}*_7fKxJwRw3lx;v zqy(09x{HbFDrNx}!tTw8I<}Io<&fR(3&VCHncH<-!RxDTqpw~VkA*XX=5+91WJpLoxTtkzksg! za${hE>CO6%1&VC^Cw+oN$ zwnHiaG{?*jnB4(vTKJ)BA4>al`Et7TL8g~rlkZ;V-RWt?YROS0mt^0>w zQ(16`pkZMTYrNSUEQsL8E=b10S1QJfVV|VObFIEdXwb0bS$m?PDHYe{%TMIkv<1MP zCoQyE1rOI(=6xousG*XlAGr@2hZbC02Ih|RajB*tTYPj)WZn7t91E<$Ho^YGy@m60 zxxWPNW8MfUWBJZP)C~m8w<7~~`po09fHNDV*8xDNU3sB0{3)R2*bP6VlAmUYJM~1-h5OwEd}Y35N0op$Tv)~ z)QEuv5}xW!39xHZKdos4OE9u_iF}WYw)Kjq4JTq;Vaami2L!8OEt0FBoQ^RoF7s@M zfBE8SYggtdJPJmz#1oWjS77plyYO@R?BzQyD&=`3537>YcZM{eZ7!GmQfo56Pz|Q`{3lv2aZia@VsaglJ{|hIg)&tHmcXX_l zn)YN#BWd|TFZ^RFO>kdVj^aMHf7D$Em_w|{n+Kv}lF3L+!Rj8viC7MlCT4z;XhN_= zFmp~O-Lr@H$iDK(-B6(LrGdl331cUDTS2>8lUm2K5uj+@Pw&Z8RJVtsnbsPu5bcy}OZSU^EGXgFQaPgi0BV;O zzw}ydQ`E-mXe5g)#EJ}>lKeKE`h!C|ZxCQH=XuEeIIw&4-Jm&5VD~TPU?8dKN(Sv4 zS#MGp2R&wXr)M}cPwTk@EjbhD(c!jz1G+2l5t%Jec(DqOoFk51fp>`Oqp4Do)!%~( zh!`|~(VFk6N2xz*a*m&+!L$iwoeyzgb-nQNMh-BIicyzrSVFJXf)3Jj@X7A?Vm z3_CVsYG!s*hA_unrIDNW17=sOvv+$ZLu>=vo#UTb-$j}SKMGbi0(WQ3wJtkj{=(eV z0m9>#$GY3MQ8L_G_SiUIYVIR2y(k+kxkPHZGqJtdC}}ik+O^CA<1>O>4-Oupl(#%FXhHvX; zG!}=$1f~#Da+T3<#tS3cataDE(bY8*5-XI50qlUM-lL_N&CcxZyxj5{^JYl7Y7z<^Gn+A)QE8+;aLySfDoCXYEK6vv!)IrbAI{oCh{Pkvl>wMp z<6^JNqL&Bz$szukqCTm1qULBwI7LB@JvnIZ=9@-TLQw7*_}CIt9Uq^6pel3p{*AxZ zo^%;I8#sv_uk;LZIb73uNv-GH!7PRS-RsA{NIve=C>+5hdqoD14WVH--rQ=sJefPM zzZqD%Qt}dIUVV6d;zV(_r@Jv-%Ml}ok9|+g;JOW-c0Uuy7)omxxLkL|-Lgc4d-j_C zD*Md}|Jl=@zIIpBP6}v`!nby%+kk6Z*KT3=T)TZ)e%Fk#cQ?vVZULjaI#34u& ztYjMocNN_~l~)5UCbo;jHLw2Xe*nlEj9+|4%$(doa&IRPe5zEH^#WTI`Wu#;XY^2c5_U>^H4Yni{NbGQmuo7G6qEp*AXy>f`1r*>{) z2NOH&_`m2x-a&8|WdmdesNNRnn_Oiqy0J-oCfN%3hskdX(A0 z>E2lG>4oV<1jBzS>G{&a52GK{=xV_+ z6r{X04gc2nF*;68Pw&cbXSeElNywAxA9p>9c@lLLS*fh^F`9Mw)VLRTkB61pp@B13 za+m{C$c3YKT*7LG;0h01j!pPH)Ur)O&DL0D^v$P3-pIsV;df=Mp3^$PSw8_gJDxu) z2*SJy(D?vUD&-giy$g#*Bv)W z7sykii>C2gp#AJ+Ck=8O3MxR|Jjj0$#^2ZZQ0;`7o0EdHdq}zusHrx7E&(sCy_W)k z1g${e*3CL&xC=@l&-xrGT(>o-;3Peo-Mx)of!S(tIUIxzHb7~|pUbnZ-sDZQe@ UB)331rLx7y38nflL1%0D?;QyU2><{9 diff --git a/spring-webflow/docs/reference/src/images/viewstate-classdiagram.png b/spring-webflow/docs/reference/src/images/viewstate-classdiagram.png deleted file mode 100644 index af7fe3013ee7be50f27b925fa4c3c02f889e1329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7882 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 Kqg2cG_x}JpbwRHH diff --git a/spring-webflow/docs/reference/src/index.xml b/spring-webflow/docs/reference/src/index.xml index fa242452..9ea2038d 100644 --- a/spring-webflow/docs/reference/src/index.xml +++ b/spring-webflow/docs/reference/src/index.xml @@ -3,20 +3,14 @@ "../lib/docbook-dtd/docbookx.dtd" [ - - - - - - + ]> - Spring Web Flow Reference Documentation - Version 2.0-m4 + Version 2.0 M4 March 2008 @@ -54,11 +48,6 @@ &overview; - &flow-definition; - &flow-execution; - &flow-execution-repository; - &flow-executor; - &spring-faces; - &practical; + &defining-flows; \ No newline at end of file diff --git a/spring-webflow/docs/reference/src/overview.xml b/spring-webflow/docs/reference/src/overview.xml index 3eebcc31..f696003c 100644 --- a/spring-webflow/docs/reference/src/overview.xml +++ b/spring-webflow/docs/reference/src/overview.xml @@ -2,630 +2,50 @@ Preface - Many web applications consist of a mix of free browsing, - where the user is allowed to navigate a web site as they please, - and controlled navigations where the user is guided through - a series of steps towards completion of a business goal. - - - Consider the typical shopping cart application. While a user is - shopping, she is freely browsing available products, adding her - favorites to her cart while skipping over others. This is a good - "free browsing" use case. However, when the user decides to - checkout, a controlled workflow begins--the checkout process. - Such a process represents a single user conversation that takes - place over a series of steps, and navigation from step-to-step - is controlled. The entire process represents an discrete - application transaction that must complete exactly once - or not at all. + Many web applications require the same sequence of steps to execute in different contexts. + Often these sequences are merely components of a larger task the user is trying to accomplish. + Such a reusable sequence is called a flow. - Consider some other good examples of "controlled navigations": - applying for a loan, paying your taxes on-line, - booking a trip reservation, registering an account, or - updating a warehouse inventory. + Consider a typical shopping cart application. + User registration, login, and cart checkout are all examples of flows that can be invoked from several places in this type of application. - Traditional approaches to modeling and enforcing such controlled - navigations or "flows" fall flat, and fail to express the Flow as a - first class concept. Spring Web Flow (SWF) is a component of the - Spring Framework's web stack focused on solving this problem - in a productive and powerful manner. + Spring Web Flow (SWF) is the module of Spring that focuses on being the definitive solution for implementing flows. + The Web Flow engine plugs into the Spring Web MVC platform and provides declarative flow definition language. + This reference guide shows you how to use and extend Spring Web Flow. Introduction - - Overview + + What this guide covers - Spring Web Flow (SWF) is a component of the - Spring Framework's web stack focused on the - definition and execution of UI flow within - a web application. - - - The system allows you to capture a logical flow - of your web application as a self-contained module - that can be reused in different situations. Such - a flow guides a single user through the implementation - of a business task, and represents a single user - conversation. - Flows often execute across HTTP requests, - have state, exhibit transactional characteristics, - and may be dynamic and/or long-running in nature. - - - Spring Web Flow exists at a higher level of abstraction, integrating - as a self-contained flow engine within - base frameworks such as Struts, Spring MVC, Portlet MVC, and JSF. - SWF provides you the capability to capture your - application's UI flow explicitly in a declarative, - portable, and manageable fashion. SWF is - a powerful controller framework based on a finite-state machine, - fully addressing the "C" in MVC. + This guide covers all aspects of Spring Web Flow. + It is organized into two major sections, a Users Section followed by an Architects Section. + The Users Section covers implementing flows in end-user applications and working with the feature set. + The Architects Section covers extending the framework and the overall architectural model. - - Architecture overview + + What Web Flow requires to run - Spring Web Flow has been architected as a self-contained flow engine - with few required dependencies on third-party APIs. All dependencies are - carefully managed. + Java 1.4 or higher - At a minimum, to use Spring Web Flow you need: - - - - spring-webflow (the framework) - - - spring-core (miscellaneous utility classes used internally by the framework) - - - spring-binding (the Spring data binding framework, used internally) - - - commons-logging (a simple logging facade, used internally) - - - OGNL (the default expression language) - - - - Most users will embed SWF as a component within a larger web application development - framework, as SWF is a focused controller technology that expects a - calling system to care for request mapping and response rendering. In this case, those users - will depend on a thin integration piece for their environment. For example, those executing - flows within a Servlet environment might use the Spring MVC integration to care for dispatching - requests to SWF and rendering responses for SWF view selections. Spring Web Flow ships - convenient Spring MVC, Struts Classic, and JSF integration out of the box. - - - - - Spring Web Flow, like Spring, is a layered framework, - packaged in a manner that allows teams to use the parts they need and nothing else. - For example, one team might use Spring Web Flow in a Servlet environment with Spring MVC - and thus require the Spring MVC integration. Another team might use SWF in a Portlet - environment, and thus require the Portlet MVC integration. Another team might mix and match. - A major benefit of SWF is that it allows you to define reusable, self-contained controller - modules that can execute in any environment. - - + Spring 2.5.2 or higher - - Architectural layers + + Where to get additional support - Spring Web Flow is a layered framework. A diagram of Spring Web Flow's layered architecture is - shown below: - - - - - - - - - - Spring Web Flow layer diagram - - - - - Layer descriptions - - Each layer is partitioned into one or more subsystems that together - carry out the layer's role within the overall system. This section notes - the purpose of each layer and describes each subsystem in the following format: - - - - - Subsystem name - The name of a layer subsystem. - - - - - Description - The purpose of the subsystem. - - - - - Packages - The Java packages that contain the source code for - the subsystem. The packages are rooted at the org.springframework.webflow - root package in the package hierarchy. - - - - - Subsystem interfaces - Central API elements exposed by the subsystem, - typically through Java interfaces. - - - - - Internal dependencies - Dependencies of the subsystem. These could be - other subsystems of the layer or external libraries. - - - - - The Execution Core Layer (Bottom Layer) - - Defines core flow definition and execution public APIs. As the "bottom layer", this - layer is highly stable with no dependencies on any other layer. - - - Execution Core Subsystems - - - - - - - - - Subsystem name - Description - Packages - Subsystem interfaces - Internal dependencies - - - - - Core - - Foundational, generic types usable by all other subsystems. - Contains the default expression parser (OGNL-based) and - core collection types (AttributeMap and company). - - - core, - core.collection - - None - None - - - Util - - Low level utilities used by all other parts of the system. - - - util - - None - None - - - Flow Definition - - Central abstractions for modeling flow definitions. - These abstractions include FlowDefinition, - StateDefinition, and TransitionDefinition - that form the domain language for describing flows. - - - definition - - - FlowDefinition - - Core - - - Flow Definition Registry - - Support for working with registries of flow definitions. Flow - definitions eligible for execution are typically stored in - a registry that provides lookup services. - - - definition.registry - - - FlowDefinitionRegistry, - FlowDefinitionLocator - - - Core, - Flow Definition - - - - External Context - - Provides normalized access to a client environment that has called into Spring Web Flow. - - - context, - context.servlet, - context.portlet - - - ExternalContext - - - Core, - context.servlet requires Servlet API 2.4, - context.portlet requires Portlet API 1.0 in addition to Servlet API 2.4 - - - - Conversation - - Manages the creation and cleanup of conversational state. Used by - the execution repository system to begin new user conversations and - track execution state. - - - conversation, - conversation.impl - - - ConversationManager - - - Core, - Util, - External Context - - - - Flow Execution - - Stable runtime abstractions that define the flow definition - execution model. For executing flow definitions - and representing execution state. - - - execution, - execution.support, - execution.factory - - - FlowExecution - - - Core, - External Context, - Flow Definition - - - - Flow Execution Repository - - For persisting paused flow executions beyond a single request - into the server. - - - execution.repository, - execution.repository.support, - execution.repository.continuation - - - FlowExecutionRepository - - - Core, - Util, - Flow Definition, - Conversation, - Flow Execution - - - - Action - - Reusable action implementations. - - - action, - action.portlet - - - None - - - Core, - Util, - Flow Definition, - External Context, - Flow Execution - - - - -
    -
    - - The Execution Engine Layer - - Defines an implementation of the flow execution core API, forming the basis - of the state machine or "engine" implementation. More volatile, as it contains - specific implementations of stable execution abstractions. - - - Depends On: Execution Core - - - Execution Engine Subsystems - - - - - - - - - Subsystem name - Description - Packages - Subsystem interfaces - Internal dependencies - - - - - Engine Implementation - - The implementation of the flow execution engine based on a finite state machine. - - - engine, - engine.support, - engine.impl - - None - None - - - Flow Definition Builder - - Abstractions used at configuration-time for building and assembling Flow definitions - executable by this engine implementation. Flows are typically defined - in externalized resources such as XML files. - - - engine.builder, - engine.builder.xml - - - FlowBuilder - - - Engine Implementation, - Spring Beans 2.0, - Spring Context 2.0, - builder.xml requires JDK 1.5 or Xerces for XSD support - - - - -
    -
    - - The Test Layer - - Support for unit testing flow artifacts and system testing flow executions. - - - Depends On: Execution Engine, Execution Core - - - Test Subsystems - - - - - - - - - Subsystem name - Description - Packages - Subsystem interfaces - Internal dependencies - - - - - Engine Artifact Unit Test Support - - Support for unit testing implementations such as Actions in isolation. - - - test - - None - JUnit 3.8.1 - - - Flow Execution Test Support - - Support for testing Flow Executions out-of-container. - - - test.execution - - None - - Spring Beans 2.0, - JUnit 3.8.1 - - - - -
    -
    - - The Executor Layer - - Stable higher-level layer for driving and coordinating the execution of flow definitions. - This layer is decoupled from the more-volatile engine implementation. - - - Depends On: Execution Core - - - Executor Subsystems - - - - - - - - - Subsystem name - Description - Packages - Subsystem interfaces - Internal dependencies - - - - - Core - - Generic flow executor abstractions and support. - - - executor, - executor.support - - - FlowExecutor - - None - - - Spring MVC - - The integration between Spring Web Flow and the Spring MVC framework. - - executor.mvc - None - - Core, - Spring Web MVC 2.0 - - - - Struts - - The integration between Spring Web Flow and the Struts Classic framework. - - - executor.struts - - None - - Core, - Struts 1.1 - - - - -
    -
    - - The System Configuration Layer (Top Layer) - - The top-most layer for configuring the overall Spring Web Flow system for use - within an application. As the top layer, this layer depends on the most. - - - Depends On: Executor, Execution Engine, Execution Core - - - System Configuration Subsystems - - - - - - - - - Subsystem name - Description - Packages - Subsystem interfaces - Internal dependencies - - - - - Spring Configuration Support - - For configuring Spring Web Flow using Spring 1.x and 2.x. - - - config - - None - - Spring Beans 1.2.7, - spring-webflow-config-1.0 XSD support requires Spring 2.0 - - - - -
    - - - - As described above, some subsystem packages are optional depending on your use of the - subsystem. For example, use of Spring Web Flow in a Servlet environment entails use of - the ExternalContext context.servlet package which requires the - Servlet API to be in the classpath. In this case, the context.portlet package is not - used and the Portlet API is not required. - - - - - For the exact list of dependencies, as well as supported product usage configurations, - see the Ivy dependency manager descriptor located within the SWF distribution. - -
    -
    - - Support - - Spring Web Flow 1.x is supported on Spring Framework 1.2.7 or > for the 1.x series, and - supported on 2.0 or > for the 2.x series. + Professional "from the source" support on Spring Web Flow is available from + SpringSource, the company behind Spring, and + Ervacon, operated by Web Flow project co-founder Erwin Vervaet - XML-based flow building requires Xerces 2 or JDK 5.0 (for XSD support). - - - Our active community support forum is located at http://forum.springframework.org. + Spring Community support is available at www.springframework.org
    \ No newline at end of file diff --git a/spring-webflow/docs/reference/src/practical.xml b/spring-webflow/docs/reference/src/practical.xml deleted file mode 100644 index b7bb957e..00000000 --- a/spring-webflow/docs/reference/src/practical.xml +++ /dev/null @@ -1,2195 +0,0 @@ - - - Practical Use of Spring Web Flow - - Sample applications - - It is recommended that you review the Spring Web Flow sample applications included in the - release distribution for best-practice illustrations of the features of this framework. - A description of each sample is provided below: - - - - - - Phonebook - the original sample demonstrating most core features (including subflows). - - - - - Sellitem - demonstrates a wizard with conditional transitions, flow scope, flow execution redirects, and continuations. - - - - - Sellitem-JSF - The sellitem sample in a JSF environment - (notice how the flow definition is more concise because JSF components care for data binding and validation). - - - - - Shippingrate - demonstrates Spring Web Flow together with the Prototype Javascript framework (for Ajax-style flows). - - - - - NumberGuess - demonstrates use of stateful middle-tier components to carry out business logic. - - - - - Flowlauncher - demonstrates all the possible ways to launch and resume flows. - - - - - Itemlist - demonstrates REST-style URLs and inline flows. - - - - - Fileupload - demonstrates multipart file upload. - - - - - Birthdate - demonstrates Struts integration and the MultiAction. - - - - - Phonebook-Portlet - the phonebook sample in a Portlet environment - (notice how the flow definitions do not change). - - - - - - - Running the Web Flow sample applications - - The samples can be built from the command line and imported as Eclipse projects - all samples come - with Eclipse project settings. It is also possible to start by importing the samples into Eclipse - first and then build with Ant within Eclipse. - - - Building from the Command Line - - Java 1.5 (or greater) and Ant 1.6 (or greater) are prerequisites for building the sample applications. - Ensure those are present in the system path or are passed on the command line. To build Web Flow - samples from the command line, open a prompt, cd to the directory where Spring Web Flow was - unzipped, and run the following: - -cd projects/spring-webflow/build-spring-webflow -ant dist - - This builds all samples preparing "target" areas within each sample project subdirectory - containing webapp structures in both exploded and WAR archive forms. The build also provides basic helper targets - for deploying to Tomcat from Ant; however these webapp structures can be copied to any servlet container, - and each project is also a Eclipse Dynamic Web Project (DWP) for easy deployment inside Eclipse - with the Eclipse Webtools Project (WTP). - - - - Importing Projects into Eclipse - - Importing the sample projects into Eclipse is easy. With a new or an existing workspace select: - File > Import > Existing Projects into Workspace. In the resulting dialog, browse to the project - subdirectory where Spring Web Flow was unzipped and choose it as the root directory to import from. - Select OK. Here Eclipse will list all projects it found including the sample application projects. - Select the projects you're interested in, and select Finish. - - - If you previously built each project from the command line, Eclipse will compile with no errors. - If not, you will need to run the Ant build once for these errors to clear. - - - To build all projects inside Eclipse, import and expand the build-spring-webflow project, right-click on - build.xml and select Run As > Ant Build. - Doing this will run the default Ant target and will build all sample projects. - - - To build a single project inside Eclipse, simply select the project, right-click, and - select Run As > Ant Build. You can also use the convenient - shortcut ALT + SHIFT + X (Execute menu), then Q (Run Ant Build). - - - After Ant runs and the libraries needed to compile each project are downloaded, - all errors in the Eclipse problems view should go away. Try refreshing a project (F5) - if you still have errors. In general, from this point on you no longer need Ant: you - can rely on Eclipse's incremental compile and Eclipse's web tools (WTP) built-in JEE support - for deployment. (Ant is only needed in the system for command-line usage or when the list of - jar dependencies for a project changes and new jars need to be downloaded). - - - - Deploying projects inside Eclipse using Eclipse Web Tools (WTP) - - Each Spring Web Flow sample application project is a Eclipse Dynamic Web Project (DWP), - for easy deployment to a server running inside the Eclipse IDE. To take advantage - of this, you must be running Eclipse 3.2 with Web Tools 1.5. - - - To run a sample application as a webapp inside Eclipse, simply select the project, - right-click, and select Run -> Run On Server. A convenient - shortcut for this action is ALT + SHIFT + X (Execute menu), R (Run on Server). - The first time you do this you will be asked to setup a Server, where you are - expected to point Eclipse to a location where you have a Servlet Container - such as Apache Tomcat installed. Once your container has been setup and you finish the - deployment wizard, Eclipse will start the container and automatically publish - your webapp to it. In addition, it will launch a embedded web browser allowing you - to run the webapp fully inside the IDE. - - - - Other IDE's - - Importing samples into other IDE's should be fairly straight-forward. If using another IDE, - running the Ant build from the command line first may help as it will populate the lib - subdirectories of each sample project. Follow steps similar as those outlined for Eclipse above. - - - - - Sellitem Example - - Overview - - The Sellitem example demonstrates using Web Flow to build a - shopping cart wizard with - a shipping rate subflow, decision states, service and data access - Spring POJO beans, Spring 2.0 form tags, and a Web Flow - FormAction bean for data binding, validation, and - error reporting. - - - The Sellitem example breaks down its Spring application configuration - into a number of files organized according to purpose. - Although the example itself uses a small number of beans you - may consider organizing a real-world application (with many more - beans) according to similar principles. Before going into the specifics - of each individual context, use the diagram below to - get a brief overview of all configuration files including - location and purpose. - - - - - - - - - - Sellitem Spring & Web Flow Application Wiring - - - - - - Web.xml - - The web.xml configuration maps "*.htm" requests to the sellitem servlet - - a Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>sellitem</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> - <init-param> - <param-name>contextConfigLocation</param-name> - <param-value> - /WEB-INF/sellitem-servlet-config.xml - /WEB-INF/sellitem-webflow-config.xml - </param-value> - </init-param> -</servlet> - -<servlet-mapping> - <servlet-name>sellitem</servlet-name> - <url-pattern>*.htm</url-pattern> -</servlet-mapping> - - The contextConifgLocation parameter for the DispatcherServlet indicates the - Spring MVC web context for the sellitem servlet is spread over two xml files: - sellitem-servlet-config.xml and sellitem-webflow-config.xml. - The web.xml also requests an additional Spring context to be loaded - from the classpath through the ContextLoaderListener: - -<context-param> - <param-name>contextConfigLocation</param-name> - <param-value> - classpath:org/springframework/webflow/samples/sellitem/services-config.xml - </param-value> -</context-param> - -<listener> - <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -</listener> - - This service layer context defines beans to be referenced from - web flow definitions. The next section discusses the - content of this context in more detail. - - - - Services-config.xml - - The services-config.xml loaded from the classpath through Spring MVC's - ContextLoaderListener defines several beans for the service - and data access layers of the application. For example, - the service context defines a DAO bean ("saleProcessor") and injects - it with a data source: - -<bean id="saleProcessor" class="org.springframework.webflow.samples.sellitem.JdbcSaleProcessor"> - <property name="dataSource" ref="dataSource"/> -</bean> - -<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> - <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> - <property name="url" value="jdbc:hsqldb:mem:sellItem"/> - <property name="username" value="sa"/> -</bean> - - The services context also declares a bean of type InMemoryDatabaseCreator - set to autowire by type meaning that its fields will be compared against the types of - beans available in the context and will be automatically set when a match is found. - Hence the dataSource bean is used to set the dataSource property - of InMemoryDatabaseCreator: - -<bean id="databaseCreator" class="org.springframework.webflow.samples.sellitem.InMemoryDatabaseCreator" - autowire="byType"/> - - Looking inside the InMemoryDatabaseCreator, its initDao() method invoked - during context initialization creates a table called T_SALES for use by the sample - application. This table is created in an in-memory hsqldb database called - sellitem (based on the url property of the dataSource bean). - It's also worth noting the bean declarations related to declarative - transaction management: - -<tx:annotation-driven/> - -<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> - <property name="dataSource" ref="dataSource"/> -</bean> - - The "<tx:annotation-driven>"declaration indicates transaction - configuration is governed by Java 5 annotations used in bean classes - such as this annotation in the SaleProcessor interface: - -@Transactional -public interface SaleProcessor { - public void process(Sale sale); -} - - For annotated beans the Spring container automatically creates - proxies according to the transaction semantics in the annotation - metadata. The "<tx:annotation-driven>" tag has a transaction-manager - attribute but this attribute is not required if the transaction - manager bean is named "transactionManager". - - - - Spring MVC Context - - The Spring MVC web context is split over two files - - sellitem-servlet-config.xml and sellitem-webflow-config.xml. - The sellitem-servlet-config.xml defines - a controller and a view resolver. - -<bean name="/pos.htm" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> -</bean> - -<!-- Maps flow view-state view names to JSP templates --> -<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> - <property name="prefix" value="/WEB-INF/jsp/" /> - <property name="suffix" value=".jsp" /> -</bean> - - FlowController is a web flow controller extending Spring MVC's AbstractController - delegating requests (in this case for the "/pos.htm" servlet path) to the - flowExecutor bean it is configured with. FlowController acts - as gateway to Web Flow and a single controller instance can serve - the application as most of the actual control logic is encapsulated - in web flow definitions. - - - The sellitem-webflow-config.xml defines web flow specific beans such as - a flow executor, a flow registry and a flow listener beans: - -<!-- Launches new flow executions and resumes existing executions --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry"> - <flow:execution-listeners> - <flow:listener ref="listener" criteria="sellitem-flow" /> - </flow:execution-listeners> -</flow:executor> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/flows/**/*-flow.xml" /> -</flow:registry> - -<!-- Observes the lifecycle of sellitem-flow executions --> -<bean id="listener" - class="org.springframework.webflow.samples.sellitem.SellItemFlowExecutionListener" /> - - The FlowExecutor is the central entry point into the - Spring Web Flow system. It drives the execution of flow definitions - configured through the flowRegistry. The flowRegistry bean is configured - to load definitions from files ending with "-flow.xml" in any - subdirectory of /WEB-INF/flows. This matches to - sellitem-flow.xml, shipping-flow.xml, sellitem-simple-flow.xml, - sellitem-conversation-scope-flow.xml and shipping-conversation-scope-flow.xml. - - - As shown here the flow executor can also be configured with a flow - listener, which is a callback mechanism for flow execution lifecycle events. - The SellItemFlowExecutionListener extends FlowExecutionListenerAdapter - - a default implementation of the FlowExecutionListener interface - sparing the need to implement methods for all lifecycle events. - - - Looking inside SellItemFlowExecutionListener, it implements the stateEntering - method executed for whenever a new state is about to be entered. - The logic in this method checks if the current web flow state - has an attribute named "role" and if so it ensures the user - has that role: - -String role = nextState.getAttributes().getString("role"); -if (StringUtils.hasText(role)) { - HttpServletRequest request = ((ServletExternalContext)context.getExternalContext()).getRequest(); - if (!request.isUserInRole(role)) { - throw new EnterStateVetoException(context.getActiveFlow().getId(), context.getCurrentState().getId(), - nextState.getId(), "State requires role '" + role - + "', but the authenticated user doesn't have it!"); - } -} - - - - Based on the above definitions - web.xml, Spring MVC controller bean, and - web flow registry, the sellitem-flow can be initiated with the - following URI: - -/swf-sellitem/pos.htm?_flowId=sellitem-flow - - - Note: although it is possible to invoke the shipping-flow directly as well, - it expects an input attribute and is intended to be invoked as a subflow. - - - - - Sellitem-beans.xml - - Before tracing the sequence of states in sellitem-flow.xml notice the - import declaration at the bottom of that file: - -<import resource="sellitem-beans.xml"/> - - The sellitem-beans.xml located in the same directory declares a - web flow FormAction bean for use in the flow definition and configures - it with a SaleValidator and a SellItemPropertyEditorRegistrar: - -<!-- Manages setting up, binding input to, and validating a Sale "backing wizard form object" --> -<bean id="formAction" class="org.springframework.webflow.action.FormAction"> - <property name="formObjectName" value="sale"/> - <property name="validator"> - <bean class="org.springframework.webflow.samples.sellitem.SaleValidator"/> - </property> - <!-- Installs property editors used to format non-String fields like 'shipDate' --> - <property name="propertyEditorRegistrar"> - <bean class="org.springframework.webflow.samples.sellitem.SellItemPropertyEditorRegistrar"/> - </property> -</bean> - - The SellValidator will be used to validate form input data. - The SellItemPropertyEditorRegistrar is responsible for registering - custom property editors. Such editors are used to bind text data from - HTML form fields to server-side Objects. For example - SellItemPropertyEditorRegistrar registers a custom date - editor: - -public void registerCustomEditors(PropertyEditorRegistry registry) { - registry.registerCustomEditor(Date.class, - new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"), true)); -} - - This editor will bind the shipDate form field in shippingDetailsForm.jsp - to the shipDate property of the Sale object on the server side. - - - - Sellitem-flow Flow Definition - - The flow begins by declaring a "sale" variable - an object of type Sale: - -<var name="sale" class="org.springframework.webflow.samples.sellitem.Sale"/> - - The formAction bean will use the sale variable for form binding and - validation (see sellitem-beans.xml). - - - The start state for the flow enterPriceAndItemCount is a view state, which resolves - to the JSP page /WEB-INF/jsp/priceAndItemCountForm.jsp: - -<view-state id="enterPriceAndItemCount" view="priceAndItemCountForm"> - <render-actions> - <!-- create the backing form object and initialize a empty errors collection --> - <action bean="formAction" method="setupForm"/> - </render-actions> - <transition on="submit" to="enterCategory"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validatePriceAndItemCount"/> - </action> - </transition> -</view-state> - - The view state uses a render action to invoke the setupForm method of the - formAction bean. The setupForm method prepares a form object based on - the "sale" variable declared at the top of the flow definition. - - - The priceAndItemCountForm.jsp page collects a price and an itemCount using - Spring 2.0 form input tags binding form fields to properties in the form - backing object "sale". When pressed, the submit button "_eventId_submit" - causes a web flow transition for an event with the id of "submit" to - the view state "enterCategory". Prior to transitioning the formAction's - bindAndValidate method is called to perform binding and (partial) validation - using the validatePriceAndItemCount method of the validator object. - - - The next view state enterCategory (based on categoryForm.jsp) - collects inputs for sale category and whether shipping is required. On - submit it transitions to the requiresShipping state: - -<view-state id="enterCategory" view="categoryForm"> - <transition on="submit" to="requiresShipping"> - <action bean="formAction" method="bind"/> - </transition> -</view-state> - - The requiresShipping state is a decision state making - flow routing decisions. It evaluates a boolean expression against the - executing flow and it decides where to transition to next. - Here the shipping boolean property of the "sale" form backing - object is checked to decide whether to go to the enterShippingDetails - subflow state or proceed directly to processSale. - -<decision-state id="requiresShipping"> - <if test="${flowScope.sale.shipping}" then="enterShippingDetails" else="processSale"/> -</decision-state> - - The enterShippingDetails subflow state is based on shipping-flow.xml - located in the same directory. The form backing object "sale" is - passed to it as an input attribute using an attribute mapper declaration: - -<subflow-state id="enterShippingDetails" flow="shipping-flow"> - <attribute-mapper> - <input-mapper> - <input-attribute name="sale"/> - </input-mapper> - </attribute-mapper> - <transition on="finish" to="processSale"/> -</subflow-state> - - The shipping-flow subflow is a simple flow with one view state. It - collects the shipping details, binds the data and returns to its parent - flow. The id of the subflow end state "finish" is returned to the - parent subflow state causing a transition to the processSale action state. - -<action-state id="processSale"> - <bean-action bean="saleProcessor" method="process"> - <method-arguments> - <argument expression="flowScope.sale"/> - </method-arguments> - </bean-action> - <transition on="success" to="finish"/> -</action-state> - - The saleProcessor bean, a POJO defined in services-config.xml - is invoked using a "bean-action" declaration (as opposed to the "action" - declation used to invoke a web flow Action such as FormAction). - The saleProcessor (an instance of JdbcSaleProcessor) performs a database - update using the values of the Sale object and upon - successful completion transitions to the end view state: - -<end-state id="finish" view="costOverview"> - <entry-actions> - <action bean="formAction" method="setupForm"/> - </entry-actions> -</end-state> - - Then end state calls FormAction's setupForm method again. - This does not re-create the "sale" form object (still in flow scope) - but it does ensure any custom property editors are - registered for use in rendering the JSP. - - - - Sellitem-simple-flow Flow Definition - - A simpler version of the sellitem-flow is available in the sellitem-simple-flow.xml file. - This version uses a view state to gather shipping details instead of using a subflow. You - can launch the sellitem-simple-flow using the following URI: - -/swf-sellitem/pos.htm?_flowId=sellitem-simple-flow - - - - - Sellitem-conversation-scope-flow Flow Definition - - This web flow is equivalent in functionality to the sellitem-flow definition - described above. The main difference is that it uses "conversation" - scope to store the form backing object declared in - /WEB-INF/flows/converstation-scope/sellitem-beans.xml. - -<bean id="formAction" class="org.springframework.webflow.action.FormAction"> - <property name="formObjectName" value="sale"/> - <property name="formObjectScope" value="CONVERSATION"/> - <property name="formErrorsScope" value="CONVERSATION"/> - - Conversation scope retains attributes stored in it for the life - of the flow execution and is shared by all flow sessions. - For example when invoking the shipping details subflow the parent - flow does not need to pass the "sale" form backing object because - it is now stored in conversation scope and is accessible to both flows: - -<subflow-state id="enterShippingDetails" flow="shipping-conversation-scope-flow"> - <transition on="finish" to="processSale"/> -</subflow-state> - - Also, when the "sale" object needs to be accessed it is done by referencing - conversation cope: - -<decision-state id="requiresShipping"> - <if test="${conversationScope.sale.shipping}" then="enterShippingDetails" else="processSale"/> -</decision-state> - - You can launch the sellitem-conversation-scope-flow using the following URI: - -/swf-sellitem/pos.htm?_flowId=sellitem-conversation-scope-flow - - - - - - Sellitem-JSF Example - - Overview - - The Sellitem-JSF example uses Web Flow and JSF to build a shopping - cart wizard. Navigation logic and supporting managed beans - are supplied by Spring Web Flow, while UI views and - overall servlet processing is based on JSF technology. - - - - The underlying Web Flow definitions for the Sellitem and the Sellitem-JSF - examples are very similar. To avoid repetition the documentation for - the Sellitem-JSF example focuses primarily on the points of integration between - Web Flow and JSF. For further general information on Web Flow definitions - and supporting Java classes for the Sellitem example, please refer to the - Sellitem example documentation. - - - - - Web.xml - - The web.xml contains standard JSF configuration including mappings for - the JSF front servlet: it handles all requests ending with "*.faces": - -<!-- Faces Servlet --> -<servlet> - <servlet-name>Faces Servlet</servlet-name> - <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> - <load-on-startup>1</load-on-startup> -</servlet> - -<servlet-mapping> - <servlet-name>Faces Servlet</servlet-name> - <url-pattern>*.faces</url-pattern> -</servlet-mapping> - - - - In addition, the web.xml loads a Spring root web application context containing the services - used by the application: - -<context-param> - <param-name>contextConfigLocation</param-name> - <param-value> - classpath:org/springframework/webflow/samples/sellitem/services-config.xml - /WEB-INF/webflow-config.xml - </param-value> -</context-param> - -<listener> - <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -</listener> - - The services-config.xml contains POJO beans required for the services and - data access layers of the application. These declarations are very similar - to the Sellitem example (and explained in more detail there). - The webflow-config.xml contains Web Flow related bean - definitions. These definitions will be explained a little bit - further on in the context of how they fit into the JSF phases - lifecycle. - - - - Web Flow JSF Setup in faces-config.xml - - To plug in Web Flow, a few things must be added once to faces-config.xml. - This is demonstrated in the faces-config.xml of Sellitem-JSF: - -<application> - <navigation-handler>org.springframework.webflow.executor.jsf.FlowNavigationHandler</navigation-handler> - <variable-resolver>org.springframework.webflow.executor.jsf.DelegatingFlowVariableResolver</variable-resolver> -</application> - -<lifecycle> - <phase-listener>org.springframework.webflow.executor.jsf.FlowPhaseListener</phase-listener> -</lifecycle> - - - - The FlowNavigationHandler delegates view navigation handling to the - the Web Flow system when a flow is initiated or resumed. - - - The DelegatingFlowVariableResolver is suitable for use along side - other variable resolvers to support EL binding expressions like - {#bean.property} where "bean" could be a property in any supported scope. - The resolver search algorithm looks in flash scope first, then flow scope, - then conversation scope. If no variable is found, this resolver - delegates to the next resolver in the chain. - - - The FlowPhaseListener invoked during beforePhase and afterPhase JSF events - is responsible for managing the lifecycle of a FlowExecution and making it available - to other JSF artifacts during the lifecycle of a JSF request. - - - - Web Flow System Setup in webflow-config.xml - - Examining the definitions in faces-config.xml highlighted the ability - to use plug Web Flow in as a navigation handler and as a source - for JSF managed beans. Now we can turn to the question - of how to configure the web flow system itself in a JSF environment. - - - The Spring web context fragment /WEB-INF/webflow-config.xml contains the following configuration: - -<!-- Launches new flow executions and resumes existing executions --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry" /> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/flows/sellitem-flow.xml" /> -</flow:registry> - - Here the flow executor is configured to support execution of a single - flow definition - sellitem-flow.xml. The executor bean has been assigned the id - "flowExecutor". This id is significant and is required for the JSF artifacts to detect - the executor and its services. - - - - Launching the sellitem-flow - - The intro.jsp page shows how the configured web flow sellitem-flow.xml can be launched using - a JSF command link component. - -<h:form> - <h:commandLink value="Sell Item" action="flowId:sellitem-flow"/> -</h:form> - - This causes the sellitem-flow to be initiated. Once a flow is initiated - each subsequent JSP page can participate in the flow (the flow execution key - is tracked for you). - - - A few notable differences between Sellitem and Sellitem-JSF to keep in mind: - - - - The JSF version of the sellitem flow definition is simpler because JSF components care for data binding and validation. - - - - - In its web flow definition Sellitem-JSF uses actual JSP names (instead of the logical view names used in Sellitem) - to be rendered by JSF. This is consistent with normal JSF-isms. - - - - - The JSP pages in Sellitem-JSF use unified EL to access the converastion scoped Sale object - e.g. #{sale.price}. - - - - Sellitem-JSF uses JSF component tags for UI and Sellitem uses Spring form tags. - - - - There is no need to manually track the flow execution key because it is tracked for you in the JSF view root. - - - - The combination of delegating flow variable resolution plus automatic flow execution key management - means JSF views selected a flow look like standard JSF views to JSF developers. Also, JSF components - help simplify flow definition logic as the flow no longer has to worry about data binding and validation. - - - For more information and understanding on the Sellitem flow definition logic itself - please refer to the documentation for the original Sellitem example. - - - - - Shippingrate Example - - Overview - - The Shippingrate sample demonstrates the use of Spring Web Flow in combination with - Ajaxian techniques. It consists of several wizard-style steps executed - with Ajax requests and refreshing a portion of the page. - The input is collected from the user in incremental steps. It is stored - in a flow-scoped object and is then used to calcualte a shipping rate. - The example also demonstrates invocation of a service-layer bean - defined in a Spring context to perform calculations and - to provide reference data such as countries and package types. - - - - Web.xml - - The web.xml configuration maps requests for "*.htm" to the - shippingrate servlet - a regular Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>shippingrate</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -</servlet> - -<servlet-mapping> - <servlet-name>shippingrate</servlet-name> - <url-pattern>*.htm</url-pattern> -</servlet-mapping> - - The web.xml also ensures the following Spring context file is loaded - at runtime from the web application classpath: - -<context-param> - <param-name>contextConfigLocation</param-name> - <param-value> - classpath:org/springframework/webflow/samples/shippingrate/domain/services.xml - </param-value> -</context-param> - - The services.xml Spring context defines a "rateService" bean providing - operations for making shipping rate calculations and for retrieving - reference data required for display in the JSP pages of the application. - - - - Spring MVC Context - - The Spring MVC servlet context for the shippingrate servlet (WEB-INF/shippingrate-servlet.xml) - defines one controller bean: - -<bean name="/rates.htm" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> -</bean> - - FlowController is a Web Flow controller. It is the main point of integration between Spring MVC - and Spring Web Flow routing requests to one or more managed web flow executions. The - FlowController is injected with flowExecutor and flowRegistry beans: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry" repository-type="simple"/> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/flows/**/*-flow.xml" /> -</flow:registry> - - The flowExecutor and the flowRegistry beans collectively configure - the FlowController with one web flow - the getRate-flow defined in - /WEB-INF/flows/getRate-flow.xml. The flowExecutor uses a "simple" - repository, which manages execution state in the user session. - - - Given the above definitions the following URI can be used to initiate - the getRate-flow: - -/swf-shippingrate/rates.htm?_flowId=getRate-flow - - - - - Ajax Requests - - The shippingrate example consists of several wizard-style steps. - After the initial index.jsp subsequent pages are - loaded in an Ajax manner without reloading the entire page. - - - The Ajax requests are done with the help of the - Prototype - framework and a thin JavaScript layer over it providing - convenient functions for processing Ajax form and get requests. - The required Javascript libraries are included in index.jsp as follows: - -<script src="prototype.js" type="text/javascript"></script> -<script src="swf_ajax.js" type="text/javascript"></script> - - - - When index.jsp is loaded the following JavaScript invokes the getRate-flow - and replaces the content of the getRateWizard div tag with the response - returned from the server: - -<div id="getRateWizard"> - <script type="text/javascript"> - window.onload = function() { - new SimpleRequest('getRateWizard', 'rates.htm', 'get', '_flowId=getRate-flow'); - }; - </script> -</div> - - Functions are first-class citizens and a type in JavaScript. - The script above creates an instance of - the SimpleRequest function defined in swf_ajax.js. This function invokes - Prototype's Ajax.Updater with the specified URL and request parameters. On success - the content of the getRateWizard div is replaced with the response returned - from the server. On failure such as an HTTP response code other 200 (OK) - an error message is displayed. - - - The next few pages are form-based JSP's - selectCustomer.jsp, selectReceiver.jsp, - etc. Each of them contains the following JavaScript call at the bottom: - -<script type="text/javascript"> - formRequest('selectCustomerTypeForm'); -</script> - - The formRequest function is also defined in swf_ajax.js - and it uses Prototype to register a handler for the form submit event: - -function formRequest(formElementId) { - Event.observe(formElementId, 'submit', handleSubmitEvent, true); -} - - The handleSubmitEvent function extracts the form parameters, stops the - submit event, and posts an AJAX request via XMLHttpRequest. On success - the results returned form the server replace the content of the form. - On failure such as an HTTP response code other 200 (OK) an error - message is displayed. - - - Although not demonstrated in this example a back button can be - implemented in parallel with the Next button used to advance from - one screen to the next. This would be necessary because the browser - back button - a common issue in Ajax applications, contrary to user - expectation returns to the page prior to the first Ajax request. - - - As a result of the Ajax requests the entire wizard is able to - function within a portion of the page without refresing - the remaining information on it. - - - - getRate Web Flow - - The getRate-flow (/WEB-INF/jsp/flows/getRate-flow.xml) defines the following start state: - -<view-state id="selectCustomerType" view="selectCustomer"> - <transition on="submit" to="selectSender"> - <action bean="formAction" method="bind" /> - </transition> -</view-state> - - This is a view state, which will display the initial form using the - JSP page /WEB-INF/jsp/selectCustomer.jsp. Notice, the use of a start action - executed immediately before the JSP is displayed: - -<start-actions> - <action bean="formAction" method="setupForm" /> -</start-actions> - - The "formAction" bean is defined in the Spring servlet context - (/WEB-INF/shippingrate-servlet.xml). It specifies a form object - and a validator to use for form data binding and validation: - -<!-- Performs "form backing object" data binding and validation on input submit --> -<bean id="formAction" class="org.springframework.webflow.action.FormAction"> - <property name="formObjectName" value="rateCriteria" /> - <property name="formObjectClass" value="org.springframework.webflow.samples.shippingrate.domain.RateCriteria" /> - <property name="formObjectScope" value="FLOW" /> - <property name="validator"> - <bean class="org.springframework.webflow.samples.shippingrate.domain.RateCriteriaValidator" /> - </property> -</bean> - - The form object of type RateCriteria will be used to collect data - from the user in several steps. The form object will be stored in FLOW scope - and will not be re-created with each request as long - as the flow hasn't reached its end state. The actual binding of - html form fields to the RateCriteria object is based on - Spring's data binding mechanism. Html form fields are surrounded - with the <spring:bind> tag containing the path - nested property field. FormAction's bindAndValidate method - will initiate the actual binding on the server side - between HTTP request parameters and RateCriteria data fields. - - - When the selectCustomer.jsp submits back to the FlowController via - "/swf-shippingrate/rate.htm" it uses a submit button named - "_eventId_submit". This indicates to Web Flow a transition to - the "selectSender" view state. This view state is defined as follows: - -<view-state id="selectSender" view="selectSender"> - <render-actions> - <bean-action bean="rateService" method="getCountries"> - <method-result name="countries" /> - </bean-action> - </render-actions> - <transition on="submit" to="selectReceiver"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validateSender" /> - </action> - </transition> -</view-state> - - The selectSender view state has a render action: - the "rateService" bean that was loaded through the services.xml context referenced - in web.xml. The purpose of the render action is to load data required - to render the JSP. In this case the rateService bean has a method called - getCountries that returns a list of countries to be displayed in a drop-down - by the JSP. - - - The "selectSender" view state also defines one transition: on event with - id of "submit" a transition to the "selectReceiver" view state occurs. - A pre-requisite for the transition to occur is the successful completion of - formAction bean's bindAndValidate method. The attribute "validatorMethod" on - the bean specifies the name of the method to invoke on the Validator object - specifically for the fields of the current screen. - If the bindAndValidate method does not succeed the transition does not take - place and the flow remains in the "selectSender" view - state where the user can review the errors and modify the selection. - - - The next two states in the flow - selectReceiver and selectPackageDetails use similar - mechnisms. The rateSevice bean is used to retrieve countries and package types for - use in the JSP. The form backing object RateCriteria stored in FLOW scope - is used to collect user input with each form submit. - - - The "findRate" action state occurs after all user input has been provided. - It is defined as follows: - -<action-state id="findRate"> - <bean-action bean="rateService" method="getRate"> - <method-arguments> - <argument expression="flowScope.rateCriteria" /> - </method-arguments> - <method-result name="rate" /> - </bean-action> - <transition on="success" to="showRate" /> -</action-state> - - Logic for the action state is provided by the getRate method of - the rateService bean. The RateCriteria object stored in FLOW scope - and containing the user input is passed to the rateService bean. - The result of the method is exposed in request scope under - the name "rate". - - - The next and final state "showRate" is a JSP page, which accesses the calculated rate - information and displays it to the user. - - - - - Numberguess Example - - Overview - - Numberguess uses Web Flow to implement two number guessing games. - For each game the user can enter multiple guesses and depending - on the answer either transition back to the same screen or - advance to the final screen. Logic for the guessing games is - provided through FLOW-scoped beans, which also maintain state - such as the total number of guesses. The example defines transitions - using event pattern matching and custom exception handlers. - - - - Web.xml - - The web.xml configuration maps "*.htm" requests to the numberguess servlet - - a regular Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>numberguess</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> - <init-param> - <param-name>contextConfigLocation</param-name> - <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> - </init-param> -</servlet> - -<servlet-mapping> - <servlet-name>numberguess</servlet-name> - <url-pattern>*.htm</url-pattern> -</servlet-mapping> - - The Spring web context is loaded from a file called - /WEB-INF/dispatcher-servlet.xml. - - - - Spring MVC Context - - The Spring MVC web context (WEB-INF/dispatcher-servlet.xml) - defines one controller bean: - -<bean name="/play.htm" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> -</bean> - - FlowController is a Web Flow controller. It is the main point of - integration between Spring MVC and Spring Web Flow routing requests - to one or more managed web flow executions. The FlowController is - injected with flowExecutor and flowRegistry beans: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry" repository-type="singlekey"/> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/higherlower.xml" /> - <flow:location path="/WEB-INF/mastermind.xml" /> -</flow:registry> - - The flowExecutor and the flowRegistry beans collectively configure - the FlowController with two web flows - higherlower and mastermind. - This flowExecutor is configured with a simple repository that assigns - a single flow execution key per conversation. The key, once assigned, - never changes for the duration of the conversation. - - - Given the above definitions the following URI's can be used to initiate - each of the two flows: - -/swf-numberguess/play.htm?_flowId=higherlower -/swf-numberguess/play.htm?_flowId=mastermind - - - - The Spring MVC servlet context also defines a view resolver bean for - resolving logical view names. In general Web Flow does not aim - to replace the flexibility of Spring MVC for view resolution. - It focuses on the C in MVC. - - - - Higherlower Flow - - The Higherlower flow (/WEB-INF/higherlower.xml) starts with the following - flow variable declaration: - -<var name="game" class="org.springframework.webflow.samples.numberguess.HigherLowerGame"/> - - This variable is automatically created when an execution of the flow - begins and will exist in FLOW scope throughout its duration. - - - The start state for the flow is defined as follows: - -<view-state id="enterGuess" view="higherlower.enterGuess"> - <transition on="submit" to="makeGuess"/> -</view-state> - - The view resolver bean of Spring MVC will resolve "higherlower.enterGuess" - to /WEB-INF/jsp/higherlower.enterGuess.jsp. - This JSP has a form with one input field for the guess number. - The "game" variable referenced throughout the JSP - is the FLOW-scoped variable that was declared at the top of - the flow definition. - - - The name of the form submit button "_eventId_submit" indicates the - event id to use for deciding where to transition to next. Given an - event with id of "submit" the "enterGuess" view state transitions - to the "makeGuess" action state defined as follows: - -<action-state id="makeGuess"> - <evaluate-action expression="flowScope.game.makeGuess(requestParameters.guess)"> - <evaluation-result name="guessResult"/> - </evaluate-action> - <transition on="CORRECT" to="showAnswer"/> - <transition on="*" to="enterGuess"/> - <transition on-exception="java.lang.NumberFormatException" to="enterGuess"/> -</action-state> - - - - The makeGuess action state consists of one evaluate action and three - transitions. Evaluate actions are used to invoke logic encapsulated - in a FLOW-scoped object - in this case the game bean. - The makeGuess method of the game bean returns one of several enum - values it defines: - -enum GuessResult { - TOO_HIGH, TOO_LOW, CORRECT, INVALID -} - - Web Flow detects the returned result from the makeGuess method - is a JDK 1.5 enum type and - creates an Event with a String id matching the enum value. If the - makeGuess method returns CORRECT a transition to the final - showAnswer state occurs. For any other event (defined with the event - pattern on="*") Web Flow returns to the enterGuess - state. The makeGuess state also defines one on-exception transition - demonstrating how specific Exceptions can be incorporated into - flow transition logic. - - - The end-state showAnswer resolves to the JSP page - /WEB-INF/jsp/higherlower.showAnswer.jsp, which simply shows the - correct guess. At this point the flow has ended and the "game" bean - is no longer in scope. - - - - Mastermind Flow - - The mastermind flow uses a similar flow definition to implement a 4-digit - guessing game: - -<var name="game" class="org.springframework.webflow.samples.numberguess.MastermindGame"/> - -<start-state idref="enterGuess"/> - -<view-state id="enterGuess" view="mastermind.enterGuess"> - <transition on="submit" to="makeGuess"/> -</view-state> - -<action-state id="makeGuess"> - <evaluate-action expression="flowScope.game.makeGuess(requestParameters.guess)"> - <evaluation-result name="guessResult"/> - </evaluate-action> - <transition on="CORRECT" to="showAnswer"/> - <transition on="*" to="enterGuess"/> -</action-state> - -<end-state id="showAnswer" view="mastermind.showAnswer"/> - - The MastermindGame class encapsulates the logic for the game and - is stored as a FLOW-scoped bean. - It returns one of three possible enum values - - WRONG, CORRECT, or INVALID, which Web Flow converts to events with - id's matching the enum values. If the guess is INVALID the JSP page - /WEB-INF/jsp/mastermind.enterGuess.jsp will print an error message. - If the guess is CORRECT the flow will transition to the showAnswer - end state and complete the flow. - - - - - Flowlauncher Example - - Overview - - Flowlauncher demonstrates two different ways one web flow can launch - another - by redirecting to it or by launching it as a subflow. - Flowlauncher has two flows: Sample A and Sample B. As a root level - flow Sample A either transitions to B through a subflow state or - redirects to B in its end state. - - - - Web.xml - - The web.xml configuration maps "*.htm" requests to the flowlauncher servlet - - a regular Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>flowlauncher</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -</servlet> - -<servlet-mapping> - <servlet-name>flowlauncher</servlet-name> - <url-pattern>*.htm</url-pattern> -</servlet-mapping> - - - - - Spring MVC Context - - The Spring MVC web context (WEB-INF/flowlauncher-servlet.xml) defines one controller bean: - -<bean name="/flowController.htm" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> -</bean> - - FlowController is a Web Flow extension of Spring MVC's AbstractController. - It contains a FlowExecutor and directs incoming requests for one - or more managed flow executions to it. The FlowExecutor bean is configured - in the same context: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry"/> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/sampleA.xml" /> - <flow:location path="/WEB-INF/sampleB.xml" /> -</flow:registry> - - A single FlowController may direct all flows for an application serving as - a gateway to Web Flow. Based on the above definitions the flows - sampleA and sampleB can be invoked as follows: - -/swf-flowlauncher/flowController.htm?_flowId=sampleA -/swf-flowlauncher/flowController.htm?_flowId=sampleB - - The welcome index.html file for the web application invokes - the flows and passes additional input using either a URL link - or a form submit. - - - - Sample A Web Flow - - The Sample A web flow (/WEB-INF/sampleA.xml) begins with an input mapping declaration: - -<input-mapper> - <mapping source="input" target="flowScope.input" /> -</input-mapper> - - This declaration reads "when a new execution of this flow starts map the - input attribute named input into a flowScope attribute - also named input". Spring Web Flow will automatically provide the request - parameters as input to the flow when launching a new flow execution. - Following this declaration the input - request parameter will remain available for the duration of the flow. - - - There are 3 states in this flow: the start state, the end state, and a subflow - state. The start state is a view state - it will display a JSP page and allow - the user to make a choice. The subflow state initiates Sample B as a - subflow of the current flow - subflows give the ability to compose independent - modules together to compose complex controller workflows. And the end state - launches Sample B by redirecting to it. - - - The subflow state launches B with the following input attribute declaration. - This declaration reads "pass the value of the flow-scoped attribute named - input as an attribute also named input - to subflow B. - -<attribute-mapper> - <input-mapper> - <mapping source="flowScope.input" target="input" /> - </input-mapper> -</attribute-mapper> - - The next line is a transition defining how to respond - when the subflow ends: advance back to the start state for Sample A. - -<transition on="end" to="aPage" /> - - - - The end state demonstrates how to redirect to Sample B upon completion of - the root level flow Sample A: - -<end-state id="endAndLaunchB" view="flowRedirect:sampleB?input=${requestParameters.input}" /> - - This declaration causes A to be terminated and B to start - with the given requst input parameter. - - - - Sample B Web Flow - - The flow Sample B (/WEB-INF/sampleB.xml) - used as a subflow in Sample A has two - simple states: a view state and an end state. From the view state "bPage" the - flow transitions to the end state: - -<view-state id="bPage" view="bPage"> - <transition on="end" to="end" /> -</view-state> - -<end-state id="end" /> - - The "id" attribute of the end state matches the "on" attribute of the - transition in the outer flow's subflow state, which the outer flow - uses to resume itself. - - - Also notice how bPage.jsp makes a check to detect if Sample B is - running as a subflow of Sample A or if it is running as a top-level flow: - -<c:if test="${!flowExecutionContext.activeSession.root}"> - - - - The FlowExecutionContext object is exposed to the views (JSPs) - to make information like this available during response rendering. - - - - - Itemlist Example - - Overview - - Itemlist demonstrates how to configure a FlowExecutor with an argument handler - enabling it to process REST-style requests where the name of the target - flow is in the URL instead of a _flowId request parameter. - The example also demonstrates inner flows as well as how an output parameter - can be passed from a subflow to a parent flow. - Finally, it serves as an illustration of how to configure Spring Web Flow - using classic Spring 1.x bean definitions. - - - - Web.xml - - The web.xml configuration maps "/app/*" requests to the itemlist servlet - - a regular Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>itemlist</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -</servlet> - -<servlet-mapping> - <servlet-name>itemlist</servlet-name> - <url-pattern>/app/*</url-pattern> -</servlet-mapping> - - - - - Spring MVC Context - - The Spring MVC web context (/WEB-INF/itemlist-serlvet.xml) defines one controller - and one URL handler mapping: - -<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> - <property name="alwaysUseFullPath" value="true" /> - <property name="mappings"> - <value>/app/**/**=flowController</value> - </property> -</bean> - -<bean id="flowController" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> - <property name="argumentHandler"> - <bean class="org.springframework.webflow.executor.support.RequestPathFlowExecutorArgumentHandler" /> - </property> -</bean> - - All requests with a servlet path matching "/app/**/**" are mapped to the "flowController" bean. - The FlowController is a Web Flow extension of Spring MVC's AbstractController delegating - requests to one or more managed web flows. It acts as gateway to Web Flow defined control - logic and a single instance can serve the application. - - - The usual way to launch a specific web flow is to pass the _flowId request parameter. - However, this example is configured with a RequestPathFlowExecutorArgumentHandler - for processing REST-style URL's. - Requests for services built around the REST concept are encoded in the URL - and not as query string parameters. The way to invoke a web flow with - this argument handler is to follow: - -http://${host}/${context path}/${dispatcher path}/${flowId} - - - - The FlowController is configured with a flowExecutor and flowRegistry beans containing - two web flows - itemlist and itemlist-alternate: - -<!-- Launches new flow executions and resumes existing executions: Spring 1.2 config version --> -<bean id="flowExecutor" class="org.springframework.webflow.config.FlowExecutorFactoryBean"> - <property name="definitionLocator" ref="flowRegistry"/> -</bean> - -<!-- Creates the registry of flow definitions for this application: Spring 1.2 config version --> -<bean id="flowRegistry" class="org.springframework.webflow.engine.builder.xml.XmlFlowRegistryFactoryBean"> - <property name="flowLocations"> - <list> - <value>/WEB-INF/itemlist.xml</value> - <value>/WEB-INF/itemlist-alternate.xml</value> - </list> - </property> -</bean> - - The FlowRegistry and FlowExecutor are defined with Spring 1.2 compatible bean definitions. - However, starting with Spring 2.0 Web Flow also offers the - custom tags flow:registry and flow:executor, which are more - readable and less verbose. - - - Based on the above web context definition use the following URL's to invoke - the itemlist or the itemlist-alternate web flows: - -/swf-itemlist/app/itemlist -/swf-itemlist/app/itemlist-alternate - - - - Also defined in itemlist-servlet.xml are three "action" beans - createItemAction, - addItemAction, and mapItemAction, which will be referenced from action states - in the web flow definitions. - - - - Itemlist Web Flow - - The itemlist flow allows adding items to a list. There are - two view states - displayItemList and displayItem, and two action states - - createItem and addItem. - - - The displayItemList view state resolves to /WEB-INF/jsp/itemList.jsp, which - lists all items on the list and displays an "Add" button with the - name "_eventId_add". The name of the button indicates the - event id to use for deciding where to transition to next. - Also, notice that instead of posting a "_flowId" parameter - the JSP sets the form action to the value of flowExecutionKey - - a value automatically made available in the page - context by Web Flow: - -<form action="${flowExecutionKey}" method="post"/> - - - - When the form submits an event with the "_eventId_add" button - the displayItemList view state transitions to the - createItem action state. - -<view-state id="displayItemlist" view="itemlist"> - <transition on="add" to="createItem" /> -</view-state> - -<action-state id="createItem"> - <action bean="createItemAction" /> - <transition on="success" to="displayItem" /> -</action-state> - - - - The "createItemAction" bean is declared in the Spring MVC context - (/WEB-INF/itemlist-servlet.xml). It simply returns "success", which - causes a transition to the displayItem view state. - - - The next two states displayItem and addItem allow adding an item to the - list variable declared at the top of the flow: - -<var name="list" class="java.util.ArrayList" /> - - The "addItemAction" bean is also declared in the Spring MVC context. - It performs the add by accessing the list in flow scope and - the item to be added from the request parameters as follows: - -Collection list = context.getFlowScope().getRequiredCollection("list"); -String data = context.getRequestParameters().get("data"); -if (data != null && data.length() > 0) { - list.add(data); -} - - For any outcome the addItem state transitions back to the initial - displayItemList state using an event pattern match: - -<action-state id="addItem"> - <action bean="addItemAction" /> - <transition on="*" to="displayItemlist" /> -</action-state> - - - - - Itemlist-alternate Web Flow - - The Itemlist-alternate web flow (/WEB-INF/itemlist-alternate.xml) - has functionality equivalent to that of itemlist but instead uses - a subflow for selecting individual items. - The "addItem" state is a subflow state - invoking an inline flow called "item" (also defined in itemlist-alternate.xml) - accepting an output parameter from the subflow and adding the - output parameter to a flow-scoped list variable: - -<subflow-state id="addItem" flow="item"> - <attribute-mapper> - <output-mapper> - <mapping source="item" target-collection="flowScope.list" /> - </output-mapper> - </attribute-mapper> - <transition on="finish" to="displayItemlist" /> -</subflow-state> - - An output-mapper is used to pass results from a subflow to a parent flow. - The above declaration defines an expectation on the subflow to return - an output parameter called "item". Accordingly the end state for the - inline flow has this output mapping returning a parameter called "item": - -<end-state id="finish"> - <output-mapper> - <mapping source="requestParameters.data" target="item" /> - </output-mapper> -</end-state> - - With the above declarations we see how a subflow can pass output - parameters back to its parent flow - in this case the 'data' request parameter - is passed back as an output parameter. - - - Once the inner subflow flow has completed the item is passed to the parent flow - as an output parameter, which adds it to its flow-scoped list and transitions - to the initial "displayItemList" state. - - - - - Fileupload Example - - Overview - - Fileupload is a simple one page web application for uploading files to a server. It is based - on Spring MVC, uses a Web Flow controller and one web flow with two states: a view state for - displaying the initial JSP page and an action state for processing the submit. - - - - Web.xml - - The web.xml configuration maps requests for "*.htm" to the fileupload servlet - a regular - Spring MVC DispatcherServlet: - -<servlet> - <servlet-name>fileupload</servlet-name> - <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> -</servlet> - -<servlet-mapping> - <servlet-name>fileupload</servlet-name> - <url-pattern>*.htm</url-pattern> -</servlet-mapping> - - - - - Spring MVC Context - - The Spring MVC servlet context for the fileupload servlet (WEB-INF/fileupload-servlet.xml) defines - one controller bean: - -<bean name="/admin.htm" class="org.springframework.webflow.executor.mvc.FlowController"> - <property name="flowExecutor" ref="flowExecutor" /> -</bean> - - FlowController is a Web Flow controller. It is the main point of integration between Spring MVC - and Spring Web Flow routing requests to one or more managed web flow executions. The - FlowController is injected with flowExecutor and flowRegistry beans containing one web flow - definition: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry" repository-type="singlekey"/> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/fileupload.xml" /> -</flow:registry> - - Given the above definitions the following URI can be used to invoke the "fileupload" flow: - -/swf-fileupload/admin.htm?_flowId=fileupload - - - - Both flowExecutor and flowRegistry beans are defined with Spring custom tags schema available in - Spring 2.0. The custom tags make configuration less verbose and more readable. Regular Spring - bean definitions can be used as well with earlier versions of Spring. - - - The Spring MVC context also defines a view resolver bean for resolving logical view names and a - multipartResolver bean for the upload component. In general Web Flow does not aim to replace the - flexibility of Spring MVC for view resolution. It focuses on the C in MVC. - - - - Fileupload Web Flow - - The start state for the fileupload flow (WEB-INF/fileupload.xml) is a view state: - -<start-state idref="selectFile"/> - -<view-state id="selectFile" view="fileForm"> - <transition on="submit" to="uploadFile"/> -</view-state> - - View states allow a user to participate in a flow by presenting a suitable interface. - The view attribute "fileForm" is a logical view name, which the Spring MVC view resolver bean - will resolve to /WEB-INF/jsp/fileForm.jsp. - - - The fileForm.jsp has an html form that submits back to the same controller - (/swf-fileupload/admin.htm) and passes a "_flowExecutionKey" parameter. - The value for _flowExecutionKey is provided by the FlowController - it identifies the current - instance of the flow and allows Web Flow to resume flow execution, which is paused each time a - view is displayed. - - - The name of the form submit button "_eventId_submit" indicates the event id to use for deciding - where to transition to next. Given an event with id of "submit" the "selectFile" view transitions - to the "uploadFile" state: - -<action-state id="uploadFile"> - <action bean="uploadAction"/> - <transition on="success" to="selectFile"> - <set attribute="fileUploaded" scope="flash" value="true"/> - </transition> - <transition on="error" to="selectFile"/> -</action-state> - - - - The "uploadFile" state is an action state. Action states integrate with business application code and - respond to the execution of that code by deciding what state of the flow to enter next. The code for the - uploadFile state is in the "uploadAction" bean declared in the Spring web context (/WEB-INF/fileupload-servlet.xml): - -<bean id="uploadAction" class="org.springframework.webflow.samples.fileupload.FileUploadAction" /> - - FileUploadAction has simple logic. It picks one of two Web Flow defined events - success or error, - depending on whether the uploaded file size is greater than 0 or not. Both success and error - transition back to the "selectFile" view state. However, a success event causes an attribute named - "fileUploaded" to be set in flash scope - - - A flash-scoped attribute called "file" is also set programmatically in the FileUploadAction bean: - -context.getFlashScope().put("file", new String(file.getBytes())); -return success(); - - This illustrates the choice to save attributes in one of several scopes either programatically or - declaratively. - - - - - Birthdate Example - - Overview - - Birthdate is a web application with 3 consequitive screens. The first two collect user input - to populate a form object. The third presents the results of business calculations based on - input provided in the first two screens. - - - Birthdate demonstrates Spring Web Flow's Struts integration as well as the use of FormAction, - a multi-action used to do the processing required for all three screens. The sample also uses JSTL - taglibs in conjunction with flows. - - - - Web.xml - - The web.xml configuration maps requests for "*.do" to a regular Struts ActionServlet: - -<servlet> - <servlet-name>action</servlet-name> - <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> -</servlet> - -<servlet-mapping> - <servlet-name>action</servlet-name> - <url-pattern>*.do</url-pattern> -</servlet-mapping> - - The web.xml also sets up the loading of a Spring context at web application startup: - -<context-param> - <param-name>contextConfigLocation</param-name> - <param-value> - /WEB-INF/webflow-config.xml - </param-value> -</context-param> - -<listener> - <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> -</listener> - - The Spring web context contains beans to set up the Web Flow runtime environment. As will be - shown in the next section Struts is configured with a Web Flow action that relies on the - presence of a flowExecutor and a flowRegistry beans in this context. - - - - Struts Configuration - - The Struts configuration (WEB-INF/struts-config.xml) defines the following action mapping: - -<action-mappings> - <action path="/flowAction" name="actionForm" scope="request" - type="org.springframework.webflow.executor.struts.FlowAction"/> -</action-mappings> - - FlowAction is a Struts action acting as a front controller to the Web Flow system routing Struts - requests to one or more managed web flow executions. To fully configure the FlowAction a Spring - web context is required to define flowExecutor and flowRegistry beans (named exactly so). This is - an excerpt from the Spring web context (/WEB-INF/webflow-config.xml) defining these beans: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry"/> - -<!-- Creates the registry of flow definitions for this application --> -<flow:registry id="flowRegistry"> - <flow:location path="/WEB-INF/birthdate.xml"/> - <flow:location path="/WEB-INF/birthdate-alternate.xml"/> -</flow:registry> - - - - Based on the above, Web Flow is configured with two flows - birthdate and birthdate-alternate, - which can be invoked as follows: - -/swf-birthdate/flowAction.do?_flowId=birthdate -/swf-birthdate/flowAction.do?_flowId=birthdate-alternate - - The Struts configuration file also defines several global forwards: birthdateForm, cardForm, - and yourAge, which will be referenced from Web Flow definitions as logical view names - (and left to Struts to resolve to actual JSP pages). In general Web Flow does not aim to replace - view resolution capabilities of web frameworks such as Struts or Spring MVC. - It focuses on the C in MVC. - - - - Birthdate Web Flow - - The birthdate web flow (WEB-INF/birthdate.xml) defines the following start state: - -<view-state id="enterBirthdate" view="birthdateForm"> - <render-actions> - <action bean="formAction" method="setupForm" /> - </render-actions> - <transition on="submit" to="processBirthdateFormSubmit" /> -</view-state> - - The setupForm action is called to perform initializations for the enterBirthdate view state. - Its action bean is defined the Spring web context WEB-INF/webflow-config.xml: - -<bean id="formAction" class="org.springframework.webflow.samples.birthdate.BirthDateFormAction" /> - - BirthDateFormAction is a FormAction - it extends Web Flow's FormAction class, which serves a - purpose similar to that of Spring MVC's SimpleFormController providing common form functionality - for data binding and validation. - - - When the BirthDateFormAction bean is instantiated it sets the name, class and scope of the form - object to use for loading form data upon display and collecting form data upon submit: - -public BirthDateFormAction() { - // tell the superclass about the form object and validator we want to - // use you could also do this in the application context XML ofcourse - setFormObjectName("birthDate"); - setFormObjectClass(BirthDate.class); - setFormObjectScope(ScopeType.FLOW); - setValidator(new BirthDateValidator()); -} - - The form object "birthDate" is placed in flow scope, which means it will not be re-created with - each request but will be obtained from flow scope instead as long as the request remains within - the same flow. - - - Once setupForm is done, the "birthdateForm" view will be rendered. - The logical view name "birthdateForm" is a global-forward in struts-config.xml resolving to - /WEB-INF/jsp/birthdateForm.jsp. This JSP collects data for the fields "name" and "date" bound to - the birthDate form object and posts back to FlowAction with a submit image named - "_eventId_submit". An event with the id of "submit" causes a transition to the - processBirthdateFormSubmit action state defined as follows: - -<action-state id="processBirthdateFormSubmit"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validateBirthdateForm" /> - </action> - <transition on="success" to="enterCardInformation" /> - <transition on="error" to="enterBirthdate" /> -</action-state> - - The processBirthDateFormSubmit action state uses the same formAction bean as the one already used - to setup the form. This time its bindAndValidate - method is used to populate and validate the html form values. Also, note the "validateMethod" - attribute used to specify the name of the method to invoke on the Validator object setup in the - constructor of the BirthDateFormAction. The use of this attribute allows partial validation of - complex objects populated over several consecutive screens. - - - On error the action returns to the view state it came from. On success it transitions to the - enterCardInformation view state: - -<view-state id="enterCardInformation" view="cardForm"> - <transition on="submit" to="processCardFormSubmit" /> -</view-state> - - The logical view name "cardForm" is a global-forward in struts-config.xml resolving to - /WEB-INF/jsp/cardForm.jsp. This JSP collects data for the remaining fields of the birthDate form - object - "sendCard" and "emailAddress", and posts back to FlowAction with a submit image named - "_eventId_submit". An event with the id of "submit" causes a transition to the - processCardFormSubmit action state defined as follows: - -<action-state id="processCardFormSubmit"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validateCardForm" /> - </action> - <transition on="success" to="calculateAge" /> - <transition on="error" to="enterCardInformation" /> -</action-state> - - For this action state the bindAndValidate method of the formAction bean is used to populate and - validate the remaining html form values. The "validateMethod" attribute specifies the name of the - method to invoke on the Validator object specific to the fields loaded on the current screen. - - - On error the action returns to the view state it came from. On success it transitions to another - action state called calculateAge: - -<action-state id="calculateAge"> - <action bean="formAction" method="calculateAge" /> - <transition on="success" to="displayAge" /> -</action-state> - - The logic for the calculateAge action state is in the calculateAge method of the same formAction - bean used for data binding and validation. This demonstrates the flexibility Web Flow allows in - properly structuring control and business logic according to function. - - - The caculateAge method performs business calculations and adds a string in request scope with the - calculated age. Upon successful completion the calculateAge action state transitions to the end - view state: - -<end-state id="displayAge" view="yourAge" /> - - Once again the logical view name "yourAge" is a global-forward in struts-config.xml resolving to - /WEB-INF/jsp/yourAge.jsp. This JSP page retrieves the calculated age from request scope and - displays the results for the user. - - - The transition to the end state indicates the end of the web flow. The flow execution is cleaned up. - If the web flow is entered again a new flow execution will start, creating a new form - object named "birthDate" and placing it in flow scope. - - - - Birthdate-alternate Web Flow - - The birthdate-alternate web flow (/WEB-INF/birthdate-alternate.xml) offers an alternative way and - more compact way of defining the same web flow. For example the birthdate web flow defines two - independent states for the first screen - a view state (enterBirthdate) and an action state - (processBirthdateFormSubmit). In birthdate-alternate those are encapsulated in the view state - enterBirthdate as follows: - -<view-state id="enterBirthdate" view="birthdateForm"> - <render-actions> - <action bean="formAction" method="setupForm" /> - </render-actions> - <transition on="submit" to="enterCardInformation"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validateBirthdateForm" /> - </action> - </transition> -</view-state> - - Here the setupForm action state is defined as a render-action of the enterBirthdate view state - while the transition to the next screen uses a nested action bean invoked before the transition - occurs. Notice that success is implicitly required for the transition to occur. Similarly on error - the transition does not occur and the same view state is displayed again. - - - The second screen is also defined with a nested transition and action bean: - -<view-state id="enterCardInformation" view="cardForm"> - <transition on="submit" to="calculateAge"> - <action bean="formAction" method="bindAndValidate"> - <attribute name="validatorMethod" value="validateCardForm" /> - </action> - </transition> -</view-state> - - The remaining two states - calculateAge and displayAge are identical. - - - - - Phonebook-Portlet Example - - Overview - - The Phonebook-Portlet demonstrates how to run the - Phonebook - sample as a JSR-168 portlet. The functionality for Phonebook and Phonebook-Portlet - including web flow definitions, JSP pages, and Java classes is the same and - already well documented. - The focus in Phonebook-Portlet is specifically on how to configure - and run Phonebook in a Portal container. - - - - JSR-168 defines portlets but not how portlets integrate into a - portal container. This process is left open to portal vendors who - have their own individual mechanisms. - The Phonebook-Portlet sample is configured to run with - Apache Pluto - - a reference implementation of the Java Portlet Specification. - However, its dependence on Pluto is limited to configuration in web.xml. - Hence it should be easy to adapt for use - in other Portal/Portlet implementations after learning the - deployment steps specific for that implementation. - - - - - Portal/Portlet Related Software Used in the Sample - - This section provides a very brief introduction to the portal related - supporting software used in the sample - namely Apache Pluto - and the Portlet MVC framework. If this is not new for you - feel free to skip to the next section. - - - Apache Pluto - - For those familiar with servlet applications the process - of deploying and running a portlet application can be - confusing and requires some explanation. - Typically an application with JSR-168 portlets runs in - one webapp while a portal/portlet container runs - in a separate webapp making cross-context calls to - portlets. How exactly this is configured - depends on each portal vendor. - - - Pluto is an open-source reference implementation of the - Java Portlet specification. The following general steps - are required to run portlets with it. First the - the portlet application's web.xml is "injected" with - configuration required for Pluto. Secondly Pluto's - Portal web application, usually set to run at - http://localhost:8080/pluto/portal - is used to add or remove portlets to one or more - portal container pages. - - - The web.xml for the Phonebook-Portlet sample has - already been "injected" with the configuration required - for Pluto 1.1.0. Although this enables it for use with Pluto - you must still use the - admin pages of Pluto's Portal web application to add - the Phonebook-Portlet to a test portal page. For more - information on how to do this please follow instructions from - Apache Pluto. - - - - Portlet MVC Framework - - The Portlet MVC framework represents Spring's support for JSR-168. - It has many parallels with the Spring MVC framework such - as the DispatcherPortlet, the Controller interface, - handler mappings, view resolvers, and exception handlers. - The main differences between Portlet MVC and Spring MVC - have to do with the lifecycles of a portlet and its - distinct phases as defined in the Porlet Specification: - the action and the render phases. - For more information see - - Chapter 16 (Portlet MVC Framework) from the Spring reference - documentation. - - - - Getting Phonebook Portlet up and Runnign with Apache Pluto - - Since the phonebook portlet was tested with Apache Pluto we've - decided to documents the steps taken to deploy and run it - - Download the Pluto 1.1 binary distribution named pluto-current-bundle from http://portals.apache.org/pluto - Unzip the binary distribution to any directory. - Create the directory [pluto-home]/webapps/swf-phonebook-portlet - Copy the content of [webflow-release]/spring-webflow-samples/phonebook-portlet/target/artifacts/war-expanded to the directory created in the previous step - Start Pluto with [pluto-home]/bin/startup - Go to http://localhost:8080/pluto/portal - Login as tomcat/tomcat (or any other user but see note below) - After logging in you will be taken to the Portal Test page. - Here you will see a Navigation pull-down menu at the top. Select 'Pluto Admin' from it to go to the Pluto Admin page. - On the Pluto Admin page under Portlet Applications you will see a drop-down with available portlet applications - Select '/swf-phonebook-portlet' from it, then phonebook from the drop-down next to it, and then press the 'Add Portlet' button - Use the Navigation menu at the top to go back to the Test Page. The Phonebook portlet should be present. - - - - - The tomcat user must have the 'pluto' role. Open - [pluto-home]/conf/tomcat-users.xml and ensure the - following lines are there: - -<role rolename="pluto"/> -<user username="tomcat" password="tomcat" roles="tomcat,pluto"/> - - - - - - - Portlet.xml Configuration - - Portlet.xml is a standard deployment descriptor where - portlet resources are defined. The Phonebook-Portlet - is based the Portlet MVC DispatcherPorlet: - -<portlet-class> - org.springframework.web.portlet.DispatcherPortlet -</portlet-class> - - The DispatcherPortlet is Spring's implementation of the Portlet interface - dispatching requests for a portlet to registered Portlet MVC handlers. - The phonebook portlet is configured with the following Spring - contexts containing Portlet MVC handler, controller and - view resolver beans: - -<init-param> - <name>contextConfigLocation</name> - <value> - /WEB-INF/phonebook-portlet-config.xml /WEB-INF/phonebook-webflow-config.xml - </value> -</init-param> - - The above configuration defines phonebook as a portlet resource. In order - to use it in a portal/portlet container - additional web.xml configuration is required. - - - - Web.xml Configuration - - The Java Portlet Specification is defined as a layer over existing Servlet - infrastructure. Therefore some sort of a servlet is required to accept servlet - requests and expose portlet resources. Portal vendors - provide such servlets and specific configuration varies by vendor. - The Phonebook-Portlet has the following Apache Pluto servlet definition - and servlet mapping: - -<!-- Generated Portlet Wrapper Servlet for Apache Pluto deployment --> -<servlet> - <servlet-name>phonebook</servlet-name> - <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class> - <init-param> - <param-name>portlet-name</param-name> - <param-value>phonebook</param-value> - </init-param> - <load-on-startup>1</load-on-startup> -</servlet> -<servlet-mapping> - <servlet-name>phonebook</servlet-name> - <url-pattern>/PlutoInvoker/phonebook</url-pattern> -</servlet-mapping> - - - - - The above configuration was auto generated using ant tasks from - Apache Pluto 1.1.0. This configuration is included in web.xml - for convenience and also as an example. - For the most up-to-date information on required configuration please - check Pluto's documentation. - - - - The web.xml configuration also contains the following servlet definition: - -<servlet> - <servlet-name>viewRendererServlet</servlet-name> - <servlet-class> - org.springframework.web.servlet.ViewRendererServlet - </servlet-class> -</servlet> -<servlet-mapping> - <servlet-name>viewRendererServlet</servlet-name> - <url-pattern>/WEB-INF/servlet/view</url-pattern> -</servlet-mapping> - - - - The main purpose of this servlet is to allow reuse of Spring MVC's flexible - view resolution and rendering capabilities in a Portlet application. - The DispatcherPortlet converts a PortletRequest/PortletResponse to an - HttpServletRequest/HttpServletResponse and then performs an include of - this servlet. - - - - Portlet MVC Configuration - - The phonebook-portlet-config.xml is very similar to the Spring MVC - equivalent phonebook-servlet.xml from the Phonebook sample. The main - difference is in the use of a PortletModeHandlerMapping: - -<bean id="portletModeControllerMapping" - class="org.springframework.web.portlet.handler.PortletModeHandlerMapping"> - <property name="portletModeMap"> - <map> - <entry key="view" value-ref="flowController"/> - </map> - </property> -</bean> - - and a PortletFlowController: - -<bean id="flowController" class="org.springframework.webflow.executor.mvc.PortletFlowController"> - <property name="flowExecutor" ref="flowExecutor"/> - <property name="defaultFlowId" value="search-flow"/> -</bean> - - A PortletModeHandlerMapping allows mapping specific to each - portlet mode. The VIEW mode in this case is mapped to the - flowController bean, which delegates the request to Web Flow's - executor for launching or resuming a flow from a flow definition. - For more information on Phonebook flow definitions please - refer to the - Phonebook - sample documentation. - - - One last thing to observe is the following configuration in - /WEB-INF/phonebook-webflow-config.xml: - -<!-- Launches new flow executions and resumes existing executions. --> -<flow:executor id="flowExecutor" registry-ref="flowRegistry"> - <flow:execution-attributes> - <!-- execution redirects don't apply in a Portlet environment --> - <flow:alwaysRedirectOnPause value="false"/> - </flow:execution-attributes> -</flow:executor> - - As the comment indicates the default behavior of redirect after submit - must be turned off in a portlet environment where there is no HTTP redirect. - For more information on the alwaysRedirectOnPause refer to the following - article. - - - - diff --git a/spring-webflow/docs/reference/src/spring-faces.xml b/spring-webflow/docs/reference/src/spring-faces.xml deleted file mode 100644 index fae2b26c..00000000 --- a/spring-webflow/docs/reference/src/spring-faces.xml +++ /dev/null @@ -1,382 +0,0 @@ - - - Spring Faces - - Introduction - - Spring Faces is the home of the new Spring Web Flow + JSF 1.2 integration layer, as well as a number of additional value adds specific - to a JSF environment. These value adds include: - - - Unified EL Integration - A separate implementation of the ExpressionParser from Spring Binding that uses - the new Unified EL from JSF 1.2 and JSP 2.1. This allows for JSF users to use the same expression language in their flow definitions - as in their JSF views. - - - Client Side Validator Components - A small set of JSF components that work as "advisors" on regular JSF inputText components. These - components make use of the rich validation capabilities of the Dojo javascript framework by default, with an alternate set of tags - based on Ext also available. - - - - Web Flow Java Server Faces (JSF) integration - - The Spring Faces module provides strong integration between Spring Web Flow and Java Server Faces (JSF). When used with JSF, - Spring Web Flow takes responsibility for view navigation handling and managing model state, adding power and - simplicity beyond JSF's default navigation system and object scopes. Plain JSF views and components continue to work just as before, - and are able to participate in flows with full access to flow state. In addition, other view technologies - such as Facelets continue to plug-in normally. - - - The JSF integration relies on custom implementations of core JSF artifacts to drive the execution of flows. In addition, - it relies on custom ELResolvers to access flow execution attributes from JSF components. - - - Adding Spring Web Flow extensions to a JSF application. - - Using Spring Web Flow in a JSF environment does not require any additions to the application's faces-config.xml. The Spring Faces - jar just needs to be on the classpath and all of the custom JSF artifacts provided by spring-faces will be picked - up by JSF automatically. Ideally, when building new applications from the start with Spring Faces, a faces-config.xml should - not be needed at all in preference for having all beans managed by Spring. - - - - Configuring the Web Flow system - - The artifacts configured by Spring Faces use Spring to access the Web Flow system configuration. - This requires the Spring Web Servlet to be configured in the web.xml deployment descriptor: - - -<!-- The front controller of the Spring Web application, responsible for handling all application requests --> -<servlet> - <servlet-name>Spring Web Servlet</servlet-name> - <servlet-class>org.springframework.webflow.servlet.SpringWebServlet</servlet-class> - <init-param> - <param-name>configLocations</param-name> - <param-value>/WEB-INF/config/web-application-config.xml</param-value> - </init-param> - <load-on-startup>1</load-on-startup> -</servlet> - -<!-- Map all /spring/* requests to the Spring Web Servlet for handling --> -<servlet-mapping> - <servlet-name>Spring Web Servlet</servlet-name> - <url-pattern>/spring/*</url-pattern> -</servlet-mapping> - - - The application context bootstrapped by the Spring Web Servlet should contain the Web Flow system configuration. - The example webflow-config.xml below shows a typical Web Flow configuration for a JSF environment: - - -<?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:web="http://www.springframework.org/schema/webflow-config" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-2.0.xsd - http://www.springframework.org/schema/webflow-config - http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"> - - <!-- Imports the "application-layer" definining business logic and data access services --> - <import resource="application-layer-config.xml"/> - - <web:flow-executor id="flowExecutor" flow-registry="flowRegistry"> - <web:flow-execution-listeners> - <web:listener ref="jpaFlowExecutionListener" criteria="*"/> - </web:flow-execution-listeners> - </web:flow-executor> - - <web:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices"> - <web:flow-location path="flow/main/main.xml" /> - <web:flow-location path="flow/booking/booking.xml" /> - <web:flow-builder class="org.springframework.faces.ui.resource.ResourcesFlowBuilder" /> - </web:flow-registry> - - <bean id="flowBuilderServices" class="org.springframework.webflow.engine.builder.support.FlowBuilderServices"> - <property name="expressionParser"> - <bean class="org.springframework.webflow.core.expression.el.WebFlowELExpressionParser"> - <constructor-arg > - <bean class="org.jboss.el.ExpressionFactoryImpl"/> - </constructor-arg> - </bean> - </property> - <property name="viewFactoryCreator"> - <bean class="org.springframework.faces.webflow.JsfViewFactoryCreator"/> - </property> - </bean> - -</beans> - - - A bean named flowExecutor must be configured and linked with a flow definition registry - that contains the flows eligible for execution. Note the flowExecutor bean name is significant, - as that is bean name the Web Flow JSF extensions will expect. - - - Any flow executor property such as the flow execution repository type is configurable here, consistent - with the other environments Spring Web Flow supports. - - - The flowRegistry bean definition shows the registration of two XML based flow definitions, as well - as a special java-based FlowBuilder that installs a special flow for serving the javascript and CSS resources needed - by the Spring Faces custom JSF components. - - - The flowBuilderServices provides a number of JSF-specific services to the flowRegistry, including the - WebFlowELExpressionParser that allows Web Flow to use the Unified EL for parsing expressions in flow definitions. - - - - Configuring the FacesServlet - - Even in an ideal scenario where the SpringWebServlet is handling all incoming requests, the FacesServlet - must still be configured in web.xml in order for JSF to bootstrap properly: - - -<!-- Here so the JSF implementation can initialize, not used at runtime --> -<servlet> - <servlet-name>Faces Servlet</servlet-name> - <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> - <load-on-startup>1</load-on-startup> -</servlet> - -<!-- Mapping for faces initialization --> -<servlet-mapping> - <servlet-name>Faces Servlet</servlet-name> - <url-pattern>*.faces</url-pattern> -</servlet-mapping> - - - This configuration also allows for the mixing of legacy pure JSF request handling with the request handling of Spring Web Flow for easier - page-by-page migration. - - - - Launching a flow execution - normal HTML anchor - - The preferred way of launching a flow from an external system, such as a normal JSF view is by accessing flow definition - URLs directly using a bookmark or normal HTML link: - - -<a href="/spring/main">Go</a> - - - This link would launch the "main" flow, assuming /spring/* has been mapped to the SpringWebServlet defined within web.xml. - - - - Launching a flow execution - JSF command link component - - Before going this route, it should be considered whether the same effect can be achieved with a normal REST-ful URL link in combination perhaps - in combination with a custom Web Flow action in order to execute specialized logic. If it is an absolute requirement to use - a JSF UICommand component, then the recommended approach is to programmatically have JSF forward the request to the flow execution URL from within - a JSF ActionListener. - - -public void myActionListener(ActionEvent event) { - // Execute any required processing and then forward to the flow execution - - facesContext.getCurrentInstance().getExternalContext().dispatch("/spring/main/"); - facesContext.getCurrentInstance().responseComplete(); -} - - - - Flow definitions in a JSF environment - - Flow definitions in a JSF environment are just plain Spring Web Flow definitions: - - -<?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-1.0.xsd"> - - <var name="myBean" class="example.ManagedBeanImpl" scope="conversation" /> - - <start-state idref="displayView" /> - - <view-state id="displayView" view="myview.jsp"> - <transition on="submit" to="prepareNextView"/> - </view-state> - - <action-state id="prepareNextView" > - <bean-action bean="myService" method="loadMyModel"> - <method-arguments> - <argument expression="#{myBean.foo}"/> - </method-arguments> - </bean-action> - <transition on="success" to="displayNextView"/> - </action-state> - - <view-state id="displayNextView" view="mynextview.jsp" /> - -</flow> - - - A primary benefit of using JSF is it is a rich UI component framework, and UI components have both data and behavior. - As JSF components typically handle data binding and field-level validation behaviors, the actual flow - definition logic is often simpler and more focused as a result. - - - An important difference to note in the above example is the difference in using EL expressions versus Web Flow's traditional - OGNL expressions. When using the ELExpressionParser, the chain of configured resolvers will automatically resolve an expression - against the correct scope, so the "conversationScope" identifier is optional in the expression when referencing "myBean". - - - Views selected by view states are specified using paths relative to the current flow definition. In the above example, it is - expected that myview.jsp and mynextview.jsp are both located in the same directory as the flow definition. - - - - Resuming a flow execution - form bound to flow execution variables - - Views participating in flows are just plain JSF views. They may also incorporate other - JSF view technologies such as Facelets and Ajax4JSF. - - -<f:view> - <h:form id="form"> - ... - <h:inputText id="propertyName" value="#{someBean.someProperty}"/> - ... - <h:commandButton type="submit" value="Next" action="submit"/> - </h:form> -</f:view> - - - As shown above, there is nothing Spring Web Flow specific here. The flow execution - key is automatically tracked by a special UI component in the view root, so there is no need to - track it manually. Action outcomes are automatically mapped to Spring Web Flow event identifiers - signaled against the current state. - - - - Spring Faces JSF Components - - Spring Faces provides some lightweight JSF components that act in an "advisor" role to provide rich client-side validation - capabilities to standard inputText components. These can be used in place of server-side JSF validators to provide immediate - validation feedback to the end user without the overhead of another fine-grained call to the server. The default implementation - of these components use the Dojo javascript library to provide this validation behavior. Dojo was chosen due to their increased - attention to accessibility concerns compared to other javascript frameworks. An alternate implementation based on the Ext library - is also provided. Though Ext does not address accessibility issues, it can still be attractive for use in internal corporate - intranet style applications. - - - Spring Faces Component Configuration - - The Spring Faces components are currently provided as Facelets tags. In order to utilize them, the - following namespace declaration must be added to the header of a Facelets view template: - - -xmlns:sf="http://www.springframework.org/tags/faces" - - - - Spring Faces Resource Loading - - Spring Faces requires the installation of a special flow for loading javascript and CSS resources, as shown in the configuration - example. This special stateless flow serves up resources corresponding to URLs such as "/spring/resources/dojo/dojo.js". This flow - searches for the corresponding resource as follows: - - - 1) Look for the resource in the web app root using the context-relative path "/dojo/dojo.js", and serve the resource if found. - - - 2) If not found in the web app root, try and load the resource from the classpath using the path "/META-INF/dojo/dojo.js" and - serve the resource if found. - - - - - For convenience, the external javascript libraries that the Spring Faces components depend on are made available in seperate - jar files, and will be automatically loaded by the components when needed using the proper resource URLs. Since the resource loading - mechanism checks in the web app classpath first it is possible to, for example, override the provided resources with a custom build of the - Dojo or Ext library that is optimized for the particular application. - - - - Using The Spring Faces Client Side Validation Components - - Spring Faces provides three different client-side validator components: - - - - - - <sf:clientTextValidator> - Provides validation with customizable error messages for text fields. - - - - - <sf:clientNumberValidator> - Provides validation and input filtering with customizable error messages for numeric - fields. - - - - - <sf:clientDateValidator> - Provides validation and a rich popup date picker control with customizable error - messages for date fields. - - - - - <sf:validateAllOnClick> - When wrapped around a UICommand component such as <h:commandButton> or <h:commandLink> - fires all client-side validators when the UICommand component is clicked and prevents the form from being submitted if - any of the validations fail. - - - - - - The validator components must be wrapped around an <h:inputText> component (or any other component that renders an HTML text input). - For example, see the following snippet from the Booking sample application: - - - -<sf:clientDateValidator required="true"> - <h:inputText id="checkinDate" value="#{booking.checkinDate}" required="true"> - <f:convertDateTime pattern="yyyy-MM-dd" timeZone="EST"/> - </h:inputText> -</sf:clientDateValidator> - - - - In general, each of the available validations has a corresponding sensible default error message. The error messages - can be overridden via the component's "invalidMessage" attribute. All of the customizable message attributes are - value-binding aware so that expressions may be used to bind to keys in the application message bundle if so desired. - - - Please refer to the javadocs of the component classes to see all of the attributes for the components. More - extensive taglib docs will be available with the final release of Spring Web Flow 2.0. - - - - Using Ext Version of The Spring Faces Client Side Validation Components - - An alternate version of the components based on the Ext library is provided under a separate tag namespace. - In order to utilize them, the following namespace declaration must be added to the header of a Facelets view template: - - -xmlns:sfe="http://www.springframework.org/tags/faces-ext" - - - The basic behavior of the Ext versions of the components is the same, but the tags have different attributes that correspond with the attributes - of the underlying Ext widgets. Please refer to the javadocs of the component classes to see all of the attributes for the components. More - extensive taglib docs will be available with the final release of Spring Web Flow 2.0. - - - - - Spring Web Flow JSF Integration Samples - - See the booking-jsf sample that provides a complete example of Spring Web Flow - operating in a JSF environment, including use of flow-managed persistence, EL integration, and the - client-side JSF validator components of Spring Faces. - - - - \ No newline at end of file