基于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
  • 1423

Java多线程应用开发(二)

多线程开发不仅提升了了程序执行的效率,更是大大解决了单线程中所无法解决的同步问题,那么多线程开发是不是真的像我们想象的那么完美呢?        最近两个星期一直在做多线程开发,期间用多线程达到了许...

PKI技术及应用开发指南

1 前言 随着网络技术和信息技术的发展,电子商务已逐步被人们所接受,并在得到不断普及。但由于各种原因,国内电子商务的安全性仍不能得到有效的保障。在常规业务中,交易双方现场交易,可以确认购买双方的身份...

android应用开发-从设计到实现 2-3 颜色的运用

颜色的运用Material Design采用的是扁平化的设计,可以看到一大块一大块区域的颜色。这些颜色大多亮丽引人,整个界面上搭配的颜色也不会太多,基本保持在三种颜色以内。“没有错误的颜色的,只有错误...

(热更新技术)高效率Hybird移动应用开发过程解决方案

前言作为一名移动应用开发者而言快速高效进行版本测试,是至关重要的,所以一直在探索一个解决方案,可以随时更新我们的逻辑代码,今天我们就来看一下,我是如何在项目中进行应用的。热更新这个名词很早就听说过,只...

大师之路解惑基础概念篇:Java Web应用开发中的一些概念

原文:http://developer.51cto.com/art/201005/201999.htm Java Web应用开发中的一些概念 学习Java Web开发。很多人喜欢直接上手去写...

Vaadin Web应用开发教程(10):UI组件-TextField

TextField文本框,可以接受用户输入文字。它实现Field接口,支持数据绑定。基本用法: // Create a text field TextField tf = new TextField...

android应用开发全程实录-你有多熟悉listview? .

本文版权归 csdn noTice501 所有,转载请详细标明原作者及出处,以示尊重! 作者:noTice501 原文:http://blog.csdn.net/notice520/art...

《安卓应用开发学习》仿锤子计算器(中)

在上文章《安卓应用开发学习》仿锤子计算器(上)

Win8 应用开发介绍(四)

Win8 应用开发介绍(四) Win8应用开发步骤 本文为Win8应用开发介绍系列的 Win8应用开发介绍(四) Win8应用开发步骤 1、应用开发步骤 Metro Style App开...
  • dotfun
  • dotfun
  • 2012-08-06 18:12
  • 1906
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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