




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.第四章 InterceptorInterceptor(攔截器)顧名思義就是在某個(gè)事件發(fā)生之前將其攔截,并插入相應(yīng)的處理過(guò)程。從這點(diǎn)上來(lái)看,攔截器類似于在Servelet規(guī)范中定義的Filter,但是Struts2的攔截器完全獨(dú)立于Servelet的Filter,而且兩者有著截然不同的實(shí)現(xiàn)。Interceptor將很多通用的功能從Action中獨(dú)立出來(lái),大大減少了Action中重復(fù)的代碼量,通過(guò)組裝Interceptor可以使得通用的邏輯按照順序執(zhí)行,并且當(dāng)業(yè)務(wù)邏輯順序發(fā)生變化的時(shí)候也不需要重新編寫代碼,只需重新組裝Interceptor即可,從而降低web應(yīng)用的耦合性。在開發(fā)Web應(yīng)用的過(guò)程
2、中,會(huì)碰到很多可以復(fù)用的模塊,如果不采取任何策略,無(wú)疑會(huì)增加應(yīng)用的重復(fù)代碼量。Interceptor就是Struts2對(duì)這些可復(fù)用的應(yīng)用模塊加以管理的策略。通過(guò)Interceptor可以把通用的模塊從Action中提取出來(lái),供應(yīng)用中的其它Action應(yīng)用,甚至是供其它項(xiàng)目復(fù)用。4.1 Interceotor基礎(chǔ)對(duì)于攔截器而言,最主要就是要清楚攔截器在什么時(shí)候開始被調(diào)用,以及Struts2中是如何實(shí)現(xiàn)攔截器,最后還要清楚Struts2中自帶的攔截器有哪些,只有了解這些,才可以為以后使用攔截器打下基礎(chǔ)。4.1.1 Interceptor何時(shí)調(diào)用讓我們來(lái)看看Interceptor到底在什么時(shí)候被調(diào)用
3、,又是如何被調(diào)用。首先讓我們來(lái)分析com.opensymphony.xwork2.DefaultActionInvocation源代碼看看一般的Action調(diào)用流程,注意下面的代碼片斷。DefaultActionInvoation.java/*省略其他方法*/ public String invoke() throws Exception if (executed) throw new IllegalStateException(Action has already executed); if (interceptors.hasNext() InterceptorMapping interce
4、ptor = (InterceptorMapping) interceptors.next(); resultCode = interceptor.getInterceptor().intercept(this); else resultCode = invokeActionOnly(); /*省略語(yǔ)句*/ 在執(zhí)行Action之前,Struts2會(huì)檢查Action是否配置有攔截器,如果有,遍歷所有攔截器并且執(zhí)行之,如果對(duì)應(yīng)的Action沒(méi)有配置攔截器,那么Struts2將只執(zhí)行Action。但是似乎并沒(méi)有看到Action和Interceptor的執(zhí)行的先后次序,別著急,讓我們看看其它的代碼里有
5、沒(méi)有關(guān)于Interceptor的執(zhí)行先后次序。Xwork的攔截器都必須實(shí)現(xiàn)Interceptor接口,但是實(shí)際上大部分的攔截器都是通過(guò)繼承抽象類AbstractInterceptor實(shí)現(xiàn)攔截器的功能。下面來(lái)了解下AbstractInterceptor類的具體代碼。AbstractInterceptor.javapackage erceptor;import com.opensymphony.xwork2.ActionInvocation;public abstract class AbstractInterceptor implements
6、 Interceptor public void init() public void destroy() public abstract String intercept(ActionInvocation invocation) throws Exception;在這個(gè)抽象類中沒(méi)有實(shí)現(xiàn)任何方法,就是一個(gè)簡(jiǎn)單Interceptor接口的實(shí)現(xiàn)。那么攔截器要在Action之前執(zhí)行,那么只有在繼承這個(gè)類時(shí),通過(guò)實(shí)現(xiàn)它的抽象方法intercept()來(lái)完成攔擊器的功能。也就是說(shuō)在intercept()方法中會(huì)先執(zhí)行攔截器想要完成的任務(wù),然后再轉(zhuǎn)向Action執(zhí)行,一般函數(shù)最后會(huì)加上這句代碼:Strin
7、g result = invocation.invoke();通過(guò)上面的介紹,不難發(fā)現(xiàn),Interceptor的本質(zhì)也是一個(gè)Action,畢竟其產(chǎn)生的目的就是為了提高Action代碼的復(fù)用性,降低Action的耦合性。但是Interceptor又是一種特殊的Action,因?yàn)槠鋱?zhí)行于指定Action或之前,或之后完成可復(fù)用的模塊化業(yè)務(wù)邏輯。Interceptor能夠攔截Action的執(zhí)行,它的出現(xiàn)使得開發(fā)者能夠在Action執(zhí)行之前或者之后執(zhí)行一段業(yè)務(wù)邏輯。它們同時(shí)也可以阻止Action的執(zhí)行,使得開發(fā)者對(duì)一段通用的業(yè)務(wù)邏輯進(jìn)行封裝,然后用在其它地方。下面通過(guò)對(duì)Interceptor的源代碼中
8、的類和接口的展示,希望能夠使讀者對(duì)Interceptor的本質(zhì)有更深一層次的認(rèn)識(shí)。4.1.2 Interceptor接口攔截器是一個(gè)Struts2框架很好的特性,它的使用十分靈活,同時(shí)框架為了滿足特定的需要實(shí)現(xiàn)了一些特定的API,用戶可以根據(jù)自己的需要選用。表4-1 Interceptor提供的預(yù)定義接口Interceptor定義的接口描述Interceptorinterceptor 是采用 interceptor 模式的一種無(wú)狀態(tài)類NoParameters這個(gè)接口通常由不需要參數(shù)附加的Action實(shí)現(xiàn)ParameterNameAware這個(gè)接口通常由需要參數(shù)附加的Action實(shí)現(xiàn)PreRes
9、ultListener實(shí)現(xiàn)這個(gè)接口可以獲得一個(gè)在Action之后但是結(jié)果之前的回調(diào)n Interceptor:是所有攔截器必須實(shí)現(xiàn)的一個(gè)接口。n NoParameters:這個(gè)標(biāo)記接口應(yīng)該由那些不想要任何參數(shù)附加的Action來(lái)實(shí)現(xiàn),這種情況通常是這樣的,用戶在使用Action標(biāo)簽,不想框架附加任何參數(shù)給次Action,而是想要手動(dòng)的來(lái)設(shè)置這些參數(shù)。n ParameterNameAware:這個(gè)接口通常由那些需要參數(shù)附加的Action實(shí)現(xiàn),通常和ParametersInterceptor配合起來(lái)實(shí)現(xiàn)參數(shù)的附加,例如Action可能有這樣一份參數(shù)的白名單和黑名單,前者列出的參數(shù)是允許用戶設(shè)置的,
10、而后者列出的則拒絕用戶的設(shè)置。n PreResultListener:實(shí)現(xiàn)這個(gè)接口的Action可以獲得一個(gè)在Action執(zhí)行之后但是結(jié)果執(zhí)行之前的回調(diào)。4.1.3 Interceptor相關(guān)類在進(jìn)行Interceptor編寫的時(shí)候,同Action的編寫一樣,Struts2也提供了一些框架支持的類,這些類的使用,可以大大便利我們進(jìn)行相關(guān)的攔截器的開發(fā)。讀者可以在實(shí)際的應(yīng)用中根據(jù)自己需要使用這些類。表4-2 Interceptor 提供的相關(guān)類類描述AbstractLifecycleInterceptor提供了before(),after() 以及result之前的攔截AliasIntercep
11、tor為類似的Action 的類似參數(shù)提供別名服務(wù)AroundInterceptor提供了before(),after() 攔截ChainingInterceptor將值棧中所有的對(duì)象拷貝到當(dāng)前對(duì)象,當(dāng)前對(duì)象實(shí)現(xiàn)unchainable()接口的除外ConversionErrorInterceptor如果Action執(zhí)行了ValidationAware()接口,那么將所有轉(zhuǎn)換錯(cuò)誤添加到域錯(cuò)誤表DefaultWorkflowInterceptor在允許ActionChain繼續(xù)執(zhí)行之前完成一些基本的操作如校驗(yàn)ExceptionHolder對(duì)Exception的簡(jiǎn)單封裝,方便使用ExceptionM
12、appingInterceptor次攔截器是異常處理的核心I18nInterceptor設(shè)置ActionRequest國(guó)際化的本地信息LoggingInterceptor記錄Action執(zhí)行的日志攔截器MethodFilterInterceptor可以包含和排除一些方法執(zhí)行的攔截器ModelDrivenInterceptor觀察modelDriven的Action執(zhí)行情況并將其添加到值棧ParameterFilterInterceptor參數(shù)過(guò)濾的攔截器ParametersInterceptor將所有參數(shù)設(shè)置到值棧PrefixMethodInvocationUtil一個(gè)執(zhí)行一些固定方法的工具類
13、PrepareInterceptor調(diào)用實(shí)現(xiàn)了preparable接口方法的Action的prepare()方法TimerInterceptor記錄以秒為單位的時(shí)間日志仔細(xì)的分析這些類可以發(fā)現(xiàn),其涉及了Struts2 Interceptor的全部。類的功能涉及了Action執(zhí)行的方方面面。幾乎在Action執(zhí)行的任何時(shí)刻,都可以找到適合的攔截器截?cái)郃ction的執(zhí)行。使其完成想要的業(yè)務(wù)邏輯功能。靈活的運(yùn)用這些類,那么我們幾乎就掌握了Action執(zhí)行的每一個(gè)方面,就能夠?qū)ction的執(zhí)行進(jìn)行精準(zhǔn)的控制。4.2使用預(yù)定義的InterceptorStruts2預(yù)先設(shè)計(jì)了很多通用性很強(qiáng)的Interc
14、eptor供用戶使用。靈活的使用這些攔截器,不僅可以更好的設(shè)計(jì)更具通用性的業(yè)務(wù)模塊,而且可以增加Web應(yīng)用的可測(cè)試性,使得Web應(yīng)用的開發(fā)和維護(hù)變得更為便捷。4.2.1預(yù)定義Interceptor類攔截器的使用,可以抽取系統(tǒng)的各個(gè)方面的可復(fù)用代碼。當(dāng)然在實(shí)際的開發(fā)中可能有一些模塊是經(jīng)常使用到的,或者說(shuō)是每一個(gè)進(jìn)行Web應(yīng)用開發(fā)的程序員都要使用到的,Struts2考慮到了這樣的情況,并且預(yù)先抽取了這些復(fù)用性很強(qiáng)的模塊。那么Struts2自帶的攔截器的配置在struts-default.xml都有配置,在struts-2.0.9-all.zip壓縮包的src目錄下。通過(guò)搜索,在路徑struts-2
15、.0.9-allstruts-2.0.9srccoresrcmainresources下可以找到這個(gè)文件,打開之后下面是其關(guān)于攔截器配置部分的代碼:struts-default.xml/*省略其他配置語(yǔ)句*/ /*省略其他配置語(yǔ)句*/配置文件中指出了每個(gè)自帶攔截器對(duì)應(yīng)的類以及它們的名字,那么它們具體的功能可以通過(guò)閱讀類的源代碼知道,表4-3中提供一些常用攔截器實(shí)現(xiàn)的功能表4-3 Struts2框架預(yù)定義的攔截器名稱描述chain將參數(shù)從一個(gè)Action復(fù)制到另一個(gè)Actioncomponent為Action應(yīng)用IoC的邏輯處理conversionError如果出現(xiàn)類型轉(zhuǎn)換錯(cuò)誤,則增加對(duì)應(yīng)字段錯(cuò)
16、誤execAndWait生成一個(gè)獨(dú)立的線程來(lái)執(zhí)行ActionfileUpload設(shè)置上傳文件為Action文件logger記錄Action執(zhí)行的起始時(shí)間model-driven將Action模型壓入值棧params將HTTP參數(shù)應(yīng)用于Actionprepare調(diào)用Action的prepare()方法servlet-config提供對(duì)通用HTTP對(duì)象的訪問(wèn)static-params將Action映射設(shè)定的參數(shù)應(yīng)用到Action實(shí)例中timer控制Action的定時(shí)執(zhí)行token防止表單重復(fù)提交的基本實(shí)現(xiàn)token-session防止表單重復(fù)提交的高級(jí)實(shí)現(xiàn)validation校驗(yàn)Action中的字
17、段值workflow如果發(fā)生錯(cuò)誤則自動(dòng)返回INPUT這個(gè)返回類型例如校驗(yàn)攔截器validation這個(gè)攔截器就對(duì)表單的校驗(yàn)提供了極大的便利,這一點(diǎn)在以后的章節(jié)中,將繼續(xù)講解。為了方便初學(xué)者的使用,Struts2框架還預(yù)定義了若干攔截器棧,所謂的攔截器棧就是將攔截器一個(gè)接一個(gè)的組裝起來(lái),這些裝配好的攔截器棧往往有著特殊的用途,讓我們大致了解一下這些棧??纯催@些組合在一起的攔截器又將為開發(fā)帶來(lái)什么樣的便捷特性。攔截器棧的相關(guān)配置也是在struts-default.xml實(shí)現(xiàn)的,下面是這個(gè)文件中關(guān)于攔截器棧的配置部分。struts-default.xml/*省略其他配置語(yǔ)句*/ /*省略其他配置語(yǔ)句
18、*/上面的攔截器棧的配置只是所有攔截器棧的一部分,讀者可以自己找到這個(gè)文件,找出所有棧的配置。表4-4中列出部分常用攔截器棧的功能。表4-4 Struts2 框架預(yù)定義的攔截器棧名稱描述defaultStack基本的攔截器棧validationWorkflowStack配置了validation和workflow攔截的棧fileUploadStack配置了fileupload的攔截器棧componentStack配置了反轉(zhuǎn)控制的攔截器棧modelDrivenStack配置了modelDriven的攔截器棧chainStack配置了chain的攔截器棧execAndWaitStack配置了exe
19、cAndWait的攔截器棧completeStack配置了所有攔截器的攔截器棧這里面的攔截棧其實(shí)是在實(shí)際的開發(fā)過(guò)程中經(jīng)常要用到的,例如文件上傳攔截棧,這個(gè)攔截棧的定義,使得在開發(fā)有關(guān)文件上傳的組件的時(shí)候,就不必考慮文件上傳的細(xì)節(jié)了,而是可以把精力集中在業(yè)務(wù)邏輯上,又如攔截棧,這個(gè)框架定義的攔截棧,是用戶在使用框架定義的攔截器,不可或缺的一個(gè)部分。4.2.2 LoggingInterceptor示例這一節(jié)我們使用框架為我們定義的日志攔截器(LoggingInterceptor)為我們的Action記錄日志??蚣軐?shí)現(xiàn)的這個(gè)攔截器的功能很簡(jiǎn)單,下面讓首先來(lái)看看這個(gè)例子。LoggingAction.j
20、avapackage example;import com.opensymphony.xwork2.Action;public class LoggingAction implements Actionpublic String execute()delay();return SUCCESS;private void delay()for ( int i=0;i10000;i+);這個(gè)Action簡(jiǎn)單的做一個(gè)延遲,(后面為了計(jì)算Action的執(zhí)行時(shí)間),然后轉(zhuǎn)向success頁(yè)面。它的確是夠簡(jiǎn)單,因?yàn)檫@里要重點(diǎn)演示的是Interceptor。struts.xml 在這個(gè)文件里面,我們配置了一個(gè)
21、Struts2框架預(yù)定義的日志攔截器,名稱為logger然后在action里面引用了這個(gè)攔截器,指示這個(gè)攔截器和這個(gè)Action裝配,對(duì)這個(gè)Action起作用。這樣當(dāng)Struts2框架發(fā)現(xiàn)了這個(gè)裝配的攔截器之后,在調(diào)用Action之前就會(huì)去調(diào)用這個(gè)攔截器,從而達(dá)到預(yù)期的目的。這個(gè)例子的目錄圖如圖4-1所示:圖4-1例子的完整目錄如果配置正確的話,部署到Tomcat下,然后在瀏覽器地址欄輸入:http:/localhost:8080/Logging/logging.action頁(yè)面會(huì)有一個(gè)“result null not found”的信息,是因?yàn)槲覀儧](méi)有配置返回頁(yè)面,但是可以在控制臺(tái)得到這樣的
22、輸出:圖4-2 LoggingAction的對(duì)應(yīng)輸出可以看到,在控制器執(zhí)行的前后,日志攔截器分別截獲了控制器的執(zhí)行,并輸出了對(duì)應(yīng)的日志新日,如“/logging”這個(gè)Interceptor好像完成的工作也并不是很多,讓我們看看它到底是如何工作的。該文件在erceptor.LoggingInterceptor中。LoggingInterceptor.java/省略導(dǎo)入包public class LoggingInterceptor extends AbstractInterceptor private static final Log log
23、 = LogFactory.getLog(LoggingInterceptor.class); private static final String FINISH_MESSAGE = Finishing execution stack for action ; private static final String START_MESSAGE = Starting execution stack for action ; public String intercept(ActionInvocation invocation) throws Exception logMessage(invoc
24、ation, FINISH_MESSAGE); /記錄結(jié)束信息 String result = invocation.invoke(); logMessage(invocation, START_MESSAGE);/記錄開始信息 return result; private void logMessage(ActionInvocation invocation, String baseMessage) if (log.isInfoEnabled() StringBuffer message = new StringBuffer(baseMessage); String namespace =
25、invocation.getProxy().getNamespace(); if (namespace != null) & (namespace.trim().length() 0) message.append(namespace).append(/); message.append(invocation.getProxy().getActionName(); (message.toString(); 這個(gè)是框架實(shí)現(xiàn)的一個(gè)日志攔截器,通過(guò)對(duì)源代碼的分析,用戶可以在編寫自己的模塊的時(shí)候可以參考Struts2的源代碼,比如下面的記時(shí)攔截器就是參考了這里的日志攔截器。通過(guò)對(duì)源代碼
26、的分析,我們還可以了解到攔截器的具體實(shí)現(xiàn)方式,并編寫自己的攔截器去實(shí)現(xiàn)Interceptor接口。參考源代碼,發(fā)現(xiàn)原來(lái)也可以通過(guò)繼承這樣的基類AbstractInterceptor來(lái)實(shí)現(xiàn)interceptor接口從而實(shí)現(xiàn)自己的攔截器,同時(shí)這樣做一個(gè)好處就是代碼的邏輯很清楚,在執(zhí)行Action之前,首先執(zhí)行l(wèi)ogMessage()函數(shù)在控制臺(tái)有一個(gè)輸出,在Action執(zhí)行結(jié)束后又有一個(gè)信息輸出,在兩個(gè)信息輸出之間通過(guò)ActionInvocation類可以獲得當(dāng)前要執(zhí)行的Action有關(guān)的信息,然后執(zhí)行Action相關(guān)操作。掌握了攔截器的這幾個(gè)方面那么用戶就可以對(duì)攔截器的執(zhí)行進(jìn)行粒度很小的控制。4
27、.3使用自定義的Interceptor閱讀了框架的Logging攔截器的源代碼,可以發(fā)現(xiàn)一個(gè)攔截器的實(shí)現(xiàn)也很簡(jiǎn)單,下面模仿框架的日志攔截器設(shè)計(jì)一個(gè)記時(shí)攔截器,這個(gè)攔截器不僅記錄Action的執(zhí)行時(shí)間,而且同時(shí)還輸出執(zhí)行日志。大致可以分為一下幾個(gè)步驟:1. 定義自己的攔截器邏輯2. 配置自己的攔截器3. 將自定義的攔截器裝配到對(duì)應(yīng)的控制器進(jìn)行攔截4. 運(yùn)行實(shí)例查看效果4.3.1自定義Interceptor的配置Interceptor的配置大同小異,注意struts.xml中的粗體顯示的片斷。struts.xml 這些地方就是用戶在框架中配置攔截器的地方。從上面的配置文件的代碼我們也可以看出,首先
28、我們是先定義了一個(gè)自定義的攔截器,然后在對(duì)應(yīng)的要使用的控制器中使用了這個(gè)攔截器,通過(guò)這樣的配置,攔截器和控制器的裝配工作就完成了,下面看看這個(gè)攔截器的具體內(nèi)容。4.3.2實(shí)現(xiàn)自己的Interceptor本小節(jié)使用一個(gè)自定義的Interceptor,對(duì)Action執(zhí)行前和執(zhí)行后進(jìn)行計(jì)時(shí),并且在Action執(zhí)行結(jié)束后向控制臺(tái)輸出對(duì)應(yīng)的日志信息。同時(shí)在Action執(zhí)行完成之后使用這兩個(gè)時(shí)間計(jì)算出整個(gè)Action的運(yùn)行時(shí)間。LogAndTime.javapackage example;import mons.logging.Log;import mons.logging.LogFactory;impo
29、rt com.opensymphony.xwork2.ActionInvocation;import erceptor.AbstractInterceptor;SuppressWarnings(serial)public class LogAndTime extends AbstractInterceptor private static final Log log = LogFactory.getLog(LogAndTime.class); private static final String FINISH_MESSAGE = Syst
30、em Administrator Finishing execution stack for action ; private static final String START_MESSAGE = System Administrator Starting execution stack for action ; /設(shè)定了一些輸出信息字符串 private long startTime; /聲明了開始時(shí)間 private long executeTime; / 聲明了執(zhí)行時(shí)間 private void logMessage(ActionInvocation invocation, Strin
31、g baseMessage) if (log.isInfoEnabled() StringBuffer message = new StringBuffer(baseMessage); String namespace = invocation.getProxy().getNamespace(); if (namespace != null) & (namespace.trim().length() 0) message.append(namespace).append(/); message.append(invocation.getProxy().getActionName(); log.
32、info(message.toString(); /記錄日志信息 Overridepublic String intercept(ActionInvocation invocation) throws Exception logMessage(invocation, START_MESSAGE); startTime = System.currentTimeMillis(); String result = invocation.invoke(); logMessage(invocation, FINISH_MESSAGE); executeTime = System.currentTimeM
33、illis() - startTime; /執(zhí)行時(shí)間,等于當(dāng)前時(shí)間-開始時(shí)間。當(dāng)前時(shí)間是控制器的Execute()方法執(zhí)行后 String TIMESTRING=The Action: +invocation.getProxy().getActionName()+has executed +executeTime+ MilliSeconds;/設(shè)定時(shí)間信息 System.out.println(TIMESTRING); /獲得當(dāng)前的執(zhí)行時(shí)間付給開始執(zhí)行時(shí)間return result;在這個(gè)interceptor的實(shí)現(xiàn)里面,使用了框架對(duì)Interceptor的支持類。使用這些支持類的好處是:這樣
34、可以更加方便,便捷的構(gòu)建自己想要的攔截器。在這個(gè)例子中在Action執(zhí)行的前后都對(duì)Action進(jìn)行了攔截,在Action執(zhí)行前,將其攔截,記錄下此時(shí)的時(shí)間,然后輸出一行控制信息到控制臺(tái),表明已經(jīng)執(zhí)行到Action之前。然后Interceptor會(huì)喚醒Action繼續(xù)執(zhí)行,執(zhí)行完之后,Interceptor會(huì)繼續(xù)將Action捕獲,獲得此時(shí)的時(shí)刻,和執(zhí)行開始前的一比較,便得出了整個(gè)Action執(zhí)行所耗費(fèi)的時(shí)間,同時(shí)向控制臺(tái)輸出信息表明已經(jīng)執(zhí)行完這個(gè)Action了。那么再看下這個(gè)例子的目錄,如圖4-3所示:圖4-3例子的完整目錄如果配置無(wú)誤,在瀏覽器地址欄輸入:http:/localhost:80
35、80/Logging/logging.action 那么將得到下面的結(jié)果:圖4-4自定義攔截器的輸出結(jié)果首先要注意的一點(diǎn)就是這里的所有的控制信息都是在標(biāo)準(zhǔn)輸出(控制臺(tái))輸出的,而不是在相應(yīng)的頁(yè)面。本例中的結(jié)果是輸出在eclipse的控制臺(tái)的。從輸出的結(jié)果可以看出編寫的攔截器成功的執(zhí)行了,首先在Action執(zhí)行前,攔截器記錄當(dāng)前的時(shí)間并輸出日志”.starting execution.”然后在Action執(zhí)行之后,又輸出日志信息”.fininshing execution.”同時(shí)記錄當(dāng)前的執(zhí)行時(shí)間,并計(jì)算除整個(gè)Action的執(zhí)行時(shí)間(執(zhí)行后-執(zhí)行前)。輸出執(zhí)行時(shí)間。4.4 Interceptor
36、應(yīng)用實(shí)例在前面學(xué)習(xí)的知識(shí),在這一節(jié)將完成一個(gè)綜合的Interceptor例子。這個(gè)例子中既會(huì)用到自定義的攔截器也會(huì)使用Struts2提供的預(yù)定義的攔截器。完成頁(yè)面等待的效果,由于某個(gè)Action要執(zhí)行較長(zhǎng)的一段時(shí)間,在頁(yè)面跳轉(zhuǎn)到另一個(gè)頁(yè)面之前,先會(huì)進(jìn)入一個(gè)等待的頁(yè)面,等待頁(yè)面裝載。其實(shí)在互聯(lián)網(wǎng)上這種頁(yè)面等待的效果會(huì)經(jīng)常被用到,現(xiàn)在就借用Struts2的攔截器來(lái)實(shí)現(xiàn)這個(gè)功能。自定義攔截器部分將會(huì)使用第二章最后小節(jié)的自定義攔截器,即GreetingInterceptor。為了達(dá)到頁(yè)面等待的效果,要借助Struts2提供execAndWait攔截器,這個(gè)攔截器的功能在前面的表中可以查到,就是生成一個(gè)獨(dú)立的線程來(lái)執(zhí)行Action。為什么選擇這個(gè)攔截器,將會(huì)在下面的源碼分析部分詳細(xì)解釋。有了這兩個(gè)攔截器就可以完成這個(gè)實(shí)例。整個(gè)流程是這樣的:輸入訪問(wèn)地址之后,首先會(huì)出現(xiàn)一個(gè)等待的頁(yè)面,大概等待10秒之后,跳入一個(gè)輸入頁(yè)面,用戶輸入姓名提交之后,根據(jù)當(dāng)前的時(shí)間生成特定的問(wèn)候語(yǔ)。為了讓讀者能夠正確阿使用Struts2提供e
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 印度道路安全培訓(xùn)課件
- 危險(xiǎn)廢物環(huán)保試題及答案
- 測(cè)氧儀培訓(xùn)試題及答案
- 廣告設(shè)計(jì)師考試互動(dòng)性設(shè)計(jì)元素試題及答案
- 成功備考的紡織工程師考試試題及答案
- 最基本的普法試題及答案
- 政治青島一模試題及答案
- 2024年行業(yè)標(biāo)準(zhǔn)下的設(shè)計(jì)師考試試題及答案
- 助理廣告師備考過(guò)程中的常見誤區(qū)試題及答案
- 公安警校面試題及答案
- 2025年國(guó)家保密基本知識(shí)考試題庫(kù)及答案
- 《《定制式醫(yī)療器械醫(yī)工交互全過(guò)程監(jiān)控及判定指標(biāo)與接受條件》》
- 第12課 19世紀(jì)下半期資本主義的擴(kuò)展
- 2022版藝術(shù)新課標(biāo)解讀心得(課件)小學(xué)美術(shù)
- 鋰離子電池失效分析及后果PFMEA-電子表格版
- 律師事務(wù)所法律咨詢委托書
- 中華人民共和國(guó)保守國(guó)家秘密法實(shí)施條例
- 人美版八年級(jí)美術(shù)下冊(cè)《1. 繪畫的多元化》說(shuō)課稿
- DB34T4829-2024公路工程泡沫輕質(zhì)土設(shè)計(jì)與施工技術(shù)規(guī)程
- 【新課標(biāo)核心素養(yǎng)目標(biāo)】6.2.1二氧化碳的性質(zhì)和用途教案(表格式)初中化學(xué)人教版(2024)九年級(jí)上冊(cè)
- 預(yù)防性侵害安全教育
評(píng)論
0/150
提交評(píng)論