隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827240
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          如何使用struts2攔截器,或者自定義攔截器。特別注意,在使用攔截器的時候,在Action里面必須最后一定要引用struts2自帶的攔截器缺省堆棧defaultStack,如下(這里我是引用了struts2自帶的checkbox攔截器):

          <interceptor-ref name="checkbox">
            <param name="uncheckedValue">0</param>
          </interceptor-ref>
          <interceptor-ref name="defaultStack"/>
          (必須加,否則出錯)

          也可以改為對全局Action設置自己需要的攔截器,如下:


          在struts.xml里面定義全局的配置設置

             <package name="struts-shop" extends="struts-default">
              <interceptors>
                <interceptor-stack name="myStack">
                  <interceptor-ref name="checkbox">
                    <param name="uncheckedValue">0</param>
                 </interceptor-ref>
                 <interceptor-ref name="defaultStack"/>
                </interceptor-stack>
              </interceptors>
              <default-interceptor-ref name="myStack"/>(這句是設置所有Action自動調用的攔截器堆棧)
            </package>
           
          struts-action.xml里面配置Action如下:
            <package name="LogonAdmin" extends="struts-shop">(這里擴展struts.xml里面定義的配置就可以了)
            <action name="logon" class="logonAction">
               <result>/jsp/smeishop/admin/index.jsp</result>
               <result name="error">/jsp/smeishop/admin/logon.jsp</result>
               <result name="input">/jsp/smeishop/admin/logon.jsp</result>
             </action>
             <action name="logout" class="logoutAction">
               <result>/jsp/smeishop/admin/logon.jsp</result>
             </action>
           </package>

          你的攔截器可以正常工作了!!HOHO

          以下是參考資料

          struts2自帶的配置及其攔截器配置

          Struts2 攔截器 [Interceptor]


               攔截器的工作原理如上圖,每一個
          Action請求都包裝在一系列的攔截器的內部。攔截器可以在Action
          執(zhí)行直線做相似的操作也可以在
          Action
          執(zhí)行直后做回收操作。

          每一個Action既可以將操作轉交給下面的攔截器,Action也可以直接退出操作返回客戶既定的畫面。

          如何自定義一個攔截器?

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

          1 自定義一個實現(xiàn)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方法在攔截器類被創(chuàng)建之后,在對Action鏡像攔截之前調用,相當于一個post-constructor方法,
          使用這個方法可以給攔截器類做必要的初始話操作。

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

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

          另外AbstractInterceptor提供了一個簡單的Interceptor的實現(xiàn),這個實現(xiàn)為:

          public abstract class AbstractInterceptor implements Interceptor {

               public void init() {

              }

             

              public void destroy() {

              }

              public abstract String intercept(ActionInvocation invocation) throws Exception;

          }

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

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

          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) {

                      // 存在的情況下進行后續(xù)操作。

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

                      return actionInvocation.invoke();

                  } else {

                      // 否則終止后續(xù)操作,返回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"/>

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

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

          攔截器

          名字

          說明

          Alias Interceptor

          alias

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

          Chaining Interceptor

          chain

          讓前一個Action的屬性可以被后一個Action訪問,現(xiàn)在和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

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

          Debugging Interceptor

          debugging

          提供不同的調試用的頁面來展現(xiàn)內部的數(shù)據(jù)狀況。

          Execute and Wait Interceptor

          execAndWait

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

          Exception Interceptor

          exception

          將異常定位到一個畫面

          File Upload Interceptor

          fileUpload

          提供文件上傳功能

          I18n Interceptor

          i18n

          記錄用戶選擇的locale

          Logger Interceptor

          logger

          輸出Action的名字

          Message Store Interceptor

          store

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

          Model Driven Interceptor

          model-driven

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

          Scoped Model Driven

          scoped-model-driven

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

          Parameters Interceptor

          params

          將請求中的參數(shù)設置到Action中去。

          Prepare Interceptor

          prepare

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

          Scope Interceptor

          scope

          Action狀態(tài)存入sessionapplication的簡單方法。

          Servlet Config Interceptor

          servletConfig

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

          Static Parameters Interceptor

          staticParams

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

          Roles Interceptor

          roles

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

          Timer Interceptor

          timer

          輸出Action執(zhí)行的時間

          Token Interceptor

          token

          通過Token來避免雙擊

          Token Session Interceptor

          tokenSession

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

          Validation Interceptor

          validation

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

          Workflow Interceptor

          workflow

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

          Parameter Filter Interceptor

          N/A

          從參數(shù)列表中刪除不必要的參數(shù)

          Profiling Interceptor

          profiling

          通過參數(shù)激活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
          執(zhí)行,必須執(zhí)行攔截器堆棧中的每一個攔截器。

          <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應用中,根據(jù)慣例配置了若干個攔截器堆棧,詳細情參看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>

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

          <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>

          每一個攔截器都有兩個默認的參數(shù):

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

          includeMethods ?C 使用攔截器的方法。

          需要說明的幾點:

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

          <interceptor-stack name="xaStack">

           <interceptor-ref name="thisWillRunFirstInterceptor"/>

           <interceptor-ref name="thisWillRunNextInterceptor"/>

           <interceptor-ref name="followedByThisInterceptor"/>

           <interceptor-ref name="thisWillRunLastInterceptor"/>

          </interceptor-stack>

          的執(zhí)行順序為:

          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();

          或者實現(xiàn)相應的接口:

          HttpSession            SessionAware

          HttpServletRequest     ServletRequestAware

          HttpServletResponse    ServletResponseAware

          文章來源:http://www.java3z.com/cwbwebhome/article/article2/2933.html?id=1626



          posted on 2007-11-23 10:35 Ke 閱讀(2391) 評論(0)  編輯  收藏 所屬分類: struts 2
          主站蜘蛛池模板: 松阳县| 彰武县| 化隆| 衡山县| 达州市| 西吉县| 长顺县| 丰顺县| 榕江县| 乐安县| 溆浦县| 淳化县| 紫阳县| 彭水| 安新县| 天台县| 建宁县| 镇江市| 新巴尔虎左旗| 桑植县| 扎囊县| 娄底市| 肇源县| 泗洪县| 霍城县| 扶绥县| 乌兰察布市| 五峰| 资兴市| 吐鲁番市| 丘北县| 乌海市| 登封市| 平昌县| 尉犁县| 新河县| 栾川县| 政和县| 扶沟县| 县级市| 凌云县|