<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-9  評論-0  文章-0  trackbacks-0

    如何自定義一個攔截器?

    自定義一個攔截器需要三步:

    1 自定義一個實現Interceptor接口(或者繼承自AbstractInterceptor)的類。

    2 strutx.xml中注冊上一步中定義的攔截器。

    3 在需要使用的Action中引用上述定義的攔截器,為了方便也可將攔截器定義為默認的攔截器,這樣在不加特殊聲明的情況下所有的Action都被這個攔截器攔截。

     

    Interceptor接口聲明了三個方法:

     

    public interface Interceptor extends Serializable {

     

        void destroy();

     

        void init();

     

        String intercept(ActionInvocation invocation) throws Exception;

    }

     

    Init方法在攔截器類被創建之后,在對Action鏡像攔截之前調用,相當于一個post-constructor方法,使用這個方法可以給攔截器類做必要的初始話操作。

     

    Destroy方法在攔截器被垃圾回收之前調用,用來回收init方法初始化的資源。

     

    Intercept是攔截器的主要攔截方法,如果需要調用后續的Action或者攔截器,只需要在該方法中調用invocation.invoke()方法即可,在該方法調用的前后可以插入Action調用前后攔截器需要做的方法。如果不需要調用后續的方法,則返回一個String類型的對象即可,例如Action.SUCCESS

    另外AbstractInterceptor提供了一個簡單的Interceptor的實現,這個實現為:

    public abstract class AbstractInterceptor implements Interceptor {

     

         public void init() {

        }

       

        public void destroy() {

        }

     

     

        public abstract String intercept(ActionInvocation invocation) throws Exception;

    }

    在不需要編寫initdestroy方法的時候,只需要從AbstractInterceptor繼承而來,實現intercept方法即可。

     

    我們嘗試編寫一個Session過濾用的攔截器,該攔截器查看用戶Session中是否存在特定的屬性(LOGIN屬性)如果不存在,中止后續操作定位到LOGIN,否則執行原定操作,代碼為:

    public class CheckLoginInterceptor extends AbstractInterceptor {

        public static final String LOGIN_KEY = "LOGIN";

        public static final String LOGIN_PAGE = "global.login";

     

        public String intercept(ActionInvocation actionInvocation) throws Exception {

     

            System.out.println("begin check login interceptor!");

            // LoginAction不做該項攔截

            Object action = actionInvocation.getAction();

            if (action instanceof LoginAction) {

                System.out.println("exit check login, because this is login action.");

                return actionInvocation.invoke();

            }

     

            // 確認Session中是否存在LOGIN

            Map session = actionInvocation.getInvocationContext().getSession();

            String login = (String) session.get(LOGIN_KEY);

            if (login != null && login.length() > 0) {

                // 存在的情況下進行后續操作。

                System.out.println("already login!");

                return actionInvocation.invoke();

            } else {

                // 否則終止后續操作,返回LOGIN

                System.out.println("no login, forward login page!");

                return LOGIN_PAGE;

            }

        }

    }

     

    注冊攔截器

    <interceptors>

                <interceptor

    name="login" 

    class="com.jpleasure.teamware.util.CheckLoginInterceptor"/>

                <interceptor-stack name="teamwareStack">

                    <interceptor-ref name="login"/>

                    <interceptor-ref name="defaultStack"/>

                </interceptor-stack>

    </interceptors>

     

    將上述攔截器設定為默認攔截器:

    <default-interceptor-ref name="teamwareStack"/>

    這樣在后續同一個package內部的所有Action執行之前都會被login攔截。

     

     

    Struts2XWork)提供的攔截器的功能說明:

     

    攔截器

    名字

    說明

    Alias Interceptor

    alias

    在不同請求之間將請求參數在不同名字件轉換,請求內容不變

    Chaining Interceptor

    chain

    讓前一個Action的屬性可以被后一個Action訪問,現在和chain類型的result<result type=”chain”>)結合使用。

    Checkbox Interceptor

    checkbox

    添加了checkbox自動處理代碼,將沒有選中的checkbox的內容設定為false,而html默認情況下不提交沒有選中的checkbox

    Cookies Interceptor

    cookies

    使用配置的name,value來是指cookies

    Conversion Error Interceptor

    conversionError

    將錯誤從ActionContext中添加到Action的屬性字段中。

    Create Session Interceptor

    createSession

    自動的創建HttpSession,用來為需要使用到HttpSession的攔截器服務。

    Debugging Interceptor

    debugging

    提供不同的調試用的頁面來展現內部的數據狀況。

    Execute and Wait Interceptor

    execAndWait

    在后臺執行Action,同時將用戶帶到一個中間的等待頁面。

    Exception Interceptor

    exception

    將異常定位到一個畫面

    File Upload Interceptor

    fileUpload

    提供文件上傳功能

    I18n Interceptor

    i18n

    記錄用戶選擇的locale

    Logger Interceptor

    logger

    輸出Action的名字

    Message Store Interceptor

    store

    存儲或者訪問實現ValidationAware接口的Action類出現的消息,錯誤,字段錯誤等。

    Model Driven Interceptor

    model-driven

    如果一個類實現了ModelDriven,將getModel得到的結果放在Value Stack中。

    Scoped Model Driven

    scoped-model-driven

    如果一個Action實現了ScopedModelDriven,則這個攔截器會從相應的Scope中取出model調用ActionsetModel方法將其放入Action內部。

    Parameters Interceptor

    params

    將請求中的參數設置到Action中去。

    Prepare Interceptor

    prepare

    如果Acton實現了Preparable,則該攔截器調用Action類的prepare方法。

    Scope Interceptor

    scope

    Action狀態存入sessionapplication的簡單方法。

    Servlet Config Interceptor

    servletConfig

    提供訪問HttpServletRequestHttpServletResponse的方法,以Map的方式訪問。

    Static Parameters Interceptor

    staticParams

    struts.xml文件中將<action>中的<param>中的內容設置到對應的Action中。

    Roles Interceptor

    roles

    確定用戶是否具有JAAS指定的Role,否則不予執行。

    Timer Interceptor

    timer

    輸出Action執行的時間

    Token Interceptor

    token

    通過Token來避免雙擊

    Token Session Interceptor

    tokenSession

    Token Interceptor一樣,不過雙擊的時候把請求的數據存儲在Session

    Validation Interceptor

    validation

    使用action-validation.xml文件中定義的內容校驗提交的數據。

    Workflow Interceptor

    workflow

    調用Actionvalidate方法,一旦有錯誤返回,重新定位到INPUT畫面

    Parameter Filter Interceptor

    N/A

    從參數列表中刪除不必要的參數

    Profiling Interceptor

    profiling

    通過參數激活profile

     

    注冊并引用Interceptor

    <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="redirect-action">/secure/home</result>

       </action>

    </package>

     

    可以將多個攔截器合并在一起作為一個堆棧調用,當一個攔截器堆棧被附加到一個Action的時候,要想Action執行,必須執行攔截器堆棧中的每一個攔截器。

    <package name="default" extends="struts-default">

       <interceptors>

            <interceptor name="timer" class=".."/>

            <interceptor name="logger" class=".."/>

            <interceptor-stack name="myStack">

               <interceptor-ref name="timer"/>

               <interceptor-ref name="logger"/>

            </interceptor-stack>

        </interceptors>

     

        <action name="login" class="tutuorial.Login">

             <interceptor-ref name="myStack"/>

             <result name="input">login.jsp</result>

             <result name="success"

                 type="redirect-action">/secure/home</result>

        </action>

    </package>

     

    上述說明的攔截器在默認的Struts2應用中,根據慣例配置了若干個攔截器堆棧,詳細情參看struts-default.xml

    其中有一個攔截器堆棧比較特殊,他會應用在默認的每一個Action上。

    <interceptor-stack name="defaultStack">

        <interceptor-ref name="exception"/>

        <interceptor-ref name="alias"/>

        <interceptor-ref name="servletConfig"/>

        <interceptor-ref name="prepare"/>

        <interceptor-ref name="i18n"/>

        <interceptor-ref name="chain"/>

        <interceptor-ref name="debugging"/>

        <interceptor-ref name="profiling"/>

        <interceptor-ref name="scopedModelDriven"/>

        <interceptor-ref name="modelDriven"/>

        <interceptor-ref name="fileUpload"/>

        <interceptor-ref name="checkbox"/>

        <interceptor-ref name="staticParams"/>

        <interceptor-ref name="params">

          <param name="excludeParams">dojo"..*</param>

        </interceptor-ref>

        <interceptor-ref name="conversionError"/>

        <interceptor-ref name="validation">

            <param name="excludeMethods">input,back,cancel,browse</param>

        </interceptor-ref>

        <interceptor-ref name="workflow">

            <param name="excludeMethods">input,back,cancel,browse</param>

        </interceptor-ref>

    </interceptor-stack>

     

    每一個攔截器都可以配置參數,有兩種方式配置參數,一是針對每一個攔截器定義參數,二是針對一個攔截器堆棧統一定義所有的參數,例如:

    <interceptor-ref name="validation">

     <param name="excludeMethods">myValidationExcudeMethod</param>

    </interceptor-ref>

    <interceptor-ref name="workflow">

     <param name="excludeMethods">myWorkflowExcludeMethod</param>

    </interceptor-ref>

    或者

    <interceptor-ref name="defaultStack">

        <param name="validation.excludeMethods">myValidationExcludeMethod</param>

        <param name="workflow.excludeMethods">myWorkflowExcludeMethod</param>

    </interceptor-ref>

     

    每一個攔截器都有兩個默認的參數:

    excludeMethods - 過濾掉不使用攔截器的方法和

    includeMethods – 使用攔截器的方法。

     

    需要說明的幾點:

    1 攔截器執行的順序按照定義的順序執行,例如:

    <interceptor-stack name="xaStack">

     <interceptor-ref name="thisWillRunFirstInterceptor"/>

     <interceptor-ref name="thisWillRunNextInterceptor"/>

     <interceptor-ref name="followedByThisInterceptor"/>

     <interceptor-ref name="thisWillRunLastInterceptor"/>

    </interceptor-stack>

    的執行順序為:

    thisWillRunFirstInterceptor

     thisWillRunNextInterceptor

        followedByThisInterceptor

          thisWillRunLastInterceptor

            MyAction1

            MyAction2 (chain)

            MyPreResultListener

            MyResult (result)

          thisWillRunLastInterceptor

        followedByThisInterceptor

     thisWillRunNextInterceptor

    thisWillRunFirstInterceptor

     

    2 使用默認攔截器配置每個Action都需要的攔截器堆棧,例如:

    <action name="login" class="tutorial.Login">

         <interceptor-ref name="timer"/>

         <interceptor-ref name="logger"/>

         <interceptor-ref name="default-stack"/>

     

         <result name="input">login.jsp</result>

         <result type="redirect-action">/secure/home</result>

    </action>

    可以按照如下的方式定義:

    <interceptors>

         <interceptor-stack name="myStack">

            <interceptor-ref name="timer"/>

            <interceptor-ref name="logger"/>

            <interceptor-ref name="default-stack"/>

         </interceptor-stack>

    </interceptors>

     

    <default-interceptor-ref name="myStack"/>

     

    <action name="login" class="tutorial.Login">

           <result name="input">login.jsp</result>

           <result type="redirect-action">/secure/home</result>

    </action>

     

    3 如何訪問HttpServletRequestHttpServletResponse或者HttpSession

    有兩種方法可以達到效果,使用ActionContext

    Map attibutes = ActionContext.getContext().getSession();

    或者實現相應的接口:

    HttpSession            SessionAware

    HttpServletRequest     ServletRequestAware

    HttpServletResponse    ServletResponseAware

    posted on 2010-02-26 18:48 AndyFish 閱讀(272) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日韩免费a级毛片无码a∨| 亚洲第一第二第三第四第五第六| 亚洲欧洲精品无码AV| 国产国拍亚洲精品福利| 亚洲成人高清在线| 亚洲精品岛国片在线观看| 亚洲国产精品人人做人人爱| 亚洲国产精品无码久久久久久曰| 又黄又爽无遮挡免费视频| 亚洲av午夜成人片精品电影| 亚洲人成网站观看在线播放| 国产亚洲精品激情都市| 亚洲国产美女精品久久久久∴| 亚洲国产精品无码专区| 亚洲AV人无码激艳猛片| 久久亚洲AV无码精品色午夜麻豆| 亚洲精品影院久久久久久| 亚洲制服丝袜第一页| 亚洲变态另类一区二区三区| 特级毛片全部免费播放| GOGOGO免费观看国语| 99在线观看免费视频| www.999精品视频观看免费| 在线观看永久免费视频网站| 亚洲视频在线免费| 久久精品国产精品亚洲色婷婷| 91精品国产亚洲爽啪在线影院| 亚洲AV综合色区无码二区偷拍 | 真实乱视频国产免费观看| yy6080久久亚洲精品| 亚洲日韩小电影在线观看| 久久亚洲sm情趣捆绑调教| 亚洲国产成人久久精品大牛影视 | 久久久综合亚洲色一区二区三区| 亚洲精品不卡视频| 亚洲第一街区偷拍街拍| 中国一级全黄的免费观看| 69视频免费观看l| 小小影视日本动漫观看免费| 亚洲精品tv久久久久久久久 | 亚洲av日韩av激情亚洲|