Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

As you can see, lesson 4.1.1's formProcessing Action uses the validationWorkflowStack. That is an interceptor stack, which organizes a bunch of interceptors in the order in which they are to be executed. That stack is configured in webwork-default.xml, so all we have to do to use it is declare a <interceptor-ref /> under the action configuration or a <default-interceptor-ref />, under package configuration, as seen in lesson 3's first example:

Interceptor configuration from

...

starter example:

Code Block
xml
xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.01.dtd">

<xwork>
	    <!-- Include webwork defaults (from WebWork JAR). -->
	    <include file="webwork-default.xml" />
	
	    
    <!-- Configuration for the default package. -->
	    <package name="default" extends="webwork-default">
		<!-- Default interceptor stack. --> 
		<default-interceptor-ref        <action name="defaultStacklistPeople" /> 
		
		<!-- Action: Lesson 03: HelloWebWorldAction. --> 
		<action name="helloWebWorld" class="lesson03.HelloWebWorldAction"> 
			<result name="success" type="dispatcher">ex01-success.jsp</result> 
		</action> 
	</package>
</xwork>

But let's see how it works from scracth:

class="com.acme.ListPeople">
            <result type="freemarker">listPeople.ftl</result>
        </action>

        <action name="newPerson" class="com.acme.CreatePerson">
            <result type="redirect">listPeople.action</result>
            <result name="input" type="freemarker">newPerson.ftl</result>
        </action>
    </package>
</xwork>

But let's see how it works from scracth:

  1. Create an interceptor class, which is a class that implements the com.opensymphony.xwork.interceptor.Interceptor interface (bundled in xwork-1.0.jar);
  2. Declare the class in your XML configuration file (xwork.xml) using the element <interceptor /> nested within <interceptors />;
  3. Create stacks of
  4. Create an interceptor class, which is a class that implements the com.opensymphony.xwork.interceptor.Interceptor interface (bundled in xwork-1.0.jar);
  5. Declare the class in your XML configuration file (xwork.xml) using the element <interceptor /> nested within <interceptors />;
  6. Create stacks of interceptors, using the <interceptor-stack /> element (optional);
  7. Determine which interceptors are used by which action, using <interceptor-ref /> or <default-interceptor-ref />. The former defines the interceptors to be used in a specific action, while the latter determines the default interceptor stack to be used by all actions that do not specify their own <interceptor-ref />.

Looking inside webwork-default.xml we can see how it's done:

webwork-default.xml:

's done:

webwork-default.xml:

Code Block
xml
xml

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">

<!-- // START SNIPPET: webwork-default -->
<xwork>
    <package name="webwork-default">
        <result-types>
            <result-type name="chain" class="com.opensymphony.xwork.ActionChainResult"/>
            <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"
                         default="true"/>
            <result-type name="freemarker" class="com.opensymphony.webwork.views.freemarker.FreemarkerResult"/>
            <result-type name="httpheader" class="com.opensymphony.webwork.dispatcher.HttpHeaderResult"/>
            <result-type name="jasper" class="com.opensymphony.webwork.views.jasperreports.JasperReportsResult"/>
            <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
            <result-type name="redirect-action"
                         class="com.opensymphony.webwork.dispatcher.ServletActionRedirectResult"/>
            <result-type name="stream" class="com.opensymphony.webwork.dispatcher.StreamResult"/>
            <result-type name="velocity" class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
            <result-type name="xslt" class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
        </result-types>

        <interceptors>
            <interceptor name="alias" class="com.opensymphony.xwork.interceptor.AliasInterceptor"/>
            <interceptor name="autowiring"
                         class="com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
            <interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
            <interceptor name="conversionError"
                         class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
            <interceptor name="external-ref" class="com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"/>
            <interceptor name="execAndWait" class="com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"/>
            <interceptor name="exception" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
            <interceptor name="fileUpload" class="com.opensymphony.webwork.interceptor.FileUploadInterceptor"/>
            <interceptor name="i18n" class="com.opensymphony.xwork.interceptor.I18nInterceptor"/>
            <interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
            <interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
            <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
            <interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
            <interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
            <interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
            <interceptor name="sessionAutowiring"
                         class="com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringInterceptor"/>
            <interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
            <interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
            <interceptor name="token-session"
                         class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
            <interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
            <interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>

            <!-- Basic stack -->
            <interceptor-stack name="basicStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="servlet-config"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="static-params"/>
                <interceptor-ref name="params"/>
                <interceptor-ref name="conversionError"/>
            </interceptor-stack>

            <!-- Sample validation and workflow stack -->
            <interceptor-stack name="validationWorkflowStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="validation"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!-- Sample file upload stack -->
            <interceptor-stack name="fileUploadStack">
                <interceptor-ref name="fileUpload"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample WebWork Inversion of Control stack
                 Note: WebWork's IoC is deprecated - please
                 look at alternatives such as Sprint -->
            <interceptor-stack name="componentStack">
                <interceptor-ref name="component"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample model-driven stack  -->
            <interceptor-stack name="modelDrivenStack">
                <interceptor-ref name="model-driven"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample action chaining stack -->
            <interceptor-stack name="chainStack">
                <interceptor-ref name="chain"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample i18n stack -->
            <interceptor-stack name="chainStack">
                <interceptor-ref name="i18n"/>
                <interceptor-ref name="basicStack"/>
            </interceptor-stack>

            <!-- Sample execute and wait stack.
                 Note: execAndWait should always be the *last* interceptor. -->
            <interceptor-stack name="executeAndWaitStack">
                <interceptor-ref name="basicStack"/>
                <interceptor-ref name="execAndWait"/>
            </interceptor-stack>

            <!-- A complete stack with all the common interceptors in place.
                 Generally, this stack should be the one you use, though it
                 may process additional stuff you don't need, which could
                 lead to some performance problems. Also, the ordering can be
                 switched around (ex: if you wish to have your components
                 before prepare() is called, you'd need to move the component
                 interceptor up -->
            <interceptor-stack name="defaultStack">
                <interceptor-ref name="exception"/>
                <interceptor-ref name="alias"/>
                <interceptor-ref name="prepare"/>
                <interceptor-ref name="servlet-config"/>
                <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"/>
                <interceptor-ref name="workflow"/>
            </interceptor-stack>

            <!-- The completeStack is here for backwards compatibility for
                 applications that still refer to the defaultStack by the
                 old name -->
            <interceptor-stack name="completeStack">
                
Code Block
xmlxml

<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.dtd">

<xwork>
	<package name="webwork-default">
		<result-types>
			<result-type name="dispatcher" default="true"
				class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult"/>
			<result-type name="redirect" 
				class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
			<result-type name="velocity" 
				class="com.opensymphony.webwork.dispatcher.VelocityResult"/>
			<result-type name="chain" 
				class="com.opensymphony.xwork.ActionChainResult"/>
			<result-type name="xslt" 
				class="com.opensymphony.webwork.views.xslt.XSLTResult"/>
		</result-types>
	
		<interceptors>
			<interceptor name="timer" 
				class="com.opensymphony.xwork.interceptor.TimerInterceptor"/>
			<interceptor name="logger" 
				class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/>
			<interceptor name="chain" 
				class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/>
			<interceptor name="static-params" 
				class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/>
			<interceptor name="params" 
				class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
			<interceptor name="model-driven" 
				class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/>
			<interceptor name="component" 
				class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/>
			<interceptor name="token" 
				class="com.opensymphony.webwork.interceptor.TokenInterceptor"/>
			<interceptor name="token-session" 
				class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/>
			<interceptor name="validation" 
				class="com.opensymphony.xwork.validator.ValidationInterceptor"/>
			<interceptor name="workflow" 
				class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/>
			<interceptor name="servlet-config" 
				class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/>
			<interceptor name="prepare" 
				class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/>
			<interceptor name="conversionError" 
				class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/>
			<interceptor-stack name="defaultStack">
				<interceptor-ref name="static-params"/>
				<interceptor-ref name="params"/>
				<interceptor-ref name="conversionError"/>
			</interceptor-stack>
			<interceptor-stack name="validationWorkflowStack">
				<interceptor-ref name="defaultStack"/>
				<interceptor-ref name="validation"/>
				<interceptor            </interceptor-stack>
        </interceptors>

        <default-interceptor-ref name="workflowdefaultStack"/>
			    </interceptor-stack>package>
		</interceptors>xwork>
	</package>
</xwork>!-- // END SNIPPET: webwork-default -->

Since we included webwork-default.xml in our xwork.xml, all the interceptors and stacks above are available for us to use in our actions. Here's what these interceptors do:

...