最近發(fā)現(xiàn)很多朋友連攔截器都不知道,于是想寫個BLOG總結(jié)一下。 java攔截器的基本原理其實非常簡單,說白了就是動態(tài)代理類。 下面來看一個簡單的例子 首先,我建立一個攔截器的類InterceptorClass,這里的before()和after()方法是以后攔截器會執(zhí)行的方法 CODE清單一:
我們模擬一個業(yè)務(wù)組件接口BusinessInterface,和一個業(yè)務(wù)組件實現(xiàn)類BusinessClass CODE清單二:
CODE清單三:
然后,創(chuàng)建一個動態(tài)代理類DynamicProxyHandler,這個類是集成InvocationHandler接口的,動態(tài)類的原理實際上是使得當(dāng)你執(zhí)行一個動態(tài)方
法的時候,他可以把這個動態(tài)方法dispatch到這個動態(tài)類上來。這樣,你就可以在這個方法的前后嵌入自己的一些方法。 CODE清單四: //包含了業(yè)務(wù)對象綁定動態(tài)代理類的處理,并實現(xiàn)了InvocationHandler接口的invoke方法
// 代理要調(diào)用的方法,并在方法調(diào)用前后調(diào)用連接器的方法
OK,我們來寫個類測試一下 CODE清單五:
來看看結(jié)果:
近期struts2很流行,而且攔截器是struts2里面一個比較好的功能,下面舉個例子說明一下攔截器在struts2中的用法。 struts2對攔截器實現(xiàn)做了一個封裝,使得我們在實現(xiàn)的時候比較簡單。 首先我們要建一個攔截器類 CODE清單六:
這個類是必須要繼承struts2包中提供的AbstractInterceptor類,這個類有一個抽象方法intercept,這個方法是必須要實現(xiàn)的。 那么經(jīng)理在這個攔截器里面寫了一個簡單的實現(xiàn),對url用戶合法性做了一個限制。
接下來比較關(guān)鍵的是過濾器在struts2中的配置,先看看代碼 CODE清單七:
在interceptors節(jié)點里,我們可以定義多個攔截器,這里的名為authority的只是其中的一個。struts2的攔截器棧我是先執(zhí)行struts2默認(rèn)的攔
截器defaultStack,然后再執(zhí)行我的。然后只需要用default-interceptor-ref標(biāo)簽設(shè)置好這個system包中的默認(rèn)攔截器為這個攔截器就OK了。
struts2中引入了package這個概念,我覺得十分實用,當(dāng)然這對struts2攔截器也是個實惠,我們可以根據(jù)不同的action來分包和不同的攔截器
ok,來運(yùn)行測試一下。
結(jié)果..