專利名稱:一種面向切面編程的攔截器系統(tǒng)及方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)系統(tǒng)開發(fā)領(lǐng)域,特別是涉及計算機(jī)J2EE企業(yè)級應(yīng)用系 統(tǒng)開發(fā)領(lǐng)域,具體是涉及一種在Stmts下的面向切面編程(AOP)的攔截器系 統(tǒng)及方法。
背景技術(shù):
J2EE, Java2平臺企業(yè)版(Java 2 Platform Enterprise Edition),是Sun公司為企業(yè)級應(yīng)用推出的標(biāo)準(zhǔn)軟件系統(tǒng)開發(fā)平臺。而隨著Java技術(shù)的發(fā)展,J2EE 平臺得到了迅速的發(fā)展,成為Java語言中最活躍的體系之一?,F(xiàn)如今,J2EE 不僅僅是指一種標(biāo)準(zhǔn)平臺(Platform),她更多的表達(dá)著一種軟件系統(tǒng)架構(gòu)和軟 件系統(tǒng)編程方法。J2EE企業(yè)級Web應(yīng)用開發(fā)系統(tǒng)框架有Struts、 Webwork、 JSF、 Tapestry等開發(fā)框架。其中,Stmts系統(tǒng)框架是開放源代碼的企業(yè)級Web應(yīng)用開發(fā)系統(tǒng)框架,目 的是從整體上減輕構(gòu)造企業(yè)Web應(yīng)用的負(fù)擔(dān)。而J2EE的表示層一般是用Struts 組件系統(tǒng)框架來編寫,其是目前最常用的企業(yè)級Web應(yīng)用開發(fā)系統(tǒng)框架。Struts系統(tǒng)框架是基于Model 2設(shè)計模式的J2EE應(yīng)用開發(fā)平臺。Model 2 體系是MVC (Model-View-Controller)體系中的一種。在MVC體系中,數(shù)據(jù) 模型(Model)、表現(xiàn)邏輯(View)和控制邏輯(Controller)是分離的組件, 但它們可以互相通信,Struts系統(tǒng)框架正是定位在基于Model 2設(shè)計模式的 J2EE應(yīng)用開發(fā)系統(tǒng)框架。但是,相比于其它J2EE企業(yè)級Web應(yīng)用開發(fā)系統(tǒng)框架,如Webwork等, Struts系統(tǒng)框架在默認(rèn)的情況下并沒有實現(xiàn)面向切面的編程(AOP)。面向切面編程(Aspect Oriented Programming, AOP)主要實現(xiàn)的目的是 針對業(yè)務(wù)處理過程中的切面進(jìn)行提取,其面對處理過程中的某個步驟階段,以 獲得邏輯過程中各部分之間低耦合性的隔離效果。例如最常見的日志記錄,現(xiàn)在需要提供一個查詢學(xué)生信息服務(wù),并記錄有誰進(jìn)行了這個查詢。如果按照傳 統(tǒng)的編程方式實現(xiàn)的話,那首先實現(xiàn)了一個査詢學(xué)生信息的服務(wù)接口(StudentlnfoService.java)禾Q其實現(xiàn)類(StudentlnfoServicelmpl.java),然后 為了進(jìn)行記錄,在實現(xiàn)類(StudentlnfoServicelmpLjava)中添加實現(xiàn)記錄的過 程。這樣的話,如果要實現(xiàn)的服務(wù)有多個,則要在每個實現(xiàn)的類都添加這些記 錄過程。這種實現(xiàn)方式很繁瑣,而且每個實現(xiàn)類都與記錄服務(wù)日志的行為緊耦 合,違反了面向?qū)ο蟮囊?guī)則。而為了實現(xiàn)日志記錄服務(wù)與業(yè)務(wù)處理過程分離, 使査詢學(xué)生信息的服務(wù)正常進(jìn)行,則人們將日志記錄行為單獨進(jìn)行記錄,其他 業(yè)務(wù)處理如査詢學(xué)生信息的服務(wù)不知道存在這些日志記錄過程,這就是面向切 面的編程(AOP)。面向切面的編程,就是把某個方面的功能提出來與一批對 象進(jìn)行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進(jìn)行編程。面向切面編程(AOP)可以使用一個代理類(Proxy),通過攔截一個對 象的行為并添加需要的功能來完成,即攔截方法,也就是面向切面編程的攔截 方法,也叫攔截器。Struts系統(tǒng)框架在默認(rèn)情況下沒有實現(xiàn)面向切面編程(AOP)實現(xiàn),這和 WebWork等開發(fā)框架相比存在缺陷。因此,現(xiàn)有的技術(shù)中,通過Lars Hoss 和Don Brown編寫SAIF (Struts Action Invocation Framework),能夠在Struts 系統(tǒng)框架上實現(xiàn)面向切面編程(AOP)。但是,SAIF實現(xiàn)的功能很少,其一般只能實現(xiàn)Struts系統(tǒng)框架上的最基 本的類的攔截,即只能針對一個類(如Action類)或多個類進(jìn)行攔截,不能 實現(xiàn)對各個類里面的實現(xiàn)方法進(jìn)行攔截(即方法級攔截器),其實用性比較差。發(fā)明內(nèi)容本發(fā)明的目的在于提供一種面向切面編程的攔截器系統(tǒng)及方法,其全面在 Struts應(yīng)用開發(fā)系統(tǒng)框架中實現(xiàn)面向切面編程(AOP),實現(xiàn)類的攔截(類級 攔截器)和類中實現(xiàn)方法的攔截(方法級攔截器),具有很好的實用性。為實現(xiàn)本發(fā)明目的而提供的一種面向切面編程的攔截器系統(tǒng),是在Struts 應(yīng)用開發(fā)系統(tǒng)框架下實現(xiàn)的,包括接口模塊,攔截器配置模塊,其中接口模塊,用于設(shè)置Struts框架下的攔截器接口,基于該接口實現(xiàn)攔截器類;攔截器接口, 一般基于該接口實現(xiàn)攔截器類,在調(diào)用攔截器的時候會執(zhí)行 在接口中定義的方法;攔截器配置模塊,用于配置攔截器的配置文件,將攔截器配置到相應(yīng)的執(zhí) 行路徑中去。所述的面向切面編程的攔截器系統(tǒng),還可以包括讀取模塊和執(zhí)行模塊,其中讀取模塊,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;執(zhí)行模塊,用于在客戶端訪問網(wǎng)站時,根據(jù)路徑調(diào)用Struts Action或者DispatchAction類,獲取路徑對應(yīng)的攔截器,使用相應(yīng)的攔截器接口,實現(xiàn)在Struts框架下面向切面編程的攔截。所述的面向切面編程的攔截器系統(tǒng),所述接口模塊中,還可以包括攔截器管理模塊,用于在Spring容器的配置文件配置攔截器類對應(yīng)的bean,實現(xiàn)在Spring容器中統(tǒng)一管理攔截器對象。所述的面向切面編程的攔截器系統(tǒng),所述讀取模塊中,還可以進(jìn)一步包括Struts插件模塊,用于在struts框架下調(diào)用Struts Action類或者DispatchAction類前(一般Web應(yīng)用啟動時),在Struts配置文件中加入攔截器配置模塊,在Struts配置文件中以插件的方式配置上去;所述讀取模塊在Struts啟動初始化時,由Struts插件類讀取配置文件。 為實現(xiàn)本發(fā)明目的還提供一種面向切面編程的攔截方法,包括下列步驟 步驟A,設(shè)置Struts框架下的攔截器接口,基于該接口實現(xiàn)攔截器類; 步驟B,配置攔截器的配置文件結(jié)構(gòu),并將攔截器配置到相應(yīng)的執(zhí)行路徑中去,實現(xiàn)在Struts框架下初始化時能夠讀取面向切面編程的方法級攔截器。 所述的面向切面編程的攔截方法,所述步驟B之后還可以包括下列步驟 步驟C,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;步驟D,當(dāng)客戶端訪問網(wǎng)站時,服務(wù)器端Servlet容器根據(jù)路徑調(diào)用StrutsAction類或者DispatchAction類,獲取路徑對應(yīng)的攔截器,使用相應(yīng)的攔截器接口 ,實現(xiàn)在Struts框架下面向切面編程的攔截。 所述步驟A還包括下列步驟-在Spring容器的配置文件配置攔截器類對應(yīng)的bean,實現(xiàn)在Spring容器 中統(tǒng)一管理攔截器對象。所述步驟C中讀取配置文件是由Struts插件類完成的。 所述歩驟C可以包括下列步驟步驟C1,采用Diggester工具將xml配置文件讀入,產(chǎn)生Java對象; 步驟C2,解析路徑的攔截配置器,將配置分別提取,并將攔截器棧替換對應(yīng)的一批攔截器;步驟C3,在每個路徑的攔截配置器中加入缺省攔截器指定的攔截器; 步驟C4,在每個路徑的攔截配置器中排除被排除的缺省攔截器中指定的攔截器;步驟C5,判斷配置攔截器是否要按順序執(zhí)行,若配置中攔截配置器按順 序執(zhí)行的配置為真,則對每個路徑的攔截配置器中攔截器進(jìn)行排序,否則直接 返回。所述歩驟D中,使用攔截器接口,實現(xiàn)在struts框架下面向切面編程的攔 截,可以包括下列步驟步驟D1,執(zhí)行攔截器中的前攔截器接口;步驟D2,判斷返回值是否為空,如果不為空,則表示結(jié)束,攔截器得到 結(jié)果,攔截過程結(jié)束,轉(zhuǎn)到步驟D6;步驟D3,如果為空,則執(zhí)行Struts Action或者DispatchAction對象類方法, 正常執(zhí)行Struts程序;步驟D4,如果拋異常,在執(zhí)行Struts Action或者DispatohAction對象類方 法過程中出現(xiàn)異常情況時,則執(zhí)行攔截器中的異常處理攔截器接口,然后,攔 截過程結(jié)束,轉(zhuǎn)到步驟D6;步驟D5,否則,正常執(zhí)行Struts程序后,執(zhí)行攔截器中的后攔截器接口;步驟D6,將攔截或者執(zhí)行結(jié)果送出。所述接口包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。 所述攔截器包括權(quán)限控制攔截器、數(shù)據(jù)驗證攔截器、日志記錄攔截器以及異常處理攔截器中的一種或者一種以上的組合。本發(fā)明的有益效果是本發(fā)明的面向切面編程(AOP)的攔截器系統(tǒng)及方法,其在Struts應(yīng)用開發(fā)系統(tǒng)框架下實現(xiàn)方法級攔截,其不但支持Struts Action類,也支持Struts DispatchAction類,支持Struts l.X全系列版本。而且,本發(fā) 明還利用Spring容器來統(tǒng)一管理攔截器對象,通過SpringFramework (Spring 框架)提供的Spring容器統(tǒng)一管理攔截器,使得程序代碼功能分解清晰,更 容易被維護(hù),并支持按指定順序執(zhí)行攔截器,從而全面在Struts開發(fā)框架中實 現(xiàn)面向切面編程,通過Struts Action類實現(xiàn)類的攔截(類級攔截器),通過Struts DispatchAction類實現(xiàn)方法級的攔截(方法級攔截器),具有很好的實用性。
圖1為本發(fā)明面向切面編程(AOP)的攔截器系統(tǒng)結(jié)構(gòu)示意圖; 圖2為本發(fā)明面向切面編程(AOP)的攔截方法流程圖; 圖3為讀取配置文件并初始化過程流程圖;圖4為使用攔截器接口,實現(xiàn)在Struts框架下面向切面編程(AOP)的攔 截的過程。
具體實施方式
為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下結(jié)合附圖及實 施例,對本發(fā)明的一種面向切面編程的攔截器系統(tǒng)及方法進(jìn)行進(jìn)一步詳細(xì)說 明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定 本發(fā)明。本發(fā)明的面向切面編程的攔截器系統(tǒng)及方法,是實現(xiàn)在Struts應(yīng)用幵發(fā)系 統(tǒng)框架下11的方法級攔截器。其當(dāng)客戶端訪問網(wǎng)站系統(tǒng)時,在服務(wù)器端的 Servlet容器根據(jù)路徑調(diào)用相關(guān)的Struts Action類或者DispatchAction類時,使 用本發(fā)明的攔截器系統(tǒng)和方法,實現(xiàn)工作在Struts l.x中的方法級攔截,即Struts l.X下的方法級面向切面編程(AOP)實現(xiàn)。為了說明本發(fā)明的Struts下的面向切面編程的攔截器及方法,首先說明 Struts體系。Struts應(yīng)用開發(fā)系統(tǒng)框架11的目標(biāo)是為Mode12 Web應(yīng)用開發(fā)提供一個強(qiáng) 大的框架。Struts應(yīng)用開發(fā)系統(tǒng)框架11能夠隱藏Web訪問固有的"混亂", 幫助開發(fā)者建立起清晰和明確的秩序和規(guī)則。典型的Struts應(yīng)用開發(fā)系統(tǒng)框架 11要用到三種配置文件web.xml、 struts-config.xml以及可選的應(yīng)用資源文件。web.xml是Web應(yīng)用的標(biāo)準(zhǔn)配置文件,是所有J2EE web應(yīng)用必需的組成 部分。應(yīng)用服務(wù)器通過該配置文件把URL映射到Servlet服務(wù)器和JSP GavaServer Pages, —種動態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn)),通過該配置文件為Servlet服 務(wù)器和JSP指定啟動參數(shù)。為Stmts應(yīng)用開發(fā)系統(tǒng)框架11提供的web.xml文 件很簡單,真正必需的只有一個主ActionServlet類控制器(Controller)定義, 以及一個確保Struts請求傳遞到ActionServlet類控制器的映射。 一般地,以 ".do"結(jié)尾的URL (Uniform Resoure Locator,統(tǒng)一資源定位器)都是Struts 請求,例如/login.do。 Servlet服務(wù)器利用web.xml文件中的映射,把該請求傳 遞給ActionServlet類控制器。接著,ActionServlet類控制器決定如何分配該請 求。而ActionServlet類控制器的決定依據(jù)是Struts-config.xml中定義的方法邏 輯,和/或是通過ActionServlet派生類額外定義的分配邏輯。Struts-config.xml稱為Struts配置文件。Struts應(yīng)用開發(fā)系統(tǒng)框架11是一 個依靠struts-config.xml文件把組件連接起來的系統(tǒng)。struts-config.xml文件為 Web應(yīng)用的組件定義了邏輯名稱,也定義了它們在Struts框架下的屬性和關(guān)系, 就像web.xml文件在Web應(yīng)用框架之內(nèi)定義組件 一 樣。 一般地, struts-config.xml文件包含了與Struts框架有關(guān)的應(yīng)用信息,包括數(shù)據(jù)源信息、 Form Bean信息、Global Forwards f言息禾口 Actions信息。其中,Action信息定 義了 Struts應(yīng)用體系的請求分配信息,它們是核心分配器的補(bǔ)充定義,負(fù)責(zé)處 理各種具體的請求類型。Struts應(yīng)用的基本工作模式是主分發(fā)器ActionServlet類控制器調(diào)用一個 動作分配器,動作分配器確定或者構(gòu)造出Model部分(一個JavaBean或其他 Java對象),并把它提供給View (通常是一個JSP頁面)。如圖1所示,本發(fā)明的面向切面編程的攔截器系統(tǒng),是在Struts應(yīng)用開發(fā) 系統(tǒng)框架ll下,包括接口模塊21,攔截器配置模塊22,讀取模塊23和執(zhí)行 模塊24,其中接口模塊21,設(shè)置struts框架下運行的接口,基于該接口實現(xiàn)攔截器類, 即利用該接口實現(xiàn)攔截器類。通過在struts框架下定義可被讀取的前攔截器接口 (beforeAction)、后攔 截器接口 (afterAction)以及異常處理攔截器接口 (throwsAction)。利用該接 口實現(xiàn)在struts框架下的接口攔截器類。攔截器配置模塊22,用于通過接口模塊21配置攔截器的配置文件,并將 攔截器配置到相應(yīng)的執(zhí)行路徑中去。所述的攔截器,可以分為權(quán)限控制攔截器32、數(shù)據(jù)驗證攔截器33、曰志 記錄攔截器34、異常處理攔截器35等。權(quán)限控制攔截器32,用于判斷用戶是否有訪問對應(yīng)路徑的權(quán)限,若有權(quán) 限則返回空值(null);若沒有則返回到錯誤頁面。其一般通過運行前攔截器 (beforeAction)接口實現(xiàn)。數(shù)據(jù)驗證攔截器33,用于檢査客戶端提交的數(shù)據(jù)是否符合服務(wù)器所要求 的規(guī)則,若符合則返回空值(mill),若不符合則返回到錯誤頁面。其一般通 過運行前攔截器(beforeAction)接口實現(xiàn)。曰志記錄攔截器34,用于截獲方法調(diào)用參數(shù)、返回值、調(diào)用所花時間等 信息,然后打印日志到文件或者控制臺,最后返回空值(null)。其一般通過 運行后攔截器(afterAction)接口實現(xiàn)。異常處理攔截器35,用于根據(jù)傳入的參數(shù)Exceptio-e的類型分別進(jìn)行處 理,然后分別返回到相應(yīng)的錯誤頁面。其一般通過異常處理攔截器 (throwsAction)接口實現(xiàn)。讀取模塊23,在Stmts啟動初始化時,由Struts插件類讀取配置文件 struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化。執(zhí)行模塊24,用于在客戶端訪問網(wǎng)站時,根據(jù)路徑調(diào)用相關(guān)的Struts Action 或者DispatchAction類,獲取路徑對應(yīng)的攔截器,使用攔截器,實現(xiàn)在Struts 框架下面向切面編程(AOP)的攔截。較佳地,本發(fā)明的面向切面編程的攔截器系統(tǒng),在接口模塊21中,還包 括攔截器管理模塊31,用于在Spring容器的配置文件配置攔截器類對應(yīng)的 bean,實現(xiàn)在Spring容器中統(tǒng)一管理攔截器對象。更佳地,所述面向切面編程的攔截器系統(tǒng),在讀取模塊23中,還包括Struts 插件模塊,用于在struts框架下調(diào)用Struts Action類或者DispatchAction類前, 在Struts配置文件中加入攔截器配置模塊22,作為Struts配置文件插件,使得 在struts框架下調(diào)用Struts Action類或者DispatchAction類前,將攔截器配置 文件配置到相應(yīng)的路徑中并駐留在系統(tǒng)中,不再每執(zhí)行一次攔截器必須首先執(zhí) 行攔截器模塊。ii特別需要說明的是,當(dāng)用讀取模塊23中的Struts插件模塊將攔截器模塊 作為作為Struts配置文件插件時,則在通過接口模塊21配置struts框架下調(diào)用 Struts Action類或者DispatchAction類中的每個方法時不再調(diào)用攔截器配置模 塊22,將攔截器配置文件中的攔截器配置到相應(yīng)的執(zhí)行路徑中去。本發(fā)明的面向切面編程的攔截器系統(tǒng),首先設(shè)置在struts框架下運行的攔 截器接口;再基于此接口實現(xiàn)攔截器類;然后利用在接口模塊21中的攔截器 管理模塊31在Spring容器的配置文件配置攔截器類對應(yīng)的bean,實現(xiàn)在Spring 容器中統(tǒng)一管理攔截器對象;接著,按照攔截器配置文件的結(jié)構(gòu),在配置文件 中將攔截器配置到相應(yīng)的執(zhí)行路徑中去。其后,讀取模塊23在Struts啟動初始化時,由Struts插件類讀取配置文 件struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化。最后,執(zhí)行模塊24在客戶端訪問網(wǎng)站時,服務(wù)器端Servlet容器根據(jù)路徑 調(diào)用相關(guān)的Struts Action或者DispatchAction類,使用攔截器,實現(xiàn)在Struts 框架下面向切面編程(AOP)的攔截。如圖2所示,下面詳細(xì)描述本發(fā)明的Struts應(yīng)用開發(fā)系統(tǒng)框架下11基于 切面編程的攔截方法步驟S100,設(shè)置在struts框架下運行的攔截器接口,基于該接口實現(xiàn)攔截 器類,即利用該接口實現(xiàn)在struts框架下的接口攔截器類;一般來說調(diào)用對象的方法時有3個處理過程,第一步是開始調(diào)用,第二步 是值返回,另外如果有異常拋出對應(yīng)的就有異常處理過程,對應(yīng)就有了前攔截 方法、后攔截方法和異常處理攔截方法。因此,首先設(shè)置在struts框架下可被讀取的前攔截器接口 (beforeAction)、 后攔截器接口 (afterAction)以及異常處理攔截器接口 (throwsAction)。接口 中的參數(shù)對應(yīng)于Struts Action中的execute()方法中的參數(shù)。攔截器接口代碼實現(xiàn)如下public interface Actionlnterceptor { /***前攔截器接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應(yīng)的ActionMapping對象* @param form路徑對應(yīng)的表單,如果沒有對應(yīng)的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象* @return對應(yīng)在Struts中的返回路徑 */public ActionForward beforeAction (Action action, ActionMapping mapping ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception;/***后攔截接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應(yīng)的ActionMapping對象 *@paramform路徑對應(yīng)的表單,如果沒有對應(yīng)的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象* @return對應(yīng)在Stmts中的返回路徑 */public ActionForward afterAction(Action action, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception;/***異常處理攔截器接口* @param action被攔截器攔截的Action實例* @param mapping訪問路徑對應(yīng)的ActionMapping對象* @param form路徑對應(yīng)的表單,如果沒有對應(yīng)的表單則為null* @param request客戶端瀏覽器傳送過來的對象* @param response送回給客戶端瀏覽器的對象 *@parame拋出的異常* @retum對應(yīng)在Struts中的返回路徑 */public ActionForward throwsAction(Action action, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception;然后,利用該接口實現(xiàn)在struts框架下的接口攔截器類。 攔截器一般都使用代理來實現(xiàn),本發(fā)明也使用代理類實現(xiàn),其類名為 InterceptorActionProxy 。 是基于 Springframework ( Spring 框架)的 org.springframework.web.struts.DelegatingActionProxy 實現(xiàn),Springframework 的org.springframework.web.struts.DelegatingActionProxy類提供了使用Sping容 器管理Struts Action的功能,InterceptorActionProxy類在其基礎(chǔ)上增加了根據(jù)配置文件去查找并執(zhí)行相關(guān)的攔截器的功能。Struts Action或者DispatchAction的^f戈理類InterceptorActionProxy類的^(乍 用是當(dāng)用戶訪問網(wǎng)站某一路徑時,Stmts在調(diào)用路徑對應(yīng)的Action類或者 DispatchAction類時,實際上先調(diào)用的是此類,調(diào)用時執(zhí)行其中的execute方法, 在這個方法中,調(diào)用攔截器配置文件讀取類獲取路徑對應(yīng)的攔截器,執(zhí)行攔截 器類中的相關(guān)方法并調(diào)用運行真實的Struts Action或者DispatchAction,并根據(jù)兩者調(diào)用的結(jié)果返回。InterceptorActionProxy類的主要實現(xiàn)代碼如下public class InterceptorActionProxy extends DelegatingActionProxy {* Pass the execute call on to the Spring-managed delegate Action.*@S66org.springframework.web.struts.DelegatingActionProxy#getDelegateAction*/public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {〃獲取訪問路徑前綴即模塊名String module = mapping.getModuleConfig().getPrefix();//若模塊為空值,則為默認(rèn)模塊 if (module == null) { module -"";〃根據(jù)模塊獲取對應(yīng)的Spring容器引用WebApplicationContext wac = getWebApplicationContext(getServlet(), mapping.getModuleConfig()); 〃獲取代理目標(biāo)類Action delegateAction = getDelegateAction(mapping);ActionForward forward = null;Actionlnterceptor[JnterceptorArray = null;try{〃調(diào)用配置文件讀取類,査找此映射相關(guān)的攔截器interceptorArray 二 InterceptorConfig.getlnterceptorArray(module, request, wac); } catch (Exception e) {〃獲取攔截器數(shù)量int size = interceptorArray.length; if (size > 0) {for (int i = 0; i < size; i++) { try{〃執(zhí)行所有攔截器中的前攔截方法,如果設(shè)置了順序則要按順序執(zhí)行forward = interceptorArray[i.beforeAction(delegateAction,mapping, form, request, response); if (forward != null) {return forward; 〃如果返回值不為空,則不再執(zhí)行后面的代碼直接返回} catch (Exception e) {〃如果執(zhí)行過程中出現(xiàn)了異常,并且是ModuleExc印tion,則拋出異常 if (e instanceof ModuleException) { throw e;continue; 〃若拋出的不是ModuleExc印tion,則忽略try{〃執(zhí)行Struts Action中的相關(guān)方法forward = delegateAction.execute(mapping, form, request, response); } catch (Exception e) {〃如果不是ModuleExc印tion類型則進(jìn)行處理 if (e instanceof ModuleException) {throw e; } else {for (int i = 0; i < size; i++) { 〃執(zhí)行所有欄截器中的異常處理攔截方法,如果設(shè)置了順序則要按順序執(zhí)行forward 二 interceptorArray卩j.throwsAction(delegateAction, mapping, form, request, response, e);if (forward != null) {return forward; //如果返回值不為空,則不再執(zhí)行后面的代碼直接返回//將未處理的異常拋出,交給容器處理,用于調(diào)試 throw e;ActionForward afterForward = null; for (int i = 0; i < size; i++) { try{〃執(zhí)行所有攔截器中的后攔截方法,如果設(shè)置了順序則要按順序執(zhí)行 afterForward = interceptorArray[i].afterAction(delegateAction, mapping, form, request, response); if (afterForward != null) {return afterForward; 〃如果返回值不為空,則不再執(zhí)行后面的代碼直接返回} catch (Exception e) {if (e instanceof ModuleException) {throw e;//如果執(zhí)行過程中出現(xiàn)了異常,并且是 ModuleException,則拋出異常continue; 〃若拋出的不是ModuleExc印tion,則忽略} else {forward = delegateAction.execute(mapping, form, request, response); 〃如果攔截器數(shù)量為0,則直接執(zhí)行對應(yīng)的Actionreturn forward;更進(jìn)一歩地,在Spring容器的配置文件配置攔截器類對應(yīng)的bean,實現(xiàn) 在Spring容器中統(tǒng)一管理攔截器對象。Springframework (Spring框架)的核心是IoC (Inversion of Control,控帝ij 反轉(zhuǎn))禾Q AOP。IoC是一種設(shè)計模式。IoC模式進(jìn)一步降低了類之間的耦合度,并且改變 了傳統(tǒng)的對象的創(chuàng)建方法,實現(xiàn)了一種配置式的對象管理方式,Spring框架中 由IoC容器負(fù)責(zé)配置性的對象的管理。IoC模式極大的提高了系統(tǒng)開發(fā)與維護(hù) 的靈活性。通過Spring配置文件可以將Struts Action和攔截器配置在Spring配置文 件中,這樣SpringFramework就會自動的創(chuàng)建這些對象并設(shè)置相關(guān)的依賴。 Spring配置樣例如下<!—配置一個名為setUserAdminFlaglnterc印tor的攔截器--><bean id="setUserAdminFlaglnterceptor" class="com.bupticet.locai,user_admin.web.interceptor.SetUserAdminFlaglnterceptor" /> <!一配置一個名為deleteUploadFileAllowSelfAndAdminlnterc印tor的攔截器,其 依賴userAdminManager對象一><bean id="deleteUploadFileAllowSelfAndAdminlnterceptor" class="com.bupticet.local.user—admin.web.interceptor.DeleteUploadFileAllowSelfAndAd minlnterceptor"><property name="userAdminManager"><ref local=''userAdminManager" /> </property> </b63n>較佳地,所述代理類是基于 Spring Framework 中 org.springframework.web.struts.DelegatingActionProxy的類。步驟S200,配置攔截器的配置文件結(jié)構(gòu)struts-interceptor.xml,并將攔截 器配置文件中的攔截器配置到相應(yīng)的執(zhí)行路徑中去,實現(xiàn)在Struts框架下初始 化時能夠讀取面向切面編程的方法級攔截器;在Struts應(yīng)用開發(fā)系統(tǒng)框架下11,該攔截器能夠被Stmts框架中的配置文 件struts-config.xml在啟動初始化時讀取。攔截器配置文件結(jié)構(gòu)包括四個部分★第一個部分是config段,用來對攔截器系統(tǒng)進(jìn)行功能性的配置;★第二部分是default-interceptors段,用來配置此模塊中默認(rèn)要使用的攔 截器;★第三部分是interceptor-stacks段,將一批攔截器配置中攔截器棧,以方便成批配置攔截器時使用; ★第四部分則是action-interceptors段,用來對指定路徑和方法的Action進(jìn)行攔截器配置, 一次可以配置一個攔截器,也可以配置攔截器棧,另外也可以配置排除默認(rèn)的攔截器。 以下是使用Diggester讀取攔截器配置文件的主要代碼 /***添力卩Digester Rules* @p3ram d Vprivate static void addDigesterRules(Digester d) {〃i賣取stmts-interceptor/config/order-interceptor配置段 d.addObjectCreate("stmts-interceptor/config/order-interceptor",Orderlnterc印torModel.class); 〃創(chuàng)建配置段對應(yīng)的對象(下同) d.addSetPraperties("stnjts-interceptor/config/order-interceptor"); 〃在對象中 將XML中的屬性對應(yīng)的設(shè)置進(jìn)去(下同)d.addSetNext("struts-interceptor/config/order-interceptor","setOrderlnterc印tor);〃設(shè)置加入下一個對象時執(zhí)行的方法(下同) 〃讀取stmts-interceptor/default-interceptors/default-interceptor配置段 d.addObjectCreate("struts-interceptor/default-interceptors/default-interceptor",DefaultlnterceptorModel.class);d.addSetProperties("stmts-interceptor/default-interceptors/default-interceptor"); d.addSetNext("struts-interceptor/default-interceptors/default-interceptor", "addDefaultlnterceptor");\〃 i賣取struts-interceptor/interceptor-stacks/interceptor-stack配置段 d.addObjectCreate("struts-interceptor/interceptor-stacks/interceptor-stack",InterceptorStackModel.class);d.addSetProperties("struts-interceptor/interceptor-stacks/interceptor-stack"); d.addSetNext("struts-interceptor/interceptor-stacks/interceptor-stack", "addlnterceptorStackModel"); 〃 i賣取struts-interceptor/interceptor-stacks/interceptor-stack/interceptor陽ref配置段 d.addObjectCreate( "struts-interceptor/interceptor-stacks/interceptor-stack/interceptor-ref', I nterceptorRef Model class);d.addSetProperties("struts-interceptoi7interceptor陽stacks/interceptor-stack/interce ptor-ref);d.addSetNext("struts-interceptor/interceptor-stacks/interceptor-stack/interceptor-rer,"addlnterceptorRef'); 〃 i賣取struts-interceptor/action-interceptors/action配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action"'ActionModel.class); d.addSetProperties("struts-interceptor/action-interceptors/action"); d.addSetNext("struts-interceptor/action-interceptors/action", "addAction");〃i賣取struts-interceptor/action-interceptors/action/exclude-default配置段 d.addObjectCreate("stmts-interceptor/action-interceptors/action/exclude-default",\ExcludeDefaultModel.class);d.addSetProperties("struts-interceptor/action-interceptors/action/exclude-default"); d.addSetNext("struts-interceptor/action-interceptors/action/exclude-default", "setExcludeDefault"); 〃i賣取struts-interceptor/action-interceptors/action/exclude-default/exclude酉己—1!段 d.addObjectCreate( "struts-interceptor/action-jnterceptors/action/exclude-default/exclude", ExcludeModel.class);d.addSetProperties("stmts-interceptoi7action-interceptors/action/exclude-default/e xclude");d.addSetNext("struts-interceptor/action-interceptors/action/exclude-default/exclude", "addExdude");〃i賣取stmts-interceptor/action-interceptors/action/method配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action/method", MethodModel.class);d.addSetProperties("struts-interceptor/actJon-interceptors/action/method"); d.addSetNext("stmts-interceptor/action-interceptors/action/method", "addMothod");〃i賣取struts-interceptor/action-interceptors/action/method/exclude-default配置段 d.addObjectCreate(d9。J9)u!/po£SE/uo!pe/SJOJd90J9}u!-uo!pe/」OJd90J9JU!,s}nJls--)s9!t9do」n-lssppB.--Jai-」o}dso」91u!/po£9E/uo!pe/SJOJd8J91u!-uo!pe/」£da。J91u!-ss4s=趙鵬2li9」-JOJd90Jalu!/POL-19E/uo一loe/SJold90J91u!-uo!VDe/」old90JQlu!-SSJls趙踏//- 9pnlox9ZJIn_3J9p-spnlox9/po£9E/uo!pe/SJ2d9a-91u!-uo!pe/」old90」^u!-sln.4s---apnlox9/po£9E/uo!pe/s」old9。J91u!-uo!pe/」old9?!箂lu!-SSJls--)s9!lJ3do」d^sppB.\,9pnpx9/llneJ.9p-9pnlox9/po£9E/uo!pe/SJold90」91u!-uo!peyJold90」su!-SSJls ¥a-opsfqoppe-P3g9pnlox9/Jlnei9p-9pnl。x9/poq一9E/uo一pe/s」cnd90J9JU一-uo!pe/」oidso.5JU!-ss.us磁脈一//-』J9p-9pnlox9/POL-lsE、uo!pe/SJOidao」9}u!-uo!pe/」oldao」91u!-SSJls--)PSN冗sppe-P一(』nei①p-spnlcos/po£9E、uo!pe/SJO》d90JanJ!-uo!pe/Jold90」91u!-ss4s,,)s9!t9doJd}3sppm.\;lneisp-9pnlox9、po£9£/uo!pe/s」£d90J >u!-uo!pe/」old9?!?iu!-ss.4s,-d.addSetNext("struts-interceptor/action-interceptors/action/method/interceptor-ref', "addlnterceptorRef'); 〃i賣取struts-interceptor/action-interceptors/action/method/stack-ref配置段 d.addObjectCreate("struts-interceptor/action-interceptors/action/method/stack-ref', StackRefModel.class);d.addSetProperties("struts-interceptor/action-interceptors/action/method/stack-rer); d.addSetNext("struts-interceptor/action-interceptors/action/method/stack-ref , "addStackRef');其中,Diggester是一個XML解析工具,它將XML直接讀取成Java對象。所述的攔截器,可以分為權(quán)限控制攔截器32、數(shù)據(jù)驗證攔截器33、曰志 記錄攔截器34、異常處理攔截器35等。權(quán)限控制攔截器32,用于判斷用戶是否有訪問對應(yīng)路徑的權(quán)限,若有權(quán) 限則返回空值(null);若沒有則返回到錯誤頁面。其一般通過前攔截器接口 (beforeAction)實現(xiàn)。數(shù)據(jù)驗證攔截器33,用于檢查客戶端提交的數(shù)據(jù)是否符合服務(wù)器所要求 的規(guī)則,若符合則返回空值(null),若不符合則返回到錯誤頁面。其一般通 過前攔截器接口 (beforeAction)實現(xiàn)。日志記錄攔截器34,用于截獲方法調(diào)用參數(shù)、返回值、調(diào)用所花時間等 信息,然后打印日志到文件或者控制臺,最后返回空值(null)。其一般通過 后攔截器接口 (afterAction)實現(xiàn)。異常處理攔截器35,用于根據(jù)傳入的參數(shù)Exception-e的類型分別進(jìn)行處 理,然后分別返回到相應(yīng)的錯誤頁面。其一般通過異常處理攔截器接口 (throwsAction)實現(xiàn)。步驟S300,在Struts啟動初始化時,由Struts插件類讀取配置文件 struts-interceptor.xml,解析得到配置文件中配置的攔截器,并初始化;Java的Web應(yīng)用程序(Java web application)啟動時,由Struts插件類 com.bupticet. strutsinterceptor. StrutsInterceptorContextLoaderPlugln裝載牛蘭截器 配置文件,要求在Spring容器裝載之后,再裝置Struts應(yīng)用程序,如圖3所示, 其過程如下步驟S301 ,采用Diggester工具將xml配置文件讀入,產(chǎn)生Java對象(Java object);步驟S302,解析路徑的攔截配置器action-interceptors段,將配置分別提 取,并將攔截器棧stack-ref替換對應(yīng)的一批攔截器interceptor;步驟S303,在每個路徑的攔截配置器action-interceptor中加入缺省攔截器 default-interceptors段指定的攔截器interceptor;步驟S304,在每個路徑的攔截配置器action-interceptor中排除被排除的缺 省攔截器exdude-default配置段中指定的攔截器interceptor;步驟S305,判斷配置攔截器是否要按順序執(zhí)行,若配置器config段中路 徑的攔截配置器order-interceptor的配置為真(true),則對每個路徑的攔截配 置器action-interceptor中攔截器interceptor進(jìn)行排序,否則直接返回。步驟S400,當(dāng)客戶端訪問網(wǎng)站時,服務(wù)器端Servlet容器根據(jù)路徑調(diào)用相 關(guān)的Struts Action或者DispatchAction類,獲取路徑對應(yīng)的攔截器,使用相應(yīng) 的攔截器接口,實現(xiàn)在Struts框架下面向切面編程(AOP)的攔截。Struts DispatchAction禾卩Struts Action比較類似,不同之處在于 DispatchAction中可以有多個映射到訪問路徑的方法,而Action只能有一個 6xecute oDispatchAction繼承自Action類,它是一個抽象類,封裝了一些基礎(chǔ)方法, 來解決使用一個Action處理多個操作的能力,這就是DispatchAction最大的用途,它可以幫助我們用一個Action類,封裝一套類似的操作方法,節(jié)省了 類的數(shù)目,同時也減輕了后期維護(hù)的困難。本發(fā)明在配置文件中對每個Action的配置時,都有個method屬性,若這 個屬性為execute則就可以對Struts Action進(jìn)行類級別的攔截;若這個屬性是 其它值,則就可以對Struts DispatchAction類中以這個屬性名命名的方法進(jìn)行 方法級別的攔截,從而實現(xiàn)方法級的攔截。如圖4所示,下面詳細(xì)描述使用攔截器接口 ,實現(xiàn)在Struts框架下面向切 面編程(AOP)的攔截的過程歩驟S401,執(zhí)行攔截器中的前攔截器接口 (Before-Action);歩驟S402,判斷返回值是否為空,如果不為空,則表示結(jié)束,攔截器得 到結(jié)果,攔截過程結(jié)束,轉(zhuǎn)到步驟S406;歩驟S403 ,如果為空,則執(zhí)行Struts Action或者DispatchAction對象類方 法,正常執(zhí)行Struts程序;步驟S404,如果拋異常,即在執(zhí)行Struts Action或者DispatchAction對象 類方法過程中出現(xiàn)異常情況時,如網(wǎng)絡(luò)連接錯誤,讀寫磁盤文件錯誤等,則執(zhí) 行攔截器中的異常處理攔截器(ThrowAction)接口,然后,攔截過程結(jié)束, 轉(zhuǎn)到步驟S406;步驟S405,否則,正常執(zhí)行Struts程序后,執(zhí)行攔截器中的后攔截器接 口 (AfterAction);步驟S406,將攔截或者執(zhí)行結(jié)果(Response)送出。用類似Java的代碼表示其執(zhí)行過程為try{interceptor.beforeAction(); strutsAction.invoke(); interceptor.afterAction(); }catch(Exception e){interceptor .throwAction();通過以上結(jié)合附圖對本發(fā)明具體實施例的描述,本發(fā)明的其它方面及特征 對本領(lǐng)域的技術(shù)人員而言是顯而易見的。本發(fā)明的面向切面編程(AOP)的攔截器及方法,其在Struts應(yīng)用開發(fā)系 統(tǒng)框架下11實現(xiàn)方法級攔截,當(dāng)客戶端訪問網(wǎng)站系統(tǒng)時,服務(wù)器端Servlet容 器根據(jù)路徑調(diào)用相關(guān)的Struts Action或DispatchAction時,使用本發(fā)明的攔截 方法配置攔截器,例如權(quán)限控制攔截器、數(shù)據(jù)驗證攔截器、日志記錄攔截器、 異常處理攔截器,并用SpringFmmework提供的容器來統(tǒng)一管理這些攔截器對 象,使得程序代碼功能分解清晰,更容易被維護(hù)。其不但支持Struts Action類, 也支持Struts DispatchAction類,支持Stmts l.X全系列版本甚至更高的版本。 而且,本發(fā)明做到用Spring容器來統(tǒng)一管理攔截器對象,支持按指定順序執(zhí) 行攔截器,從而全面在Struts開發(fā)框架中實現(xiàn)面向切面編程,實現(xiàn)類的攔截(類 級攔截器)和各個類中的實現(xiàn)方法而進(jìn)行攔截(方法級攔截器),具有很好的 實用性。以上對本發(fā)明的具體實施例進(jìn)行了描述和說明,這些實施例應(yīng)被認(rèn)為其只 是示例性的,并不用于對本發(fā)明進(jìn)行限制,本發(fā)明應(yīng)根據(jù)所附的權(quán)利要求進(jìn)行 解釋。
權(quán)利要求
1. 一種面向切面編程的攔截器系統(tǒng),是在Struts應(yīng)用開發(fā)系統(tǒng)框架下實現(xiàn)的,其特征在于,包括接口模塊,攔截器配置模塊,其中接口模塊,用于設(shè)置Struts框架下的攔截器接口,基于該接口實現(xiàn)攔截器類;攔截器配置模塊,用于通過接口模塊配置攔截器的配置文件,并將攔截器配置到相應(yīng)的執(zhí)行路徑中去。
2、 根據(jù)權(quán)利要求1所述的面向切面編程的攔截器系統(tǒng),其特征在于,還 包括讀取模塊和執(zhí)行模塊,其中讀取模塊,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中 配置的攔截器,并初始化;執(zhí)行模塊,用于在客戶端訪問網(wǎng)站時,根據(jù)路徑調(diào)用Struts Action或者 DispatchActkm類,獲取路徑對應(yīng)的攔截器,使用相應(yīng)的攔截器接口,實現(xiàn)在 Struts框架下面向切面編程的攔截。
3、 根據(jù)權(quán)利要求1或2所述的面向切面編程的攔截器系統(tǒng),其特征在于, 所述接口模塊中,還包括攔截器管理模塊,用于在Spring容器的配置文件配 置攔截器類對應(yīng)的bean,實現(xiàn)在Spring容器中統(tǒng)一管理攔截器對象。
4、 根據(jù)權(quán)利要求2所述的面向切面編程的攔截器系統(tǒng),其特征在于,所 述讀取模塊中,還進(jìn)一步包括Struts插件模塊,用于在struts框架下調(diào)用Struts Action類或者DispatchAction類前,在Struts配置文件中加入攔截器配置模塊, 作為Struts配置文件插件;所述讀取模塊在Struts啟動初始化時,由Struts插件類讀取配置文件。
5、 根據(jù)權(quán)利要求1或2所述的面向切面編程的攔截器系統(tǒng),其特征在于, 所述接口包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。
6、 根據(jù)權(quán)利要求1或2所述的面向切面編程的攔截器系統(tǒng),其特征在于, 所述攔截器包括權(quán)限控制攔截器、數(shù)據(jù)驗證攔截器、日志記錄攔截器以及異常 處理攔截器中的一種或者一種以上的組合。
7、 一種面向切面編程的攔截方法,其特征在于,包括下列步驟 步驟A,設(shè)置Struts框架下的攔截器接口,基于該接口實現(xiàn)攔截器類;;步驟B,配置攔截器的配置文件結(jié)構(gòu),并將攔截器配置到相應(yīng)的執(zhí)行路徑 中去,實現(xiàn)在Struts框架下初始化時能夠讀取面向切面編程的方法級攔截器。
8、 根據(jù)權(quán)利要求7所述的面向切面編程的攔截方法,其特征在于,所述步驟B之后還包括下列步驟步驟C,在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配 置的攔截器,并初始化;步驟D,當(dāng)客戶端訪問網(wǎng)站時,服務(wù)器端Servlet容器根據(jù)路徑調(diào)用Struts Action類或者DispatchAction類,獲取路徑對應(yīng)的攔截器,使用相應(yīng)的攔截器 接口,實現(xiàn)在Stmts框架下面向切面編程的攔截。
9、 根據(jù)權(quán)利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述步驟A還包括下列步驟在Spring容器的配置文件配置攔截器類對應(yīng)的bean,實現(xiàn)在Spring容器 中統(tǒng)一管理攔截器對象。
10、 根據(jù)權(quán)利要求8所述的面向切面編程的攔截方法,其特征在于,所述 步驟C中讀取配置文件是由Struts插件類完成的。
11、 根據(jù)權(quán)利要求IO所述的面向切面編程的攔截方法,其特征在于,所 述步驟C包括下列步驟步驟C1,,采用Diggester工具將xml配置文件讀入,產(chǎn)生Java對象; 歩驟C2,解析路徑的攔截配置器,將配置分別提取,并將攔截器棧替換對應(yīng)的一批攔截器;步驟C3,在每個路徑的攔截配置器中加入缺省攔截器指定的攔截器; 歩驟C4,在每個路徑的攔截配置器中排除被排除的缺省攔截器中指定的攔截器;步驟C5,判斷配置攔截器是否要按順序執(zhí)行,若配置器中路徑的攔截配 置器的配置為真,則對每個路徑的攔截配置器中攔截器進(jìn)行排序,否則直接返 回。
12、 根據(jù)權(quán)利要求8所述的面向切面編程的攔截方法,其特征在于,所述 步驟D中,使用攔截器接口,實現(xiàn)在struts框架下面向切面編程的攔截,包括 下列步驟步驟D1,執(zhí)行攔截器中的前攔截器接口;步驟D2,判斷返回值是否為空,如果不為空,則表示結(jié)束,攔截器得到 結(jié)果,攔截過程結(jié)束,轉(zhuǎn)到歩驟D6;步驟D3,如果為空,則執(zhí)行Struts Action或者DispatchAction對象類方法, 正常執(zhí)行Struts程序;步驟D4,如果拋異常,在執(zhí)行Struts Action或者DispatchAction對象類方 法過程中出現(xiàn)異常情況時,則執(zhí)行攔截器中的異常處理攔截器接口,然后,攔 截過程結(jié)束,轉(zhuǎn)到步驟D6;歩驟D5,否則,正常執(zhí)行Struts程序后,執(zhí)行攔截器中的后攔截器接口;步驟D6,將攔截或者執(zhí)行結(jié)果送出。
13、 根據(jù)權(quán)利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述接口包括包括前攔截器接口 、后攔截器接口和/或異常處理攔截器接口 。
14、 根據(jù)權(quán)利要求7或8所述的面向切面編程的攔截方法,其特征在于, 所述攔截器包括權(quán)限控制攔截器、數(shù)據(jù)驗證攔截器、日志記錄攔截器以及異常 處理攔截器中的一種或者一種以上的組合。
全文摘要
本發(fā)明公開了一種面向切面編程的攔截器系統(tǒng)及方法。其包括設(shè)置在Struts框架下運行的攔截器接口,基于該接口實現(xiàn)攔截器類;配置攔截器的配置文件結(jié)構(gòu),并在攔截器配置文件中將攔截器配置到相應(yīng)的執(zhí)行路徑中去;在Struts啟動初始化時,讀取配置文件,解析得到配置文件中配置的攔截器,并初始化;當(dāng)客戶端訪問網(wǎng)站時,服務(wù)器端根據(jù)路徑調(diào)用Struts Action類或者DispatchAction類時獲取攔截器,執(zhí)行相應(yīng)的攔截器方法,實現(xiàn)在Struts框架下面向切面編程的攔截。其實現(xiàn)類的攔截和對各個類中的實現(xiàn)方法而進(jìn)行的攔截,具有很好的實用性。
文檔編號G06F9/44GK101276271SQ20071006492
公開日2008年10月1日 申請日期2007年3月29日 優(yōu)先權(quán)日2007年3月29日
發(fā)明者廖德生, 文福安, 李江濤 申請人:北京郵電大學(xué)