熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JAVA攔截器原理及Struts2擴展

2013-11-23 19:23:52  來源: Java核心技術 

  最近發現很多朋友連攔截器都不知道於是想寫個BLOG總結一下

  java攔截器的基本原理其實非常簡單說白了就是動態代理類

  下面來看一個簡單的例子

  首先我建立一個攔截器的類InterceptorClass這裡的before()和after()方法是以後攔截器會執行的方法

  CODE清單一

  Java代碼

  <SPAN >//攔截器

  public class InterceptorClass {

  public void before() {

  Systemoutprintln(攔截器InterceptorClass方法調用:before()!);

  }

  public void after() {

  Systemoutprintln(攔截器InterceptorClass方法調用:after()!);

  }

  }</SPAN>

  我們模擬一個業務組件接口BusinessInterface和一個業務組件實現類BusinessClass

  CODE清單二

  Java代碼

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: ::

  */

  //業務組件接口

  public interface BusinessInterface {

  public void doSomething();

  }</SPAN>

  CODE清單三

  Java代碼

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: ::

  */

  //業務組件實現類

  public class BusinessClass implements BusinessInterface {

  public void doSomething() {

  Systemoutprintln(業務組件BusinessClass方法調用:doSomething());

  }

  }</SPAN>

  然後創建一個動態代理類DynamicProxyHandler這個類是集成InvocationHandler接口的動態類的原理實際上是使得當你執行一個動態方

  法的時候他可以把這個動態方法dispatch到這個動態類上來這樣你就可以在這個方法的前後嵌入自己的一些方法

  CODE清單四

  Java代碼

  <SPAN >/**

  * Created by IntelliJ IDEA

  * User: Ming

  * Date:

  * Time: ::

  */

  /**

  * 動態代理類實現InvocationHandler接口

  * 包含了業務對象綁定動態代理類的處理

  */

  public class DynamicProxyHandler implements InvocationHandler {

  private Object business;//被代理對象

  private InterceptorClass inceptor = new InterceptorClass();//攔截器

  public DynamicProxyHandler(Object business) {

  thisbusiness = business;

  }</SPAN>

  // 代理要調用的方法並在方法調用前後調用連接器的方法

  Java代碼

  <SPAN >/**

  * @param proxy    代理類對象

  * @param method   被代理的接口方法

  * @param args      被代理接口方法的參數

  * @return

  * @throws Throwable

  */

  public Object invoke(Object proxy Method method Object[] args) throws Throwable {

  Object result = null;

  inceptorbefore();

  result = methodinvoke(business args);

  inceptorafter();

  return result;

  }</SPAN>

  OK我們來寫個類測試一下

  CODE清單五

  Java代碼

  <SPAN >    public static void main(String[] args) {

  //生成待測試的業務組件對象

  BusinessInterface business = new BusinessClass();

  //生成動態代理類實例

  DynamicProxyHandler handler = new DynamicProxyHandler(business);

  BusinessInterface businessProxy = (BusinessInterface) ProxynewProxyInstance(

  //被代理類的ClassLoader

  businessgetClass()getClassLoader()

  //要被代理的接口本方法返回對象會自動聲稱實現了這些接口

  businessgetClass()getInterfaces()

  //代理處理器對象

  handler);

  //用動態代理類調用方法

  businessProxydoSomething();

  }</SPAN>

  來看看結果

  近期struts很流行而且攔截器是struts裡面一個比較好的功能下面舉個例子說明一下攔截器在struts中的用法

  struts對攔截器實現做了一個封裝使得我們在實現的時候比較簡單

  首先我們要建一個攔截器類

  CODE清單六

  Java代碼

  <SPAN >public class AuthorizationInterceptor extends AbstractInterceptor {

  @Override

  public String intercept(ActionInvocation invocation) throws Exception {

  Map session = invocationgetInvocationContext()getSession();

  String userName = (String) sessionget(userName);

  if ( userName != null && userNameequals(test)) {

  Systemoutprintln(攔截器合法用戶登錄);

  return invocationinvoke();

  }

  else

  {

  Systemoutprintln(攔截器用戶未登錄);

  return ActionLOGIN;

  }

  }

  }

  </SPAN>

  這個類是必須要繼承struts包中提供的AbstractInterceptor類這個類有一個抽象方法intercept這個方法是必須要實現的

  那麼經理在這個攔截器裡面寫了一個簡單的實現對url用戶合法性做了一個限制

  接下來比較關鍵的是過濾器在struts中的配置先看看代碼

  CODE清單七

  Java代碼

  <SPAN ><package name=system extends=strutsdefault>

  <interceptors>

  <!  定義權限控制攔截器  >

  <interceptor name=authority

  class=moninterceptsstrutsAuthorizationInterceptor/>

  <! 定義一個包含權限控制的攔截器棧   >

  <interceptorstack name=mystack>

  <interceptorref name=defaultStack></interceptorref>

  <interceptorref name=authority></interceptorref>

  </interceptorstack>

  </interceptors>

  <!定義默認攔截器   >

  <defaultinterceptorref name=mystack />

  <!定義全局處理結果   >

  <globalresults>

  <result name=login>indexjsp</result>

  </globalresults>

  <action name=login_* class=websystemLoginAction method={}>

  <result name=success>system/homepagejsp</result>

  </action>

  </package></SPAN>

  在interceptors節點裡我們可以定義多個攔截器這裡的名為authority的只是其中的一個struts的攔截器棧我是先執行struts默認的攔

  截器defaultStack然後再執行我的然後只需要用defaultinterceptorref標簽設置好這個system包中的默認攔截器為這個攔截器就OK了

  struts中引入了package這個概念我覺得十分實用當然這對struts攔截器也是個實惠我們可以根據不同的action來分包和不同的攔截器

  ok來運行測試一下


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26790.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.