struts2的一个优点就是它为我们提供了拦截器。那么拦截器是怎么工作的呢!
这是我自己写的一个拦截器类:
package tm.change.interceptor; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class LoginInterceptor implements Interceptor{ @Override public void destroy() { System.out.println("@@@@@@@@@@@@@@@@@销毁"); } @Override public void init() { System.out.println("@@@@@@@@@@@@初始化"); } @Override public String intercept(ActionInvocation arg0) throws Exception { String name = (String) ActionContext.getContext().getSession().get("name"); if(name!=null&& !name.equals("")){ //invoke()方法执行说明拦截结束,否则被拦截 arg0.invoke(); return "success"; } return "login"; } }
那拦截器怎么配置呢?
这是struts.xml中的一段代码,注意看注释
<package name="csdn" namespace="/test" extends="struts-default"> <interceptors> <!-- 定义自己的拦截器loginInterceptor --> <interceptor name="loginInterceptor" class="tm.change.interceptor.LoginInterceptor"></interceptor> <!-- 定义自己的拦截器栈loginInterceptor --> <interceptor-stack name="myStack"> <interceptor-ref name="loginInterceptor"/><!-- 自定义类 --> <interceptor-ref name="defaultStack"/><!-- struts-default.xml自带的 --> </interceptor-stack> </interceptors> <!-- 将myStack设置为默认的拦截器,就是说如果某个action没有设置拦截器,那就会执行这个拦截器 --> <default-interceptor-ref name="myStack"/>
再看下面连个action,上面的action设置了自己的拦截器,所以它执行defaultStack
下面这个action没有设置自己的拦截器,所以它执行默认的拦截器 myStack
<action name="login" class="tm.change.action.UserAction" method = "login"> <interceptor-ref name="defaultStack"/> <result name = "success">/index.jsp</result> </action> <action name="index" class="tm.change.action.UserAction" method = "login"> <result name = "success">/index.jsp</result> </action>
备注:有一点不得不提。那就是,都收到action请求时,都是先执行拦截器,然后再执行action中的method。
执行拦截器的时候,如果执行到 invoke() 方法,接着就执行method方法。如果没有执行invoke()方法,则不执行method方法。