See Interceptor Configuration for basic information about how interceptors are configured. OverviewAn interceptor is a stateless class that follows the interceptor pattern, as found in {@link javax.servlet.Filter} and in AOP languages. Interceptors are objects that dynamically intercept Action invocations. They provide the developer with the opportunity to define code that can be executed before and/or after the execution of an action. They also have the ability to prevent an action from executing. Interceptors provide developers a way to encapulate common functionality in a re-usable form that can be applied to one or more Actions. Interceptors must be stateless and not assume that a new instance will be created for each request or Action. Interceptors may choose to either short-circuit the ActionInvocation execution and return a return code (such as com.opensymphony.xwork.Action#SUCCESS), or it may choose to do some processing before and/or after delegating the rest of the procesing using ActionInvocation#invoke(). Webwork & XWork InterceptorsInterceptor classes are also defined using a key-value pair specified in the xwork configuration file. The names specified below come specified in webwork-default.xml. If you extend the webwork-default package, then you can use the names below. Otherwise they must be defined in your package with a name-class pair specified in the <interceptors> tag.
Method FilteringAn abstract Setable parameters are as follows:
NOTE: If method name are available in both includeMethods and excludeMethods, it will still be considered as an included method. In short includeMethods takes precedence over excludeMethods. Interceptors that extends this capability would be :-
Interceptor Parameter OverridingInterceptor's parameter could be overriden through the following ways :- Method 1: <action name="myAction" class="myActionClass"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="params"/> <interceptor-ref name="servlet-config"/> <interceptor-ref name="prepare"/> <interceptor-ref name="i18n"/> <interceptor-ref name="chain"/> <interceptor-ref name="model-driven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="static-params"/> <interceptor-ref name="params"/> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">myValidationExcudeMethod</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">myWorkflowExcludeMethod</param> </interceptor-ref> </action> Method 2: <action name="myAction" class="myActionClass"> <interceptor-ref name="defaultStack"> <param name="validation.excludeMethods">myValidationExcludeMethod</param> <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param> </interceptor-ref> </action> In the first method, the whole default stack is copied and the parameter then changed accordingly. In the second method, the <interceptor-name>.<parameter-name> Note also that in this case the Nested Parameter Overriding
Interceptor stack parameter overriding could be nested into as many level as possible, though it would be advisable not to nest it too deep as to avoid confusion, For example, <interceptor name="interceptor1" class="foo.bar.Interceptor1" /> <interceptor name="interceptor2" class="foo.bar.Interceptor2" /> <interceptor name="interceptor3" class="foo.bar.Interceptor3" /> <interceptor name="interceptor4" class="foo.bar.Interceptor4" /> <interceptor-stack name="stack1"> <interceptor-ref name="interceptor1" /> </interceptor-stack> <interceptor-stack name="stack2"> <interceptor-ref name="intercetor2" /> <interceptor-ref name="stack1" /> </interceptor-stack> <interceptor-stack name="stack3"> <interceptor-ref name="interceptor3" /> <interceptor-ref name="stack2" /> </interceptor-stack> <interceptor-stack name="stack4"> <interceptor-ref name="interceptor4" /> <interceptor-ref name="stack3" /> </interceptor-stack>Assuming the interceptor has the following properties
<action ... > <!-- to override parameters of interceptor located directly in the stack --> <interceptor-ref name="stack4"> <param name="interceptor4.param4"> ... </param> </interceptor-ref> </action> <action ... > <!-- to override parameters of interceptor located under nested stack --> <interceptor-ref name="stack4"> <param name="stack3.interceptor3.param3"> ... </param> <param name="stack3.stack2.interceptor2.param2"> ... </param> <param name="stack3.stack2.stack1.interceptor1.param1"> ... </param> </interceptor-ref> </action> Order of Interceptor ExecutionInterceptors provide an excellent means to wrap before/after processing. The concept reduces code duplication (think AOP). <interceptor-stack name="xaStack"> <interceptor-ref name="thisWillRunFirstInterceptor"/> <interceptor-ref name="thisWillRunNextInterceptor"/> <interceptor-ref name="followedByThisInterceptor"/> <interceptor-ref name="thisWillRunLastInterceptor"/> </interceptor-stack> Note that some interceptors will interrupt the stack/chain/flow... so the order is very important. Interceptors implementing com.opensymphony.xwork.interceptor.PreResultListener will run after the Action executes its action method but before the Result executes thisWillRunFirstInterceptor thisWillRunNextInterceptor followedByThisInterceptor thisWillRunLastInterceptor MyAction1 MyAction2 (chain) MyPreResultListener MyResult (result) thisWillRunLastInterceptor followedByThisInterceptor thisWillRunNextInterceptor thisWillRunFirstInterceptor |