`
阅读更多

关于JNDI and EJB

JNDI (The Java Naming and Directory Interface,Java 命名和目录接口) 是一组在Java 应用中访问命名和目录服务的API。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。

 

命名服务:就像DNS一样,通过命名服务器提供服务,大部分的J2EE 服务器都含有命名服务器。

 

目录服务:一种简化的RDBMS 系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软ACTIVE DIRECTORY 等。

 

JNDI 的好处:

(1)包含大量命名和目录服务,可以使用相同API 调用访问任何命名或目录服务。

(2)可以同时连接多个命名和目录服务。

(3)允许把名称同JAVA 对象或资源关联起来,不必知道对象或资源的物理ID。

(4)使用通用接口访问不同种类的目录服务

(5)使得开发人员能够集中使用和实现一种类型的命名或目录服务客户API 上。

 

上下文:由0 或多个绑定构成。比如java/MySql,java 为上下文(context),MySql 为命名

 

子上下文(subConext):上下文下的上下文。比如MyJNDITree/ejb/helloBean,ejb 为子上下文。

 

因为JNDI 是一组接口,所以我们只需根据接口规范编程就可以。要通过JNDI 进行资源访问,我们必须设置初始化上下文的参数,主要是设置JNDI 驱动的类名(java.naming.factory.initial) 和提供命名服务的URL (java.naming.provider.url)。

 

因为Jndi 的实现产品有很多。所以java.naming.factory.initial 的值因提供JNDI 服务器的不同而不同,java.naming.provider.url 的值包括提供命名服务的主机地址和端口号。

 

访问Jboss 服务器的例子代码:

Properties props = new Properties();

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

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

InitialContext = new InitialContext(props);

HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");

 

 

访问Sun 应用服务器的例子代码:

Properties props = new Properties();

props.setProperty("java.naming.factory.initial",

"com.sun.enterprise.naming.SerialInitContextFactory");

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

InitialContext = new InitialContext(props);

HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");

 

 

访问Weblogic10 应用服务器的例子代码:

Properties props = new Properties();

props.setProperty("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");

props.setProperty("java.naming.provider.url", "t3://localhost:7001");

InitialContext = new InitialContext(props);

HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld");

 

JBOSS 环境下JNDI 树的命名约定:

(1)java:copm 这个上下文环境和其子上下文环境仅能被与之相关的特定应用组件访问和使用

(2)java: 子上下文环境和绑定的对象只能被Jboss 服务器虚拟机内的应用访问

(3)其他上下文环境 只要实现序列化就可以被远程用户调用。

 

 

当你把EJB发布到JBOSS后,你就可以在jboss 的管理平台查看她们的JNDI 名,输入下面URL http://localhost:8080/jmx-console/,点击“service=JNDIView” link,在出现的page里找到“List of MBean operations:”栏的“list()”方法,click “Invoke”button,就会看到下面的界面

 

在上图中可以看见HelloWorld 会话Bean 的JNDI路径,JNDI 路径名的组成规则是“上层名称/下层名称,每层之间以”/”分隔。HelloWorld 会话Bean 的JNDI路径名是:HelloWorldBean/remote

 

 

下面要重点说明一下Jboss EJB JNDI 名称默认的命名规则,命名规则如下:

1> 如果EJB 打包进后缀为*.ear 的J2EE 发布文件,默认的JNDI 路径名称是

访问本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local

访问远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote

例:EJB HelloWorld 打包进名为 HelloWorld.ear 的J2EE 应用,访问她远程接口的JNDI 名是:HelloWorld/HelloWorldBean/remote

 

2> 如果EJB 应用打包成后缀为*.jar 的发布文件, 默认的JNDI 路径名称是

访问本地接口:EJB-CLASS-NAME/local

访问远程接口:EJB-CLASS-NAME/remote

例: HelloWorld 应用打包成HelloWorld.jar 文件,访问她远程接口的JNDI 名称是:HelloWorldBean/remote

 

注意:EJB-CLASS-NAME 是不带包名的,如com.foshanshop.ejb3.impl.HelloWorldBean 只需取HelloWorldBean。

 

目前网上很多教材获取JNDI 路径名的方式不适用在jboss 下,如:

HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName());

这种方式适用于Sun Application Server 及glassfish

 

 

 

自定义JNDI 命名

默认的JNDI 命名规则上面已经介绍过,但有些情况下需要自定义名称。在Jboss 中要自定义JNDI 名称,可以使用@LocalBinding 和@RemoteBinding 注释

 

关键代码(只需要在bean interface前加binding注释):

import org.jboss.annotation.ejb.RemoteBinding;

...

@Remote

@RemoteBinding (jndiBinding="testbinding/myAccount")

publicinterface MyAccount extends Serializable {

    publicint Add(int a, int b);

    publicint getResult() ;

}

 

那么在client端调用上面的EJB的代码为:

InitialContext ctx = new InitialContext(props);

MyAccount bean1 = (MyAccount) ctx.lookup("testbinding/myAccount");

 


分享到:
评论

相关推荐

    Java EJB简单例子.rar

    Java EJB简单例子,这是HelloWorldBean的Home接口,它是EJB对象的生成库,无状态会话(将在下一个实例中具体讲解)Bean,这个接口是客户端与EJB对象相互作用的中间途径,通过Client触发调用Bean方法:  try {  //...

    Java EJB中有、无状态SessionBean的两个例子

    Java EJB中有、无状态SessionBean的两个例子,的无状态SessionBean可,会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;  在有状态SessionBean中,用累加...

    EJB 模拟银行ATM流程及操作源代码

    个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕...

    Java B-S结构EJB用法例子.rar

    Java B-S结构EJB用法例子,在JSP页面中,为初始化上下文获得一个系统属性对象,初始化并得到一个上下文,查询jndi名,通过强制转型得到Home接口,得到远程接口的引用,JSP调用EJB的例子。

    JAVA上百实例源码以及开源项目源代码

    Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    8.10 配置EJB引用 340 8.11 使用计时器进行任务调度 342 8.12 本章小结 345 第9章 消息驱动EJB 346 9.1 JMS和EJB 347 9.1.1 为什么使用MDB 347 9.1.2 使用MDB的设计原则 348 9.2 使用消息驱动Bean 349 9.2.1 使用@...

    JAVA上百实例源码以及开源项目源代码 java开源包2

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    ejbCreate函数用于初始化一个EJB实例

    创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的...

    JSP+Servlet+EJB3.0+Oracle10g火车售票系统

    使用JNDI得到已经注册到WEB容器上的数据源,EJB的引用。 2.合理使用From表单进行隐藏信息的提交;使用分页技术将从数据库中搜索出的记录分页显示,提高系统性能。 3.选择Oracle数据库通过SQL语句建立表,插入相关的...

    Java C-S结构EJB实例.rar

    Java C-S结构EJB实例,在...创建一个访问EJB的客户端应用程序,得到名字上下文,查询jndi名,通过强制转型得到Home接口,用client的getHome()函数调用Home接口函数得到远程接口的引用 ,用远程接口的引用访问EJB。

    TXT文件等分切割器

    可以把txt文本文档切割成小的等分,切割TXT文件

    J2EE中文版指南 CHM格式 带全文检索

    在deploytool中配置资源引用 239 二.数据库连接 241 获得连接 241 用deploytool指定数据库用户名和密码 242 连接池 243 三.邮件服务连接 243 运行ConfirmerEJB例子 244 四.URL资源连接 245 运行HTMLReaderEJB例子...

Global site tag (gtag.js) - Google Analytics