日期: 2016-8-31
内容: 简单模拟实现Struts的拦截器
一、 Struts2的拦截器的简单概述
1、什么叫做拦截器?
使用一张图简单展现一下Struts2的拦截器的实现原理,如下图:
在这里就不用“官话”来阐述具体什么是拦截器了,就个人的理解阐述一下什么是拦截器。
所谓的Struts2拦截器就是在我们发起一个请求(登录,注册请求)的时候,我们发起的请求会被struts2的拦截机制所过滤,必须只有在满足拦截器的拦截要求的情况 下才可以通过。在这里打一个形象的比方:我们要请求的Action就好比一个戒备森严的皇宫,假如我们想去参观的话就得经过层层检查,比如第一个拦截器拦截可 以把我们身上的“重武器给过滤掉假如有的话”,在完成这个拦截器的拦截之后我们就可以进入下一个拦截器,“这个拦截器就把我们身上的其它金属设备拦截掉”, 如此这般假如我们都通过了所有的拦截器的话就可以成功的访问我们的“Action”了。其实,拦截器就是一个工具,它可以简化我们实际开发中的很多比较繁琐的问 题,简化我们的操作,扩展我们的功能实现。还有就是提高开发的安全性。
2、 为什么要使用拦截器?
使用拦截器很简单的讲,就是可以为我们开发带来便利,简化开发流程,增强代码的复用性。其实struts2的拦截器优点不胜枚举,在此不再赘述。
3、Struts2的默认拦截器有哪些?
可以将下载的Strutsjar包标准目录的目录: \struts-2.3.24\apps\struts2-blank\WEB-INF\lib打开之后解压struts2-core-2.3.24.jar jar包,里面有一个文件:struts- default.xml这里面配置了很多拦截器,有兴趣的朋友可以自己去看看。
struts-default.xml内部拦截器截图如下:
二、自定义拦截器的实现
1、如何自定义拦截器?
实现自定义拦截器有两种方式:
①、继承com.opensymphony.xwork2.interceptor.AbstractInterceptor抽象类并实现intercept方法;
②、实现com.sun.xml.internal.bind.v2.runtime.unmarshaller.Intercepter接口并重写intercept方法;
2、自定义拦截器
package com.onlyone.struts.Intercepter;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 在定义struts2的自定义拦截器的时候有两种自定义拦截器的方式:其一是继承AbstractIntercepter或者实现Intercepter结构
* @author peixun
*
*/
public class RegisterIntercepter extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
/**
* 定义实现拦截器的内部逻辑:这里只是简单的模拟实现拦截器,明白拦截器的实现流程
*/
System.out.println("拦截器"+this.getClass().getName()+"开始启动>>>>>>>>>>");
//返回下一个拦截器或者Action(通常要执行的拦截器都不是简单的一个,而是一个拦截器连或者拦截器栈),因此只有在执行如下的操作让他返回执行下一个拦截器或者Action
String resultString = invocation.invoke();
System.out.println("拦截器"+this.getClass().getName()+"执行完成>>>>>>>>>>>>");
//执行返回
return resultString;
}
}
3、在struts.xml中配置拦截器:
<package name="userRegister" namespace="/" extends="struts-default">
<!-- 在struts.xml中配置拦截器 -->
<!-- 拦截器的定义开始 -->
<interceptors>
<!-- 定义拦截器对应拦截器的具体实现类 -->
<interceptor name="registerIntercepter" class="com.onlyone.struts.Intercepter.RegisterIntercepter"></interceptor>
</interceptors>
<!-- 拦截器的定义结束 -->
<action name="userRegisterAction" class="com.onlyone.struts.register.action.UserRegisterAction" method="register">
<result name="success">/jsp/register/register_success.jsp</result>
<result name="error">/jsp/register/register_failure.jsp</result>
<!-- 拦截器的使用开始 -->
<!-- 使用拦截器:自定义拦截器和默认;拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 使用自定义拦截器实施拦截 -->
<interceptor-ref name="registerIntercepter"></interceptor-ref>
<!-- 拦截器的使用结束 -->
</action>
</package>
4、启动服务器测试拦截器是否配置成功:
有图有真相,说明我们的拦截器配置已经生效了。
三、总结
在学习的过程总是由浅入深循序渐进的一个过程,这篇博文只是很浅显的阐述了如何去编写一个拦截器并部署实现,但是在开发的过程中需要自定义的拦截器肯定 会比这个难上百倍也没准儿。因此我们学习的是原理,扩展还得靠我们不断的去探索。