我是靠谱客的博主 幸福西装,这篇文章主要介绍struts2自定义拦截器,现在分享给大家,希望可以做个参考。

    • 你要懂得的知识
    • AbstractInterceptor类
    • 自定义interceptor的配置
      • 自定义interceptor的配置步骤如下
      • 普通类MyIntercepter java 自定义拦截器 在Action执行之前和执行之后各输出一句话
      • 配置拦截器
      • 运行结果

1.你要懂得的知识

首先放一张Struts2框架流程图
这里写图片描述
在这里我们需要关注的是这一部分
这里写图片描述

struts在执行Action之前会先创建一个ActionInvocation实例,然后检查Action是否配置有拦截器,如果有按照拦截器顺序一个一个的执行,然后进入result结果视图,调用相关的jsp或其它template,然后再按照拦截器的逆顺序执行一遍,最后到HttpServletResponse.
从图中我们可以看到ActionInvocation贯穿 interceptor-action-result-template的整个执行过程。可见拦截器机制就是早期的AOP(Aspect Orient Program,面向切面编程)思想。拦截器在AOP中用于在某个方法或字段被访问之前进行拦截,然后在之前,之后加入某些操作,AOP就是面向切面编程,是一种消除代码重复的方法。

2.AbstractInterceptor类

其实在Struts2中拦截器体系是一个重要的组成部分,可以认为struts2是一个空的容器,正是因为大量自带的拦截器的使用,让整个框架功能变得强大起来。在struts2的核心jar包中有一个struts-default.xml文件,里面有许多拦截器例如ServletConfigInterceptor,ModelDriverInterceptor。其中一些默认的拦截器如下

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<interceptor-stack name="defaultStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="servletConfig"/> <interceptor-ref name="i18n"/> <interceptor-ref name="prepare"/> <interceptor-ref name="chain"/> <interceptor-ref name="scopedModelDriven"/> <interceptor-ref name="modelDriven"/> <interceptor-ref name="fileUpload"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"> <param name="excludeParams">dojo..*,^struts..*,^session..*,^request..*,^application..*,^servlet(Request|Response)..*,parameters...*</param> </interceptor-ref> <interceptor-ref name="conversionError"/> <interceptor-ref name="validation"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="debugging"/> </interceptor-stack>

查看源码可以发现,这些拦截器都继承于AbstractInterceptor类,

复制代码
1
2
3
4
5
6
7
8
public abstract class AbstractInterceptor implements Interceptor { public void init() { } public void destroy() { } public abstract String intercept(ActionInvocation invocation) throws Exception; }

在这个类中没有实现任何方法,就是一个简单的Interceptor接口。拦截器要在Action之前执行,只有在继承这个类时,通过实现它的抽象方法intercept()来完成拦截器的功能。也就是说,在intercept()方法中会先执行拦截器想要完成的任务,然后再转向Action执行,一般函数最后都会加上这句代码:String res=invocation.invoke();
具体的结构图如下:
这里写图片描述
我们自定义的拦截器MyInterceptor也可以通过继承AbstractInterceptor类来实现拦截器的功能。

3.自定义interceptor的配置

通过上面的知识,我们就可以自定义拦截器了。使用自定义拦截器需要知道当配置了任何一个拦截器,默认的拦截器栈就不会工作了。至于如何让默认的拦截器栈和自定义的拦截器一起工作,我们会在下篇文章写个小例子。

自定义interceptor的配置步骤如下:

1.创建一个普通类,继承AbstractInterceptor,实现抽象方法intercept
2.在struts.xml中配置拦截器
2.1声明拦截器
2.2使用拦截器

普通类MyIntercepter .java 自定义拦截器 在Action执行之前和执行之后各输出一句话。

复制代码
1
2
3
4
5
6
7
8
9
10
public class MyIntercepter extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { System.out.println("拦截器拦截啦-----动作执行之前"); String res=invocation.invoke(); System.out.println("拦截器拦截啦-----动作执行之后"); return res; } }

其中String res=invocation.invoke(); 执行后返回的String类型的res即是Action中相应方法执行后返回的结果。

配置拦截器

struts.xml 在这个配置文件里,配置了一个struts2框架预定义的拦截器,名称为myIntercepter,然后在Action里引用了这个Action,指定这个Action和这个拦截器装配,对这个Action起作用。这样当struts2框架发现了这个装配的拦截器后,在调用Action之前就会去调用这个拦截器从而达到预期的目的。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 开发者模式 --> <constant name="struts.devMode" value="true"></constant> <package name="user" extends="struts-default" namespace="/user"> <!-- 声明自己定义的拦截器,名字以及对应的java类 --> <interceptors> <interceptor name="myIntercepter" class="com.scx.web.intercepter.MyIntercepter"></interceptor> </interceptors> <action name="login" class="com.scx.web.action.UserAction" method="login"> <!-- 配置自己定义的拦截器 --> <interceptor-ref name="myIntercepter"></interceptor-ref> <result name="success">/success.jsp</result> </action> </package> </struts>

运行结果

配置完这些,在浏览器中输入:http://localhost:8080/Interceptor/user/login.action
控制台输出结果为:
这里写图片描述

最后

以上就是幸福西装最近收集整理的关于struts2自定义拦截器的全部内容,更多相关struts2自定义拦截器内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部