Struts2 拦截器详细配置过程
2013-12-14 17:02
423 查看
Struts2 拦截器详细配置(在struts.xml中进行配置)过程
拦截器(Interceptor)是Struts 2的核心组成部分。很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2利用内建的拦截器,完成了框架内的大部分操作。在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。
在 <action>节点中我们可以用 <interception-ref/>节点来应用我们配置的拦截器,对拦截器配置用 <interceptors>节点,而 <interceptors>又可以包含 <interceptor>和 <interceptor-stack>。
1、所有拦截器的超级接口Interceptor ,Action去实现这个接口;
Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):
4000
Init()方法:在服务器起动的时候加载一次,并且只加载一次;
Destroy()方法:当拦截器销毁时执行的方法;
Interceptor()方法:其中里边有一个参数invocation
public String intercept(ActionInvocation invocation) throws xception {
System.out.println("interceptor!!");
String result=invocation.invoke();
return result;
}
Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.
2、可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:
在拦截器类中把hello当做属性set/get方式注入到拦截器类中;
<interceptors>
<!-- 先定义拦截器 -->
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<!-- 指定系统初始化给拦截器的参数 -->
<param name="hello">张钊钊</param>
</interceptor>
<!-- 加到自己设置的拦截器栈里边去 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
也可以在使用拦截器的时候给它设置参数,就是在一个action 的reslut下面配置上如下:
<action name="register" class="com.zzz.struts2.action.RegisterAction">
<result name="success">/success.jsp</result>
<!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 -->
<result name="input">/register.jsp</result>
<interceptor-ref name="myInterceptor">
<param name="hello">welcome</param>
</interceptor-ref>
<interceptor-ref name="myStack"></interceptor-ref>
</action>
3、拦截器,拦截器栈和默认的拦截器之间的关系
A、拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式:
<interceptors>
<!-- 先定义拦截器 -->
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<!-- 指定系统初始化给拦截器的参数 -->
<param name="hello">张钊钊</param>
</interceptor>
<!-- 加到自己设置的拦截器栈里边去 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
拦截器的使用:1.先定义;2.在引用使用;
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<interceptor-ref name="myInterceptor"></interceptor-ref>
4、struts2中有一个系统默认的拦截器栈是defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>
如果想改变系统默认的拦截器栈,可以这样配置:
<default-interceptor-ref name="myStack"></default-interceptor-ref>
其中myStack是自己定义的拦截器栈名字;
如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;
5、抽象的拦截器类AbstractInterceptor
A、Interceptor这个超级拦截器接口,有三个方法需要实现,但是如果不想使用init()和destroy()方法,可以去继承这个抽象拦截器类,它的使用跟上边的没有什么区别。
6、方法过滤拦截器MethodFilterInterceptor
A、上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类,它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.
<interceptor-ref name="myInterceptor3">
<param name="includeMethods">execute</param>
<param name="excludeMethods">execute</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;
7、监听器PreResultListener接口
A、它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;
然后向需要它的拦截器中注册进去如下代码:
publicclass MyInterceptor3 extends MethodFilterInterceptor {
privatestaticfinallongserialVersionUID = 3756655410194005443L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//把鉴听器注册到拦截中去;
invocation.addPreResultListener(new MyListener());
System.out.println("my Interceptor3");
String result=arg0.invoke();
System.out.println("my interceptor3 finshed!");
return result;
}
}
注:默认拦截器与自定义拦截器顺序无所谓。一般写法是自定义在前,默认在后
defaultStack包含了基本上所有的拦截器,所以基本上都能满足需求,但是一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,可以根据不通的场景,选择合适的拦截器栈。只需要添加需要的拦截器即可!
在 <action>节点中配置了拦截器,则默认的拦截器则不会起作用,如果该 Action需要使用该默认拦截器,则必须将该默认拦截器配上。
拦截器(Interceptor)是Struts 2的核心组成部分。很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2利用内建的拦截器,完成了框架内的大部分操作。在Struts 2文档中对拦截器的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制,使开发者可以定义一个特定的功能模块,这个模块可以在Action执行之前或者之后运行,也可以在一个Action执行之前阻止Action执行。同时也提供了一种可以提取Action中可重用的部分的方式。
在 <action>节点中我们可以用 <interception-ref/>节点来应用我们配置的拦截器,对拦截器配置用 <interceptors>节点,而 <interceptors>又可以包含 <interceptor>和 <interceptor-stack>。
1、所有拦截器的超级接口Interceptor ,Action去实现这个接口;
Interceptor 它其中有三个方法(init(),destroy() ,interceptor()):
4000
Init()方法:在服务器起动的时候加载一次,并且只加载一次;
Destroy()方法:当拦截器销毁时执行的方法;
Interceptor()方法:其中里边有一个参数invocation
public String intercept(ActionInvocation invocation) throws xception {
System.out.println("interceptor!!");
String result=invocation.invoke();
return result;
}
Invocation.invoke()是如果只有一个拦截器执行完这个方法后,会返回给视图,如果有多个拦截器,它顺序的执行完所有的拦截器,才返回给视图.
2、可以在系统初始化中给拦截器指定默认的参数(也包括了定义拦截器方式)如下:
在拦截器类中把hello当做属性set/get方式注入到拦截器类中;
<interceptors>
<!-- 先定义拦截器 -->
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<!-- 指定系统初始化给拦截器的参数 -->
<param name="hello">张钊钊</param>
</interceptor>
<!-- 加到自己设置的拦截器栈里边去 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 改变系统默认的拦截器,改成自己的默认拦截器,并且一个系统只能有一个默认的拦截器,这样这个拦截器栈会默认应用到所有的Action上去 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
也可以在使用拦截器的时候给它设置参数,就是在一个action 的reslut下面配置上如下:
<action name="register" class="com.zzz.struts2.action.RegisterAction">
<result name="success">/success.jsp</result>
<!-- result 它其中还有一个信息转发类型 type=""记住,如果不转向JSP,转向图表,可以改变type=""值 -->
<result name="input">/register.jsp</result>
<interceptor-ref name="myInterceptor">
<param name="hello">welcome</param>
</interceptor-ref>
<interceptor-ref name="myStack"></interceptor-ref>
</action>
3、拦截器,拦截器栈和默认的拦截器之间的关系
A、拦截器和拦截器栈是一个级别的,也就是说一个拦截器栈中包括许多拦截器, 一个拦截器栈中还可以包括许多拦截器栈,配置如下方式:
<interceptors>
<!-- 先定义拦截器 -->
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<!-- 指定系统初始化给拦截器的参数 -->
<param name="hello">张钊钊</param>
</interceptor>
<!-- 加到自己设置的拦截器栈里边去 -->
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
拦截器的使用:1.先定义;2.在引用使用;
<interceptor name="myInterceptor" class="com.zzz.struts2.interceptor.MyInterceptor">
<interceptor-ref name="myInterceptor"></interceptor-ref>
4、struts2中有一个系统默认的拦截器栈是defaultStack,如果你手动引用自己的拦截器,系统默认的拦截器栈将不起作用;这样必需手动引入系统的拦截器栈<interceptor-ref name="defaultStack"></interceptor-ref>
如果想改变系统默认的拦截器栈,可以这样配置:
<default-interceptor-ref name="myStack"></default-interceptor-ref>
其中myStack是自己定义的拦截器栈名字;
如果拦截器栈中有多个拦截器,在执行action之前的顺序跟配置拦截器的顺序一致,而在action之后执行的顺序是相反的;
5、抽象的拦截器类AbstractInterceptor
A、Interceptor这个超级拦截器接口,有三个方法需要实现,但是如果不想使用init()和destroy()方法,可以去继承这个抽象拦截器类,它的使用跟上边的没有什么区别。
6、方法过滤拦截器MethodFilterInterceptor
A、上边的拦截器都要是针对整个action的,如果针对某个方法进行拦截可以去继承这个类,它的使用跟上边的使用方法差不多,只是需要要配置它对那个方法进行拦截,方法过滤拦截器最好不要配置到自己设置默认的拦截器栈里边,自己手动配置.
<interceptor-ref name="myInterceptor3">
<param name="includeMethods">execute</param>
<param name="excludeMethods">execute</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
其中includeMethods ,excludeMethods是固定写法: includeMethods 包含拦截那些方法,多个方法需要用”,”隔开; excludeMehtods是排除拦截的那些方法;
7、监听器PreResultListener接口
A、它的鉴听点在拦截器执行完某个action方法后,在渲染视图之前做一些事情;让某个类去实现这个接口;
然后向需要它的拦截器中注册进去如下代码:
publicclass MyInterceptor3 extends MethodFilterInterceptor {
privatestaticfinallongserialVersionUID = 3756655410194005443L;
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//把鉴听器注册到拦截中去;
invocation.addPreResultListener(new MyListener());
System.out.println("my Interceptor3");
String result=arg0.invoke();
System.out.println("my interceptor3 finshed!");
return result;
}
}
注:默认拦截器与自定义拦截器顺序无所谓。一般写法是自定义在前,默认在后
defaultStack包含了基本上所有的拦截器,所以基本上都能满足需求,但是一般情况下用不了这么多拦截器栈的,经过这么多拦截器栈肯定会影响性能的,可以根据不通的场景,选择合适的拦截器栈。只需要添加需要的拦截器即可!
在 <action>节点中配置了拦截器,则默认的拦截器则不会起作用,如果该 Action需要使用该默认拦截器,则必须将该默认拦截器配上。
相关文章推荐
- Struts2 拦截器详细配置过程
- Struts2 拦截器详细配置过程
- Struts2 拦截器详细配置过程
- Struts2 拦截器详细配置过程
- Struts2 拦截器详细配置过程(转载)
- 转载 - Struts2 拦截器详细配置过程
- Struts2 拦截器详细配置过程(转载)
- 在struts2如何实现拦截器和配置过程
- Struts2&nbsp;拦截器详细配置过程
- Struts2 拦截器具体配置过程
- TestLink 1.9.3安装配置详细说明附带汉化过程
- MyEclipse + Maven开发Web工程的详细配置过程
- mysql-5.7.14-winx64免安装版在win10下的详细配置过程
- Struts2学习笔记(五)拦截器下 struts2拦截器配置及详解
- Struts2拦截器的配置
- win7+caffe+GPU详细配置过程
- caffe及faster-rcnn详细配置安装过程
- SQLServer2000 发送邮件详细配置过程
- struts2的struts.xml的详细配置1-1
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)