开发EJB的客户端

因为EJB属于业务层,通常它要被客户端所调用

客户端类型可以是:J2SE J2EE J2ME

 

才用普通的JAVA类开发客户端:

新建 new一个Class 带有main()方法

 

客户端要调用EJB是要先通过JNDI去寻找EJB的承担对象

JNDI是用于访问命名目录的API,也是JAVA EE中的规范

 

开发EJB的客户端

这里编写的客户端程序完全可以部署在另外一台计算机上,只需要修改其中连接的服务器IP地址和启动JBOSS时绑定相应IP地址即可,这正事EJB的远程调用特性。
在37行返回的helloWorld实例对象并不是我们在服务器端编写的HelloworldBean,而是一个也实现了HelloWorld接口的代理对象,这个代理对象最终远程调用我们自己编写的HelloWorldBean,在第37行后加入了一行代码:System.out.println(helloWorld.getClass().getName()); 即可看到这个代理对象的类名

 

当EJB发布到JBOSS时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,JBOSS就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:

把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是:
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
EJB的接口实现类名(不加包名)
例:把HelloWorld应用打包成HelloWorld.jar文件,他的远程接口JNDI名称是:
HelloWorldBean/remote

 

把EJB作为模块打包进后缀名*.ear的JAVA EE企业应用文件,默认全局JNDI名称是:
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME作为EJB的非限定类名
例:把HelloWorld应用打包成HelloWorld.ear的企业应用文件,他的远程接口JNDI名称是:
HelloWorld/HelloWorldBean/remote

 

----------------------------------------------------------------

通过属性文件,设置JNDI的上下文信息:

把硬编码的代码,放到配置文件中

Properties props = new Properties();

props.setProperty("java.naming.factory.initial"
 ,"org.jnp.interfaces.NamingContextFactory");

props.setProperty("java.naming.provider.url", "localhost:1099");

就可以注释掉了

 

在项目src下新建File 名称为:jndi.properties

内容:

java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory
java.naming.provider.url = localhost:1099

保存,启动JBOSS后,运行客户端也可执行

 

在InitalContext cts = new InitalContext(); 时,其构造方法中默认从类路径下找jndi.properties文件

 

HelloWorld helloWorld = (HelloWorld)cts.lookup("HelloWorldBean/remote");

这句可能会报错,解决方案是:

查看EJB的JNDI

进入JBOSS的管理后台 http://localhost:8080/

开发EJB的客户端

点JMX Console,找到jboss,点service = JNDIView

开发EJB的客户端

这个服务提供了一个list()方法,点Invoke按钮,会列出JBOSS里面的资源

开发EJB的客户端
开发EJB的客户端

EJB部署后,生成的JNDI是在全局JNDI中(Global JNDI Namespace)

开发EJB的客户端

在其中找到EJB的JNDI名称,如果找到了则发布成功

 

也有可能是jar包出了问题,重新导jar包

猜你喜欢

转载自leon-s-kennedy.iteye.com/blog/1537122