- Java EE框架開發技術與案例教程
- 張繼軍 董衛
- 2008字
- 2020-05-28 14:20:34
4.4 Struts 2的攔截器
攔截器(Interceptor)是Struts 2的核心組成部分。攔截器動態攔截Action調用的對象,它提供了一種機制,使開發者可以定義一個特定的功能模塊,這個模塊可以在Action執行之前或者之后運行,也可以在一個Action執行之前阻止Action執行。攔截器分為兩類:Struts 2提供的內建攔截器和用戶自定義的攔截器。
對于Struts 2框架提供的內建的攔截器,可以完成框架所提供的相關功能和操作,例如,文件的上傳和下載、國際化、轉換器和數據校驗等。對于Struts 2內建攔截器的應用將在4.5~4.7節給出。本節主要介紹Struts 2攔截器的自定義實現。
4.4.1 Struts 2攔截器的自定義實現
為了實現自定義攔截器,Struts 2提供了Interceptor接口,以及對該接口實現的一個抽象攔截器類(AbstractInterceptor)。創建攔截器類可以實現Interceptor接口,也可以直接繼承AbstractInterceptor類;同時,Struts 2還提供了一個MethodFilterIntercepter類,該類是AbstractInterceptor類的子類,若要實現方法過濾,就需要繼承MethodFilterIntercepter,設計方法攔截器。
1.攔截器接口與抽象攔截器類
Struts 2提供的Interceptor接口(Interceptor.java)的代碼如下。
import com.opensymphony.xwork2.ActionInvocation; import java.io.Serializable; public interface Interceptor extends Serializable { void destroy(); //用于在攔截器執行完之后,釋放init()方法里打開的資源 void init(); //由攔截器在執行之前調用,主要用于初始化系統資源 String intercept(ActionInvocation invocation) throws Exception; }
其中,String intercept(ActionInvocation invocation) throws Exception是攔截器的核心方法,用于實現具體的攔截操作,返回一個字符串作為邏輯視圖。
另外,抽象攔截器類(AbstractInterceptor),是對接口Interceptor的一種實現。
2.自定義攔截器
用戶自定義攔截器,首先通過實現Interceptor接口(或繼承AbstractInterceptor或繼承MethodFilterIntercepter)的類創建自定義攔截器類;然后,在struts.xml中注冊自定義的攔截器;最后,在需要使用的Action中引用已經注冊的攔截器。
(1)創建攔截器類
實現接口Intercepter(或繼承AbstractInterceptor),并在interceptor方法中加入有關的處理代碼,其格式示例如下。

(2)在Struts.xml中注冊攔截器并引用攔截器
在struts.xml中注冊聲明攔截器,并在Action中引用攔截器,配置格式如下。

注意:一旦某個Action引用了自定義的攔截器,Struts 2默認的攔截器就不會再起作用了,為此,還需要引用默認攔截器棧。
3.自定義方法攔截器
Struts 2還提供了方法攔截器類MethodFilterInterceptor,該類繼承AbstractInterceptor類,重寫了intercept()方法,并提供了新的抽象方法doInterceptor()。通過該攔截器可以指定哪些方法需要被攔截,哪些方法不需要被攔截。其創建過程如下。
1)建立攔截器:繼承MethodFilterInterceptor,創建一個攔截器。
2)在配置文件內注冊攔截器:該類攔截器只能配置在Action內部,格式如下。

注意:
(1)exculdMethods:指定不被攔截的方法,若有多個方法以逗號分隔。
(2)includMethods:指定被攔截的方法,若有多個方法以逗號分隔。
4.在interceptor方法中,利用參數ActionInvocation可獲取頁面提交的信息

4.4.2 案例——文字過濾器的設計與應用
【例4-6】開發一個網上論壇過濾系統,如果網友發表的文字中有不文明的文字,將通過攔截器對不文明的文字進行自動替代。該示例只是給出了一種簡單的過濾,過濾是否有“討厭”文字,若有“討厭”,則用“喜歡”代替要過濾的“討厭”,形成新的文本內容并顯示在論壇上。運行界面如圖4-6所示。

圖4-6 【例4-6】的運行界面
a) 提交頁面b) 過濾后顯示信息的頁面
【分析】對于該案例,需要編寫一個自定義攔截器(MyInterceptor.java),一個發表新聞評論的頁面(news.jsp)及其對應的業務控制器PublicAction類,以及評論成功頁面success.jsp。
【設計關鍵】該問題的關鍵是設計一個攔截器MyInterceptor.java,該攔截器的工作過程是:在頁面提交后,獲取所提交的請求參數信息,判定其是否含有“討厭”文字,并進行處理,處理后重新修改請求參數值,然后再執行Action或下一個過濾器。
【實現】
1)建立工程:struts2_Interceptor,并在web.xml中配置核心控制器。
2)根據如圖4-6所示的頁面,設計評論頁面(news.jsp),其代碼如下。
<%@ page language="java" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <title>評論</title> </head> <body> 請發表你的評論!<hr> <s:form action="public" method="post"> <s:textfield name="title" label="評論標題" maxLength="36"/> <s:textarea name="content" cols="36" rows="6" label="評論內容"/> <s:submit value="提交"/> </s:form> </body> </html>
3)編寫評論成功頁面(success.jsp)。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> <title>評論成功</title> </head> <body> 評論如下:<hr> 評論標題:<s:property value="title"/> <br> 評論內容:<s:property value="content"/> </body> </html>
4)評論頁面對應的業務控制器(PublicAction.java)。
package action; import com.opensymphony.xwork2.ActionSupport; public class PublicAction extends ActionSupport{ private String title; private String content; //屬性的getter/setter方法 public String execute(){return SUCCESS; } }
5)編寫自定義攔截器:MyInterceptor.java。
編寫一個自定義攔截器用于對發表評論的內容進行過濾,代碼如下。
package interceptor; //省略了import; public class MyInterceptor extends AbstractInterceptor { public String intercept(ActionInvocation ai) throws Exception { //獲取頁面提交的所有屬性及屬性值 Map<String, Object> parameters = ai.getInvocationContext().getParameters(); //對每對屬性、屬性值分別進行過濾,將過濾后的內容再保存到該屬性中 for (String key : parameters.keySet()) { Object value = parameters.get(key); if ( value ! = null && value instanceof String[]) { String[] valueArray = (String[]) value; for (int i = 0; i < valueArray.length; i++) { if( valueArray[i] ! = null ){ //判斷用戶提交的評論內容是否有要過濾的內容 if(valueArray[i].contains("討厭")) { //以“喜歡”代替要過濾的內容“討厭” valueArray[i] =valueArray[i].replaceAll("討厭", "喜歡"); //把替代后的評論內容設置為Action的評論內容 parameters.put(key, valueArray); } } } } } return ai.invoke(); //執行下一個攔截器或Action } }
6)在struts.xml中配置自定義攔截器和Action。
修改配置文件struts.xml,在配置文件中配置攔截器和Action。
<struts> <package name="default" namespace="/" extends="struts-default"> <interceptors> <! --文字過濾攔截器配置,replace是攔截器的名稱--> <interceptor name="replace" class="interceptor.MyInterceptor" /> </interceptors> <action name="public" class="action.PublicAction"><! --文字過濾Action配置--> <result name="success">/success.jsp</result> <result name="login">/success.jsp</result> <interceptor-ref name="replace"/> <! --使用自定義攔截器--> <interceptor-ref name="defaultStack"/> <! --Struts 2系統默認攔截器--> </action> </package> </struts>
7)項目部署和運行。部署后,運行效果如圖4-6所示。
- INSTANT Mock Testing with PowerMock
- LabVIEW Graphical Programming Cookbook
- 數據庫原理及應用(Access版)第3版
- Manga Studio Ex 5 Cookbook
- Vue.js 2 and Bootstrap 4 Web Development
- WordPress Plugin Development Cookbook(Second Edition)
- Python漫游數學王國:高等數學、線性代數、數理統計及運籌學
- Web程序設計(第二版)
- Julia高性能科學計算(第2版)
- Unity UI Cookbook
- Java高并發核心編程(卷1):NIO、Netty、Redis、ZooKeeper
- Spring 5 Design Patterns
- Unity 5.X從入門到精通
- Learning Unreal Engine Game Development
- HTML5+CSS3+jQuery Mobile+Bootstrap開發APP從入門到精通(視頻教學版)