Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

Code Block
xml
xml
<action name="formProcessing" class="lesson04_01_01.FormProcessingAction"> 
	<result name="input" type="dispatcher">ex01-index.jsp</result> 
	<result name="success" type="dispatcher">ex01-success.jsp</result> 
	<interceptor-ref name="validationWorkflowStack" /> 
</action> 

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:

...

Code Block
xml
xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" 
"http://www.opensymphony.com/xwork/xwork-1.0.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 name="defaultStack" /> 
		
		<!-- 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:

...

Code Block
xml
xml
<!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-ref name="workflow"/>
			</interceptor-stack>
		</interceptors>
	</package>
</xwork>

...

Code Block
java
java
package lesson05;

import java.util.Calendar;
import com.opensymphony.xwork.interceptor.Interceptor;
import com.opensymphony.xwork.ActionInvocation;

public class GreetingInterceptor implements Interceptor {
	public void init() { }
	public void destroy() { }
	public String intercept(ActionInvocation invocation) throws Exception {
		Calendar calendar = Calendar.getInstance();
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		String greeting = (hour < 6) ? "Good evening" : 
			((hour < 12) ? "Good morning": 
			((hour < 18) ? "Good afternoon": "Good evening"));

		invocation.getInvocationContext().getSession().put("greeting", greeting);

		String result = invocation.invoke();

		return result;
	}
}

...

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

<xwork>
	<!-- Include webwork defaults (from WebWork JAR). -->
	<include file="webwork-default.xml" />
	
	<!-- Configuration for the default package. -->
	<package name="default" extends="webwork-default">
		<interceptors> 
			<interceptor name="greeting" class="section02.lesson05.GreetingInterceptor" /> 
		</interceptors> 
		
		<!-- Action: Lesson 5: GreetingInterceptor. --> 
		<action name="greetingAction" class="lesson05.GreetingAction"> 
			<result name="success" type="velocity">ex01-result.vm</result> 
			<interceptor-ref name="greeting" /> 
		</action> 
	</package>
</xwork>

GreetingAction.java:

...