官术网_书友最值得收藏!

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所示。

主站蜘蛛池模板: 离岛区| 玛曲县| 中山市| 崇明县| 临桂县| 合水县| 会宁县| 松江区| 洪泽县| 平谷区| 潼关县| 子洲县| 莎车县| 昌都县| 宁陵县| 喀喇沁旗| 四子王旗| 美姑县| 延津县| 兴和县| 佛教| 天全县| 哈尔滨市| 新晃| 汤阴县| 五家渠市| 永川市| 页游| 梅河口市| 双柏县| 中宁县| 桂阳县| 响水县| 德安县| 昔阳县| 黄龙县| 十堰市| 毕节市| 太康县| 南充市| 渝中区|