struts2拦截器(六)

一、拦截器

  1、拦截器是单例模式的,因此拦截器最好是无状态的;
   2、配置拦截器步骤:
         1):编写实现Interceptor接口或继承AbstractInterceptor抽象类的类;
         2):在struts.xml配置文件中定义拦截器;
         3):在action中配置拦截器。
   3、一旦定义了自己的拦截器,将其配置到action上后,我们需要在action最后加上默认的拦截器栈:defaultStack
   

二、拦截器应用(用户登录)

  1、登录页面login.jsp
  <body>
      <h3>用户登录</h3>
     <form action="login" method = "post">
         username:<input type = "text" name = "username"/><br/>
         password:<input type = "text" name = "password"/><br/>
         <input type = "submit" value = "submit"/>
     </form>
  </body>
  2、LoginAction
public class LoginAction extends ActionSupport{
  private String username;
  private String password;
  //...setter/getter....
  public String execute()throws Exception{
     return SUCCESS;
}
}
   3、定义自己的拦截器MyInterceptor
public class MyInterceptor implements Interceptor
{
	private String test;
	public void destroy()
	{
		System.out.println("MyInterceptor is destory!");
	}
	public void init()
	{
		System.out.println("MyInterceptor is init !");
	}
	public String intercept(ActionInvocation arg0) throws Exception
	{
		System.out.println("intercept before");
		
		String temp = arg0.invoke();
		//该方法为如果下面有烂机器就调用下一个,如果没有就执行Action。
		System.out.println("MyInterceptor is intercept:"+temp);
		
		System.out.println("intercept after");
		return temp;
	}
	public String getTest()
	{
		return test;
	}
	public void setTest(String test)
	{
		this.test = test;
	}
}
   4、配置文件struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <!-- 配置拦截器 -->
        <interceptors>
            <interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
               <!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
               <param name="test">test</param>
            </interceptor>
        </interceptors>
        <action name="login" class="com.liusheng.action.LoginAction">
           <result name="success">index.jsp</result>
           <!-- exception:是对于抛出该处出现的异常进行处理
                result:自定义的结果名,有其对应的result进行处理
            -->
           <!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
           <interceptor-ref name="myInterceptor"></interceptor-ref>
           <!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
                                             配置默认拦截器 -->
           <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>

三、方法拦截器  

    方法拦截器(可以对指定方法进行拦截):MethodFilterInterceptor

   如果既没有指定includeMethods参数,也没有指定execludeMethods参数,那么所有的方法都有会被拦截。

      依旧延续以上的案例
    1、编写自定义的方法拦截器
public class MyMethodInterceptor extends MethodFilterInterceptor
{
	@Override
	protected String doIntercept(ActionInvocation arg0) throws Exception
	{
		//可以添加监听器
		arg0.addPreResultListener(new TheLisener());
		System.out.println("method interceptor before");
		String s = arg0.invoke();
		System.out.println("method interceptor after");
		return s;
	}
}
   2、struts.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <!-- 配置拦截器 -->
        <interceptors>
            <interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
               <!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
               <param name="test">test</param>
            </interceptor>
            <!-- 配置方法拦截器 -->
            <interceptor name="methodInterceptor" class="com.liusheng.interceptor.MyMethodInterceptor"></interceptor>
        </interceptors>
        <action name="login" class="com.liusheng.action.LoginAction">
           <result name="success">index.jsp</result>
           <!-- exception:是对于抛出该处出现的异常进行处理
                result:自定义的结果名,有其对应的result进行处理
            -->
           <!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
           <interceptor-ref name="myInterceptor"></interceptor-ref>
           <interceptor-ref name="methodInterceptor">
              <param name="includeMethods">execute</param>
              <param name="execludeMethods"></param>
           </interceptor-ref>
           <!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
                                             配置默认拦截器 -->
           <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>

四、自定义默认的拦截器栈
  1、配置struts.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="struts2" extends="struts-default">
        <!-- 配置拦截器 -->
        <interceptors>
            <interceptor name="myInterceptor" class="com.liusheng.interceptor.MyInterceptor">
               <!-- 配置初始化参数 ,与成员变量对应赋值,在给成员变量赋值时机在init方法之前进行-->
               <param name="test">test</param>
            </interceptor>
            <!-- 配置方法拦截器 -->
            <interceptor name="methodInterceptor" class="com.liusheng.interceptor.MyMethodInterceptor"></interceptor>
            <!-- 定义拦截器栈 -->
            <interceptor-stack name="myDefaultInterceptorStack">
                <interceptor-ref name="myInterceptor"></interceptor-ref>
                <interceptor-ref name="methodInterceptor"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 自定义默认的拦截器栈,替换掉了系统默认的拦截器栈 -->
        <default-interceptor-ref name="myDefaultInterceptorStack"></default-interceptor-ref>
       
        <action name="login" class="com.liusheng.action.LoginAction">
           <result name="success">index.jsp</result>
           <!-- exception:是对于抛出该处出现的异常进行处理
                result:自定义的结果名,有其对应的result进行处理
            -->
           <!-- 配置拦截器,拦截器按照配置的顺序依次拦截 -->
           <interceptor-ref name="myInterceptor"></interceptor-ref>
           <interceptor-ref name="methodInterceptor">
              <param name="includeMethods">execute</param>
              <param name="execludeMethods"></param>
           </interceptor-ref>
           <!-- 一旦使用了自定义的拦截器,默认的拦截器就不会起作用,因此需要手动在自定义拦截器后
                                             配置默认拦截器 -->
           <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
    </package>
</struts>

    如上配置好之后,面对登录不需要进行拦截的请求,只能通过在代码中对该情况进行处理。



你可能感兴趣的:(struts2拦截器,Interceptor)