Struts2攔截器
- 介紹
- 配置攔截器
- 編寫攔截器
- 使用攔截器
介紹
攔截器其實是AOP的一種實作方式。攔截器可以在調用Action之前和之後執行代碼。架構的大多數核心功能都是作為攔截器實作的。Struts2提供了對個攔截器,開發人員可以根據需要配置攔截器。
用戶端發送請求會被Struts2的過濾器攔截,此時Struts2對請求持有控制權。他會建立action的代理對象。之後通過攔截器處理請求,最後交給action處理。在這期間,攔截器對象作用Action和Result的前後可以執行的任何操作,是以Action對象編寫簡單是由于攔截器進行了處理。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL5NGVNBTRU50dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1cjN2QDNyMTMzADNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
配置攔截器
在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)結果如下