免费看欧美黑人毛片-免费看毛片网站-免费看毛片的网站-免费看久久-中文字幕日韩欧美-中文字幕日韩精品一区

您現在的位置:首頁 > IT認證 > JAVA >

JavaBeans:創建客戶端應用


  Cabin實體和 TravelAgent EJB已經部署完畢,我們打算從遠程客戶端對其進行訪問。本節中,我們會創建一個遠程客戶端,連向EJB服務器,為TravelAgent EJB定位EJB遠程接口,并與TravelAgent EJB進行交互,以創建Cabin實體并將其從數據庫中取出。下列代碼展示了一個Java應用程序,該程序新建了一個Cabin實體,設置其name、 deckLevel、shipId和bedCount成員屬性,然后再用主鍵對其進行定位。

  package com.titan.clients;

  import com.titan.travelagent.TravelAgentRemote;

  import com.titan.domain.Cabin;

  import javax.naming.InitialContext;

  import ntext;

  import javax.naming.NamingException;

  import java.util.Properties;

  import javax.rmi.PortableRemoteObject;

  public class Client {

  public static void main(String [] args) {

  try {

  Context jndiContext = getInitialContext( );

  Object ref = jndiContext.lookup( "TravelAgentBean/remote");

  TravelAgentRemote dao = (TravelAgentRemote)

  PortableRemoteObject.narrow(ref,TravelAgentRemote.class);

  Cabin cabin_1 = new Cabin( );

  cabin_1.setId(1);

  cabin_1.setName( "Master Suite");

  cabin_1.setDeckLevel(1);

  cabin_1.setShipId(1);

  cabin_1.setBedCount(3);

  dao.createCabin(cabin_1);

  Cabin cabin_2 = dao.findCabin(1);

  System.out.println(cabin_2.getName( ));

  System.out.println(cabin_2.getDeckLevel( ));

  System.out.println(cabin_2.getShipId( ));

  System.out.println(cabin_2.getBedCount( ));

  } catch (javax.naming.NamingException ne){ne.printStackTrace( );}

  }

  public static Context getInitialContext( )

  throws javax.naming.NamingException {

  Properties p = new Properties( );

  // ... 指定廠商專有的JNDI屬性

  return new javax.naming.InitialContext(p);

  }

  }

  為了訪問enterprise bean,客戶端首先使用JNDI獲得一個連向bean所在容器的目錄。JNDI是一組獨立于實現的API,用于目錄和命名系統。每家EJB廠商都必須提供一個與JNDI兼容的目錄服務。這意味著他們必須給出一個JNDI service provider(JNDI服務提供程序),即一段類似JDBC驅動的軟件代碼。不同的service provider與不同的目錄服務相連接,就如同JDBC一樣,不同的驅動程序與不同的關系數據庫相連接。getInitialContext方法使用JNDI來獲得一個指向EJB服務器的網絡連接。

  用于獲取JNDI上下文的代碼和你使用哪一家EJB廠商的產品有關。如何獲取與你所用的產品相配的JNDI上下文,請參考廠商文檔。例如,在WebSphere中用于獲取JNDI上下文的代碼可能類似如下。

  public static Context getInitialContext( )

  throws javax.naming.NamingException {

  java.util.Properties properties = new java.util.Properties( );

  properties.put(ntext.PROVIDER_URL, "iiop:///");

  properties.put(ntext.INITIAL_CONTEXT_FACTORY,

  "com.ibm.ejs.InitialContextFactory");

  return new InitialContext(properties);

  }

  而針對JBoss編寫的同一方法會有所不同。

  public static Context getInitialContext( )

  throws javax.naming.NamingException {

  Properties p = new Properties( );

  p.put(Context.INITIAL_CONTEXT_FACTORY,

  "org.jnp.interfaces.NamingContextFactory");

  p.put(Context.URL_PKG_PREFIXES,

  " org.jboss.naming:org.jnp.interfaces");

  p.put(Context.PROVIDER_URL, "jnp://localhost:1099");

  return new javax.naming.InitialContext(p);

  }

  一旦建立起JNDI連接,并且通過getInitialContext方法獲得了上下文,我們就可以利用上下文來查找TravelAgent EJB的遠程接口了。

  Object ref = jndiContext.lookup("TravelAgentBean/remote");

  在本書中,我們將始終為遠程客戶端應用程序使用形如“TravelAgentBean/remote”這樣的查找名稱。你所用的實際查找名稱或許有所不同,這依賴于廠商的要求。你需要把查找名稱綁定到EJB服務器的命名服務上,而有些廠商可能會要求一個特殊的目錄路徑,或者提供一個默認的綁定。

  如果使用標準的Java EE組件(Servlet、JSP、EJB或Java EE應用客戶端),無論你使用哪家EJB廠商的產品,在創建JNDI InitialContext時都不需要顯式的設置屬性。這是因為JNDI屬性可以在部署期間配置并被自動應用。一個Java EE組件會以如下方式獲得其InitialContext。

  public static Context getInitialContext( )

  throws javax.naming.NamingException {

  return new javax.naming.InitialContext( );

  }

  相比于為簡單Java客戶端手工配置JNDI屬性,這種方式更為簡單,也更易于移植。所有的Java EE組件都使用相同的JNDI命名系統,enterprise bean以此來查找任何服務。特別要指明的是,這些組件要求指向EJB的引用要與“java:comp/env/ejb/”名字空間綁定。例如,對于像 servlet這樣一個不同的Java EE組件而言,為了查找TravelAgent EJB,下面是我們所要做的全部工作。

  Object ref = jndiContext.lookup("java:comp/env/ejb/TravelAgentRemote");

  在部署期間,你要使用廠商的部署工具將JNDI名稱映射到TravelAgent EJB的遠程接口。在后續章節里,我們會看到使用特殊的注解可以將指向EJB的引用直接注入到bean class中。我們已經看到過這種方式的一個例子,即:將EntityManager服務注入到Travel- AgentBean類里。在本書中,Java客戶端應用程序需要使用顯式的參數來進行JNDI查找。作為替代方案,你也可以使用一種特殊的Java EE組件,叫做Java EE應用客戶端(Java EE Application Client),但是這類組件超出了本書的討論范圍。有關Java EE應用客戶端組件的更多信息可以參考Java EE 5的規范。

  客戶端應用程序使用PortableRemoteObject.narrow方法將Object ref窄化(narrow)成一個TravelAgentRemote引用。

  Object ref = jndiContext.lookup("TravelAgentRemote");

  CabinHomeRemote home = (TravelAgentRemote)

  PortableRemoteObject.narrow(ref,TravelAgentRemote.class);

  PortableRemoteObject.narrow方法在EJB 1.1中被首次引入,并繼續沿用于EJB 3.0的遠程客戶端。這需要支持基于IIOP之上的RMI。由于CORBA要支持許多不同的語言,而轉型并非CORBA的固有功能(一些語言沒有轉型概念)。因此,為了獲得一個指向TravelAgentRemote的遠程引用,我們必須顯示地對從lookup返回的對象進行窄化。

  用于查找TravelAgent EJB遠程接口的名稱,可以是特定于廠商的默認值,特定于廠商的注解,或部署描述文件。或者,如果EJB產品中帶有部署向導,還可以由部署人員使用向導來設置。JNDI的名稱完全取決于部署bean的人;可以與在XML部署描述文件中設定的bean名字相同,也可以截然不同。

相關文章

無相關信息
更新時間2023-01-10 12:27:04【至頂部↑】
江南財子®  聯系我們 | 郵件: | 客服熱線電話:4008816886 | 

付款方式留言簿投訴中心網站糾錯二維碼手機版

電話:
付款方式   |   給我留言   |   我要糾錯   |   聯系我們




主站蜘蛛池模板: 维罗尼卡| 搜狐手机首页| 在爱的名义下| 台风电影| 汉宣帝40集电视剧叫什么名| 电影《48天》免费观看全集| 分享视频| 卢昱晓电视剧| 浙江卫视节目表电视猫| 八下数学练习册答案| 激情豪放女| 爷爷的爷爷怎么称呼| 首映式| 重温经典频道节目表| kaori全部av作品大全| 1988田螺姑娘| 在线激情小视频| 姜洋| 炊事班的故事演员表| 别说我的眼泪你无所谓吉他谱| 当代大学德语2答案| 女同爱爱视频| 我的父亲是板凳 电视剧| 都市频道在线直播观看| 质量教育培训的首要内容是() (单选题) | 帕瓦德奥特曼| 拼音表| 午间剧场| 游泳池电影| 课课帮| 教育在线教育平台直播| 洛城僵尸| 黄连厚朴电影| lanarhoades最经典电影| 邓佳佳| 金靖星座| 电影《皮埃里诺》免费观看| 叶凯薇的视频| 英国经典电影| 桥梁工程师职称论文| 欠条怎么写才有法律效果|