struts2的拦截器是基于AOP的机制,底层应用的是JDK代理,挺白痴的,明明CGlib更好一些的技术,
竟然以JDK的动态代理作为主轴,勉强可以用面向接口编程来解释,不过局限性差到让人落泪,设计的人脑袋坏了不成;
拦截器本身也算是struts2的亮点之一,不过与spring的AOP相比,的确是相形见拙;
1.现在说说拦截器,连接器本身需要继承接口或者抽象类,抽象类:AbstractInterceptor
他是在第二层的应用:
第一层:转换数据类型;
第二层:拦截器;
第三层:Action
也就是说,struts2表单传值时需要通过拦截器进行封装的,这就需要struts2的默认拦截器,<interceptor-ref name="defaultStack" />
注意:默认拦截器是在不设置任何拦截器的时候,给予默认设置的,当时只要设置任何一个连接器他否会覆盖掉默认拦截器,
故此,我们需要手动设置,如下:
2.拦截器的执行顺序:
是根据配置文件的顺序;
如果有三个拦截器分别是拦截器一,拦截器二,拦截器三;
执行顺序:拦截器一->拦截器二->拦截器三->action->拦截器三->拦截器二->拦截器一
3.拦截器可以依赖注入:
写入值分为两种Ioc与非Ioc;
非Ioc存值:
action中:
ActionContext.getContext();
Ioc注入:
Ioc拥有两种注入方式:初始注入,动态注入
4.自定义的默认拦截器:
5.具体方法拦截器 MethodFilterInterceptor
6.监听器(PreResultListener):
监听器的初始点是拦截器或者是自定义方法;
7.拦截器与过滤器的区别:
1.拦截器是基于反射机制,过滤器是基于函数回调的;
2.过滤器是依赖servlet,拦截器是不依赖于servlet容器;
3.拦截器只能对action的请求起作用,而过滤器是对任何请求起作用;
4.拦截器可以访问actionContext,值栈里的对象.而过滤器不能;
5.action的生命周期中,一个拦截器可以被调用多次,而过滤器只能调用一次;
8.标识的拦截器,这个话说偶然间看了看,自己还没敲例子,等以后有时间在来说说这个吧
竟然以JDK的动态代理作为主轴,勉强可以用面向接口编程来解释,不过局限性差到让人落泪,设计的人脑袋坏了不成;
拦截器本身也算是struts2的亮点之一,不过与spring的AOP相比,的确是相形见拙;
1.现在说说拦截器,连接器本身需要继承接口或者抽象类,抽象类:AbstractInterceptor
他是在第二层的应用:
第一层:转换数据类型;
第二层:拦截器;
第三层:Action
也就是说,struts2表单传值时需要通过拦截器进行封装的,这就需要struts2的默认拦截器,<interceptor-ref name="defaultStack" />
注意:默认拦截器是在不设置任何拦截器的时候,给予默认设置的,当时只要设置任何一个连接器他否会覆盖掉默认拦截器,
故此,我们需要手动设置,如下:
- <struts>
- <package name="struts" extends="struts-default" >
- <interceptors>
- <interceptor name="work" class="interceptor.Work_Interceptor"></interceptor>
- //设置拦截器!
- </interceptors>
- <action name="login" class="com.struts.action.UserAction" method="add">
- <interceptor-ref name="work"></interceptor-ref>
- //在此Action上应用此连接器;
- <interceptor-ref name="defaultStack" />
- //设置默认连接器;
- <result name="sueecc">/sueecc.jsp</result>
- </action>
- </package>
- </struts>
是根据配置文件的顺序;
如果有三个拦截器分别是拦截器一,拦截器二,拦截器三;
执行顺序:拦截器一->拦截器二->拦截器三->action->拦截器三->拦截器二->拦截器一
3.拦截器可以依赖注入:
写入值分为两种Ioc与非Ioc;
非Ioc存值:
action中:
ActionContext.getContext();
Ioc注入:
Ioc拥有两种注入方式:初始注入,动态注入
- 初始注入:
- <interceptors>
- <interceptor name="work" class="interceptor.Work_Interceptor">
- <param name="wang">1234</param>
- //初始注入
- </interceptor>
- </interceptors>
- 动态注入:
- <action name="login" class="POJO.User" >
- <interceptor-ref name="work">
- <param name="wang">1234</param>
- //动态注入
- </interceptor-ref>
- <result name="succee">/succee.jsp</result>
- <result name="input">/index.jsp</result>
- </action>
- <default-interceptor-ref name=""></default-interceptor-ref>
- //默认拦截器,他可以让所有的action都默认使用你定义的这个拦截器;
- struts.xml:
- <interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3">
- <param name="includeMethods">拦截的方法名</param>
- </interceptor>
- 拦截器:
- public class MyInterceptor3 extends MethodFilterInterceptor {
- protected String doIntercept(ActionInvocation invocation) throws Exception {
- System.out.println("my interceptor3");
- String result = invocation.invoke();
- return result;
- }
- }
- User u = (User) invocation.getAction();
- //返回action的对象,赋值后的对象;
监听器的初始点是拦截器或者是自定义方法;
7.拦截器与过滤器的区别:
1.拦截器是基于反射机制,过滤器是基于函数回调的;
2.过滤器是依赖servlet,拦截器是不依赖于servlet容器;
3.拦截器只能对action的请求起作用,而过滤器是对任何请求起作用;
4.拦截器可以访问actionContext,值栈里的对象.而过滤器不能;
5.action的生命周期中,一个拦截器可以被调用多次,而过滤器只能调用一次;
8.标识的拦截器,这个话说偶然间看了看,自己还没敲例子,等以后有时间在来说说这个吧