射精一区欧美专区|国产精品66xx|亚洲视频一区导航|日韩欧美人妻精品中文|超碰婷婷xxnx|日韩无码综合激情|特级黄片一区二区|四虎日韩成人A√|久久精品内谢片|亚洲成a人无码电影

您現(xiàn)在的位置:首頁(yè) > IT認(rèn)證 > JAVA >

JavaBeans:創(chuàng)建客戶(hù)端應(yīng)用


  Cabin實(shí)體和 TravelAgent EJB已經(jīng)部署完畢,我們打算從遠(yuǎn)程客戶(hù)端對(duì)其進(jìn)行訪問(wèn)。本節(jié)中,我們會(huì)創(chuàng)建一個(gè)遠(yuǎn)程客戶(hù)端,連向EJB服務(wù)器,為T(mén)ravelAgent EJB定位EJB遠(yuǎn)程接口,并與TravelAgent EJB進(jìn)行交互,以創(chuàng)建Cabin實(shí)體并將其從數(shù)據(jù)庫(kù)中取出。下列代碼展示了一個(gè)Java應(yīng)用程序,該程序新建了一個(gè)Cabin實(shí)體,設(shè)置其name、 deckLevel、shipId和bedCount成員屬性,然后再用主鍵對(duì)其進(jìn)行定位。

  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( );

  // ... 指定廠商專(zhuān)有的JNDI屬性

  return new javax.naming.InitialContext(p);

  }

  }

  為了訪問(wèn)enterprise bean,客戶(hù)端首先使用JNDI獲得一個(gè)連向bean所在容器的目錄。JNDI是一組獨(dú)立于實(shí)現(xiàn)的API,用于目錄和命名系統(tǒng)。每家EJB廠商都必須提供一個(gè)與JNDI兼容的目錄服務(wù)。這意味著他們必須給出一個(gè)JNDI service provider(JNDI服務(wù)提供程序),即一段類(lèi)似JDBC驅(qū)動(dòng)的軟件代碼。不同的service provider與不同的目錄服務(wù)相連接,就如同JDBC一樣,不同的驅(qū)動(dòng)程序與不同的關(guān)系數(shù)據(jù)庫(kù)相連接。getInitialContext方法使用JNDI來(lái)獲得一個(gè)指向EJB服務(wù)器的網(wǎng)絡(luò)連接。

  用于獲取JNDI上下文的代碼和你使用哪一家EJB廠商的產(chǎn)品有關(guān)。如何獲取與你所用的產(chǎn)品相配的JNDI上下文,請(qǐng)參考廠商文檔。例如,在WebSphere中用于獲取JNDI上下文的代碼可能類(lèi)似如下。

  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);

  }

  而針對(duì)JBoss編寫(xiě)的同一方法會(huì)有所不同。

  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連接,并且通過(guò)getInitialContext方法獲得了上下文,我們就可以利用上下文來(lái)查找TravelAgent EJB的遠(yuǎn)程接口了。

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

  在本書(shū)中,我們將始終為遠(yuǎn)程客戶(hù)端應(yīng)用程序使用形如“TravelAgentBean/remote”這樣的查找名稱(chēng)。你所用的實(shí)際查找名稱(chēng)或許有所不同,這依賴(lài)于廠商的要求。你需要把查找名稱(chēng)綁定到EJB服務(wù)器的命名服務(wù)上,而有些廠商可能會(huì)要求一個(gè)特殊的目錄路徑,或者提供一個(gè)默認(rèn)的綁定。

  如果使用標(biāo)準(zhǔn)的Java EE組件(Servlet、JSP、EJB或Java EE應(yīng)用客戶(hù)端),無(wú)論你使用哪家EJB廠商的產(chǎn)品,在創(chuàng)建JNDI InitialContext時(shí)都不需要顯式的設(shè)置屬性。這是因?yàn)镴NDI屬性可以在部署期間配置并被自動(dòng)應(yīng)用。一個(gè)Java EE組件會(huì)以如下方式獲得其InitialContext。

  public static Context getInitialContext( )

  throws javax.naming.NamingException {

  return new javax.naming.InitialContext( );

  }

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

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

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

  客戶(hù)端應(yīng)用程序使用PortableRemoteObject.narrow方法將Object ref窄化(narrow)成一個(gè)TravelAgentRemote引用。

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

  CabinHomeRemote home = (TravelAgentRemote)

  PortableRemoteObject.narrow(ref,TravelAgentRemote.class);

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

  用于查找TravelAgent EJB遠(yuǎn)程接口的名稱(chēng),可以是特定于廠商的默認(rèn)值,特定于廠商的注解,或部署描述文件;蛘,如果EJB產(chǎn)品中帶有部署向?qū),還可以由部署人員使用向?qū)?lái)設(shè)置。JNDI的名稱(chēng)完全取決于部署bean的人;可以與在XML部署描述文件中設(shè)定的bean名字相同,也可以截然不同。

相關(guān)文章

無(wú)相關(guān)信息
更新時(shí)間2023-01-10 12:27:04【至頂部↑】
江南財(cái)子®  聯(lián)系我們 | 郵件: | 客服熱線電話(huà):4008816886 | 

付款方式留言簿投訴中心網(wǎng)站糾錯(cuò)二維碼手機(jī)版

電話(huà):
付款方式   |   給我留言   |   我要糾錯(cuò)   |   聯(lián)系我們