歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Struts 2 攔截器

Struts 2 攔截器

日期:2017/3/1 10:22:35   编辑:Linux編程

1、Struts2實現原理:

當請求到達Struts 2的ServletDispatcher時,Struts 2會查找配置文件,並根據其配置實例化相對的攔截器對象,然後串成一個列表(list),最後一個一個地調用列表中的攔截器,如圖所示。


2、Struts2默認的所有攔截器:

  1. <interceptor-stack name="defaultStack">
  2. <interceptor-ref name="exception"/><!-- 用於捕獲異常 -->
  3. <interceptor-ref name="alias"/>
  4. <interceptor-ref name="servletConfig"/><!-- 將源於Servlet API的各種對象注入到Action -->
  5. <interceptor-ref name="i18n"/>
  6. <interceptor-ref name="prepare"/>
  7. <interceptor-ref name="chain"/>
  8. <interceptor-ref name="scopedModelDriven"/>
  9. <interceptor-ref name="modelDriven"/>
  10. <interceptor-ref name="fileUpload"/><!-- 將文件和元數據從多重請求轉換為常規請求 -->
  11. <interceptor-ref name="checkbox"/>
  12. <interceptor-ref name="multiselect"/>
  13. <interceptor-ref name="staticParams"/><!-- 將在配置文件中配置的參數注入到Action中對應的屬性 -->
  14. <interceptor-ref name="actionMappingParams"/>
  15. <interceptor-ref name="params"><!-- 將請求的數據設置到Action中的屬性上 -->
  16. <param name="excludeParams">dojo\..*,^struts\..*,^session\..*,
  17. ^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
  18. </interceptor-ref>
  19. <interceptor-ref name="conversionError"/>
  20. <interceptor-ref name="validation"><!-- 執行數據驗證 -->
  21. <param name="excludeMethods">input,back,cancel,browse</param>
  22. </interceptor-ref>
  23. <interceptor-ref name="workflow"><!-- 當數據驗證錯誤時,提供終止流程的功能 -->
  24. <param name="excludeMethods">input,back,cancel,browse</param>
  25. </interceptor-ref>
  26. <interceptor-ref name="debugging"/>
  27. </interceptor-stack>

在struts-default.xml中已經配置了以上的攔截器。如果您想要使用上述攔截器,只需要在應用程序struts.xml文件中通過“<include file="struts-default.xml" />”將struts-default.xml文件包含進來,並繼承其中的struts-default包(package),最後在定義Action時,使用“<interceptor-ref name="xx" />”引用攔截器或攔截器棧(interceptor stack)。一旦您繼承了struts-default包(package),所有Action都會調用攔截器棧 ——defaultStack。當然,在Action配置中加入“<interceptor-ref name="xx" />”可以覆蓋defaultStack。

3、Struts2為我們提供了一個Interceptor接口,該接口源代碼如下:

  1. publicinterface Interceptor extends Serializable {
  2. void destroy();
  3. void init();
  4. String intercept(ActionInvocation invocation) throws Exception;
  5. }

1) init():在攔截器執行之前調用,主要用於初始化系統資源。

2) destroty():與init()對應,用於攔截器執行之後銷毀資源。

3) intercept():攔截器的核心方法,實現具體的攔截操作。與action一樣,該方法也返回一個字符串作為邏輯視圖。如果攔截器成功調用了action,則返回該action中execute()方法返回的邏輯視圖,反之,則返回一個自定義的邏輯視圖。

Struts2還為我們提供了一個AbstractInterceptor類,該類的init()和destroy()都是空實現。我們開發自己的攔截器只需要繼承這個類就行了。

4、下面以一個登錄的例子為例自定義攔截器:

首先自定義一個攔截器類,該類可以實現Interceptor接口或繼承AbstractInterceptor類:

  1. public class PermissionInterceptor implements Interceptor {
  2. @Override
  3. public void destroy() {
  4. // TODO Auto-generated method stub
  5. }
  6. @Override
  7. public void init() {
  8. // TODO Auto-generated method stub
  9. }
  10. @Override
  11. public String intercept(ActionInvocation invocation) throws Exception {
  12. // TODO Auto-generated method stub
  13. ActionContext cont=ActionContext.getContext();
  14. Object obj=cont.getSession().get("user");
  15. if(obj!=null){
  16. return invocation.invoke();
  17. }
  18. cont.getSession().put("message", "非法跳轉,請先登錄!");
  19. return "login";
  20. }
  21. }
在struts.xml配置攔截器:
  1. <struts>
  2. <package name="base" extends="struts-default">
  3. <global-results><!-- 定義全局視圖 -->
  4. <result name="login" type="redirect" >/login.jsp</result>
  5. </global-results>
  6. </package>
  7. <package name="default" namespace="/test" extends="base">
  8. <interceptors>
  9. <interceptor name="permission" class="org.han.interceptor.PermissionInterceptor" />
  10. <interceptor-stack name="permissionStack"><!-- 攔截器棧 -->
  11. <interceptor-ref name="defaultStack" />
  12. <interceptor-ref name="permission" /><!-- 如果需要加載默認攔截器,自定義攔截器要放默認攔截器後面 -->
  13. </interceptor-stack>
  14. </interceptors>
  15. </package>
  16. </struts>
Copyright © Linux教程網 All Rights Reserved