struts2攔截器是struts框架的核心功能之一。首先,struts框架所實現的自動數據填充功能就是利用攔截器來實現的。這裡主要是來總結一下這段時間學習攔截的器的心得。
很明顯攔截器所要做的工作是預處理或者後加工。框架本身所實現的參數填充就是在預處理階段。類型轉換中分別在預處理和後加工階段進行,在預處理階段把視圖傳來的字符串數據轉化成相應的java數據類型,在業務處理完成後把結果類型再轉化為字符串到達結果頁面進行顯示。
總結一下個人自定義攔截器的使用方法:
1.首先建立攔截器類來實現攔截器的邏輯功能。必須實現Interceptor接口
2.配置struts.xml來添加攔截器。
3.將攔截器與相應的動作聯系在一起。
4.測試攔截器。
這裡以我們最常用的身份驗證來實現一個自定義的攔截器。
public class LimitInterceptor implements Interceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
if (用戶已登錄) {
return invocation.invoke();
} else {
return "Log";
}
}
}
public class LimitInterceptor implements Interceptor {
/**
*
*/
private static final long serialVersionUID = 1L;
public void destroy() {
}
public void init() {
}
public String intercept(ActionInvocation invocation) throws Exception {
if (用戶已登錄) {
return invocation.invoke();
} else {
return "Log";
}
}
}
這裡首先實現了攔截器類的邏輯功能,Interceptor接口中有三個方法destory、init、intercept三個方法。其中init和destory主要處理初始化和清理資源工作,這裡不用進行實現。主要的業務邏輯都放在intercept中,這裡主要的邏輯功能是檢測用戶是否登錄,若登錄了則invocation.invoke()表明繼續執行,若未登錄則轉到一個公共的視圖-Log,這是在struts.xml中聲明的一個公共視圖,也就是登錄界面。
<interceptors>
<interceptor name="permission" class="interceptor.LimitInterceptor" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="permission" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>
<interceptors>
<interceptor name="permission" class="interceptor.LimitInterceptor" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="permission" />
<interceptor-ref name="defaultStack" />
</interceptor-stack>
</interceptors>這裡主要進行的是配置攔截器,在struts.xml中配置攔截器,就如同生命action相似。這裡值得注意的是我們如果自定義了攔截器並且把它與某個動作相關聯,那麼系統的攔截器就會被默認屏蔽,則struts2的大部分核心工作都沒法完成,所以我們的解決辦法有兩種,一是我們在為每個動作添加攔截器的時候同時添加上系統默認的攔截器;二是我們將系統攔截器與我們自己編寫的攔截器一同包裝成攔截器棧然後使用。這裡我們使用第二種方式,因為這樣便於修改和維護。
<action name="DeleteStudent" class="stumanage.action.DeleteStudent" method="execute">
<interceptor-ref name="permissionStack"/>
</action>
<action name="DeleteStudent" class="stumanage.action.DeleteStudent" method="execute">
<interceptor-ref name="permissionStack"/>
</action>這裡有一個action為DeleteStudent,我們為這個動作添加攔截器,也就是如果你想進行刪除學生的操作,你必須有權限,也就是必須登錄了。
用<interceptor-ref name="permissionStack"/>這句話將我們封裝的攔截器棧與此action聯系在一起。這樣我們自定義的攔截器就可以正常工作了。如果沒有登錄,你就沒有刪除學生的權限。
當然我們也可以使用
<default-interceptor-ref name="permissinStack"/>來使我們自定義的攔截器棧成為默認攔截器,也就是為每個action添加此攔截器棧。
作者 凌風