struts2拦截器实现对Action插拨式管理,即Action执行前后插入代码或去掉拦截器。
1.struts2拦截器配置
通过制定拦截器名和拦截器实现类定义拦截器。
配置格式:
1.1 无参数形式
<interceptor name="拦截器名" class="拦截器实现类"/>
1.2 有参数形式
<interceptor name="拦截器名" class="拦截器实现类">
<!-- 参数可以有多个,无限制-->
<param name="参数名">参数值</param>
</interceptor>
1.3 拦截器栈配置
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器1"/>
<interceptor-ref name="拦截器2"/>
.......................可以配置多个
</interceptor-stack>
1.4 拦截器栈引用拦截器栈
<interceptor-stack name="拦截器栈名A">
<interceptor-ref name="拦截器1"/>
<interceptor-ref name="拦截器2"/>
.......................可以配置多个
</interceptor-stack>
=================
<interceptor-stack name="拦截器栈名B">
<interceptor-ref name="拦截器3"/>
<interceptor-ref name="拦截器栈名A"/>
.......................可以配置多个
</interceptor-stack>
B就有A的所有拦截器
*************************************************************************************************************************************
2.拦截器使用
拦截器和拦截器栈一旦定义,将可以用来拦截我们定义的Action,在Action配置的方法执行前,先执行拦截器。
如下代码,一旦访问loginAction,就会先执行拦截器,最后执行login方法,返回结果,指定视图。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="login" extends="struts-default"> <!-- 定义拦截器 --> <interceptors> <interceptor name="security" class="com.lanhuigu.interceptor.SecurityInterceptor"/> </interceptors> <action name="login" class="com.lanhuigu.action.LoginAction" method="login"> <!-- 使用自定义拦截器,不用默认拦截器 --> <interceptor-ref name="security"></interceptor-ref> <!-- 登录成功,跳转到成功页面的首页 --> <result name="success">/index.jsp</result> <!-- 登录失败,跳转到登录页面,重新登录 --> <result name="error">/login/jsp/login.jsp</result> </action> </package> </struts>
package com.lanhuigu.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; /** * 自定义拦截器实现类 */ public class SecurityInterceptor implements Interceptor{ @Override public void destroy() { // TODO Auto-generated method stub System.out.println("destroy---服务销毁时执行"); } @Override public void init() { // TODO Auto-generated method stub System.out.println("init--服务启动初始化时执行"); } @Override public String intercept(ActionInvocation invocation) throws Exception { // TODO Auto-generated method stub System.out.println("执行action目标方法前,先执行我"); String result = invocation.invoke(); return result; } }