﻿<?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-和风细雨-随笔分类-J2EE</title><link>http://www.blogjava.net/junglesong/category/30228.html</link><description>世上本无难事，心以为难，斯乃真难。苟不存一难之见于心，则运用之术自出。</description><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2008 06:01:14 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2008 06:01:14 GMT</pubDate><ttl>60</ttl><item><title>JNDI概述</title><link>http://www.blogjava.net/junglesong/archive/2008/03/20/187462.html</link><dc:creator>和风细雨</dc:creator><author>和风细雨</author><pubDate>Thu, 20 Mar 2008 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/junglesong/archive/2008/03/20/187462.html</guid><wfw:comment>http://www.blogjava.net/junglesong/comments/187462.html</wfw:comment><comments>http://www.blogjava.net/junglesong/archive/2008/03/20/187462.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junglesong/comments/commentRss/187462.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junglesong/services/trackbacks/187462.html</trackback:ping><description><![CDATA[<p>JNDI（Java Naming and Directory Interface）的中文意思是Java命名和目录接口。<br />
借助于JNDI ，开发者能够通过名字定位用户，机器，网络，对象，服务。 JNDI的常见功能有定位资源，如定位到内网中一台打印机，定位Java对象或RDBMS（关系型数据库管理系统）等<br />
在EJB，RMI，JDBC等JavaEE（J2EE）API技术中JNDI得到了广泛应用。JNDI为J2EE平台提供了标准的机制，并借助于名字来查找网络中的一切对象。</p>
<p><strong>理解&#8220;命名和目录服务&#8221;</strong></p>
<p>在掌握JNDI之前，开发者必须理解命名和目录服务。<br />
名字类似于引用，即能标识某实体如对象，人等。在企业应用中，经常需要借助于名字实现对各种对象的引用，如借助于名字引用电话号码，IP地址，远程对象等。<br />
命名服务类似于话务员，如果需要打电话给某人，但又不知道他的电话号码，于是将电话打到查询台，以便能够询问到用户的电话号码，打电话者需要提供人名给他。随后，话务员就能查到那人的电话号码。<br />
</p>
<p><img height="189" alt="" src="http://www.blogjava.net/images/blogjava_net/junglesong/jndisample.jpg" width="429" border="0" /><br />
<br />
<strong>命名服务的功能</strong></p>
<p>将名字与对象绑定在一起，这类似于电话公司提供的服务，比如将人名绑定到被叫端的电话。<br />
提供根据名字查找对象的机制。这称为查找对象或者解析名字。这同电话公司提供的服务类似，比如根据人名查找到电话号码。</p>
<p>在现实的计算机环境中，命名服务很常见，如需要定位网络中的某台机器，则借助于域名系统（Domain Name System,DNS）能够将机器名转化成IP地址。</p>
<p><strong>目录对象和目录服务</strong></p>
<p>在命名服务中，借助名字能够找到任何对象，其中有一类对象比较特殊，它能在对象中存储属性，它们被称之为目录对象或称之为目录入口项（Directory Entry）。将目录对象连接在一起便构成了目录（Directory），它是一个树状结构的构成，用户可以通过节点和分支查找到每个目录对象。<br />
目录服务是对命名服务的扩展，它能够依据目录对象的属性而提供目录对象操作。</p>
<p><strong>JNDI的概念和主要用途</strong></p>
<p>为实现命名和目录服务，基于java的客户端需要借助于JNDI系统，它为命名和目录服务架起了通信的桥梁。JNDI的主要用途有：<br />
开发者使用JNDI，能够实现目录和Java对象之间的交互。<br />
使用JNDI，开发者能获得对JAVA事务API中UserTransaction接口的引用。<br />
借助于JNDI，开发者能连接到各种资源工厂，如JDBC数据源，Java消息服务等。<br />
客户和EJB组件能够借助于JNDI查找到其他EJB组件。</p>
<p><strong>名字，绑定和上下文的概念</strong></p>
<p>JNDI中存在多种名字，一种是原子名，如src/com/sitinspring中的src，com和sitinspring；一种是复合名，它由0个或多个原子名构成，如src/com/sitinspring。<br />
绑定就是将名字和对象关联起来的操作。如system.ini绑定到硬盘中的文件， src/com/sitinspring/.classpath分别绑定到三个目录和一个文件。<br />
上下文（Context）由0个或多个绑定构成，每个绑定存在不同的原子名。如WEB-INF文件夹下分别含有.cvsignore和web.xml的文件名。在JNDI中， WEB-INF是上下文，它含有原子名.cvsignore和web.xml的绑定，它们分别绑定到硬盘中的文件。<br />
上下文中也允许存在上下文，它们被成为子上下文（subcontext）,子上下文和上下文类似，它也能含有多个名字到对象的绑定。这类似于文件夹下含有子文件夹。</p>
<p><strong>命名系统和初始上下文</strong></p>
<p>命名系统由一套连在一起的上下文构成，而且这些上下文使用了相同的命名语法。可以用目录树来类比这个概念。<br />
浏览命名空间的起点称之为初始上下文（Initial Context），初始上下文类似于目录树中的根节点概念。</p>
<p>借助于初始上下文，能够开始命名和目录服务。</p>
<p><strong>JNDI查找资源示例</strong></p>
<p>try {<br />
&nbsp; Context initCtx = new InitialContext();<br />
&nbsp; // java:comp/env是命名空间，相当于是本机JNDI资源引用根目录<br />
&nbsp; Context envCtx = (Context) initCtx.lookup("java:comp/env");<br />
&nbsp; Member bean = (Member) envCtx.lookup("Member");</p>
<p>&nbsp; System.out.print("member name=" + bean.getMemberName() + " age="<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + bean.getAge());<br />
} catch (NamingException e) {<br />
&nbsp; // TODO Auto-generated catch block<br />
&nbsp; e.printStackTrace();<br />
}</p>
<p><strong>JNDI有关API</strong></p>
<p>list（）：用于获得当前上下文的绑定列表<br />
lookup（）：用于解析上下文中名字绑定，该操作将返回绑定到给定名字的对象。<br />
rename（）：重新命名<br />
createSubContext（）：从当前上下文创建子上下文。<br />
destroySubContext（）：从当前上下文销毁子上下文。<br />
bind（）。从当前上下文中创建名字到对象的绑定。<br />
rebind（）：再次绑定，如果已经存在同名绑定则覆盖之。</p>
 <img src ="http://www.blogjava.net/junglesong/aggbug/187462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junglesong/" target="_blank">和风细雨</a> 2008-03-20 12:55 <a href="http://www.blogjava.net/junglesong/archive/2008/03/20/187462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>