第一篇:JavaWEB經(jīng)驗(yàn)總結(jié)之EJB3.0與JNDI的實(shí)際結(jié)合使用及EJB的客戶端開(kāi)發(fā)
客戶端(xxxClient)要調(diào)用EJB,它需要通過(guò)JNDI去尋找EJB的存根代理對(duì)象
下面是一個(gè)簡(jiǎn)單的EJBClient.java代碼
packagecom.zuijiajiao.Servlab.HelloWorld.test;
importjava.util.Properties;
importjavax.naming.InitialContext;importjavax.naming.NamingException;
importcom.zuijiajiao.Servlab.HelloWorld.HelloWorld;
publicclassEJBClient {
} publicstaticvoid main(String[] args){
} Properties props = newProperties();
props.setProperty(“java.naming.factory.inital”,“org.jnp.interfaces.NamingContextFactory”);props.setProperty(“java.naming.provider.url”, try {
InitialContextctx = newInitialContext(props);HelloWorld helloWorld =(HelloWorld)ctx.lookup(“HelloWorldBean/remote”);
“l(fā)ocalhost:1099”);System.out.println(helloWorld.sayHello(“電子科大”));} catch(NamingExceptione){
} // TODO: handle exception
System.out.println(e.getMessage());其中,紅色突出部分代碼就是用于設(shè)置JNDI的上下文信使。
props.setProperty(“java.naming.factory.inital”,這句代碼用于設(shè)置JNDI的鏈接工廠,第一個(gè)參數(shù),是固定的寫法,有JNDI規(guī)范所規(guī)定,第二個(gè)參數(shù)就是JBoss的鏈接工廠; 于是,JNDI通過(guò)這個(gè)鏈接工廠就可以和JBoss進(jìn)行通信了;
props.setProperty(“java.naming.provider.url”, “l(fā)ocalhost:1099”);這句代碼用于設(shè)置命名服務(wù)器的鏈接URL 第一個(gè)參數(shù)是固定的寫法,有JNDI規(guī)范所規(guī)定,第二個(gè)參數(shù)就是JBoss的連接字符串 JNDI通過(guò)JBoss的連接字符串就可以知道JBoss它所在的地址,還有它所使用的端口號(hào)
“org.jnp.interfaces.NamingContextFactory”);如果訪問(wèn)不同的服務(wù)器,那兩句代碼設(shè)置的參數(shù)值也是不一樣的設(shè)置完JNDI的上下文信息后,就可以調(diào)用它的lookup方法,根據(jù)EJB的JNDI名稱(“HelloWorldBean/remote”),去尋找與這個(gè)名稱綁定(Bind)的EJB代理存根對(duì)象,找到代理存根對(duì)象之后,他就可以返回到客戶端(Client)。在客戶端,通過(guò)接口文件去引用這個(gè)代理存根對(duì)象
HelloWorld helloWorld =(HelloWorld)ctx
.lookup(“HelloWorldBean/remote”);通過(guò)這個(gè)這個(gè)代理對(duì)象(helloWorld)就可以調(diào)用EJB的業(yè)務(wù)方法。
疑問(wèn):如何知道EJB的JNDI名稱?
速度當(dāng)EJB部署到JBoss應(yīng)用服務(wù)器的時(shí)候,JBoss服務(wù)器可以為EJB默認(rèn)生成一個(gè)JNDI名稱
默認(rèn)生成JNDI名稱的規(guī)則
注意事項(xiàng):
Properties props = newProperties();
props.setProperty(“java.naming.factory.inital”,“org.jnp.interfaces.NamingContextFactory”);props.setProperty(“java.naming.provider.url”, “l(fā)ocalhost:1099”);用這種方式來(lái)設(shè)置JNDI的上下文信息,屬于“硬編碼”設(shè)置,也可以通過(guò)一個(gè)屬性文件(xxx.properties)來(lái)設(shè)置JNDI的上下文信使
通過(guò)屬性文件來(lái)設(shè)置JNDI的上下文信使的方法:
在項(xiàng)目的類路徑下建立一個(gè)名叫JNDI的屬性文件(JNDI.properties)(也可以在源目錄(src)下建,因?yàn)樵谠茨夸浵陆ㄒ彩强梢跃幾g到項(xiàng)目的類路徑下)JNDI屬性文件代碼如下
java.naming.factory.inital = org.jnp.interfaces.NamingContextFactory java.naming.provider.url = localhost:1099
有了屬性文件之后,代碼就可以這樣寫了
packagecom.zuijiajiao.Servlab.HelloWorld.test;
importjava.util.Properties;
importjavax.naming.InitialContext;importjavax.naming.NamingException;
importcom.zuijiajiao.Servlab.HelloWorld.HelloWorld;
publicclassEJBClient {
}
原理:
InitialContextctx = newInitialContext();
在new InitialContext這個(gè)對(duì)象的時(shí)候,在InitialContext的構(gòu)造函數(shù)內(nèi)部他在項(xiàng)目的類路徑下尋找這個(gè)屬性文件 publicstaticvoid main(String[] args){
} try {
InitialContextctx = newInitialContext();HelloWorld helloWorld =(HelloWorld)ctx.lookup(“HelloWorldBean/remote”);
System.out.println(helloWorld.sayHello(“電子科大”));} catch(NamingExceptione){
} // TODO: handle exception
System.out.println(e.getMessage());