攔截器(Interceptor)是Struts 2的核心組成部分。很多功能(Feature)都是構(gòu)建在攔截器基礎(chǔ)之上的,例如文件的上傳和下載、國際化、轉(zhuǎn)換器和數(shù)據(jù)校驗(yàn)等,Struts 2利用內(nèi)建的攔截器,完成了框架內(nèi)的大部分操作。
在Struts 2文檔中對(duì)攔截器的解釋為——攔截器是動(dòng)態(tài)攔截Action調(diào)用的對(duì)象。它提供了一種機(jī)制,使開發(fā)者可以定義一個(gè)特定的功能模塊,這個(gè)模塊可以在Action執(zhí)行之前或者之后運(yùn)行,也可以在一個(gè)Action執(zhí)行之前阻止Action執(zhí)行。同時(shí)也提供了一種可以提取Action中可重用的部分的方式。
5.2.1 Struts 2攔截器原理
讀者可以通過Struts 2官方文檔說明來理解攔截器,如果讀者具有較強(qiáng)的英文閱讀能力,建議查閱官方使用文檔(http://struts.apache.org/2.0.11/docs/interceptors.html)。如圖所示,是攔截器在Struts 2中的示意圖。
[size=small;]從圖[/size]5.4所示內(nèi)容中可以看出,Struts 2架構(gòu)的Action被一個(gè)或者多個(gè)攔截器(攔截器棧)所包圍,所有的用戶請(qǐng)求都會(huì)被攔截器所攔截,然后交給Action處理,處理結(jié)果以邏輯視圖方式返回給用戶。而這個(gè)調(diào)用執(zhí)行流程,是由Struts 2的配置文件來實(shí)現(xiàn)的,后面會(huì)詳細(xì)介紹。攔截器是Struts 2核心部分之一。
當(dāng)用戶請(qǐng)求到達(dá)Struts 2的ServletDispatcher時(shí),Struts 2會(huì)查找配置文件,并根據(jù)其配置實(shí)例化相對(duì)的攔截器對(duì)象,然后串成一個(gè)列表(List),最后一個(gè)一個(gè)地調(diào)用列表中的攔截器。攔截器時(shí)序圖如圖5.5所示。
圖5.5 Struts 2攔截器時(shí)序圖
在Struts 2架構(gòu)中,Action的調(diào)用都是通過攔截器來實(shí)現(xiàn)的。有的讀者可能會(huì)疑惑,前幾章的介紹中,沒有明確說明攔截器,為什么可以直接調(diào)用Action?那是因?yàn)?/span>Struts 2架構(gòu)如果不做顯式的攔截器配置,則系統(tǒng)會(huì)調(diào)用默認(rèn)的攔截器來調(diào)用Action,在用戶看來,好像沒有配置攔截器。系統(tǒng)默認(rèn)的攔截器筆者后面會(huì)詳細(xì)介紹。