天天看點

Struts2攔截器介紹配置攔截器編寫攔截器使用攔截器

Struts2攔截器

  • 介紹
  • 配置攔截器
  • 編寫攔截器
  • 使用攔截器

介紹

攔截器其實是AOP的一種實作方式。攔截器可以在調用Action之前和之後執行代碼。架構的大多數核心功能都是作為攔截器實作的。Struts2提供了對個攔截器,開發人員可以根據需要配置攔截器。

        用戶端發送請求會被Struts2的過濾器攔截,此時Struts2對請求持有控制權。他會建立action的代理對象。之後通過攔截器處理請求,最後交給action處理。在這期間,攔截器對象作用Action和Result的前後可以執行的任何操作,是以Action對象編寫簡單是由于攔截器進行了處理。

Struts2攔截器介紹配置攔截器編寫攔截器使用攔截器
Struts2攔截器介紹配置攔截器編寫攔截器使用攔截器

配置攔截器

在struts.xml中配置

<package name="default" extends="struts-default">
   <interceptors>
       <interceptor name="timer" class=".."/>
       <interceptor name="logger" class=".."/>
   </interceptors>
   <action name="login" class="tutorial.Login">
      <interceptor-ref name="timer"/>
      <interceptor-ref name="logger"/>
      <result name="input">login.jsp</result>
      <result name="success" type="redirectAction">/secure/home</result>
   </action>
</package>
           

為包指定特定的攔截器

<package name="basicstruts2" extends="struts-default" > 
    <interceptors> 
        <interceptor-stack name="appDefault"> 
            <interceptor-ref name="timer" /> 
            <interceptor-ref name="logger" /> 
            <interceptor-ref name="defaultStack" /> 
        </interceptor-stack> 
    </interceptors>          

    <default-interceptor-ref name="appDefault" /> 
</package> 
           

編寫攔截器

攔截器必須實作

com.opensymphony.xwork2.interceptor.Interceptor

接口

在Interceptor中有三個方法:

public interface Interceptor extends Serializable {

    void destroy();

    void init();

    String intercept(ActionInvocation invocation) throws Exception;
}
           

init():方法用于攔截器執行一些初始化操作,此方法在攔截器被執行個體化後和intercept()方法執行前調用。

destroy():方法訓示生命周期結束,他在攔截器被銷毀前調用,用于攔截器在初始化時占用一些資源。

intercept():方法是攔截器中的主要方法,用于執行Action對象中的請求處理方法及其後的一些操作,動态增強Action功能。

說明:隻有電泳intercept方法中的invocation參數的invoke方法,才可以執行Action對象中的請求處理方法。

使用攔截器

(1)建立動态Java Web項目,将Struts2的相關類包配置到建構路徑中,并在web.xml檔案中注冊Struts2提供的StrutsPrepareAndExecuteFilter過濾器,進而搭建Struts2的開發環境。

(2)建立名為TestAction的類,此類繼承于ActionSupport對象。關鍵代碼如下:

package com.yy;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public String execute() throws Exception{
		Thread.sleep(1000);
		return SUCCESS;		
	}	
}

           

(3)在struts.xml中配置TestAction對象,并輸出Action執行時間攔截器timer應用到TestAction中,關鍵代碼為

<constant name="struts.devMode" value="true"/>
<constant name="struts.configuration.xml.reload" value="true"/>

<package name="myPackage" extends="struts-default">
	<action name="testAction" class="com.yy.TestAction">
		<interceptor-ref name="timer"/>
		<interceptor-ref name="logger"/>
		<interceptor-ref name="defaultStack">
			<param name="exception.logEnabled">true</param>
			<param name="exception.logLevel">ERROR</param>
		</interceptor-ref>
		<result>success.jsp</result>
	</action>
	
</package>
           

(4)建立簡單的index.jsp和success.jsp頁面用來測試timer攔截器,

(5)結果如下

Struts2攔截器介紹配置攔截器編寫攔截器使用攔截器