struts2 攔截器介紹

1.Interceptor介紹

攔截器(Intercepter):攔截器是struts2的核心少辣,struts2的眾多功能都是通過攔截器來實(shí)現(xiàn)的瓤狐,與Filter非常類似,不管是概念還是里面的方法

要想實(shí)現(xiàn)struts2的攔截器辐棒,那么就要實(shí)現(xiàn)Interceptor接口

對(duì)于攔截器而言寡夹,分為兩個(gè)階段:

  1. 定義階段
  2. 使用階段

一定要先定義才能使用

攔截器的實(shí)現(xiàn)步驟:

  1. 編寫實(shí)現(xiàn)interceptor接口的類
  2. 在struts.xml中的package元素下定義攔截器
  3. 在struts.xml的action元素下使用攔截器

雖然攔截器與Filter的配置方式不一樣,但是原理是一樣的

如果配置了攔截器如贷,那么在服務(wù)器啟動(dòng)的時(shí)候就會(huì)實(shí)例化它并調(diào)用對(duì)應(yīng)的init方法陷虎,這一點(diǎn)也與Filter一樣

有一點(diǎn)不同的是Filter可以過濾所有內(nèi)容,而攔截器只能攔截Action

整個(gè)struts2框架是靠攔截器串聯(lián)起來的

struts2提供了攔截器棧的概念杠袱,用來將攔截器按需進(jìn)行歸類尚猿,方便引用,看起來使用了組合模式楣富,因?yàn)橐粋€(gè)interceptor-stack可以包含多個(gè)interceptor-ref也可以包含多個(gè)interceptor-stack

defaultStack攔截器棧中包含了struts2所必須用到的一些攔截器類

strust2還提供了默認(rèn)攔截器機(jī)制凿掂,即如果沒有在struts.xml的Action元素下顯式的使用攔截器,那么該Action默認(rèn)使用了defaultStack攔截器棧纹蝴,否則的話需要顯式的引用默認(rèn)攔截器棧庄萎,并通常配置在所有攔截器之后【注:經(jīng)本人測(cè)試存在defaultStack不放在所有攔截器之后的情況】

對(duì)于struts.xml而言分為三部分:

  1. bean
  2. result-type
  3. interceptor

攔截器本身是xwork提供的,按照之前的規(guī)律塘安,struts2會(huì)對(duì)它進(jìn)行一些封裝糠涛,成為自己的,類似StrutsTypeConverter

攔截器示例:

前端頁(yè)面:

login.png

LoginAction配置:

loginAction.png

攔截器代碼編寫:

MyInterceptor.png

struts.xml配置:

interceptor.png

結(jié)果頁(yè)面:

output.png

測(cè)試:

在前端頁(yè)面輸入hello兼犯、world并進(jìn)行提交脱羡,如下圖所示:

test_1.png

提交后的結(jié)果如下:

result.png

控制臺(tái)輸出信息如下:

console.png

和Filter的doFilter很相似吧

此外攔截器也支持初始化參數(shù)配置,如下圖所示:

init.png

然后在對(duì)應(yīng)的攔截器中設(shè)置成員變量并提供set方法即可免都,這一點(diǎn)與Filter配置初始化參數(shù)有點(diǎn)不同锉罐,這里為了測(cè)試init與set方法的先后執(zhí)行順序在涉及到的方法中增加了打印語句,如下圖所示:

攔截器初始化參數(shù).png

服務(wù)器啟動(dòng)后控制臺(tái)的輸出信息如下:

console.png

可以看出set方法優(yōu)于init方法先執(zhí)行绕娘,這也是符合邏輯的脓规,因?yàn)閕nit方法中可能要用到對(duì)象參數(shù)

2. AbstractInterceptor介紹

因?yàn)镮nterceptor接口需要實(shí)現(xiàn)init、interceptor险领、destroy三個(gè)方法侨舆,而通常對(duì)于開發(fā)者而言只需要用到interceptor方法就行了,但是因?yàn)槭墙涌谒员仨毴?shí)現(xiàn)另外兩個(gè)方法绢陌,這樣就給開發(fā)者增加了麻煩挨下,所以產(chǎn)生了AbstractInterceptor,類似于swing中的監(jiān)聽器適配器

它是一個(gè)抽象類脐湾,實(shí)現(xiàn)了Interceptor接口臭笆,并且空實(shí)現(xiàn)了init、destroy,所以我們?cè)谑褂玫臅r(shí)候只需要繼承它就可以了愁铺,這樣我們編寫的攔截器就更加簡(jiǎn)潔了

3. 攔截器鏈配置演示

首先定義兩個(gè)攔截器分別為:MyInterceptor鹰霍、MyAbstractInterceptor:

MyInterceptor.png
MyAbstractInterceptor.png

然后配置struts.xml文件:

struts.xml.png

使用之前的登錄頁(yè)面進(jìn)行測(cè)試,控制臺(tái)輸出結(jié)果如圖所示:

console.png

從這里可以看出攔截器鏈和FilterChain的執(zhí)行流程一樣茵乱,所以之前對(duì)Filter掌握好的話茂洒,這里就很快能夠理解了

另外在這里簡(jiǎn)單的介紹下攔截器方法所攜帶的參數(shù)ActionInvocation,通過它我們可以獲得被該攔截器所攔截的Action的對(duì)象瓶竭,以及我們可以為ActionInvocation安裝PreResultListener類型的監(jiān)聽器督勺,這個(gè)之后會(huì)
詳細(xì)介紹

4. MethodFilterInterceptor介紹

MethodFilterInterceptor(方法過濾攔截器) 它繼承了AbstractInterceptor,并且提供了一個(gè)抽象方法doInterceptor來要求我們實(shí)現(xiàn)斤贰,通過在struts.xml中配置該類的excludeMethods玷氏、includeMethods屬性可以來決定到底對(duì)哪個(gè)方法進(jìn)行攔截,這里要注意一點(diǎn)腋舌,(這里的攔截指攔截器中要執(zhí)行一些邏輯盏触,不攔截指直接放行,不執(zhí)行攔截器中的邏輯块饺,流程直接進(jìn)入到Action)攔截器只要配置對(duì)了赞辩,那么該攔截器就會(huì)執(zhí)行,至于執(zhí)行效果就由攔截器來控制了

當(dāng)一個(gè)方法名字既可以在includeMethods里獲得授艰,又可以從excludeMethods里獲得辨嗽,那么MethodFilterInterceptor認(rèn)為該方法是要被攔截的即includeMethods優(yōu)先級(jí)大于excludeMethods

當(dāng)在Action中引用了MethodFilterInterceptor但沒配置其子元素param時(shí),例如下圖所示:

MethodFilterInterceptor.png

那么MethodFilterInterceptor攔截器會(huì)當(dāng)inlcude來執(zhí)行

5. PreResultListener介紹

可以對(duì)攔截器中的actionInvocation參數(shù)安裝監(jiān)聽器,該監(jiān)聽器的執(zhí)行時(shí)機(jī)是:action執(zhí)行完之后,在渲染之前

如果在這個(gè)時(shí)機(jī)想要進(jìn)行操作的話那么可以使用該監(jiān)聽器旅赢,下圖是安裝監(jiān)聽器的代碼:

PreResultListener.png

當(dāng)被攔截的Action執(zhí)行完之后,就會(huì)執(zhí)行該監(jiān)聽器的beforeReuslt方法洲押,然后再執(zhí)行攔截器上的后續(xù)代碼

6. 攔截器實(shí)戰(zhàn)

需求:用攔截器實(shí)現(xiàn)全系統(tǒng)登錄驗(yàn)證功能

實(shí)現(xiàn):

登錄頁(yè)面代碼:

login.jsp.png

添加新聞頁(yè)面代碼:

addNews.jsp.png

登錄顯示結(jié)果代碼:

output.png

新聞顯示結(jié)果代碼:

showNews.jsp.png

LoginAction代碼:

LoginAction.png

AddNewsAction代碼:

AddNewsAction.png

登錄攔截器代碼:

LoginInterceptor.png

配置文件代碼:

struts.xml.png

7. struts.xml一拆多介紹

struts.xml一拆多其實(shí)也是為了分門別類而已,防止一個(gè)xml中內(nèi)容太過龐大圆凰,在主struts.xml中通過如下語句即可引入從struts.xml 文件:

struts一拆多.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杈帐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子专钉,更是在濱河造成了極大的恐慌挑童,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃须,死亡現(xiàn)場(chǎng)離奇詭異站叼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菇民,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門尽楔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來投储,“玉大人,你說我怎么就攤上這事翔试∏嵋” “怎么了复旬?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵垦缅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我驹碍,道長(zhǎng)壁涎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任志秃,我火速辦了婚禮怔球,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浮还。我一直安慰自己竟坛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布钧舌。 她就那樣靜靜地躺著担汤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洼冻。 梳的紋絲不亂的頭發(fā)上崭歧,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音撞牢,去河邊找鬼率碾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屋彪,可吹牛的內(nèi)容都是我干的所宰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼畜挥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼歧匈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砰嘁,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤件炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后矮湘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斟冕,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年缅阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磕蛇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景描。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秀撇,靈堂內(nèi)的尸體忽然破棺而出超棺,到底是詐尸還是另有隱情,我是刑警寧澤呵燕,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布棠绘,位于F島的核電站,受9級(jí)特大地震影響再扭,放射性物質(zhì)發(fā)生泄漏氧苍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一泛范、第九天 我趴在偏房一處隱蔽的房頂上張望让虐。 院中可真熱鬧,春花似錦罢荡、人聲如沸赡突。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惭缰。三九已至,卻和暖如春惧笛,著一層夾襖步出監(jiān)牢的瞬間从媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工患整, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拜效,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓各谚,卻偏偏與公主長(zhǎng)得像紧憾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昌渤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355