第一篇:JavaWEB经验总结之EJB3.0与JNDI的实际结合使用及EJB的客户端开发
客户端(xxxClient)要调用EJB,它需要通过JNDI去寻找EJB的存根代理对象
下面是一个简单的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”);
“localhost:1099”);System.out.println(helloWorld.sayHello(“电子科大”));} catch(NamingExceptione){
} // TODO: handle exception
System.out.println(e.getMessage());其中,红色突出部分代码就是用于设置JNDI的上下文信使。
props.setProperty(“java.naming.factory.inital”,这句代码用于设置JNDI的链接工厂,第一个参数,是固定的写法,有JNDI规范所规定,第二个参数就是JBoss的链接工厂; 于是,JNDI通过这个链接工厂就可以和JBoss进行通信了;
props.setProperty(“java.naming.provider.url”, “localhost:1099”);这句代码用于设置命名服务器的链接URL 第一个参数是固定的写法,有JNDI规范所规定,第二个参数就是JBoss的连接字符串 JNDI通过JBoss的连接字符串就可以知道JBoss它所在的地址,还有它所使用的端口号
“org.jnp.interfaces.NamingContextFactory”);如果访问不同的服务器,那两句代码设置的参数值也是不一样的设置完JNDI的上下文信息后,就可以调用它的lookup方法,根据EJB的JNDI名称(“HelloWorldBean/remote”),去寻找与这个名称绑定(Bind)的EJB代理存根对象,找到代理存根对象之后,他就可以返回到客户端(Client)。在客户端,通过接口文件去引用这个代理存根对象
HelloWorld helloWorld =(HelloWorld)ctx
.lookup(“HelloWorldBean/remote”);通过这个这个代理对象(helloWorld)就可以调用EJB的业务方法。
疑问:如何知道EJB的JNDI名称?
速度当EJB部署到JBoss应用服务器的时候,JBoss服务器可以为EJB默认生成一个JNDI名称
默认生成JNDI名称的规则
注意事项:
Properties props = newProperties();
props.setProperty(“java.naming.factory.inital”,“org.jnp.interfaces.NamingContextFactory”);props.setProperty(“java.naming.provider.url”, “localhost:1099”);用这种方式来设置JNDI的上下文信息,属于“硬编码”设置,也可以通过一个属性文件(xxx.properties)来设置JNDI的上下文信使
通过属性文件来设置JNDI的上下文信使的方法:
在项目的类路径下建立一个名叫JNDI的属性文件(JNDI.properties)(也可以在源目录(src)下建,因为在源目录下建也是可以编译到项目的类路径下)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这个对象的时候,在InitialContext的构造函数内部他在项目的类路径下寻找这个属性文件 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());