亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

EJB 訪問代理設計常用的訪問方式

2019-11-18 12:34:22
字體:
來源:轉載
供稿:網友

  常規訪問方式
  編寫過EJB(EnterPRise java Bean)訪問程序的朋友都知道,通過客戶端或服務端的程序訪問EJB(即獲得一個EJB Remote或Local對象)通常要經歷以下幾個步驟:
  
 ?。?)創建一個初始化上下文(initial context);
  
 ?。?)通過JNDI查找對應的EJB上下文對象;
  
 ?。?)通過獲得的上下文對象獲得一個Home或者LocalHome對象(獲得Home對象通過PortableRemoteObject對象的narrow方法,獲得LocalHome對象通過強制類型轉換);
  
 ?。?)最后通過Home或LocalHome的create方法創建一個Remote或Local對象,通過Remote或Local對象真正使用服務器的EJB提供的方法。
  
  代理類設計
  假如我們能夠把以上4個步驟封裝在一個類(本文叫EJBAgent)的方法(getRemote和getLocal)內就可以使得獲得一個Remote或Local對象只需要提供一個JNDI的名稱,避免了重復拷貝以上4個步驟的代碼。寫過EJB訪問代碼的程序員都知道,1~3步是很輕易封裝起來的,以下是典型的代碼:
  
  /*1.*/ InitialContext context = new InitialContext (properties);
  
  /*2.*/ Object home = context.lookup(JNDIName);
  
  /*3.*/ EJBHome ejbHome =
  
  (EJBHome) PortableRemoteObject.narrow (home, EJBHome.class);
  
  第一步獲得一個Context,主要是獲得應用服務器的環境參數,我們可以把存放環境變量的pertieserties對象作為參數,第二步是查找EJB上下文對象,可以把JNDIName作為參數,第三步獲得Home對象,我們可以統一獲得Home對象的父類:EJBHome,應用程序在具體根據實際使用的Home接口作類型轉換。
  
  第四步通過create方法創建一個Remote或Local對象封裝就有一定困難了,因為我們在第三步獲得的是一個EJBHome的接口,而我們知道,EJBHome接口本身不提供create方法(對EntityBean有可能是findByPrimaryKey的方法),而是由具體的應用程序的Home接口定義的,所以假如我們直接在代碼體寫ejbHome.create(),會產生一個編譯錯誤,提示方法create沒找到。要使程序能夠執行create方法,一種辦法是把ejbHome強制類型轉換成應用程序定義的EJBHome類型,即(EJBHome)換成(EJBExampleHome),其中EJBExampleHome是應用程序定義的EJBHome接口,但這樣必須在代碼體中寫入應用程序定義的EJBHome類名稱,達不到通用處理的目的。但我們知道,通過PortableRemoteObject.narrow出來的EJBHome其實是應用程序的定義的Home接口,即雖然我們使用(EJBHome)作類型轉換,但ejbHome實際指向的對象是EJBExampleHome,其中就定義create方法,我們可以采用動態調用的方式調用create方法,從而避免在編譯時產生錯誤。java.lang.reflect包提供了通過方法名稱動態調用方法的Method類。以下代碼是上述思想的實現:
  
  /*3.*/ EJBHome ejbHome =
  
  (EJBHome) PortableRemoteObject.narrow (home, EJBHome.class);
  
  /*4.*/ Class ejbHomeClass = ejbHome.getClass();
  
  /*5.*/ Method method = ejbHomeClass.getDeclaredMethod("create",null);
  
  /*6.*/ Object remoteObject = method.invoke(ejbHome,null);
  
  其中第4步是獲得ejbHome的Class,可能有部分朋友以為是獲得EJBHome的類,其實獲得的Class是應用程序定義的EJBHome接口:應用程序定義的類EJBExampleHome。有愛好的讀者可以通過getName()方法獲得實際Class名稱作判定。第五步通過獲得的Class獲得一個定義的create方法。getDeclaredMethod有兩個參數,第一個是方法的名稱,是String類型,第二個是參數類型,是Class數組。由于create方法是沒有參數,所以getDeclaredMethod第二個參數是null。需要注重的是getDeclaredMethod是動態執行的,所以第一參數:方法名稱假如寫錯,編譯時是不會產生錯誤的,在實際執行時才會報錯,拋出“沒有該方法”的異常:NoSUChMethodException。第6步通過動態調用create方法創建Remote對象。與getDeclaredMethod方法對應,Method的invoke方法也有兩個參數,第一個參數是定義執行方法的對象,Object類型,第二個參數是調用方法的參數,是Object數組,因為create方法沒有參數,所以第二個參數設置為null。
  
  例子介紹
  以下以WebLogic6.1作應用服務器為例子說明EJBAgent的使用方法。我們建立一個叫EJBExample的sessionBean,其Home接口為EJBExampleHome,Remote對象為EJBExampleRemote,其JNDI名稱為EJBExample。通過以下代碼體獲得一個EJBExampleRemote的對象:
  
  Properties properties = new Properties();
  
  properties.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
  
  properties.put(Context.PROVIDER_URL,"t3://localhost:7001";);
  
  EJBAgent agnet = new EJBAgent(properties);
  
  EJBExampleRemote remote = (EJBExampleRemote)agent.getRemote("EJBExample");
  
  通過獲得的remote對象就可以操作服務器端EJBExample的方法。我們可以看到,整個過程只需要兩個參數:應用服務器環境properties和對應的EJB JNDI名稱,強制類型轉換也只需要在獲得Remote對象時才使用到。而且通常一個應用程序是連接到一個應用服務器上,所以properties參數通常只需要設置一次,這樣可以只產生一個EJBAgent實例供多個客戶端程序使用,既減少了代碼量,也提高了重用性。假如我們想獲得的是一個Local對象,則可以不必構造一個properties對象作為參數,為獲得Local對象的程序通常是運行在應用服務器端的SessionBean,直接使用new InitialContext()則可以獲得應用服務器的環境參數。所以EJBAgent提供了有參和無參兩個構造方法,分別供Client端和application Server端的應用程序使用。具體的實現請看EJBAgnet.java。下面就EJBAgnet的部分要害代碼作說明:
  
 ?。?)以靜態static的方式定義EJBAgent使用的context對象:避免EJB訪問程序多次重新獲得Context。在局域網的環境中,從clinet獲得一個Context的時間在1~3秒范圍內,筆者在局域網用WebLogic6.1作應用服務器作過時間比較,獲得一個Context平均花1.3秒,而獲得一個Home和Remote對象只分別花17和36毫秒,所以把獲得的Context用靜態方式緩存以供調用時使用大大減少了應用程序訪問EJB的時間;
  
 ?。?)針對Entity Bean的訪問增加了getRemoteByKey和getLocalByKey的方法,可以通過JNDI Name和Primary Key的對象獲得一個EntityBean Remote或Local對象,同樣通過動態調用的方式實現。與create方法創建EJB的區別是findByPrimaryKey的方法需要有參數調用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人激情小说| 国产一区欧美二区三区| 综合国产在线视频| 午夜精品久久久久久久久久久久| 亚洲精品wwwww| 亚洲美女自拍视频| 欧洲精品在线视频| 欧美在线一级视频| 午夜精品福利电影| 国产亚洲a∨片在线观看| 欧美日韩另类字幕中文| 国产mv免费观看入口亚洲| 国产精品扒开腿做爽爽爽的视频| 91视频免费网站| 日韩网站在线观看| 日韩欧美国产一区二区| 久久香蕉频线观| 亚洲精品美女视频| 波霸ol色综合久久| 亚洲欧美一区二区精品久久久| 96sao精品视频在线观看| 黄色一区二区在线观看| 欧美乱大交做爰xxxⅹ性3| 欧美视频国产精品| 亚洲欧美精品伊人久久| 日韩美女主播视频| 欧美成人午夜激情视频| 亚洲欧美中文日韩在线v日本| 欧美精品久久久久久久免费观看| 狠狠躁夜夜躁人人爽超碰91| 日韩电影在线观看永久视频免费网站| 亚洲男人av电影| 欧美激情高清视频| 国产欧美中文字幕| 久久久97精品| 成人精品一区二区三区电影黑人| 中日韩午夜理伦电影免费| 精品成人国产在线观看男人呻吟| 欧美最猛性xxxx| 欧美高清在线观看| 国产亚洲精品久久久久动| 日韩欧美国产中文字幕| 91av视频在线免费观看| 日韩精品免费在线观看| 国产一区二区三区网站| 亚洲一区二区黄| 成人黄色免费片| 久久夜色精品亚洲噜噜国产mv| 国产精品成人国产乱一区| 狠狠躁夜夜躁人人爽天天天天97| 国产精品日韩在线播放| 成人日韩av在线| 国产自产女人91一区在线观看| 国产精品久久精品| 亚洲老司机av| 综合网日日天干夜夜久久| 国产精品情侣自拍| 日韩国产中文字幕| 欧美麻豆久久久久久中文| 亚洲一区二区三| 久久国产一区二区三区| 精品国产一区久久久| 91精品国产九九九久久久亚洲| 日韩av在线天堂网| www.久久草.com| 热久久这里只有| 91成人国产在线观看| 欧美电影在线免费观看网站| 久久久97精品| 亚洲精品在线观看www| 欧美日韩一区二区在线播放| 国产主播喷水一区二区| 韩国国内大量揄拍精品视频| 亚洲最大的成人网| 在线播放国产精品| 日韩精品丝袜在线| 中文字幕一区电影| 欧美午夜美女看片| 亚洲国产91精品在线观看| 亚洲天堂av电影| 久久人人爽人人爽人人片亚洲| 上原亚衣av一区二区三区| 97在线免费视频| 国产精品精品视频| 97视频在线观看免费| 成人黄色在线免费| 国产久一一精品| 色无极亚洲影院| 欧美成人午夜剧场免费观看| 成人网在线观看| 成人免费福利视频| 久久成人一区二区| 亚洲综合在线中文字幕| 亚洲xxxx妇黄裸体| 日韩一区视频在线| 欧美激情第6页| 亚洲国产另类 国产精品国产免费| 最近2019中文免费高清视频观看www99| 久久久亚洲欧洲日产国码aⅴ| 国产成人精品视| 欧美日韩国产成人高清视频| 国产精品一区二区三| 日韩最新av在线| 欧美性生交xxxxx久久久| 69视频在线免费观看| 中文字幕日韩免费视频| 日韩在线观看成人| 亚洲国产高清福利视频| 91久久久在线| 国产精品福利网站| 日韩视频在线免费| 欧美成aaa人片免费看| 成人亚洲欧美一区二区三区| 欧美日韩国产在线看| 国产欧美一区二区三区视频| 色播久久人人爽人人爽人人片视av| 精品国产依人香蕉在线精品| 国产精品观看在线亚洲人成网| 欧美黑人性猛交| 亚洲精品自拍第一页| 亚洲图片制服诱惑| 日韩av手机在线观看| 日本精品视频在线播放| 日韩精品免费综合视频在线播放| 国产mv久久久| 欧美精品做受xxx性少妇| 国产日韩在线免费| 蜜月aⅴ免费一区二区三区| 亚洲欧美日韩区| 成人国产亚洲精品a区天堂华泰| 日本精品中文字幕| 欧美成人免费va影院高清| 日韩激情在线视频| 清纯唯美亚洲激情| 国产精品视频自拍| 欧美性高潮在线| 国产mv免费观看入口亚洲| 草民午夜欧美限制a级福利片| 精品国产91久久久久久老师| 国产精品扒开腿爽爽爽视频| 亚洲xxxx在线| 亚洲综合在线小说| 国产精品丝袜久久久久久不卡| 亚洲国产成人久久综合一区| 深夜福利一区二区| 国产精品视频精品视频| 久久久av免费| 国内成人精品视频| 欧美日韩国产成人在线观看| 日韩美女av在线免费观看| 欧美主播福利视频| 亚洲最大福利视频网站| 欧美中文字幕在线视频| 日韩一二三在线视频播| 精品国产区一区二区三区在线观看| 日韩av大片在线| 国产精品欧美在线| 欧美专区国产专区| 另类美女黄大片| 国产精品2018| 26uuu国产精品视频| 国产精品青青在线观看爽香蕉| 国产精品久久久久一区二区| 欧美精品性视频|