WebWork截獲Action請求,在Action執行之前或之后調用攔截器方法。這樣,可以用插拔的方式將功能注入Action中。WebWork框架的很多功能都是以攔截器的形式提供出來。例如:參數組裝,驗證,國際化,文件上傳等等。

1. 一個攔截器就是在xwork.xml文件中定義的一個無狀態Java類,它至少要實現XWork的com.opensymphony.xwork.interceptor.Interceptor接口。代碼如下:

public interface Interceptor extends Serializable {

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

2. 實現Interceptor接口的攔截器,代碼部分在intercept方法中實現。在intercept方法中,可以直接返回一個Result字符串,這樣整個執行直接“短路”,這時Action的execute方法也不會執行(一般很少會這么用)。所以,一般都會在這個方法里調用參數對象invocation的invoke方法,并返回這個方法執行的結果。這樣會持續執行后面的攔截器方法以及Action的execute方法等。

3. 大部分的時候,攔截器直接繼承WebWork的抽象類 com.opensymphony.xwork.interceptor.AroundInterceptor就可以了。這時,需要實現它的before 和after方法。Before方法會在Action執行之前調用,after方法在Action執行之后調用。

4. 攔截器的執行順序。我們可將多個攔截器放一起組裝成一個攔截器棧。這樣攔截器會按照棧的順序由上而下執行before方法,所有before方法執行結束,再執行Action的方法,執行Result的方法,再返回執行結果,最后再從下而上執行攔截器的after方法


5. 攔截器的過濾功能。我們通常會在應用中使用一個通用的定義多個攔截器的攔截器棧。但有些Action方法在調用的時候,不需要要其中的部分攔截器。這時,我們就可以使用攔截器過濾功能。如果攔截器要擁有過濾功能,必須實現抽象類 com.opensymphony.xwork.interceptor.MethodFilterInterceptor。這樣,攔截器在定義的時候或者在Action引用攔截器棧的時候,我們就可以指定哪些Action方法是需要過濾的,哪些Action是不需要過濾的。
  攔截器可以將任意代碼包含在調用棧中活動執行前或之后, 它可以極大的簡化代碼同時提供增強代碼復用能力. XWork和WebWork的許多特性多作為攔截器實現, 可以和你自己的攔截器一起通過外部配置任意指定順序并配置在任意活動上.
  換言之, 當你訪問一個*.action的地址, WebWork的 class="monospaced">ServletDispatcher執行一個活動調用. 在活動執行前, 這一調用可以被另一個對象截取, 這個對象就稱為攔截器. 要想在一個活動執行之前(或之后)設置一個攔截器, 只需正確配置xwork.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>
  名為formProcessing的Action使用了validationWorkflowStack. 它是一個截取器棧, 棧中按照截取器的執行順序進行組織. 這個截取器棧定義在webwork-default.xml, 這樣我們需要做的就是在活動配置的<interceptor-ref />或包配置中的<default-interceptor-ref />中聲明, 就像:

攔截器配置:
<!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: HelloWebWorldAction. -->
<action name="helloWebWorld" class="lesson03.HelloWebWorldAction">
<result name="success" type="dispatcher">ex01-success.jsp</result>
</action>
</package>
</xwork>

-------------------------------------------------------
寫個示例,實現在interceptor中判斷當前時間,返回問候語句,比如“Good afternoon”
1.xwork_interceptor.xml
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd">

<xwork>

<package name="hello1" extends="webwork-default">
<!-- 在action和result code之間建立了聯系-->
<interceptors>
<interceptor name="greetingInterceptor" class="com.vstsoft.action.GreetingInterceptor" />
</interceptors>
<action name="greeting" class="com.vstsoft.action.GreetingAction">
<interceptor-ref name="greetingInterceptor" />
<result name="success">/success.jsp</result>
<result name="input">/error.jsp</result>
</action>
</package>
</xwork>
2.GreetingAction
package com.vstsoft.action;

import com.opensymphony.xwork.Action;

public class GreetingAction implements Action {

public String execute(){
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
System.out.println(i);
}
return SUCCESS;//INPUT對應于xwork.xml中的resultcode='success'
}

}
3.GreetingInterceptor
package com.vstsoft.action;

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;
}
}
4.success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="ww" uri="/webwork"%>
<%String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>


<html>
<head>
<title>Say Hello</title>
</head>
<body>
<font color="red"><%=session.getAttribute("greeting")%></red>
</body>
</html>