﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-arron-文章分类-JNDI</title><link>http://www.blogjava.net/arron/category/42047.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 11 Oct 2009 17:06:03 GMT</lastBuildDate><pubDate>Sun, 11 Oct 2009 17:06:03 GMT</pubDate><ttl>60</ttl><item><title>JNDI</title><link>http://www.blogjava.net/arron/articles/297701.html</link><dc:creator>日月龙湘</dc:creator><author>日月龙湘</author><pubDate>Sat, 10 Oct 2009 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/arron/articles/297701.html</guid><wfw:comment>http://www.blogjava.net/arron/comments/297701.html</wfw:comment><comments>http://www.blogjava.net/arron/articles/297701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/arron/comments/commentRss/297701.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/arron/services/trackbacks/297701.html</trackback:ping><description><![CDATA[<h1>JNDI</h1>
Java术语<br />
英文全称是:Java Naming and Directory Interface<br />
术语解释：一组帮助做多个命名和目录服务接口的API。<br />
JNDI(Java Naming and Directory
Interface)是SUN公司提供的一种标准的Java命名系统接口，JNDI提供统一的客户端API，通过不同的访问提供者接口JNDI
SPI的实现，由管理者将JNDI
API映射为特定的命名服务和目录系统，使得Java应用程序可以和这些命名服务和目录服务之间进行交互。集群JNDI实现了高可靠性JNDI[8]，通
过服务器的集群，保证了JNDI的负载平衡和错误恢复。在全局共享的方式下，集群中的一个应用服务器保证本地JNDI树的独立性，并拥有全局的JNDI
树。每个应用服务器在把部署的服务对象绑定到自己本地的JNDI树的同时，还绑定到一个共享的全局JNDI树，实现全局JNDI和自身JNDI的联系。<br />
JNDI(Java Naming and Directory Interface)是一个应用程序设计的API，为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口，类似JDBC都是构建在抽象层上。<br />
JNDI可访问的现有的目录及服务有：<br />
DNS、XNam 、Novell目录服务、LDAP(Lightweight
Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows
XP/2000/NT/Me/9x的注册表、RMI、DSML v1&amp;v2、NIS。<br />
JNDI优点：<br />
包含了大量的命名和目录服务，使用通用接口来访问不同种类的服务；<br />
可以同时连接到多个命名或目录服务上；<br />
建立起逻辑关联，允许把名称同Java对象或资源关联起来，而不必指导对象或资源的物理ID。<br />
JNDI程序包：<br />
javax.naming：命名操作；<br />
javax.naming.directory：目录操作；<br />
javax.naming.event：在命名目录服务器中请求事件通知；<br />
javax.naming.ldap：提供LDAP支持；<br />
javax.naming.spi：允许动态插入不同实现。<br />
利用JNDI的命名与服务功能来满足企业级APIs对命名与服务的访问，诸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。<br />
JNDI与JDBC：<br />
JNDI提供了一种统一的方式，可以用在网络上查找和访问服务。通过指定一个资源名称，该名称对应于数据库或命名服务中的一个纪录，同时返回数据库连接建立所必须的信息。<br />
代码示例：<br />
try{<br />
Context cntxt = new InitialContext();<br />
DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");<br />
}<br />
catch(NamingException ne){<br />
...<br />
}<br />
JNDI与JMS：<br />
消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。<br />
代码示例：<br />
try{<br />
Properties env = new Properties();<br />
InitialContext inictxt = new InitialContext(env);<br />
TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory");<br />
...<br />
}<br />
catch(NamingException ne){<br />
...<br />
}<br />
访问特定目录：举个例子，人是个对象，他有好几个属性，诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法<br />
Attribute attr =<br />
directory.getAttributes(personName).get("email");<br />
String email = (String)attr.get();<br />
通过使用JNDI让客户使用对象的名称或属性来查找对象：<br />
foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);<br />
通过使用JNDI来查找诸如打印机、数据库这样的对象，查找打印机的例子：<br />
Printer printer = (Printer)namespace.lookup(printerName);<br />
printer.print(document);<br />
浏览命名空间：<br />
NamingEnumeration list = namespace.list("o=Widget, c=US");<br />
while (list.hasMore()) {<br />
NameClassPair entry = (NameClassPair)list.next();<br />
display(entry.getName(), entry.getClassName());<br />
}<br />
参考资料：<br />
http://java.sun.com/products/jndi/examples.html<br />
http://java.sun.com/products/jndi/serviceproviders.html<br />
常用的JNDI操作：<br />
常用的JNDI操作：<br />
void bind(String sName,Object object);――绑定：把名称同对象关联的过程<br />
void rebind(String sName,Object object);――重新绑定：用来把对象同一个已经存在的名称重新绑定<br />
void unbind(String sName);――释放：用来把对象从目录中释放出来<br />
void lookup(String sName,Object object);――查找：返回目录总的一个对象<br />
void rename(String sOldName,String sNewName);――重命名：用来修改对象名称绑定的名称<br />
NamingEnumeration listBinding(String sName);――清单：返回绑定在特定上下文中对象的清单列表<br />
NamingEnumeration list(String sName);<br />
代码示例：重新得到了名称、类名和绑定对象。<br />
NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");<br />
...<br />
while ( namEnumList.hasMore() ) {<br />
Binding bnd = (Binding) namEnumList.next();<br />
String sObjName = bnd.getName();<br />
String sClassName = bnd.getClassName();<br />
SomeObject objLocal = (SomeObject) bnd.getObject();<br />
}
<img src ="http://www.blogjava.net/arron/aggbug/297701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/arron/" target="_blank">日月龙湘</a> 2009-10-10 16:29 <a href="http://www.blogjava.net/arron/articles/297701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>