-
- 你要懂得的知识
- 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自定义拦截器内容请搜索靠谱客的其他文章。
发表评论 取消回复