Struts2提供的默认的拦截器已经包含了开发应用项目所用到的大部分拦截功能,开发人员也可以开发自己是拦截器实现类,并在配置文件中使用自定义的拦截器,来完成拦截功能!
Struts2框架为开发自定义拦截器实现类提供了Interceptor接口,我们可以实现该接口来自定义拦截器实现类
Interceptor接口定义如下:
- public interface Interceptor extends Serializable {
- /**
- * Called to let an interceptor clean up any resources it has allocated.
- */
- void destroy();
- /**
- * Called after an interceptor is created, but before any requests are processed using
- * {@link #intercept(com.opensymphony.xwork2.ActionInvocation) intercept} , giving
- * the Interceptor a chance to initialize any needed resources.
- */
- void init();
- /**
- * Allows the Interceptor to do some processing on the request before and/or after the rest of the processing of the
- * request by the {@link ActionInvocation} or to short-circuit the processing and just return a String return code.
- *
- * @param invocation the action invocation
- * @return the return code, either returned from {@link ActionInvocation#invoke()}, or from the interceptor itself.
- * @throws Exception any system-level error, as defined in {@link com.opensymphony.xwork2.Action#execute()}.
- */
- String intercept(ActionInvocation invocation) throws Exception;
- }
此接口中定义了三个方法
String intercept(ActionInvocation invocation) 这个方法是实现用户拦截的处理方法,返回一个String的结果,来对应配置文件中定义的逻辑视图名称。如果该方法不调用invoke(),而是直接返回一个字符串如“success”,则会跳转到success对应的逻辑视图,而不会调用被拦截的Action。invoke()方法 在下面的程序的注释中会说到。
Struts2除了提供Interceptor接口用于开发自定义拦截器实现类外,还提供了
AbstractInterceptor类,我们只需要继承该类,可以使用简单的方式来实现自己的拦截器类。
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(ActionInvocation invocation)方法即可。
自定义拦截器实现类:
①SimpleInterceptor类:
- package com.yaxing.interceptor;
- import java.util.Date;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class SimpleInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- // TODO Auto-generated method stub
- Reg reg = (Reg)invocation.getAction();//获得被拦截的Action的引用,获得Action的控制权限
- System.out.println("拦截器信息:启动拦截器,拦截Action时间:"+new Date());
- String result=invocation.invoke();//执行Action或者下一个拦截器
- System.out.println("拦截器信息:Action执行完毕时间:!"+new Date());
- return result;
- }
- }
②struts.xml配置文件:
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
- <struts>
- <package name="define" extends="struts-default" namespace="">
- <interceptors>
- <interceptor name="Myinterceptor" class="com.yaxing.interceptor.Myinterceptor"></interceptor>
- <interceptor name="SimpleInterceptor" class="com.yaxing.interceptor.SimpleInterceptor"></interceptor>
- </interceptors>
- <action name="Reg" class="com.yaxing.interceptor.Reg" method="execute">
- <result name="success">/Success.jsp</result>
- <result name="input">/Reg.jsp</result>
- <interceptor-ref name="defaultStack"></interceptor-ref>
- <interceptor-ref name="SimpleInterceptor"></interceptor-ref>
- </action>
- </package>
- </struts>
定义拦截器:<interceptor.../> 元素在包中定义该拦截器
使用拦截器 在<action></action>中使用<interceptor-ref.../>使用见上面代码。
包中定义两个拦截器 :一个是系统默认的拦截器defaultStack,另一个是自定义拦截器SimpleInterceptor。
执行结果如下:
从控制台的信息可以看出:拦截器SimpleInterceptor在Action执行execute()方法之前进行了拦截,并输出了一行提示,之后调用invoke()方法,执行Action 的execute(0方法,执行之后拦截器再次输出控制台信息到控制台。如果将下面代码修改如下:
如果修改如下:
- package com.yaxing.interceptor;
- import java.util.Date;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class SimpleInterceptor extends AbstractInterceptor {
- @Override
- public String intercept(ActionInvocation invocation) throws Exception {
- // TODO Auto-generated method stub
- Reg reg = (Reg)invocation.getAction();//获得被拦截的Action的引用,获得Action的控制权限
- System.out.println("拦截器信息:启动拦截器,拦截Action时间:"+new Date());
- //String result=invocation.invoke();//执行Action或者下一个拦截器
- //如果不调用invoke方法则Action不会被执行
- System.out.println("拦截器信息:Action执行完毕时间:!"+new Date());
- //return result;
- return "input";//直接返回
- }
- }
执行结果如下:
可以看到,Action并没有执行!这是因为没有调用invoke()方法!拦截器直接返回一个“input” 字符串,会直接显示配置文件中input对应的视图资源Reg.jsp
本文中的Reg.jsp Success.jsp文件在这篇文章中提及。详解Struts2拦截器实例一
如果拦截器中没有添加默认的<interceptor-ref name="defaultStack"></interceptor-ref>这个拦截器
则允许结果会是直接跳转到input视图。因为拦截器defaultStack包含了许多重要的功能,例如参数的读取,session的管理等,因此在Action显示引用自定义拦截器时,必须同时显示的引用defaultStack默认拦截器才行。
本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/542559,如需转载请自行联系原作者