WEB开发网      婵犵數濮烽弫鍛婄箾閳ь剚绻涙担鍐叉搐绾剧懓鈹戦悩瀹犲闁汇倗鍋撻妵鍕箛閸洘顎嶉梺绋款儑閸犳劙濡甸崟顖氬唨闁靛ě浣插亾閹烘鈷掗柛鏇ㄥ亜椤忣參鏌″畝瀣暠閾伙絽銆掑鐓庣仭缁楁垿姊绘担绛嬪殭婵﹫绠撻、姘愁樄婵犫偓娴g硶鏀介柣妯款嚋瀹搞儱螖閻樺弶鍟炵紒鍌氱Ч瀹曟粏顦寸痪鎯с偢瀵爼宕煎☉妯侯瀳缂備焦顨嗗畝鎼佸蓟閻旈鏆嬮柣妤€鐗嗗▓妤呮⒑鐠団€虫灀闁哄懐濮撮悾鐤亹閹烘繃鏅濋梺闈涚墕濡瑩顢欒箛鏃傜瘈闁汇垽娼ф禒锕傛煕閵娿儳鍩f鐐村姍楠炴﹢顢欓懖鈺嬬幢闂備浇顫夊畷妯肩矓椤旇¥浜归柟鐑樻尭娴滃綊姊虹紒妯虹仸闁挎洍鏅涜灋闁告洦鍨遍埛鎴︽煙閼测晛浠滃┑鈥炽偢閹鈽夐幒鎾寸彇缂備緡鍠栭鍛搭敇閸忕厧绶炴俊顖滅帛濞呭洭姊绘担鐟邦嚋缂佽鍊垮缁樼節閸ャ劍娅囬梺绋挎湰缁嬫捇宕㈤悽鍛婄厽閹兼番鍨婚埊鏇㈡煥濮樿埖鐓熼煫鍥ュ劤缁嬭崵绱掔紒妯肩畺缂佺粯绻堝畷姗€濡歌缁辨繈姊绘担绛嬪殐闁搞劋鍗冲畷顖炲级閹寸姵娈鹃梺缁樻⒒閳峰牓寮崒鐐寸厱闁抽敮鍋撻柡鍛懅濡叉劕螣鐞涒剝鏂€闂佺粯鍔曞Ο濠囧吹閻斿皝鏀芥い鏃囨閸斻倝鎽堕悙鐑樼厱闁哄洢鍔屾晶顖炴煕濞嗗繒绠婚柡灞界Ч瀹曨偊宕熼鈧▍锝囩磽娴f彃浜炬繝銏f硾椤戝洨绮绘ィ鍐╃厵閻庢稒岣跨粻姗€鏌ㄥ☉妯夹fい銊e劦閹瑩顢旈崟顓濈礄闂備浇顕栭崰鏍礊婵犲倻鏆﹂柟顖炲亰濡茶鈹戦埄鍐ㄧ祷妞ゎ厾鍏樺璇测槈閵忕姈鈺呮煏婢跺牆鍔撮柛鏂款槺缁辨挻鎷呯粙搴撳亾閸濄儳鐭撶憸鐗堝笒閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓 ---闂傚倸鍊搁崐鐑芥倿閿旈敮鍋撶粭娑樺幘濞差亜鐓涢柛娑卞幘椤斿棝姊虹捄銊ユ珢闁瑰嚖鎷�
开发学院WEB开发Jsp 灵活使用EJB的本地和远程接口(三) 阅读

灵活使用EJB的本地和远程接口(三)

 2008-01-05 10:29:25 来源:WEB开发网 闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷闂傚倸鍊搁崐椋庣矆娓氣偓楠炲鏁撻悩鎻掔€梺姹囧灩閻忔艾鐣烽弻銉︾厵闁规鍠栭。濂告煕鎼达紕校闁靛洤瀚伴獮鎺楀箣濠靛啫浜鹃柣銏⑶圭壕濠氭煙閻愵剚鐏辨俊鎻掔墛缁绘盯宕卞Δ鍐冣剝绻涘畝濠佺敖缂佽鲸鎹囧畷鎺戭潩閹典焦鐎搁梻浣烘嚀閸ゆ牠骞忛敓锟�婵犵數濮烽弫鍛婃叏椤撱垹绠柛鎰靛枛瀹告繃銇勯幘瀵哥畼闁硅娲熷缁樼瑹閳ь剙岣胯鐓ら柕鍫濇偪濞差亜惟闁宠桨鑳堕崝锕€顪冮妶鍡楃瑐闁煎啿鐖奸崺濠囧即閵忥紕鍘梺鎼炲劗閺呮稒绂掕缁辨帗娼忛埡浣锋闂佽桨鐒﹂幑鍥极閹剧粯鏅搁柨鐕傛嫹闂傚倸鍊搁崐椋庢濮橆兗缂氱憸宥堢亱闂佸湱铏庨崰鏍不椤栫偞鐓ラ柣鏇炲€圭€氾拷  闂傚倸鍊搁崐鐑芥嚄閼哥數浠氱紓鍌欒兌缁垶銆冮崨鏉戠厺鐎广儱顦崡鎶芥煏韫囨洖校闁诲寒鍓熷铏圭磼濡搫顫岄梺鍦拡閸嬪棝鎯€椤忓浂妯勯梺鍝勬湰濞叉ḿ鎹㈠┑濠勭杸闁哄洨濮烽悰銉╂⒒娴e搫甯跺鐟帮攻缁傚秴饪伴崼姘e亾閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡涱€楀褜鍠栭湁闁绘ɑ鐟ョ€氼喚绮绘ィ鍐╃厱妞ゆ劑鍊曢弸搴ㄦ煟韫囧鍔滈柕鍥у瀵潙螣閸濆嫬袝婵$偑鍊戦崹娲偡閳哄懎绠栭柍鈺佸暞閸庣喖鏌曢崶褍绨婚柟鍑ゆ嫹
核心提示:JNDI 绑定和源代码分析EJB 模块从 DualEJBModule01 开始,在 EJB Deployment Descriptor 编辑器面板中,灵活使用EJB的本地和远程接口(三),选择 Beans 选项卡,然后选择 DualEntity, ·DualEJBModule02 在“Java Build Path”、

  JNDI 绑定和源代码分析
  EJB 模块
  从 DualEJBModule01 开始。在 EJB Deployment Descriptor 编辑器面板中,选择 Beans 选项卡,然后选择 DualEntity,并且确保 WebSphere Bindings 部分中的 JNDI 名设置为 “ejb/dual/ejb/DualEntityHome” 。保存所有的更改。首先,让我们研究 DualEJBModule02 项目中 Dualsession EJB 的 ejb-jar.xml 的代码片断:
  ...
  
    useLocal
    java.lang.Boolean
    true
  

  
    doTrace
    java.lang.Boolean
    false
  

  
    ejb/DualEntityRemoteHome
    Entity
    dual.ejb.DualEntityRemoteHome
    dual.ejb.DualEntityRemote
    DualEJBModule01.jar#DualEntity
  

  
    ejb/DualEntityLocalHome
    Entity
    dual.ejb.DualEntityLocalHome
    dual.ejb.DualEntityLocal
    DualEJBModule01.jar#DualEntity
  

  ...
  
  这里,第一个元素(具有名称“useLocal”)是用来控制 DualEntity EJB 的本地接口的使用的。第二个条目(具有名称“doTrace”)预备只用于跟踪。已实现的跟踪功能是相当基本的,但是对于我们的目的来说足够了。 相应的 Java 代码看起来像是下面这样的:
  
  public class DualSessionBean implements javax.ejb.SessionBean {
    PRivate javax.ejb.SessionContext mySessionCtx;
    private boolean doTrace;
    private boolean useLocal;
    private DualEntityRemoteHome entityRemoteHome;
    private DualEntityLocalHome entityLocalHome;
  
    public void setSessionContext(javax.ejb.SessionContext ctx) {
     mySessionCtx = ctx;
     try {
       Context initCtx = new InitialContext();
       Boolean option = null;
       option = (Boolean)initCtx.lookup("java:comp/env/useLocal");
       useLocal = option.booleanValue();
       option = (Boolean)initCtx.lookup("java:comp/env/doTrace");
       doTrace = option.booleanValue();
       if (doTrace)
        System.out.println("DualSessionBean#setSessionContext: useLocal="
           +useLocal);
       Object homeObject = null;
       if (useLocal){
        homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityLocalHome");
        entityLocalHome = (DualEntityLocalHome)homeObject;
       } else {
        homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityRemoteHome");
        entityRemoteHome = (DualEntityRemoteHome)
        javax.rmi.PortableRemoteObject.narrow(homeObject,
           DualEntityRemoteHome.class);
       }
     } catch(NamingException ne){
       // process exception here...
     }
    }
  ...
  
  在 Java 代码中,EJB 环境变量是作为无状态会话 Bean 对象的生命周期的类变量存储的。DualEntity 的本地接口和 Remote Home Interface 是通过引用访问的;这是首选的方式,并且遵守 EJB 2.0 规范。相对地,ejb-jar.xml 包含描述这些引用的 ejb-ref 和 ejb-local-ref 元素。打开 EJB Deployment Descriptor 编辑器,然后选择 Beans 选项卡。确保 JNDI 名设置为“ejb/dual/ejb/DualSessionHome”。然后转到 References 选项卡,确保对 DualEntity 两个引用指向 JNDI 名“ejb/dual/ejb/DualEntityHome”。必要时可以更改这些值,然后保存所作的更改。
  
  Web 模块
  DualWebModule03project 标准的 J2EE Web 部署描述符包含两个重要的代码片段。第一个指定该 Servlet 的初始参数:
  
  ...
   
   useLocal
   true
   

   
   doTrace
   true
   

       
     jndiProviderURL
     iiop://localhost:2809
   

   
     jndiNameOnServer
     ejb/dual/ejb/DualSessionHome
   

   
     initialCtxFactoryClassName
     com.ibm.ejs.ns.jndi.CNInitialContextFactory
   

  -->
  ...
  
  上面的代码在意义上类似于前面讨论的 EJB 环境参数。注释掉的 Web 部署描述符部分后面将需要用于分离容器(Separate Containers)拓扑。The Web deployment descriptor section that is commented out will be needed later for the Separate Containers topology. 假如这三个附加的参数没有注释掉,在与此体系结构有关的逻辑将通过该 Servlet 的 init() 方法进行调用。(稍后将对此进行更多的介绍。)第二个代码片段描述了需要用来建立 Servlet 与 EJB 通信的引用:
  
  ...
  
   ejb/DualSessionRemoteHome
   Session
   dual.ejb.DualSessionRemoteHome
   dual.ejb.DualSessionRemote
   DualEJBModule02.jar#DualSession
  

  
   ejb/DualSessionLocalHome
   Session
   dual.ejb.DualSessionLocalHome
   dual.ejb.DualSessionLocal
   DualEJBModule02.jar#DualSession
  

  ...
  
  相对地,DualServlet 的源代码包含该 Servlet 的 init() 方法中的处理逻辑。下面是与处理 EJB 引用有关的代码片段:
  
  ...
  final String JNDI_NAME_LOCAL = "java:comp/env/ejb/DualSessionLocalHome";
  final String JNDI_NAME_REMOTE = "java:comp/env/ejb/DualSessionRemoteHome";
  ...
    if (useLocal) {
     initCtx = new InitialContext();
     homeObject = initCtx.lookup(JNDI_NAME_LOCAL);
     sessionLocalHome = (DualSessionLocalHome) homeObject;
    } else {
     homeObject = initCtx.lookup(JNDI_NAME_REMOTE);
     sessionRemoteHome =
       (DualSessionRemoteHome) PortableRemoteObject.narrow(
       homeObject,
       DualSessionRemoteHome.class);
    }
  ...
  
  (下载的源代码中的初始参数处理逻辑实际上更复杂,因为它还处理分离容器(Separate Containers)拓扑。)可以在 DualWebModule03 的 Web Deployment Descriptor 编辑器窗格中,首选选中 DualServlet 的所有设置(包括 Initialization 部分在内),然后转到 References 选项卡,选中 EJB 和 EJB Local 这两个子选项卡。两个引用应该指向 WebSphere Bindings 部分中的JNDI 名“ejb/dual/ejb/DualSessionHome”。
  
  项目依靠性总结
  现在我们基本上完成了这些模块,让我们再次回顾一下所有项目(包括 EAR 在内)的依靠性:
  
  ·DualJavaModule00 没有依靠性。
  
  ·DualEJBModule01 没有依靠性。
  
  ·DualEJBModule02 在“Java Build Path”、“Java JAR Dependencies”和“Project References”·设置中必须有 DualJavaModule00、DualEJBModule01 项目。
  
  ·DualWebModule03 在“Java Build Path”、“Project References”和“Web Library Projects”设置中必须有 DualJavaModule00、DualEJBModule02 项目。
  
  ·DualEARForEJBContainer 在“Project References”设置中必须有 DualJavaModule00、DualEJBModule01、DualEJBModule02;EAR 部署描述符必须有指向 EJB 模块和 Java 模块的引用。
  
  ·DualEARForAllInOne 必须有指向所有模

Tags:灵活 使用 EJB

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接