设计模式-拦截器模式
看到strut2的Interceptor(攔截器),
tomcat源碼的Valve(tomcat中各種各樣容器如Wrapper,Context都是靠Valve實現(xiàn)各種功能),
以及最早學(xué)習(xí)到的java web中的javax.servlet.Filter的概念,
都是一種鏈?zhǔn)降奶幚砹鞒?#xff0c;這一個環(huán)節(jié)處理完成,然后處理另一個環(huán)節(jié),這樣就可以在一個處理本身的之前和之后做一些事情了。
比如說,struts2中Action在執(zhí)行之前會首先執(zhí)行一些Interceptor,完成諸如權(quán)限驗證/屬性注入/Validation/國際化等等的功能,
我看過一個比較好的功能是,利用strut2的攔截器和*-Validation.xml文件以及標(biāo)簽(strut2標(biāo)簽,主要是form-close.ftl這個模板文件),自動生成頁面的Form前端驗證。(當(dāng)然輔助的客戶端js文件如jquery/jquery-validation也是需要的)。
以上的這些功能,通過一種名為責(zé)任鏈或者攔截器或者過濾器(語義上的區(qū)別而技術(shù)上沒有什么區(qū)別,知道做了什么就行了)的設(shè)計模式可以實現(xiàn),那么就來看看什么是責(zé)任鏈的設(shè)計模式。
以下內(nèi)容參考北京尚學(xué)堂的馬士兵老師的設(shè)計模式視頻,在此感謝。
Filter的概念
引入FilterChain的概念
模仿馬老師寫的代碼,
地址1:http://download.csdn.net/detail/hx888/6839619?(filter的單向過濾的簡單實現(xiàn))
地址2:http://download.csdn.net/detail/hx888/6949155?(模仿java web的filter實現(xiàn)雙向過濾)
既處理從客戶端到服務(wù)器的消息,又處理從服務(wù)器到客戶端的消息,這樣的過濾器該怎么設(shè)計呢?
首先,構(gòu)造兩個類,Request和Response,分別代表請求和響應(yīng),
其次,因為要滿足首先執(zhí)行Request的過濾然后執(zhí)行Response的過濾以及正序執(zhí)行Request的過濾和反序執(zhí)行Response的過濾,所以在doFilter方法中加入FilterChain的引用,
這樣可以依次先對Request進(jìn)行下一個Filter的處理,然后反過來再處理Response的過濾。
模仿馬老師寫的代碼,地址:
分析strut2中interceptorsStack(攔截器棧)
首先,執(zhí)行action之前會按照順序執(zhí)行所有的interceptor,執(zhí)行action之后返回一個結(jié)果字符串也會按照同之前相反的順序執(zhí)行所有的interceptor。
我覺得,首先,執(zhí)行action之后的所有interceptor是必須執(zhí)行的,且先于對action執(zhí)行完之后返回的結(jié)果進(jìn)行處理,并且是有嚴(yán)格順序的。
至于是不是對action執(zhí)行完之后返回的結(jié)果進(jìn)行處理,以及處理順序,看到到是次要的?
如果request請求不合乎一個攔截器的請求條件,如權(quán)限檢查的攔截器,停止后續(xù)處理,如何實現(xiàn)?
轉(zhuǎn)載于:https://www.cnblogs.com/wenwujuncheng/p/3515833.html
總結(jié)
以上是生活随笔為你收集整理的设计模式-拦截器模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: Mirosoft Office自动化问题
- 下一篇: DataGridView的单元格控制只能