Interceptor(拦截器)顾名思义就是在某个事件发生之前将其拦截,并插入相应的处理过程。从这点上看,拦截器类似于Servelet规范定义的Filter,但是Strut2的拦截器完全独立于Servelet中的Filter,而且两者有着截然不同的实现。Interceptor将很多通用的功能从Action中独立出来,大大减少了Action中重复的代码量,通过组装Interceptor可以使通用的逻辑按照顺序执行,并且当业务逻辑顺序发生变化的时候也不需要重新编写代码,只需要重新组装Interceptor即可,从而降低Web应用中的耦合性。
再执行Action之前,struts2会检查Action是否配置有拦截器。如果有,遍历所有的拦截器并且执行之;如果对应的Action没有拦截器,那么struts2将只执行Action。xwork的拦截器都必须实现Interceptor接口,但是实际上大部分拦截器都是通过继承抽象类AbstractInterceptor实现拦截器的功能。
/*
* Copyright 2002-2006,2009 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.opensymphony.xwork2.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
/**
* Provides default implementations of optional lifecycle methods
*/
public abstract class AbstractInterceptor implements Interceptor {
/**
* Does nothing
*/
public void init() {
}
/**
* Does nothing
*/
public void destroy() {
}
/**
* Override to handle interception
*/
public abstract String intercept(ActionInvocation invocation) throws Exception;
}
通过实现intercept()方法,一般在该方法的结尾通过invocation.invoke()。转向Action的执行。
struts2中自带的拦截器在配置文件struts-default.xml中都已声明,在struts.xml中利用<include file="struts-defalut.xml">中可以引入自带的拦截器。若要使用在Action之前。
则在<action><interceptor-ref name=“....”></action>使用,即可使用该拦截器。 也可以自定义拦截器例子暂时省略。