Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

The ActionChainResult in WebWork framework provides the ability to compose multiple Actions together to execute in chain multiple actions into a defined sequence or workflow. By applying the ActionChainResult as the result of your Action, like so:

...


<!-- simple chain example to an action in same namespace ->
<result name="success" type="chain">
    <param name="actionName">Bar</param>
</result>

This feature works by applying a Chain Result to a given Action, and intercepting its target Action's invocation with a Chaining Interceptor.

...

As a rule, Action Chaining is not recommended. First explore other options, such as the Redirect After Post technique.

Chain Result

The Chain Result is a result type that invokes an Action with its own Interceptor Stack and Result. This Interceptor allows an Action to forward requests to a target Action, while propagating the state of the source Action. Below is an example of how to define this sequence.

...

Another action mapping

...


<!- example of chaining to an action in a different namespace/package -->
<result name="success" type="chain">
	<param name="actionName">viewFoo</param>
	<param name="namespace">/foo</param>
</result>	

another Action in the same namespace (or the default "" namespace) can be executed after this Action action mapping (see Configuration Files). An optional "namespace" parameter may also be added to specify an Action action in a different namespace.

Chaining Interceptor

If you need to copy the properties from your previous Actions in the chain to the current action, you should apply the Chaining Interceptor. The Interceptor will copy the original parameters from the request, and the ValueStack are is passed in when this Action is chained to , so the chained to Action will be added on the ValueStack above the chained from Action. This allows the chained to the target Action. The source Action is remembered by the ValueStack, allowing the target Action to access the properties of the preceding Action(s) using the ValueStack, and also makes these properties available to the final result of the chain, such as the JSP or Velocity page. If you need to copy the properties from your previous Actions in the chain to the current Action, you should apply the ChainingInterceptor which copies the properties of all objects on the ValueStack to the current target.

One common use of Action chaining is to provide lookup lists (like for a dropdown list of states, etc). Since these Actions get put on the ValueStack, these their properties will be available in the view. This functionality can also be done using the ActionTag to execute an Action from the display page. In WW1.x Action chaining is often used to chain to a RedirectAction to redirect to another page after processing (in WW2 we have a redirect result).Basically it's good when you have some reusable code you want to encapsulate... In WW2 if you use it a lot, you could make it an Interceptor, or use it as an Action with chaining. If you need to set up and use some properties from it, it needs to be an Action.. You may also use the Redirect Action Result to accomplish this.

Use with care

Experience shows that chaining should be used with care. If chaining is overused, an application can turn into "spaghetti code". Actions should be treated as a Transaction Script, rather than as methods in a Business Facade. Be sure to ask yourself why you need to chain from one Action to another. Is a navigational issue, or could the logic in Action2 be pushed back to a support class or business facade so that Action1 can call it too?

Ideally, Action classes should be as short as possible. All the core logic should be pushed back to a support class or a business facade, so that Actions only call methods. Actions are best used as adapters, rather than as a class where coding logic is defined.

Next: Result Types