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>