1. 程式人生 > >struts2之自定義攔截器及攔截器生命週期分析

struts2之自定義攔截器及攔截器生命週期分析

一,概述

本文主要是關於怎樣自定義攔截器及通過自定義的攔截器來了解攔截器的生命週期.

二,自定義攔截器

1)寫一個攔截器類HelloInterceptor,它實現了Interceptor介面.
package cn.bighuan.a_interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

/**
 * 自定義一個攔截器
 * 
 * @author bighuan
 * 
 */
public class HelloInterceptor implements Interceptor {

	// 啟動時候執行
	public HelloInterceptor() {
		System.out.println("建立了攔截器物件...");
	}

	// 啟動時候執行
	@Override
	public void init() {
		System.out.println("HelloInterceptor.init():執行了攔截器的初始化方法");

	}

	// 攔截器業務處理方法:(在訪問Action時候執行?在execute之前執行?)
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		System.out.println("2,執行Action之前");

		// 呼叫下一個攔截器或Action:相當於Servlet過濾器中的chain.doFilter(...)
		// 獲取的是execute方法的返回值
		String resultFlag = invocation.invoke();
		System.out.println("4,攔截器,業務處理-結束:" + resultFlag);

		return resultFlag;
		// return null;
	}

	@Override
	public void destroy() {
		System.out.println("HelloInterceptor.destroy():攔截器銷燬了...");
	}

}
2)寫一個Actio類HelloAction.
package cn.bighuan.a_interceptor;

import com.opensymphony.xwork2.ActionSupport;

public class HelloAction extends ActionSupport {

	public HelloAction() {
		System.out.println("1,HelloAction.HelloAction():HelloAction例項建立了");
	}

	@Override
	public String execute() throws Exception {
		System.out.println("3,HelloAction.execute():執行了請求處理的方法");
		return super.execute();
	}
}
3)在struts.xml檔案進行配置,主要要注意攔截器的配置.(步驟在下面程式碼中)
<package name="hello_interceptor" extends="struts-default">
	
	<!-- 攔截器配置 -->
	<interceptors>
	
		<!-- 配置使用者自定義的攔截器 -->
		<interceptor name="helloInterceptor" class="cn.bighuan.a_interceptor.HelloInterceptor">
		</interceptor>
	
		<!-- 自定義一個棧:要引用預設棧,否則預設棧功能就沒有了,自定義的攔截器 -->
		<interceptor-stack name="helloStack">
		
			<!-- 引用預設棧,注意:預設棧一定要放到第一行 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
			
			<!-- 引用自定義的攔截器 -->
			<interceptor-ref name="helloInterceptor"></interceptor-ref>
		</interceptor-stack>
	</interceptors>
	
		<!-- 執行攔截棧中的所有攔截器 -->
		<default-interceptor-ref name="helloStack"></default-interceptor-ref>
	
		<!-- Action配置 -->
		<action name="hello" class="cn.bighuan.a_interceptor.HelloAction">
			<result name="success">/index.jsp</result>
		</action>
	</package>
4)啟動伺服器,訪問action. a)剛啟動伺服器的時候,控制檯輸出如下內容:
建立了攔截器物件...
HelloInterceptor.init():執行了攔截器的初始化方法
b)當訪問action時,控制檯輸出如下內容:
1,HelloAction.HelloAction():HelloAction例項建立了
2,執行Action之前
3,HelloAction.execute():執行了請求處理的方法
4,攔截器,業務處理-結束:success

d)當伺服器關閉的時候,控制檯輸出如下:

HelloInterceptor.destroy():攔截器銷燬了...

三,分析攔截器的生命週期

1)由上面的實驗結果可知,當我們啟動伺服器時,就已經建立了自定義攔截棧中所有攔截器的物件(如果自己未引用自定義攔截器棧,則執行預設的攔截器棧),並且所有物件都執行了初始化方法init(). 2)當用戶訪問action時,首先是建立Action示例,此時並沒有馬上執行action對應的業務邏輯方法execute(),而是執行了攔截器中的業務處理方法中invocation.invoke()這行程式碼之前的程式碼(包括自己這行程式碼).invocation.invoke()相當於servlet程式設計中過濾器的核心業務方法中的chain.doFilter().緊接著,就是先去執行Action中的業務邏輯方法execute(),當執行完execute()之後才會去繼續執行攔截器業務處理方法中的invocation.invoke()之後的程式碼直到方法結束. 3)當伺服器關閉,攔截器才會銷燬

四,預告

下一篇部落格就是通過攔截器來實現一個完整的登入驗證,敬請期待吧!