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