A.拦截器是什么
--- Interceptor:拦截器,起到拦截Action的作用。
---Filter:过滤器,过滤从客户端向服务器发送的请求。
---Interceptor:拦截器,拦截是客户端对Action的访问。更细粒度化的拦截。(拦截Action中的具体的方法)。Struts2框架核心的功能都是依赖拦截器实现。
B.Struts2的执行流程
客户端向服务器发送一个Action的请求,执行核心过滤器(doFilter)方法。在这个方法中,调用executeAction()方法,在这个方法内部调用dispatcher.serviceAction();在这个方法内部创建一个Action代理,最终执行的是Action代理中的execute(),在代理中执行的execute方法中调用ActionInvocation的invoke方法。在这个方法内部递归执行一组拦截器(完成部分功能),如果没有下一个拦截器,就会执行目标Action,根据Action的返回的结果进行页面跳转。
c.拦截器入门
1.搭建Struts2环境
2.编写拦截器类
--编写一个类实现Interceptor接口或者继承AbstractInterceptor。当然继承AbstractInterceptor的子类MethodFilterInterceptor更好,里面两个变量专门可以拦截或者放行某些方法。
自定义拦截器:
public class MyInterceptor extends AbstractInterceptor { @Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("自定义拦截器开始执行");
String obj = invocation.invoke();
System.out.println("自定义拦截器执行结束");
return obj;
}
}
配置拦截器:
1.定义拦截器方式配置
<package name="struts" extends="struts-default"><interceptors> <!--配置自己的拦截器-->
<interceptor name="MyInterceptor" class="com.xxx.web.action.MyInterceptor"/>
</interceptors>
<action name="upload" class="com.xxx.web.action.FileUploadAction">
<interceptor-ref name="MyInterceptor"></interceptor-ref> <!--引入拦截器,让它生效-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result>/File/success.jsp</result>
</action>
</package>
2.自定义拦截器栈
<interceptors>
<interceptor name="MyInterceptor" class="com.xxx.web.action.MyInterceptor"/>
<interceptor-stack name="mystack"> <!--直接定义自己的拦截器栈,将所有需要的拦截器放进去,在action中直接放拦截器栈声明生效就行了-->
<interceptor-ref name="MyInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="upload" class="com.xxx.web.action.FileUploadAction">
<interceptor-ref name="mystack"></interceptor-ref>
<result>/File/success.jsp</result>
</action>
上面两种方式都有一个defaultStack,这是struts2框架的拦截器栈,如下图所示,里面有很多拦截器,如国际化,校验,文件上传等等,想要运行struts2,就需要该defaultStack拦截器栈,当然,如果你可以做出比他更好,功能更强的,那就用你自己的就行,只要配置了自定义拦截器栈,原先struts2的拦截器就不会生效,要想原先的生效,要加上defaultStack就行。