Loading...

          java .net

          開始學習struts2(五)

          說是struts2的核心就是攔截器
          先看看攔截器的實現
          實現攔截器有這么幾個東西構成
          1、目標對象-將被攔截的對象,這個對象中的方法被調用是將被攔截
          要求目標對象面向接口編程,首先要定義接口
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:37:23
          * 面向接口編程
          * 目標對象的接口
          */
          public interface TargetInterface {
              public void doSomething();
          }
          目標對象實現
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:36:26
          * 目標對象
          */
          public class Target implements TargetInterface{
              public void doSomething(){
                  System.out.println("do something");
              }
          }

          2、攔截器對象-里面包含在調用目標對象前或后要調用的方法
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:39:32
          * 攔截器
          */
          public class Interceptor {
              public void before(){
                  System.out.println("before");
              }

              public void after(){
                  System.out.println("after");
              }
          }

          3、處理器-處理器決定攔截器如何攔截目標對象
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:41:08
          */
          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;

          /**
          * 處理器
          * 在這里將目標對象Target和攔截器Interceptor聯系在了一起
          */
          public class MyHandler implements InvocationHandler{

              /**
               * 目標對象
               * 將來目標對象的方法將被注入interceptor
               */
              private Object object;

              /**
               * 攔截器
               * MyHandler負責將Interceptor這個攔截器注入到傳入的目標對象object
               */
              private Interceptor interceptor = new Interceptor();

              public void setObject(Object object){
                  this.object = object;
              }

              /**
               * 實現InvocationHandler接口的方法
               * @param o 在其上調用方法的代理實例
               * @param method 對應于在代理實例上調用的接口方法的 Method 實例
               * @param objects 包含傳入代理實例上方法調用的參數值的對象數組
               * @return  從代理實例的方法調用返回的值
               * @throws Throwable
               */
              public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                  Object result = null;
                  interceptor.before();
                  result = method.invoke(object,objects);
                  interceptor.after();
                  return result;
              }
          }

          4、代理對象-用于得到目標對象的代理對象
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:50:52
          * 代理類
          */
          import java.lang.reflect.Proxy;
          public class MyProxy {
              /**
               * 返回obj的,處理器為MyHandler的代理對象
               * @param obj 目標對象
               * @return  目標對象的代理對象
               */
              public Object getProxy(Object obj){
                  MyHandler myHandler = new MyHandler();
                  myHandler.setObject(obj);
                  return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                          obj.getClass().getInterfaces(),myHandler);
              }
          }

          5、最后客戶調用代碼
          package com.test.interceptor;

          /**
          * Created by IntelliJ IDEA.
          * User: Administrator
          * Date: 2009-1-9
          * Time: 17:55:45
          * 客戶調用
          */
          public class Client {
              public static void main(String[] args){
                  //目標對象
                  TargetInterface target = new Target();
                  //代理對象
                  MyProxy myProxy = new MyProxy();
                  //通過代理對象得到目標對象的代理
                  TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
                  //通過目標對象的代理調用目標對象的方法
                  proxy.doSomething();
              }
          }

          //輸出:
          //before 
          //do something
          //after

          將自己的理解寫了注釋,現在只理解到這個程度,像
          Proxy.newProxyInstance
          里面是怎么實現的,還沒深入考究
          繼續努力

          posted on 2009-01-13 11:26 閱讀(291) 評論(0)  編輯  收藏 所屬分類: 學習java

          公告

          希望有一天

          我能用鼠標雙擊我的錢包

          然后選中一張100元

          按住“ctrl+c”

          接著不停的“ctrl+v”

          嘻嘻~~~笑醒~~~



          導航

          <2009年1月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統計

          常用鏈接

          留言簿(6)

          隨筆分類(102)

          隨筆檔案(398)

          文章分類

          文章檔案(10)

          有趣網絡

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 成武县| 商洛市| 兰州市| 罗源县| 湘西| 遂宁市| 科技| 普陀区| 出国| 鱼台县| 大宁县| 米易县| 剑阁县| 神农架林区| 三江| 阿坝| 兴义市| 田林县| 蓬莱市| 含山县| 延吉市| 玉龙| 巴塘县| 商河县| 固安县| 冕宁县| 浙江省| 青海省| 常德市| 赤峰市| 当阳市| 乌兰县| 静安区| 贵定县| 阿克陶县| 崇义县| 茌平县| 桂平市| 皮山县| 科尔| 贡觉县|