




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.第四章 InterceptorInterceptor(攔截器)顧名思義就是在某個(gè)事件發(fā)生之前將其攔截,并插入相應(yīng)的處理過程。從這點(diǎn)上來看,攔截器類似于在Servelet規(guī)范中定義的Filter,但是Struts2的攔截器完全獨(dú)立于Servelet的Filter,而且兩者有著截然不同的實(shí)現(xiàn)。Interceptor將很多通用的功能從Action中獨(dú)立出來,大大減少了Action中重復(fù)的代碼量,通過組裝Interceptor可以使得通用的邏輯按照順序執(zhí)行,并且當(dāng)業(yè)務(wù)邏輯順序發(fā)生變化的時(shí)候也不需要重新編寫代碼,只需重新組裝Interceptor即可,從而降低web應(yīng)用的耦合性。在開發(fā)Web應(yīng)用的過程
2、中,會(huì)碰到很多可以復(fù)用的模塊,如果不采取任何策略,無疑會(huì)增加應(yīng)用的重復(fù)代碼量。Interceptor就是Struts2對(duì)這些可復(fù)用的應(yīng)用模塊加以管理的策略。通過Interceptor可以把通用的模塊從Action中提取出來,供應(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)用讓我們來看看Interceptor到底在什么時(shí)候被調(diào)用
3、,又是如何被調(diào)用。首先讓我們來分析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(); /*省略語句*/ 在執(zhí)行Action之前,Struts2會(huì)檢查Action是否配置有攔截器,如果有,遍歷所有攔截器并且執(zhí)行之,如果對(duì)應(yīng)的Action沒有配置攔截器,那么Struts2將只執(zhí)行Action。但是似乎并沒有看到Action和Interceptor的執(zhí)行的先后次序,別著急,讓我們看看其它的代碼里有
5、沒有關(guān)于Interceptor的執(zhí)行先后次序。Xwork的攔截器都必須實(shí)現(xiàn)Interceptor接口,但是實(shí)際上大部分的攔截器都是通過繼承抽象類AbstractInterceptor實(shí)現(xiàn)攔截器的功能。下面來了解下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è)抽象類中沒有實(shí)現(xiàn)任何方法,就是一個(gè)簡(jiǎn)單Interceptor接口的實(shí)現(xiàn)。那么攔截器要在Action之前執(zhí)行,那么只有在繼承這個(gè)類時(shí),通過實(shí)現(xiàn)它的抽象方法intercept()來完成攔擊器的功能。也就是說在intercept()方法中會(huì)先執(zhí)行攔截器想要完成的任務(wù),然后再轉(zhuǎn)向Action執(zhí)行,一般函數(shù)最后會(huì)加上這句代碼:Strin
7、g result = invocation.invoke();通過上面的介紹,不難發(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)行封裝,然后用在其它地方。下面通過對(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 模式的一種無狀態(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來實(shí)現(xiàn),這種情況通常是這樣的,用戶在使用Action標(biāo)簽,不想框架附加任何參數(shù)給次Action,而是想要手動(dòng)的來設(shè)置這些參數(shù)。n ParameterNameAware:這個(gè)接口通常由那些需要參數(shù)附加的Action實(shí)現(xiàn),通常和ParametersInterceptor配合起來實(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ù)過濾的攔截器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)常使用到的,或者說是每一個(gè)進(jìn)行Web應(yīng)用開發(fā)的程序員都要使用到的,Struts2考慮到了這樣的情況,并且預(yù)先抽取了這些復(fù)用性很強(qiáng)的模塊。那么Struts2自帶的攔截器的配置在struts-default.xml都有配置,在struts-2.0.9-all.zip壓縮包的src目錄下。通過搜索,在路徑struts-2
15、.0.9-allstruts-2.0.9srccoresrcmainresources下可以找到這個(gè)文件,打開之后下面是其關(guān)于攔截器配置部分的代碼:struts-default.xml/*省略其他配置語句*/ /*省略其他配置語句*/配置文件中指出了每個(gè)自帶攔截器對(duì)應(yīng)的類以及它們的名字,那么它們具體的功能可以通過閱讀類的源代碼知道,表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ú)立的線程來執(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ì)象的訪問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è)的組裝起來,這些裝配好的攔截器棧往往有著特殊的用途,讓我們大致了解一下這些棧??纯催@些組合在一起的攔截器又將為開發(fā)帶來什么樣的便捷特性。攔截器棧的相關(guān)配置也是在struts-default.xml實(shí)現(xiàn)的,下面是這個(gè)文件中關(guān)于攔截器棧的配置部分。struts-default.xml/*省略其他配置語句*/ /*省略其他配置語句
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ā)過程中經(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)單,下面讓首先來看看這個(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頁面。它的確是夠簡(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頁面會(huì)有一個(gè)“result null not found”的信息,是因?yàn)槲覀儧]有配置返回頁面,但是可以在控制臺(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è)日志攔截器,通過對(duì)源代碼的分析,用戶可以在編寫自己的模塊的時(shí)候可以參考Struts2的源代碼,比如下面的記時(shí)攔截器就是參考了這里的日志攔截器。通過對(duì)源代碼
26、的分析,我們還可以了解到攔截器的具體實(shí)現(xiàn)方式,并編寫自己的攔截器去實(shí)現(xiàn)Interceptor接口。參考源代碼,發(fā)現(xiàn)原來也可以通過繼承這樣的基類AbstractInterceptor來實(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è)信息輸出之間通過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è)攔截器,通過這樣的配置,攔截器和控制器的裝配工作就完成了,下面看看這個(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例子的完整目錄如果配置無誤,在瀏覽器地址欄輸入:http:/localhost:80
35、80/Logging/logging.action 那么將得到下面的結(jié)果:圖4-4自定義攔截器的輸出結(jié)果首先要注意的一點(diǎn)就是這里的所有的控制信息都是在標(biāo)準(zhǔn)輸出(控制臺(tái))輸出的,而不是在相應(yīng)的頁面。本例中的結(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ù)定義的攔截器。完成頁面等待的效果,由于某個(gè)Action要執(zhí)行較長(zhǎng)的一段時(shí)間,在頁面跳轉(zhuǎn)到另一個(gè)頁面之前,先會(huì)進(jìn)入一個(gè)等待的頁面,等待頁面裝載。其實(shí)在互聯(lián)網(wǎng)上這種頁面等待的效果會(huì)經(jīng)常被用到,現(xiàn)在就借用Struts2的攔截器來實(shí)現(xiàn)這個(gè)功能。自定義攔截器部分將會(huì)使用第二章最后小節(jié)的自定義攔截器,即GreetingInterceptor。為了達(dá)到頁面等待的效果,要借助Struts2提供execAndWait攔截器,這個(gè)攔截器的功能在前面的表中可以查到,就是生成一個(gè)獨(dú)立的線程來執(zhí)行Action。為什么選擇這個(gè)攔截器,將會(huì)在下面的源碼分析部分詳細(xì)解釋。有了這兩個(gè)攔截器就可以完成這個(gè)實(shí)例。整個(gè)流程是這樣的:輸入訪問地址之后,首先會(huì)出現(xiàn)一個(gè)等待的頁面,大概等待10秒之后,跳入一個(gè)輸入頁面,用戶輸入姓名提交之后,根據(jù)當(dāng)前的時(shí)間生成特定的問候語。為了讓讀者能夠正確阿使用Struts2提供e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東省深圳市寶安區(qū)文匯學(xué)校2020-2021學(xué)年八年級(jí)下學(xué)期3月月考數(shù)學(xué)試題
- 生物-山東省淄博市濱州市2024-2025學(xué)年度2025屆高三模擬考試(淄博濱州一模)試題和答案
- 2020-2021深圳南聯(lián)學(xué)校初中部小學(xué)三年級(jí)數(shù)學(xué)上期中第一次模擬試題含答案
- 火災(zāi)逃生知識(shí)培訓(xùn)課件
- 2025年中考道德與法治一輪復(fù)習(xí):九年級(jí)下冊(cè)必背考點(diǎn)提綱
- 電梯消防施工方案
- 2025年高考地理一輪復(fù)習(xí):人教版(2019)高中地理必修第二冊(cè)知識(shí)點(diǎn)背誦提綱
- 農(nóng)村超級(jí)地基施工方案
- 鋼制門窗防水施工方案
- 2025年天津市河?xùn)|區(qū)高三一模高考數(shù)學(xué)模擬試卷(含答案)
- 2024山東能源集團(tuán)中級(jí)人才庫選拔(高頻重點(diǎn)提升專題訓(xùn)練)共500題附帶答案詳解
- 廣東省廣州市2023-2024學(xué)年一年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- DL-T5493-2014電力工程基樁檢測(cè)技術(shù)規(guī)程
- 中西醫(yī)結(jié)合思路與方法學(xué)課件
- 二年級(jí)數(shù)學(xué)下冊(cè)混合運(yùn)算計(jì)算100題(含詳細(xì)答案)
- 小學(xué)體育小課題研究
- 14J936《變形縫建筑構(gòu)造》
- 小學(xué)數(shù)學(xué)五年級(jí)下冊(cè)必考《質(zhì)數(shù)和合數(shù)》練習(xí)題(附質(zhì)數(shù)合數(shù)知識(shí)點(diǎn))
- 環(huán)境監(jiān)測(cè)安全培訓(xùn)
- 第六課 呵護(hù)花季激揚(yáng)青春
- 循環(huán)系統(tǒng)-解剖結(jié)構(gòu)
評(píng)論
0/150
提交評(píng)論