基于JNDI的应用开发

转载 2006年06月02日 10:49:00
<P>感谢译者的辛勤工作,请大家参加Matrix的翻译计划:<BR><A href="http://www.matrix.org.cn/translation/Wiki.jsp?page=Main">http://www.matrix.org.cn/translation/Wiki.jsp?page=Main</A><BR><BR>基于JNDI的应用开发
<P>JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。 </P>
<P>命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用。 </P>
<P>本文用代码示例的方式给出了一个快速教程,使你可以开始使用JNDI。它: </P>
<P>l 提供了JNDI概述 l 描述了JNDI的特点 l 体验了一下用JNDI开发应用 l 表明了如何利用JNDI访问LDAP服务器,例如,Sun ONE 目录服务器 l 表明了如何利用JNDI访问J2EE服务 l 提供了示例代码,你可以将其改编为自己的应用 </P>
<P>JNDI概述 </P>
<P>我们大家每天都不知不觉地使用了命名服务。例如,当你在web浏览器输入URL,http://java.sun.com时,DNS(Domain Name System,域名系统)将这个符号URL名转换成通讯标识(IP地址)。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。 </P>
<P>目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性(例如,用户有email地址),而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。 </P>
<P>对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址薄这样的应用来说,JNDI是一个很好的选择。 </P>
<P>JNDI架构 </P>
<P>JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,因此不管应用访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要你有目录的服务提供接口(或驱动),你就可以使用目录。如图1所示。 图1:JNDI架构 </P>
<P>关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让你的应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很象JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,你不必操心JNDI SPI。你只需要确认你要使用的每一个命名或目录服务都有服务提供者。 </P>
<P>J2SE和JNDI </P>
<P>Java 2 SDK 1.3及以上的版本包含了JNDI。对于JDK 1.1和1.2也有一个标准的扩展。Java 2 SDK 1.4.x的最新版本包括了几个增强和下面的命名/目录服务提供者: </P>
<P>l LDAP(Lightweight 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)服务提供者 </P>
<P>更多的服务提供者 </P>
<P>可以在如下网址找到可以下载的服务提供者列表:http://java.sun.com/products/jndi/serviceproviders.html 特别有意思的或许是如下网址提供的Windows 注册表JNDI服务提供者:http://cogentlogic.com/cocoon/CogentLogicCorporation/JNDI.xml 这个服务提供者使你可以访问Windows XP/2000/NT/Me/9x的windows注册表。也可以在如下网址下载JNDI/LDAP Booster Pack:http://java.sun.com/products/jndi/ 这个Booster Pack包含了对流行的LDAP控制的支持和扩展。它代替了与LDAP 1.2.1服务提供者捆绑在一起的booster pack。关于控制和扩展的更多信息可以在如下网站看到: http://java.sun.com/products/jndi/tutorial/ldap/ext/index.html 另一个有趣的服务提供者是Sun的支持DSML v2.0(Directory Service Markup Language,目录服务标记语言)的服务提供者。DSML的目的是在目录服务和XML之间架起一座桥梁。 </P>
<P>JNDI API </P>
<P>JNDI API由5个包组成: </P>
<P>l Javax.naming:包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。 l Javax.naming.directory:对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。 l Javax.naming.event:提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。 l Javax.naming.ldap:这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。 l Javax.naming.spi:这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。 </P>
<P>JNDI 上下文 </P>
<P>正如在前面提到的,命名服务将名称和对象联系起来。这种联系称之为绑定(binding)。一组这样的绑定称之为上下文(context),上下文提供了解析(即返回对象的查找操作)。其他操作包括:名称的绑定和取消绑定,列出绑定的名称。注意到一个上下文对象的名称可以绑定到有同样的命名约定的另一个上下文对象。这称之为子上下文。例如,如果UNIX中目录/home是一个上下文,那么相对于这个目录的子目录就是子上下文—例如,/home/guests中guests就是home的子上下文。在JNDI中,上下文用接口javax.naming.Context表示,这个接口是与命名服务交互的关键接口。在Context(或稍后讨论的 </P>
<P>DirContext)接口中的每一个命名方法都有两种重载形式: </P>
<P>l Lookup(String name):接受串名 l Lookup(javax.naming.Name):接受结构名,例如,CompositeName(跨越了多个命名系统的名称)或CompondName(单个命名系统中的名称);它们都实现了Name接口。Compound name的一个例子是:cn=mydir,cn=Q Mahmoud,ou=People,composite name的一个例子是:cn=mydir,cn=Q Mahmoud,ou=People/myfiles/max.txt(这里,myfiles/max.txt是表示第二部分的文件名) Javax.naming.InitialContext是实现了Context接口的类。用这个类作为命名服务的入口。为了创建InitialContext对象,构造器以java.util.Hashtable或者是其子类(例如,Properties)的形式设置一组属性。下面给出了一个例子: </P>
<P>Hashtable env = new Hashtable(); // select a service provider factory env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContext"); // create the initial context Context contxt = new InitialContext(env); </P>
<P>INITIAL_CONTEXT_FACTORY指定了JNDI服务提供者中工厂类(factory class)的名称。Factory负责为其服务创建适当的InitialContext对象。在上面的代码片断中,为文件系统服务提供者指定了工厂类。表1给出了所支持的服务提供者的工厂类。要注意的是文件系统服务提供者的工厂类需要从Sun公司单独下载,J2SE 1.4.x没有包含这些类。 </P>
<P></P>
<P></P>
<P>表1:上下文INITIAL_CONTEXT_FACTORY的值 Name Service Provider Factory File System com.sun.jndi.fscontext.RefFSContextFactory LDAP com.sun.jndi.ldap.LdapCtxFactory RMI com.sun.jndi.rmi.registry.RegistryContextFactory CORBA com.sun.jndi.cosnaming.CNCtxFactory DNS com.sun.jndi.dns.DnsContextFactory </P>
<P>为了用名称从命名服务或目录中取得或解析对象,使用Context的lookup方法:Object obj=contxt.lookup(name)。Lookup方法返回一个对象,这个对象表示的是你想要找的上下文的儿子。 </P>
<P></P>
<P>更多的信息 </P>
<P><U>LDAP v3 </U><A href="http://www.matrix.org.cn/translation/Edit.jsp?page=LDAPV3">?</A> </P>
<P><A class=external href="http://java.sun.com/products/jndi">JNDI</A><IMG class=outlink alt="" src="http://www.matrix.org.cn/translation/images/out.png"> </P>
<P>The JNDI Tutorial </P>
<P>JNDI Service Providers </P>
<P>Sun ONE Directory Server </P>
<P>JNDI-INTEREST Mailing List (for discussing JNDI) </P>

eclipse环境下使用runjetty配置jndi数据源开发web应用

eclipse环境下使用runjetty配置jndi数据源开发web应用 1、安装runjetty http://code.google.com/p/run-jetty-run/ 2、在web工程...
  • xxjin
  • xxjin
  • 2013年12月03日 17:20
  • 1522

JNDI的应用

  • 2013年04月03日 17:05
  • 242KB
  • 下载

Chrome扩展及应用开发 入门笔记(二)跨域请求

manifest.json: 文件可以告诉Chrome关于这个扩展的相关信息,它是整个扩展的入口,也是Chrome扩展必不可少的部分 注: Google的官方文档中对于扩展和应用给出了两个不同的M...

图解框架-跨平台应用开发方案

前言 各种本地框架(比如android的java api,iphone的#C api)对应用开发者来说,绝对不是那么好伺候的大爷。如果开发者需要为一款应用开发Android和IPhone两个版本,如...

Android应用开发--MP3音乐播放器滚动歌词实现

Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简、美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先...
  • wwj_748
  • wwj_748
  • 2013年06月02日 15:56
  • 32329

物联网需要什么样的应用开发语言?

目前来说,是没有一套专门面向物联网应用开发的语言的,这不利于推动物联网的大发展,因此,必须要选择一种适合物联网特点的开发语言。下面我们结合物联网本身的特征,分析物联网对应用开发语言的要求。然后感觉这些...

IOS应用开发之图片上传

本人还是个IOS小白,刚刚接触到一个图片上传的问题,困扰了三天,最后终得以领悟其中精髓。废话不多说,直接上代码 NSURL *url = [NSURL URLWithString:@"http...

【Android应用开发】-Android 串口编程原理和实现方式

提到串口编程,就不得不提到JNI,不得不提到JavaAPI中的文件描述符类:FileDescriptor。下面我分别对JNI、FileDescriptor以及串口的一些知识点和实现的源码进行分析说明。...

【Android 应用开发】GitHub 优秀的 Android 开源项目

原文地址为http://www.trinea.cn/android/android-open-source-projects-view/,作者Trinea 主要介绍那些不错个性化的V...

(c++)web应用开发框架简单对比

TreeFrog 基本情况 介绍 特性 安装 tufao 基本情况 介绍 它的特点 安装 CppCMS 基本情况 介绍 安装要求 Cinatra 基本情况 介绍 如何使用 TreeFrog基本情况项目...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于JNDI的应用开发
举报原因:
原因补充:

(最多只允许输入30个字)