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