成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Struts2教程9:實現自已的攔截器

開發 開發工具 后端
Struts是Apache 基金會Jakarta 項目組的一個Open Source 項目,它采用MVC模式,能夠很好地幫助java 開發者利用J2EE開發Web應用。和其他的java架構一樣,Struts 也是面向對象設計,將MVC模式"分離顯示邏輯和業務邏輯"的能力發揮得淋漓盡致。Struts的目的是為了減少在運用MVC設計模型來開發Web應用的時間。你仍然需要學習和應用該架構,不過它將可以完成其中一些繁重的工作。在本系列教程中我們將學習到Struts2的各種技術。

【相關文章】

  1. Struts2教程1:***個Struts2程序
  2. Struts2教程2:處理一個form多個submit
  3. Struts2教程3:struts.xml常用配置解析
  4. Struts2教程4:使用validate方法驗證數據
  5. Struts2教程5:使用Validation框架驗證數據
  6. Struts2教程6:在Action類中獲得HttpServletResponse對象
  7. Struts2教程7:上傳任意多個文件
  8. Struts2教程8:攔截器概述
  9. Struts2教程10:國際化

在上一篇中介紹了Struts2攔截器的原理,在這一篇中我們將學習一下如何編寫自己的攔截器。

攔截器的實現

實現一個攔截器非常簡單。實際上,一個攔截器就是一個普通的類,只是這個類必須實現com.opensymphony.xwork2.interceptor.Interceptor接口。Interceptor接口有如下三個方法:

publicinterfaceInterceptorextendsSerializable
{
  voiddestroy();
  voidinit();
  Stringintercept(ActionInvocationinvocation)throwsException;
}

其中init和destroy方法只在攔截器加載和釋放(都由Struts2自身處理)時執行一次。而intercept方法在每次訪問動作時都會被調用。Struts2在調用攔截器時,每個攔截器類只有一個對象實例,而所有引用這個攔截器的動作都共享這一個攔截器類的對象實例,因此,在實現Interceptor接口的類中如果使用類變量,要注意同步問題。

下面我們來實現一個簡單的攔截器,這個攔截器通過請求參數action指定一個攔截器類中的方法,并調用這個方法(我們可以使用這個攔截器對某一特定的動作進行預處理)。如果方法不存在,或是action參數不存在,則繼續執行下面的代碼。如下面的URL:

http://localhost:8080/struts2/test/interceptor.action?action=test

訪問上面的url后,攔截器會就會調用攔截器中的test方法,如果這個方法不存在,則調用invocation.invoke方法,invoke方法和Servlet過濾器中調用FilterChain.doFilter方法類似,如果在當前攔截器后面還有其他的攔截器,則invoke方法就是調用后面攔截器的intercept方法,否則,invoke會調用Action類的execute方法(或其他的執行方法)。

下面我們先來實現一個攔截器的父類ActionInterceptor。這個類主要實現了根據action參數值來調用方法的功能,代碼如下:

packageinterceptor;

importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.Interceptor;
importjavax.servlet.http.*;
importorg.apache.struts2.*;
publicclassActionInterceptorimplementsInterceptor
{
  protectedfinalStringINVOKE="##invoke";
 
  publicvoiddestroy()
  {
    System.out.println("destroy");
  }
  publicvoidinit()
  {
    System.out.println("init");
  }
  publicStringintercept(ActionInvocationinvocation)throwsException
  {  
    HttpServletRequestrequest=ServletActionContext.getRequest();
    Stringaction=request.getParameter("action");
    System.out.println(this.hashCode());
    if(action!=null)
    {
      try
      {
        java.lang.reflect.Methodmethod=this.getClass().getMethod(action);
        Stringresult=(String)method.invoke(this);
        if(result!=null)
        {
          if(!result.equals(INVOKE))
            returnresult;
        }
        else
          returnnull;
      }
      catch(Exceptione)
      {
      }
    }
    returninvocation.invoke();
  }
}

從上面代碼中的intercept方法可以看出,在調用action所指定的方法后,來判斷返回值。可能發生的情況有三種:

1. 返回值為null,執行return null。

2. 返回值為INVOKE,執行return invockation.invoke()。

3. 其他情況,執行return result。result表示指定方法的返回值,如上面代碼所示。

在實現完上面的攔截器父類后,任何繼承于ActionInterceptor類的攔截器都可以自動根據action的參數值調用自身的相應方法。下面我們來實現一個擁有兩個動作方法test和print的攔截器類。代碼如下:

packageinterceptor;

importjavax.servlet.http.HttpServletResponse;
importorg.apache.struts2.ServletActionContext;
publicclassMultiMethodInterceptorextendsActionInterceptor
{
  publicStringtest()throwsException
  {
    HttpServletResponseresponse=ServletActionContext.getResponse();
    response.getWriter().println("invoketest");
    returnthis.INVOKE;
  }
  publicStringprint()throwsException
  {
    HttpServletResponseresponse=ServletActionContext.getResponse();
    response.getWriter().println("invokeprint");
    returnnull;
  }
}

est方法返回了INVOKE,因此,在執行完這個方法后,Struts2會接著調用其他攔截器的intercept方法或Action類的execute方法。而print方法在執行完后,只是返回了null,而不再調用其他的方法了,也就是訪問如下的url時,動作的execute方法將不會執行:

http://localhost:8080/struts2/test/ddd.action?action=print

下面我們來實現一個Action類,代碼如下:

packageaction;

importorg.apache.struts2.*;
importcom.opensymphony.xwork2.ActionSupport;
publicclassInterceptorActionextendsActionSupport
{
  publicStringabcd()throwsException
  {
    ServletActionContext.getResponse().getWriter()
        .println("invokeabcd");
    returnnull;
  }
}

#p#

在這個Action類中,只有一個abcd方法,實際上,這個方法相當于execute方法,在下面會設置動作的method屬性為abcd。下面我們來在struts.xml中定義攔截器類和動作,代碼如下:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
  "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 ?。紁ackagename="demo"extends="struts-default"namespace="/test">
   ?。糹nterceptors>
     ?。糹nterceptorname="method"class="interceptor.MultiMethodInterceptor"/>
        <interceptor-stackname="methodStack">
         ?。糹nterceptor-refname="method"/>
         ?。糹nterceptor-refname="defaultStack"/>
       ?。?interceptor-stack>
    </interceptors>
   ?。糰ctionname="interceptor"class="action.InterceptorAction"method="abcd">
     ?。糹nterceptor-refname="methodStack"/>
   ?。?action>
 ?。?package>
</struts>

在配置上面的methodStack攔截器時要注意,***在后面引用defaultStack,否則很多通過攔截器提供的功能將失去。

現在訪問如下的URL:

http://localhost:8080/struts2/test/ddd.action?action=test

在瀏覽器中將會出現如下的字符串:

invoke test

invoke abcd

而如果訪問http://localhost:8080/struts2/test/ddd.action?action=print,將會只出現如下的字符串:

invoke print

大家可以看出,訪問這個url時并沒有調用abcd方法。如果隨便指定的action值的話,則只調用abcd方法,如訪問http://localhost:8080/struts2/test/ddd.action?action=aaa,就只會輸出invoke abcd。

攔截器的參數

我們在使用很多Struts2內置的攔截器時會發現有很多攔截器都帶參數,當然。我們自己做的攔截器也可以加上同樣的參數。有兩個參數比較常用,這兩個參數是includeMethods和excludeMethods,其中includeMethods指定了攔截器要調用的Action類的執行方法(默認是execute),也就是說,只有在includeMethods中指定的方法才會被Struts2調用,而excludeMethods恰恰相反,在這個參數中指定的執行方法不會被Struts2調用。如果有多個方法,中間用逗號(,)分隔。在Struts2中提供了一個抽象類來處理這兩個參數。這個類如下:

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor

如有繼承于這個類的攔截器類都會自動處理includeMethods和excludeMethods參數,如下面的攔截器類所示:

packageinterceptor;

importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.interceptor.*;
publicclassMyFilterInterceptorextendsMethodFilterInterceptor
{
  privateStringname;
  publicStringgetName()
  {
    returnname;
  }
  publicvoidsetName(Stringname)
  {
    this.name=name;
  }
  @Override
  protectedStringdoIntercept(ActionInvocationinvocation)throwsException
  {
    System.out.println("doIntercept");
    System.out.println(name);
    returninvocation.invoke();
  }
}

MethodFilterInterceptor的子類需要實現doIntercept方法(相當于Interceptor的intercept方法),如上面代碼所示。在上面的代碼中還有一個name屬性,是為了讀取攔截器的name屬性而設置的,如下面的配置代碼所示:

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
  "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 ?。紁ackagename="demo"extends="struts-default"namespace="/test">
    <interceptors>
     ?。糹nterceptorname="method"class="interceptor.MultiMethodInterceptor"/>
       ?。糹nterceptorname="filter"
          class="interceptor.MyFilterInterceptor">
          <paramname="includeMethods">abcd</param>
         ?。紁aramname="name">中國</param>
       ?。?interceptor>
       ?。糹nterceptor-stackname="methodStack">
          <interceptor-refname="method"/>
         ?。糹nterceptor-refname="filter"/>
         ?。糹nterceptor-refname="defaultStack"/>
       ?。?interceptor-stack>
    </interceptors>
   ?。糰ctionname="interceptor"class="action.InterceptorAction"method="abcd">
     ?。糹nterceptor-refname="methodStack"/>
    </action>
  </package>
</struts>

再次訪問http://localhost:8080/struts2/test/ddd.action?action=test, Struts2就會調用MyFilterInterceptor的doIntercept方法來輸出name屬性值。如果將上面的includeMethods參數值中的abcd去掉,則Action類的abcd方法不會被執行。

【編輯推薦】

  1. Struts2教程1:***個Struts2程序
  2. Struts2教程2:處理一個form多個submit
  3. Struts2教程3:struts.xml常用配置解析
  4. Struts2教程4:使用validate方法驗證數據
  5. Struts2教程5:使用Validation框架驗證數據
  6. Struts2教程6:在Action類中獲得HttpServletResponse對象
  7. Struts2教程7:上傳任意多個文件
  8. Struts2教程8:攔截器概述
  9. Struts2教程10:國際化
責任編輯:楊鵬飛 來源: BlogJava
相關推薦

2009-06-25 15:59:21

Struts2教程攔截器

2009-06-25 15:54:42

Struts2教程攔截器

2009-02-04 14:19:38

2009-06-04 08:01:25

Struts2攔截器原理

2009-06-25 15:11:28

Struts2教程Struts2程序

2009-02-04 10:51:07

2009-06-25 16:04:30

2009-06-03 14:19:34

Struts2Guice

2009-06-25 15:26:25

Struts2教程struts.xml常

2011-04-28 09:52:04

Struts2

2009-02-04 15:04:13

2009-06-25 15:50:03

Struts2教程上傳任意多個文件

2010-01-06 14:36:04

JSON插件

2009-07-29 09:54:34

struts2和str

2009-02-04 11:37:15

2009-02-04 14:00:59

2009-06-25 15:33:12

Struts2教程使用validate驗證數據

2009-06-25 15:37:12

Struts2教程Validation框

2012-04-25 10:14:40

JavaStruts

2009-07-08 17:02:11

JDK實現調用攔截器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.天天干.com | 欧美日本一区 | 日本在线免费看最新的电影 | 九九久久免费视频 | 91久久| 男人的天堂亚洲 | 精品综合久久久 | 99国内精品 | 国产精品日韩欧美一区二区三区 | 在线免费观看成人 | 国产一级一级 | 国产亚洲精品一区二区三区 | 亚洲国产精品久久 | 在线观看av网站 | 一区二区免费 | 三级在线观看 | 黄a大片| 91精品久久久久久久久 | 日韩精品福利 | 午夜精品在线 | 精品国产免费人成在线观看 | 中文字幕视频在线 | 91精品国产一区二区三区动漫 | www国产精品 | 亚洲福利av | 99tv| 久久成人精品 | 国产乱码精品一区二区三区五月婷 | 欧美一二三 | 天天草av | 欧美不卡一区二区三区 | 成人精品国产一区二区4080 | 精品国产乱码久久久久久闺蜜 | 天天爱av | 欧美一级特黄aaa大片在线观看 | 99视频免费在线观看 | 91精品国产乱码久久久久久久 | 色婷婷精品久久二区二区蜜臂av | 自拍偷拍av | 国产偷录叫床高潮录音 | 麻豆一区一区三区四区 |