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

下載本文檔

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

文檔簡(jiǎn)介

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

編寫(xiě)攔截器類(lèi)在struts2中要編寫(xiě)攔截器類(lèi),必須實(shí)現(xiàn)erceptor.Interceptor接口,該接口定義了如下的三個(gè)方法:voidinit():該方法在攔截器實(shí)例創(chuàng)建后、intercept()方法被調(diào)用之前調(diào)用,用于初始化攔截器所需要的資源,例如數(shù)據(jù)庫(kù)連接的初始化。該方法只執(zhí)行一次。voiddestroy():該方法在攔截器實(shí)例被銷(xiāo)毀之前調(diào)用,用于釋放在init()方法中分配的資源。該方法只執(zhí)行一次。Stringintercept(ActionInvocationinvocation)throwsException:該方法在Action執(zhí)行之前被調(diào)用,攔截器為Action提供的附加功能在該方法中實(shí)現(xiàn)。利用invocation參數(shù),可以獲取action執(zhí)行的狀態(tài)。在intercept()方法中,如果要繼續(xù)執(zhí)行后續(xù)的部分(包括余下的應(yīng)用于Action的攔截器、Action和Result),可以調(diào)用invocation.invoke()。如果要終止后續(xù)的執(zhí)行,可以直接返回一個(gè)結(jié)果碼,框架將根據(jù)這個(gè)結(jié)果碼來(lái)呈現(xiàn)對(duì)應(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í)行花費(fèi)的毫秒數(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>說(shuō)明這是一個(gè)非常簡(jiǎn)單的攔截器,用于輸出Action執(zhí)行花費(fèi)的時(shí)間。在invocation.invoke()調(diào)用的前后,你可以添加自己的邏輯代碼。Invocation.invoke()調(diào)用之前的代碼將在Action執(zhí)行之前執(zhí)行,invocation.ivoke()調(diào)用之后的代碼將在Action執(zhí)行之后執(zhí)行。為了簡(jiǎn)化攔截器的開(kāi)發(fā),struts2還提供了一個(gè)抽象類(lèi):erceptor.AbstractInterceptor它實(shí)現(xiàn)了Interceptor接口,并給出了init()和destroy()方法的空實(shí)現(xiàn)。我們編寫(xiě)的攔截器類(lèi)也可以選擇繼承AbstractInterceptor類(lèi),如果不需要init()和destroy()方法,那么你只需要重寫(xiě)抽象的intercept()方法就可以了。Struts2還提供了一個(gè)特殊的攔截器抽象基類(lèi):erceptor.MethodFilterInterceptor這個(gè)攔截器可以指定要攔截或排除的方法列表。通常情況下,攔截器將攔截Action的所有方法調(diào)用,但在某些應(yīng)用場(chǎng)景中,對(duì)某些方法的攔截將會(huì)出現(xiàn)一些問(wèn)題。例如:對(duì)表單字段進(jìn)行驗(yàn)證的攔截器,當(dāng)我們通過(guò)doDefault()方法輸出表單時(shí),該方法不應(yīng)該被攔截,因此此時(shí)表單字段都沒(méi)有數(shù)據(jù)。說(shuō)明在struts2中,從MethodFilterInterceptor繼承的攔截器類(lèi)有:TokenInterceptorTokenSessionStoreInterceptorDefaultWorkflowInterceptorExecuteAndWaitInterceptorValidationInterceptorParametersInterceptorPrepareInterceptorMethodFilterInterceptor通過(guò)指定included/excluded方法列表來(lái)選擇攔截器或排除的方法,可以設(shè)置的參數(shù)如下:excludeMethods要排除的方法。includeMethods要攔截的方法。例如:有如下的攔截器配置:<interceptor-refname="validation"> <paramname="excludeMethods">input,back,cancel</param> <paramname="includeMethods">execute</param></interceptor-ref>說(shuō)明當(dāng)執(zhí)行Action的input、back和cancel方法時(shí),驗(yàn)證攔截器將不執(zhí)行對(duì)輸入數(shù)據(jù)的驗(yàn)證。當(dāng)執(zhí)行Action的execute方法時(shí),驗(yàn)證攔截器將執(zhí)行對(duì)輸入數(shù)據(jù)的驗(yàn)證。在設(shè)置攔截器或排除的方法時(shí),如果有多個(gè)方法,那么以逗號(hào)(,)分隔,如上所示。如果一個(gè)方法的名字同時(shí)出現(xiàn)在execludeMethods和includeMethods參數(shù)中,那么它會(huì)被當(dāng)作要攔截的方法。也就是說(shuō),includeMethods優(yōu)先于execludeMethods。在編寫(xiě)攔截器類(lèi)的時(shí)候要注意,攔截器必須是無(wú)狀態(tài)的,換句話(huà)說(shuō),在攔截器類(lèi)中不應(yīng)該有實(shí)例變量。這是因?yàn)閟truts2對(duì)每一個(gè)體Action的請(qǐng)求使用的是同一個(gè)攔截器實(shí)例來(lái)攔截調(diào)用,如果攔截器有狀態(tài),在多個(gè)線(xiàn)程(客戶(hù)端的每個(gè)請(qǐng)求將由服務(wù)器端的一個(gè)線(xiàn)程來(lái)服務(wù))同時(shí)訪(fǎng)問(wèn)一個(gè)攔截器實(shí)例的情況下,攔截器的狀態(tài)將不可預(yù)測(cè)。攔截器棧在很多時(shí)候,且些指定的攔截器需要被多個(gè)Action所使用,這個(gè)時(shí)候,如果我們?yōu)槊恳粋€(gè)Action都分別配置攔截器的話(huà),不僅麻煩,而且不利后期的維護(hù),此時(shí)就需要用到攔截器棧。所謂攔截器棧就是將一些攔截器組合起來(lái)進(jìn)行統(tǒng)一管理。攔截器棧的使用與攔截器的使用非常相似,唯一有區(qū)別的地方,就是攔截器棧的布署方式。配置攔截器一在配置攔截器的時(shí)候可以為攔截器傳遞參數(shù),對(duì)于已經(jīng)配置好的攔截器,在引用時(shí)還可以覆蓋它的參數(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>但這樣會(huì)有一個(gè)問(wèn)題,這是因?yàn)閐efaultStack攔截器棧包含了validation和workflow攔截器,這兩個(gè)攔截器都可以有excludeMethods參數(shù),采用上述方式,框架將無(wú)法知道你是要為哪一個(gè)攔截器傳遞參數(shù)。配置攔截器二為了覆蓋defaultStack攔截器棧中validation攔截器的excludeMethods參數(shù)設(shè)置,我們可以在Action的配置中直接引用defaultStack攔截器棧中的所有攔截器,然后在引用validation攔截器時(shí)配置攔截器三很明顯,這種配置太麻煩,也太冗余了。為此,struts2為我們提供了另外一種方式來(lái)覆蓋攔截器的參數(shù)設(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>這樣一來(lái)就簡(jiǎn)潔多了。安全驗(yàn)證攔截器一<%@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="用戶(hù)名"></s:textfield><s:passwordname="user.password"label="密碼"></s:password><s:submitvalue="登錄"></s:submit></s:form><br></body></html>login.jsp安全驗(yàn)證攔截器二<%@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ái)系統(tǒng)<br></body></html>success.jsp安全驗(yàn)證攔截器三LoginAction.java安全驗(yàn)證攔截器三LoginAction繼承自ActionSupport類(lèi),這是因?yàn)槲覀円没?lèi)的addActionError()方法來(lái)添加用戶(hù)登錄失敗的提示信息。LoginAction還實(shí)現(xiàn)了SessionAware接口,ServletConfig攔截器將會(huì)向LoginAction注入sessionMap對(duì)象。當(dāng)用戶(hù)登錄成功后,我們將user對(duì)象保存到session中。在我們編寫(xiě)的執(zhí)行安全驗(yàn)證的攔截器中,可以根據(jù)session中是否存在user對(duì)象,來(lái)判斷用戶(hù)是否登錄。安全驗(yàn)證攔截器四AuthenticationInterceptor攔

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論