Struts2 攔截器
1.Struts 中攔截器就是一個類,實現了Interceptor 介面的一個類。
2.Struts中攔截器和Servlet 中的Filter 有類似的功能,從字面意思來看,Struts 攔截器就是在目標對應執行之前或之後做一些事情,其實Struts 中的攔截器的實現也是一樣,在具體Action的被調用之前或之後可以做一些操作,採用配置化的方法進行管理,使用起來比較簡單。但是我們在學習過程中最好去瞭解攔截底層實現原理,以便在使用過程中能夠控制自己的程式。從瞭解攔截器的實現原理入手會是我們學習攔截器的最好途徑。
3.攔截器採用的動態代理模式實現的在目標執行之前或之後插入必要的輔助業務。其實採用的是一種AOP的思想,來降低系統耦合。
下面我們介紹一個動態代理:
Java中提供一種動態代理的實現模式:我們用一個例子實現動態代理的示範:
涉及到代理肯定要有:目標對象 代理對象 攔截器
三者之間的關係: 代理對象 代理 目標對象 在目標對象執行之前或之後 加入攔截器的功能
首先我們建立一個目標對象:
1-1先定義一個介面
package com.snt.struts2.interceptor;
public interface ITargetInterface {
public void doSomething();
}
1-2 定義一個目標對象實現目標對象介面 [目標對象一定要實現一個介面]
package com.snt.struts2.interceptor;
public class Target implements ITargetInterface{
//攔截的目標對象
public void doSomething() {
System.out.println("do something...");
}
}
1-3 定義一個攔截器(這裡我們的攔截器比較簡單,就是一個普通在類,定義了一在目標對象調用之前工之後要執行的操作) [定義的兩個方法,代表在目標對象調用之前和之後要執行的操作]
package com.snt.struts2.interceptor;
public class Interceptor {
public void befor(){
System.out.println("before");
}
public void after(){
System.out.println("after");
}
}
1.4 下面來實現代理,如何為目標對象產生一個代理對象呢。java為我們提供了一定代理機制。
Java在java.lang.reflect包下面提供了一個Proxy 類,這個類可以為一個目標類產生代理類:
使用以下更簡單的方法:
ITargetInterface if = (ITargetInterface)
Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { ITargetInterface.class },
handler);
每一個參數是目標類的載入器 每二個參數:目標實現的介面集合 每三個參數:代理類的調用處理常式對象.
動態代理類(以下簡稱為代理類)是一個實現在建立類時在運行時指定的介面列表的類,該類具有下面描述的行為。 代理介面 是代理類實現的一個介面。 代理執行個體 是代理類的一個執行個體。 每個代理執行個體都有一個關聯的調用處理常式 對象,它可以實現介面 InvocationHandler。通過其中一個代理介面的代理執行個體上的方法調用將被指派到執行個體的調用處理常式的 Invoke 方法,並傳遞代理執行個體、識別調用方法的 java.lang.reflect.Method 對象以及包含參數的 Object 類型的數組。調用處理常式以適當的方式處理編碼的方法調用,並且它返回的結果將作為代理執行個體上方法調用的結果返回。
對於我們這個例子:也要先建立一個代理類的調用處理常式,如下:
1.5