⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0091.htm

📁 Java语言是Internet上最热门的编程语言
💻 HTM
字号:
<html>

<head>
<title>新时代软件教程:操作系统 主页制作 服务器 设计软件 网络技术 编程语言 文字编辑</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
<!--
body, table {font-size: 9pt; font-family: 宋体}
a {text-decoration:none}
a:hover {color: red;text-decoration:underline}
.1  {background-color: rgb(245,245,245)}
-->
</style>
</head>
<p align="center"><script src="../../1.js"></script></a>
    <p align="center"><big><strong>JNDI</strong></big></p>

<div align="right">---(文/姜天戬)</div>

<TABLE width="90%">
  <TBODY>
  <TR>
    <TD class=page><A name=one>一、Naming和Directory 的概念</A> <BR>
      <P>在介绍JNDI之前,我们先让读者对 naming与directory 有最基本的认识,进而了解使用JNDI 的原因。 </P>
      <P>Naming 在电脑系统上是最基本的服务之一,藉著名称 (names)与物件 (objects)的系结 
      (binding),使用者透过正确地描述环境(context)来存取欲使用的物件。例如:DNS(Domain Name System)将主机名称「 
      javacenter.cis.th u.edu.tw」对应到 IP Address「 140.128.104.30」,以方便使用者记忆。 </P>
      <P>Directory可视为 naming概念的扩充,让物件拥有属性 
      (attributes)以记录额外的资讯。於是,我们可以透过名称来查看(look up)物件并获得该物件的属性资讯,或是利用属性作为搜寻的过滤条件 
      (search filter)。例如:电话簿,记录著每个人登记的电话号码。从这个最常见的例子中不难看出directory与 
      database明显的差异之一:directory 的属性可以有很多笔资料,正如每个人可以同时拥有很多个电话号码。 
      Directory目前在电脑系统上较著名的应用系统与架构有 Novell公司的 NDS(Novell Directory 
      Services)、Sun公司的NIS(Network Information Service),与即将成为网络上一个新标准的 
      LDAP(Lightweight Directory Access Protocol)<A 
      href="#2">[2]</A> 。 </P>
      <P>Java在JNDI传统的应用就如同其他的程式语言一般,透过 Java applications 
      或applets,存取或检索(retrieve)在 directory内的物件属性。例如以Java 开发的电子邮件客户端程式(client 
      program)能够透过 directory的方式来管理其中的通讯录;然而藉著扩充 
      directory的资讯,例如将印表机的组态存入directory, 
      Java程式可以检索网路上符合 求的印表机,然後把资料传送至该印表机列印。换言之,支援 directory的Java程式将能把directory 
      中的物件当成Java 的物件来使用。 </P><A name=two>二、JNDI架构</A> <BR>
      <P>Java Naming and Directory Interface是一套提供naming和 directory功能的 
      API,Java应用程式开发者透过使用 JNDI,在naming和 directory方面的应用上就有了共通的准则。 </P>
      <P>JNDI包含一组API和一组SPI(Service Provider Interface)。Java 程式透过JNDI API 
      存取各种naming和 directory服务; JNDI SPI则使得各种naming和 
      directory服务透明化,允许Java程式透过JNDI API来存取这些服务。见下图 *。 </P>
      <TABLE>
        <TBODY>
        <TR>
          <TD><IMG src="images/jndi_f1.gif"> </TD></TR>
        <TR>
          <TD>
            <CENTER>图一、 Jndi架构图<A 
            href="#1">[1]</A> 
            </CENTER></TD></TR></TBODY></TABLE><A name=three>三、JNDI packages</A> <BR>
      <P>JNDI分为三个 packages: </P>
      <P>javax.naming包含 naming服务的类别 (classes)和存取介面(interfaces for accessing)。其中 
      Contextapi让使用者可以定义物件在 namespaces中的「相对位置」。 naming服务便以 
      context为介面,提供查看、系结、物件更名(renaming objects)等功能。 InitialContextapi 提供naming或 
      directory服务的一个起始位置。因为在JNDI的世界中没有绝对的root观念,所有的动作都建立在context上;有了起始位置,使用者才能藉著它对其 
      context上的物件进行存取。 </P>
      <P>NamingExceptionap i则为JNDI定义的一组类别,负责侦测 (catch)所有发生在 naming或directory 
      服务里的例外状况 (exceptions)。 </P>
      <P>javax.naming.dire ctory 这个 package由 javax.naming扩充而来,提供存取 
      directory服务的功能─建立在naming 服务上,增加对 directory中的物件检索其属性( retrieve 
      attributes)和透过指定属性为条件来搜寻(search)等功能。 DirContextapi提供物件在directory内 
      context的介面,与 Contextapi的运作方式类似,但更进一步定义了查询和更新directory中物件属性的方法( methods)。 
      </P>
      <P>javax.naming.spi 让系统发展者为特定的naming或 directory系统来撰写使用JNDI的应用程式,例如在 
      Plug-ins、Java Object Support及 Multiple Naming Systems(Federatio n)等方面的应用。 
      </P><A name=four>四、JNDI使用范例 </A><BR>
      <P>使用JNDI 要以下的软体及系统: </P>
      <TABLE width=200>
        <TBODY>
        <TR>
          <TD align=right>jdk 1.1.2 以上版本 </TD></TR>
        <TR>
          <TD align=right>JNDI API </TD></TR>
        <TR>
          <TD align=right>Service Provider </TD></TR>
        <TR>
          <TD align=right>Naming and Directory Server </TD></TR></TBODY></TABLE>
      <P>首先设定classpath ,编译时 要的 classpath为 jndi.jar所在的完整路径。例如: </P>
      <P align=center>
      <TABLE width="70%">
        <TBODY>
        <TR>
          <TD class=detail><PRE><CODE>

CLASSPATH=C:\jndi\lib\jndi.jar
</CODE></PRE></TD></TR></TBODY></TABLE></P>
      <P>执行时 要的 classpath: service provider 所在的完整路径。例如: </P>
      <P align=center>
      <TABLE width="70%">
        <TBODY>
        <TR>
          <TD class=detail><PRE><CODE>


CLASSPATH=C:\Novell\lib\njcl.jar

</CODE></PRE></TD></TR></TBODY></TABLE></P>
      <P>程式必 依照所使用的服务来import packages,本范例程式的目的为搜寻目录中的物件并列出其属性,因此  import naming和 
      directory两个 packages,请参照程式注标<A 
      href="#p1">(1)</A>。而在JNDI的程式中最重要的就是设定initial 
      context ,通常至少 提供 factory.initial与 provider.url两个环境资讯,依照所选用的service 
      provider而有所不同。在此程式中采用NDS为目录服务系统,於是必 引入 Novell公司开发的 SPI,见程式注标<A 
      href="#p2">(2)</A>。每个SPI所 的相关资讯,都应可在该SPI的说明文件中找到。设定完成 
      SPI所 的环境资讯之後,便可呼叫 constructor来产生 initial context;请注意在此我们使用的是目录服务,所以呼叫的是 
      InitialDirContext api,见程式注标<A 
      href="#p3">(3)</A>。接著指定搜寻时的过滤条件,base 
      所指的是搜寻开始的层级,在此范例中设定为一个目录 NCLTREE里的 o(organization)=N CL,见注标<A 
      href="#p4">(4)</A>;filter则是设定搜寻的条件,程式要求搜寻所有 
      cn(common name)以 admin或Barabbas为起始的物件(使用者),见注标<A 
      href="#p5">(5)</A>;被宣告为 
      SearchControlsapi 
      的constraints负责进行搜寻相关设定,在此仅设定搜寻的范围。搜寻范围通常有三种类型,分别是仅搜寻本身这一层、搜寻至下一层,及搜寻本层所有的整棵子树。本例中设定为搜寻整棵子树,见注标<A 
      href="#p6">(6)</A>。随後程式利用 
      DirContextapi的 searchapi method 来判断是否找到符合搜寻条件之物件,再以 SearchResultapi的 
      getAttributesapi method来取得属性资料并输出。 </P>
      <P>JNDI API更完整的使用方法,将於未来的文章中逐一介绍,因此本范例程式的内容便不再详细解说,请有兴趣的读者自行参考 
      JNDI的相关资料。范例程式的完整内容与执行范例附於文末。 </P><A name=five>五、结论</A> <BR>
      <P>在网№网路爆炸性成长,各式网路服务争相崭露头角的今日,目录服务已经深入其中的各个层面,尤其是在电子商务的应用上。使用Java的程式发展者若想要跟上这一波潮流,JNDI将是开启目录服务大门的金钥! 
      </P><A name=six>六、参考资料</A> 
      <DL>
        <DT>
        <DD><A name=1>[1]</A> The JNDI Tutorial by Rosanna Lee, <A 
        href="../../www.javasoft.com/products/jndi/tutorial/index.html">htt 
        p://www.javasoft. com/products/jndi /tutorial/index.h tml</A> 
        <DD><A name=2>[2]</A> Novell Class Libraries for Java(including Novell 
        providers for JNDI), <A 
        href="../../developer.novell.com/ndk/doc/njcl/index.htm">http://developer.novell.com/ndk/doc/njcl/index.htm</A> 
        </DD></DL><A name=seven>七、范例程式完整内容</A> 
      <P align=center>
      <TABLE width="70%">
        <TBODY>
        <TR>
          <TD class=detail><PRE><CODE>


import javax.naming.*;//<A name=p1><FONT color=red>(1)</FONT>
import javax.naming.directory.*;//<FONT color=red>(1)</FONT>
import java.util.Properties;
import java.util.Enumeration;

class Search{
	public static void main(String[] args) {
		try {
    		/* Create an environment for the initial directory context.
       		The properties specify the NDS provider, 
       		And the NDS Server's Tree Name. */
    		Properties env = new Properties();
    		env.put("java.naming.factory.initial",
                   "com.novell.service.nds.naming.NdsInitialContextFactory");//<A name=p2><FONT color=red>(2)</FONT>
		env.put("java.naming.provider.url", "nds://NCLTREE/");//<FONT color=red>(2)</FONT>
    		/* Create the initial directory context. */
    		DirContext ctx = new InitialDirContext(env);//<A name=p3><FONT color=red>(3)</FONT>
    		/* Set up and perform the search.  Find all people in NCL
       		whose common name starts with admin or Barabbas. */
    		String base = "o=NCL";//<A name=p4><FONT color=red>(4)</FONT>
    		String filter = "(|(cn=admin*)(cn=Barabbas*))";//<A name=p5><FONT color=red>(5)</FONT>
    		SearchControls constraints = new SearchControls();//<A name=p6><FONT color=red>(6)</FONT>
    		constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);//<FONT color=red>(6)</FONT>
    		NamingEnumeration results = ctx.search(base,filter,constraints);
    		/* Print the search results. */
    		if (!results.hasMore()) {
      			System.out.println("Nothing found.");
    		} else {
        			/* For each entry found. */
      			while (results.hasMore()) {
				SearchResult sr = (SearchResult) results.next();
        			System.out.println(sr.getName());
        			Attributes attrs = sr.getAttributes();
        			if (attrs == null) {
          				System.out.println("No attributes");
        			} else {
              			/* For each attribute of the entry. */
       				for (NamingEnumeration ae = attrs.getAll(); ae.hasMore();) {
        					Attribute attr = (Attribute) ae.next();            					String id = attr.getID();
       					/* For each value of the attribute. */
          				for (Enumeration vals = attr.getAll(); vals.hasMoreElements();
                				System.out.println("   "+id + ": " + vals.nextElement()));
          					}
          				}
          			}
          		}
  	} catch (NamingException e) {
    	/* Handle any name/directory exceptions. */
    	System.err.println("Search failed: " + e);  		
  	} catch (Exception e) {
       /* Handle any other types of exceptions. */
    	System.err.println("Non-naming error: " + e.getMessage());
  	}
 	}
}
</CODE></PRE></A></TD></TR></TBODY></TABLE></P>
      <P align=center>
      <TABLE width="70%">
        <TBODY>
        <TR>
          <TD class=detail><PRE><CODE>


C:\javaset\jndi112&gt;java Search
admin.NCLNetworks.NCL
   NRD:Registry Index: com.novell.service.nds.net.NetStream@1275824c
   ACL: [All Attributes Rights];admin.NCLNetworks.NCL;2
   ACL: Login Script;admin.NCLNetworks.NCL;6
   ACL: Message Server;[Public];2
   ACL: Print Job Configuration;admin.NCLNetworks.NCL;6
   SA: Case Ignore String Tung Hai University
   Message Server: Distinguished Name NCLSERVER.NCLNetworks.NCL
   Internet EMail Address: Case Ignore String barabbas@dorm.thu.edu.tw
   Internet EMail Address: Case Ignore String s852858@student.thu.edu.tw
   Internet EMail Address: Case Ignore String tjJiang@ncl.cis.thu.edu.tw
   Home Directory: 0;NCLSERVER_SYS.NCLNetworks.NCL;home\Barabbas
   Generational Qualifier: Case Ignore String None
   Surname: Case Ignore String Jiang
   OU: Case Ignore String Computer &amp; Information Science
   Used By: 0;[Root];
   Initials: Case Ignore String None
   CN: Case Ignore String admin
   CN: Case Ignore String tjJiang
   Postal Office Box: Case Ignore String Tung Hai University
   Revision: 272
   Password Required: false
   Telephone Number: Telephone Number +886-4-3594359 ext.&lt;71000&gt;
   S: Case Ignore String Taiwan
   NRD:Registry Data: com.novell.service.nds.net.NetStream@12a9824c
   Facsimile Telephone Number: None;0;
   Network Address: 1;4;
   Network Address: 1;4;
   Network Address: 1;4;
Non-naming error: String index out of range: -50
</CODE></PRE></TD></TR></TBODY></TABLE>

  </table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -