第三章 struts2攔截器_第1頁
第三章 struts2攔截器_第2頁
第三章 struts2攔截器_第3頁
第三章 struts2攔截器_第4頁
第三章 struts2攔截器_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第三章:struts2的攔截器學(xué)習(xí)目標(biāo)攔截器的概念配置攔截器使用攔截器攔截器的概念攔截器(Interceptor)是動態(tài)攔截Action調(diào)用的對象,類似于Servlet中的過濾器。在執(zhí)行Action的業(yè)務(wù)邏輯處理方法(execute())之前,Struts2會首先執(zhí)行在struts.xml中引用的攔截器。攔截器是struts2的一個重要特性。Struts2框架的大多數(shù)核心功能都是通過攔截器來實現(xiàn)的,像避免表單重復(fù)提交、類型轉(zhuǎn)換、對象組裝、驗證、文件上傳等,都是在攔截器的幫助下實現(xiàn)的。攔截器之所以稱為“攔截器”,是因為它可以在Action執(zhí)行之前和執(zhí)行之后攔截調(diào)用。Struts2將它的核心功能放到攔截器中實現(xiàn),而不是分散到Action中實現(xiàn),有利于系統(tǒng)的解耦,使得功能的實現(xiàn)類似于個人電腦的組裝,變成了可插拔的,需要某個功能就“插入”一個攔截器,不需要某個功能就“拔出”一個攔截器。你可以任意組合攔截器來為Action提供附加的功能,而不需要修改Action的代碼。攔截器的工作方式攔截器圍繞著Action和Result的執(zhí)行而執(zhí)行,其工作方式如圖:從圖中可以看到,在Action和Result執(zhí)行之前,為Action配置的攔截器將首先被執(zhí)行,在Action和Result執(zhí)行之后,攔截器將重新獲得控制權(quán),然后按照與先前調(diào)用相反的順序依次執(zhí)行。在整個執(zhí)行過程中,任何一個攔截器都可以選擇直接返回,從而終止余下的攔截器、Action和Result的執(zhí)行。例如:當(dāng)一個未授權(quán)的用戶訪問受保護(hù)的資源時,執(zhí)行身份驗證的攔截器可以直接返回。Struts2內(nèi)置攔截器Struts2內(nèi)建了大量的攔截器,這些攔截器以name-class對的形式配置在 struts-default.xml文件中,其中name是攔截器的名字,就是以后使用該攔截器的唯一標(biāo)識;class則指定了該攔截器的實現(xiàn)類,如果我們定義的package繼承了Struts2的struts-default包,則可以自由使用下面定義的攔截器,否則必須自己定義這些攔截器。Struts2內(nèi)置攔截器大部分時候,開發(fā)者無需手動控制這些攔截器,因為struts-default.xml文件中已經(jīng)配置了這些攔截器,只要我們定義的包繼承了系統(tǒng)的struts-default包,就可以直接使用這些攔截器。

編寫攔截器類在struts2中要編寫攔截器類,必須實現(xiàn)erceptor.Interceptor接口,該接口定義了如下的三個方法:voidinit():該方法在攔截器實例創(chuàng)建后、intercept()方法被調(diào)用之前調(diào)用,用于初始化攔截器所需要的資源,例如數(shù)據(jù)庫連接的初始化。該方法只執(zhí)行一次。voiddestroy():該方法在攔截器實例被銷毀之前調(diào)用,用于釋放在init()方法中分配的資源。該方法只執(zhí)行一次。Stringintercept(ActionInvocationinvocation)throwsException:該方法在Action執(zhí)行之前被調(diào)用,攔截器為Action提供的附加功能在該方法中實現(xiàn)。利用invocation參數(shù),可以獲取action執(zhí)行的狀態(tài)。在intercept()方法中,如果要繼續(xù)執(zhí)行后續(xù)的部分(包括余下的應(yīng)用于Action的攔截器、Action和Result),可以調(diào)用invocation.invoke()。如果要終止后續(xù)的執(zhí)行,可以直接返回一個結(jié)果碼,框架將根據(jù)這個結(jié)果碼來呈現(xiàn)對應(yīng)的結(jié)果視圖。TimerInterceptor.javaimportcom.opensymphony.xwork2.ActionInvocation;importerceptor.Interceptor;publicclassTimerInterceptorimplementsInterceptor{publicvoiddestroy(){}publicvoidinit(){}

publicStringintercept(ActionInvocationinvocation)throwsException{longstartTime=System.currentTimeMillis();Stringresult=invocation.invoke();longexecutionTime=System.currentTimeMillis()-startTime;

System.out.println("Action的執(zhí)行花費的毫秒數(shù)是:"+executionTime);

returnresult;}}Struts.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""/dtds/struts-2.0.dtd"><struts><constantname="struts.i18n.encoding"value="GBK"/><packagename="default"extends="struts-default"><interceptors> <interceptorname="time"class="com.neusoft.action.TimerInterceptor"></interceptor></interceptors><actionname="time"class="com.neusoft.action.TimeAction"><interceptor-refname="time"></interceptor-ref><result>index.jsp</result></action></package></struts>說明這是一個非常簡單的攔截器,用于輸出Action執(zhí)行花費的時間。在invocation.invoke()調(diào)用的前后,你可以添加自己的邏輯代碼。Invocation.invoke()調(diào)用之前的代碼將在Action執(zhí)行之前執(zhí)行,invocation.ivoke()調(diào)用之后的代碼將在Action執(zhí)行之后執(zhí)行。為了簡化攔截器的開發(fā),struts2還提供了一個抽象類:erceptor.AbstractInterceptor它實現(xiàn)了Interceptor接口,并給出了init()和destroy()方法的空實現(xiàn)。我們編寫的攔截器類也可以選擇繼承AbstractInterceptor類,如果不需要init()和destroy()方法,那么你只需要重寫抽象的intercept()方法就可以了。Struts2還提供了一個特殊的攔截器抽象基類:erceptor.MethodFilterInterceptor這個攔截器可以指定要攔截或排除的方法列表。通常情況下,攔截器將攔截Action的所有方法調(diào)用,但在某些應(yīng)用場景中,對某些方法的攔截將會出現(xiàn)一些問題。例如:對表單字段進(jìn)行驗證的攔截器,當(dāng)我們通過doDefault()方法輸出表單時,該方法不應(yīng)該被攔截,因此此時表單字段都沒有數(shù)據(jù)。說明在struts2中,從MethodFilterInterceptor繼承的攔截器類有:TokenInterceptorTokenSessionStoreInterceptorDefaultWorkflowInterceptorExecuteAndWaitInterceptorValidationInterceptorParametersInterceptorPrepareInterceptorMethodFilterInterceptor通過指定included/excluded方法列表來選擇攔截器或排除的方法,可以設(shè)置的參數(shù)如下:excludeMethods要排除的方法。includeMethods要攔截的方法。例如:有如下的攔截器配置:<interceptor-refname="validation"> <paramname="excludeMethods">input,back,cancel</param> <paramname="includeMethods">execute</param></interceptor-ref>說明當(dāng)執(zhí)行Action的input、back和cancel方法時,驗證攔截器將不執(zhí)行對輸入數(shù)據(jù)的驗證。當(dāng)執(zhí)行Action的execute方法時,驗證攔截器將執(zhí)行對輸入數(shù)據(jù)的驗證。在設(shè)置攔截器或排除的方法時,如果有多個方法,那么以逗號(,)分隔,如上所示。如果一個方法的名字同時出現(xiàn)在execludeMethods和includeMethods參數(shù)中,那么它會被當(dāng)作要攔截的方法。也就是說,includeMethods優(yōu)先于execludeMethods。在編寫攔截器類的時候要注意,攔截器必須是無狀態(tài)的,換句話說,在攔截器類中不應(yīng)該有實例變量。這是因為struts2對每一個體Action的請求使用的是同一個攔截器實例來攔截調(diào)用,如果攔截器有狀態(tài),在多個線程(客戶端的每個請求將由服務(wù)器端的一個線程來服務(wù))同時訪問一個攔截器實例的情況下,攔截器的狀態(tài)將不可預(yù)測。攔截器棧在很多時候,且些指定的攔截器需要被多個Action所使用,這個時候,如果我們?yōu)槊恳粋€Action都分別配置攔截器的話,不僅麻煩,而且不利后期的維護(hù),此時就需要用到攔截器棧。所謂攔截器棧就是將一些攔截器組合起來進(jìn)行統(tǒng)一管理。攔截器棧的使用與攔截器的使用非常相似,唯一有區(qū)別的地方,就是攔截器棧的布署方式。配置攔截器一在配置攔截器的時候可以為攔截器傳遞參數(shù),對于已經(jīng)配置好的攔截器,在引用時還可以覆蓋它的參數(shù)。例如,defaultStack攔截棧中的validation攔截器配置如下:<interceptor-refname="validation"> <paramname="excludeMethods">input,back,cancel</param></interceptor-ref>在Action配置中,我們想要覆蓋validation攔截器的excludeMethods參數(shù)的設(shè)置,可以配置如下:<packagename="default"extends="struts-default"><actionname="time"class="com.neusoft.action.LoginAction"><interceptor-refname=“defaultStack"> <paramname="excludeMethods">default</param></interceptor-ref> <result>index.jsp</result></action></package>但這樣會有一個問題,這是因為defaultStack攔截器棧包含了validation和workflow攔截器,這兩個攔截器都可以有excludeMethods參數(shù),采用上述方式,框架將無法知道你是要為哪一個攔截器傳遞參數(shù)。配置攔截器二為了覆蓋defaultStack攔截器棧中validation攔截器的excludeMethods參數(shù)設(shè)置,我們可以在Action的配置中直接引用defaultStack攔截器棧中的所有攔截器,然后在引用validation攔截器時配置攔截器三很明顯,這種配置太麻煩,也太冗余了。為此,struts2為我們提供了另外一種方式來覆蓋攔截器的參數(shù)設(shè)置,那就是在指定參數(shù)名時,加上攔截器名前綴,例如:validation.excludeMethods.采用這種方式,我們?nèi)匀豢梢岳^續(xù)引用defaultStack攔截器棧,如下所示:<packagename="default"extends="struts-default"><actionname="time"class="com.neusoft.action.LoginAction"><interceptor-refname=“defaultStack"> <paramname=“validation.excludeMethods">default</param></interceptor-ref> <result>index.jsp</result></action></package>這樣一來就簡潔多了。安全驗證攔截器一<%@pagelanguage="java"import="java.util.*"pageEncoding="gbk"%><%@taglibprefix="s"uri="/struts-tags"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><s:head/></head>

<body><s:formaction="login"method="post"><s:actionerror/><s:textfieldname="user.username"label="用戶名"></s:textfield><s:passwordname="user.password"label="密碼"></s:password><s:submitvalue="登錄"></s:submit></s:form><br></body></html>login.jsp安全驗證攔截器二<%@pagelanguage="java"import="java.util.*"pageEncoding="gbk"%><%@taglibprefix="s"uri="/struts-tags"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head></head>

<body><s:propertyvalue="user.username"/>歡迎你登錄后臺系統(tǒng)<br></body></html>success.jsp安全驗證攔截器三LoginAction.java安全驗證攔截器三LoginAction繼承自ActionSupport類,這是因為我們要利用基類的addActionError()方法來添加用戶登錄失敗的提示信息。LoginAction還實現(xiàn)了SessionAware接口,ServletConfig攔截器將會向LoginAction注入sessionMap對象。當(dāng)用戶登錄成功后,我們將user對象保存到session中。在我們編寫的執(zhí)行安全驗證的攔截器中,可以根據(jù)session中是否存在user對象,來判斷用戶是否登錄。安全驗證攔截器四AuthenticationInterceptor攔

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論