1. 程式人生 > >【Struts2】:Interceptor的配置和使用

【Struts2】:Interceptor的配置和使用

        在之前的部落格中,介紹了Struts2的內建攔截器和自定義攔截器的一些內容,但是有了這些自帶和自定義的攔截器之後,如何去配置和使用,還沒有跟大家詳細說明,接下來我們就一起學習一下,Struts2中Interceptor的配置和使用。

        Struts2框架裡的攔截器配置資訊是寫在配置檔案struts.xml裡的,通常我們只需為攔截器類指定一個攔截器名稱,就完成了攔截器的定義。定義攔截器使用<interceptor…/>元素來定義,其最簡單的格式如下;
<span style="font-size:18px;">        <!-- 通過指定攔截器名稱和攔截器實現類來定義攔截器 -->
<span style="white-space:pre">	</span><interceptor name="攔截器名" class="攔截器實現類">

	</interceptor></span>
        如果還需要在配置攔截器的時候傳入引數,則需要在<interceptor…/>元素中使用<param…/>子元素進行引數設定,這種方式設定的是攔截器引數的預設引數值。具體格式如下;
<span style="font-size:18px;"><span style="white-space: pre;">	</span><!-- 通過指定攔截器名和攔截器實現類來定義攔截器 -->
	<interceptor name="攔截器名" class="攔截器實現類">
	<!-- 為攔截器指定引數值 -->
		<param name="引數名">引數值</param>
	</interceptor></span>

        除此之外,還可以把多個攔截器放在一起組成一個“攔截器棧”,比如,如果在Action執行之前想要同時做登入檢查、安全性檢查以及日誌記錄等等操作,則可以把這三個操作對應的攔截器組成一個攔截器棧。定義攔截器棧使用<interceptor-stack…/>元素,攔截器棧是由多個攔截器組成的,因此需要在<interceptor-stack…/>元素中使用<interceptor-ref…/>元素來定義多個攔截器的引用,即該攔截器棧由多個<interceptor-ref…/>元素指定的攔截器組成。

        如何理解攔截器棧呢?單從結構上來看,攔截器棧是由多個攔截器組成的,但是從功能上來看,攔截器和攔截器棧都是一樣的,都是完成對Action的攔截,在Action的execute方法執行之前自動執行,其實,攔截器棧就是一個更大的攔截器而已。攔截器棧的配置資訊如下:

<span style="font-size:18px;"><span style="white-space: pre;">	</span><interceptor-stack name="攔截器棧名">
		<interceptor-ref name="攔截器一"/>
		<interceptor-ref name="攔截器二"/>
		<!-- 還可以配置更多的攔截器-->
		...
	</interceptor-stack></span>
        上文我們提到了攔截器棧和攔截器本質上是一種東西,因此攔截器棧裡也可以再巢狀或者說是包含攔截器棧,比如下面的配置資訊就示例了攔截器棧二引用了攔截器棧一:
<span style="font-size:18px;"><span style="white-space:pre">	</span><interceptor-stack name="攔截器棧1">
		<interceptor-ref name="攔截器一"/>
		<interceptor-ref name="攔截器二"/>
		<!-- 還可以配置更多的攔截器-->
		...
	</interceptor-stack>
			
	<interceptor-stack name="攔截器棧2">
		<interceptor-ref name="攔截器一"/>
		<interceptor-ref name="攔截器棧1"/>
		<!-- 還可以配置更多的攔截器-->
		...
	</interceptor-stack></span>
        這樣做的一個做大好處是軟體複用,按照軟體需求將攔截器分類,組成不同的攔截器棧,然後在程式開發中根據不同的需求去直接呼叫響應的攔截器棧即可,這樣就不用同時呼叫那麼多的攔截器了,靈活組合即可。

        一旦定義了攔截器和攔截器棧之後,就可以使用這個攔截器或者攔截器棧來攔截Action了,攔截器的攔截行為將會在Action的execute方法執行之前執行。通過<interceptor-ref…/>元素可以在Action內使用攔截器,其配置語法和在攔截器棧裡面引用攔截器是一樣的。如下示例,說明了如何在Action中配置攔截器和攔截器棧。

<span style="font-size:18px;"><span style="white-space: pre;">	</span><!-- 配置本系統所使用的包 -->
	<package name="lee" extends="struts-default">
		<!-- 應用所需使用的攔截器都在該元素下配置 -->
		<interceptors>
			<!-- 配置mySimple攔截器 -->
			<interceptor name="mySimple"
			class="org.ljw.app.interceptor.SimpleInterceptor">
				<!-- 為攔截器指定引數值 -->
				<param name="name">簡單攔截器</param>
			</interceptor>
		</interceptors>

		<action name="login" class="org.ljw.app.action.LoginAction">
			<result name="error">/WEB-INF/content/error.jsp</result>
			<result>/WEB-INF/content/welcome.jsp</result> 
			<!-- 配置系統的預設攔截器 -->
			<interceptor-ref name="defaultStack"/>
			<!-- 應用自定義的mySimple攔截器 -->
			<interceptor-ref name="mySimple">
				<param name="name">改名後的攔截器</param>
			</interceptor-ref>
		</action>
		<action name="*">
			<result>/WEB-INF/content/{1}.jsp</result>
		</action>
	</package></span>