java高级编程:基于JNDI的应用开发
发布时间:2025-05-24 12:38:20 发布人:远客网络
一、java高级编程:基于JNDI的应用开发
1、 JNDI(The Java Naming and Directory Interface Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API命名服务将名称和对象联系起来使得我们可以用名称访问对象目录服务是一种命名服务在这种服务里对象不但有名称还有属性
2、命名或目录服务使你可以集中存储共有信息这一点在网络应用中是重要的因为这使得这样的应用更协调更容易管理例如可以将打印机设置存储在目录服务中以便被与打印机有关的应用使用
3、本文用代码示例的方式给出了一个快速教程使你可以开始使用JNDI它
4、 l提供了JNDI概述 l描述了JNDI的特点 l体验了一下用JNDI开发应用 l表明了如何利用JNDI访问LDAP服务器例如 Sun ONE目录服务器 l表明了如何利用JNDI访问J EE服务 l提供了示例代码你可以将其改编为自己的应用
5、我们大家每天都不知不觉地使用了命名服务例如当你在web浏览器输入URL时 DNS(Domain Name System域名系统)将这个符号URL名转换成通讯标识(IP地址)命名系统中的对象可以是DNS记录中的名称应用服务器中的EJB组件(Enterprise JavaBeans Component) LDAP(Ligheight Directory Access Protocol)中的用户Profile
6、目录服务是命名服务的自然扩展两者之间的关键差别是目录服务中对象可以有属性(例如用户有email地址)而命名服务中对象没有属性因此在目录服务中你可以根据属性搜索对象 JNDI允许你访问文件系统中的文件定位远程RMI注册的对象访问象LDAP这样的目录服务定位网络上的EJB组件
7、对于象LDAP客户端应用launcher类浏览器网络管理实用程序甚至地址薄这样的应用来说 JNDI是一个很好的选择
8、 JNDI架构提供了一组标准的独立于命名系统的API这些API构建在与命名系统有关的驱动之上这一层有助于将应用与实际数据源分离因此不管应用访问的是LDAP RMI DNS还是其他的目录服务换句话说 JNDI独立于目录服务的具体实现只要你有目录的服务提供接口(或驱动)你就可以使用目录如图所示图 JNDI架构
9、关于JNDI要注意的重要一点是它提供了应用编程接口(application programming interface API)和服务提供者接口(service provider interface SPI)这一点的真正含义是要让你的应用与命名服务或目录服务交互必须有这个服务的JNDI服务提供者这正是JNDI SPI发挥作用的地方服务提供者基本上是一组类这些类为各种具体的命名和目录服务实现了JNDI接口?很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样作为一个应用开发者你不必操心JNDI SPI你只需要确认你要使用的每一个命名或目录服务都有服务提供者
10、 Java SDK及以上的版本包含了JNDI对于JDK和也有一个标准的扩展 Java SDK x的最新版本包括了几个增强和下面的命名/目录服务提供者
11、 l LDAP(Ligheight Directory Access Protocol)服务提供者 l CORBA COS(Common Object Request Broker Architecture Common Object Services)命名服务提供者 l RMI(Java Remote Method Invocation)注册服务提供者 l DNS(Domain Name System)服务提供者
12、可以在如下网址找到可以下载的服务提供者列表
13、特别有意思的或许是如下网址提供的Windows注册表JNDI服务提供者这个服务提供者使你可以访问Windows XP//NT/Me/ x的windows注册表
14、也可以在如下网址下载JNDI/LDAP Booster Pack这个Booster Pack包含了对流行的LDAP控制的支持和扩展它代替了与LDAP服务提供者捆绑在一起的booster pack关于控制和扩展的更多信息可以在如下网站看到另一个有趣的服务提供者是Sun的支持DSML v(Directory Service Markup Language目录服务标记语言)的服务提供者 DSML的目的是在目录服务和XML之间架起一座桥梁
15、 l Javax naming包含了访问命名服务的类和接口例如它定义了Context接口这是命名服务执行查询的入口 l Javax naming directory对命名包的扩充提供了访问目录服务的类和接口例如它为属性增加了新的类提供了表示目录上下文的DirContext接口定义了检查和更新目录对象的属性的方法 l Javax naming event提供了对访问命名和目录服务时的时间通知的支持例如定义了NamingEvent类这个类用来表示命名/目录服务产生的事件定义了侦听NamingEvents的NamingListener接口 l Javax naming ldap这个包提供了对LDAP版本扩充的操作和控制的支持通用包javax naming directory没有包含这些操作和控制 l Javax naming spi这个包提供了一个方法通过javax naming和有关包动态增加对访问命名和目录服务的支持这个包是为有兴趣创建服务提供者的开发者提供的
16、正如在前面提到的命名服务将名称和对象联系起来这种联系称之为绑定(binding)一组这样的绑定称之为上下文(context)上下文提供了解析(即返回对象的查找操作)其他操作包括名称的绑定和取消绑定列出绑定的名称注意到一个上下文对象的名称可以绑定到有同样的命名约定的另一个上下文对象这称之为子上下文例如如果UNIX中目录/home是一个上下文那么相对于这个目录的子目录就是子上下文?例如/home/guests中guests就是home的子上下文在JNDI中上下文用接口javax naming Context表示这个接口是与命名服务交互的关键接口在Context(或稍后讨论的
17、 DirContext)接口中的每一个命名方法都有两种重载形式
18、 l Lookup(String name)接受串名 l Lookup(javax naming Name)接受结构名例如 CompositeName(跨越了多个命名系统的名称)或CompondName(单个命名系统中的名称)它们都实现了Name接口 Compound name的一个例子是 cn=mydir cn=Q Mahmoud ou=People posite name的一个例子是 cn=mydir cn=Q Mahmoud ou=People/myfiles/max txt(这里 myfiles/max txt是表示第二部分的文件名) Javax naming InitialContext是实现了Context接口的类用这个类作为命名服务的入口为了创建InitialContext对象构造器以java util Hashtable或者是其子类(例如 Properties)的形式设置一组属性下面给出了一个例子
19、 Hashtable env= new Hashtable()// select a service provider factory env put(Context INITIAL_CONTEXT_FACTORY sun jndi fscontext RefFSContext)// create the initial context Context contxt= new InitialContext(env)
20、 INITIAL_CONTEXT_FACTORY指定了JNDI服务提供者中工厂类(factory class)的名称 Factory负责为其服务创建适当的InitialContext对象在上面的代码片断中为文件系统服务提供者指定了工厂类表给出了所支持的服务提供者的工厂类要注意的是文件系统服务提供者的工厂类需要从Sun公司单独下载 J SE x没有包含这些类
21、表上下文INITIAL_CONTEXT_FACTORY的值 Name Service Provider Factory File System sun jndi fscontext RefFSContextFactory LDAP sun jndi ldap LdapCtxFactory RMI sun jndi rmi registry RegistryContextFactory CORBA snaming CNCtxFactory DNS sun jndi dns DnsContextFactory
二、ejb和jboss 的jndi都是什么意思
以前没这样用过,不过看上去,它像是 EJB3引入了注解自动填充 EJB引用后的一种 JBoss特有的表示方式。这个应该是默认的我们部署描述符文件中没有指定 JNDI绑定时的情况。
我觉得如果你是在 web项目中引用同一个 EAR项目内的某个 EJB时应该不需要明确地写出这些东西,因为我们是通过 annotation来做到的,既然 JBoss自动把 EJB部署到这些形式古怪的 JNDI下,那么我们用 annotation它也应该能通过类名就找到正确的 EJB,不需要我们配置 JNDI。
你启动时 JBoss在控制台上显示了什么 binding JNDI信息?这个是什么版本的 JBoss?
SecurityTraceability_EAR_1.0_Alpha这个是 EAR名字?
SecurityTraceability_Core_1.0_Alpha这是一个 EJB session bean名字还是 EJB jar包名字?
我猜想的,menuEao!com.ampthon.st.eao.MenuEao可能是对应着:
publicclassMenuEaoImplimplementsMenuEao{
}
至于是不是对,其实你启动 JBoss时控制台会显示这些信息的,我之前和 JBoss 6时就能看到部署一个 EAR/EJB后这些 JNDI绑定会列出来的,我们对照着看,就知道它把哪个 EJB绑定到哪个 JNDI下,然后添加的 EJB引用又绑定到哪个 JNDI下。
至于是不是对,其实你启动 JBoss时控制台会显示这些信息的,我之前和 JBoss 6时就能看到部署一个 EAR/EJB后这些 JNDI绑定会列出来的,我们对照着看,就知道它把哪个 EJB绑定到哪个 JNDI下,然后添加的 EJB引用又绑定到哪个 JNDI下。
我觉得如果从容器外界远程访问,可能是使用 global这种形式的,只不过,这种形式虽然是 JBoss的表示方式,但一般我们可以明确地要求给出一个固定的 JNDI而不是让 JBoss自动生成一个自己想当然的又让人很难猜测的JNDI,比如在@Stateless中使用 mappedName(是这个用途么?以前我都是手写部署描述符,不知道 annotation是怎么自动省掉的)或者自己手写一份 jboss.xml放到 META-INF目录下,里面写上 ejb部署描述符来配置JNDI和各种引用,这一样一来让程序尽可能地通用一点,把这些跟服务器环境相关的差异独立出来,让我们的代码不需要重新编译就可以通过修改配置描述符 xml文件后部署到不同供应商的服务器上(xml部署描述符虽然是代码的一部分,但很多服务器都在部署时提供一个部署向导到定制这些配置,因此代码不需要修改)。
三、jndi是什么
JNDI是 Java命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,是一组在Java应用中访问命名和目录服务的API,是SUN公司提供的一种标准的Java命名系统接口,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。