# 课程：命名和目录操作

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ops/index.html](https://docs.oracle.com/javase/tutorial/jndi/ops/index.html)

您可以使用 JNDI 执行命名操作，包括读取操作和更新命名空间的操作。本课程中描述了以下操作：

*   [查找对象](lookup.html)
*   [列出上下文的内容](list.html)
*   [添加，覆盖和删除绑定](bind.html)
*   [重命名对象](rename.html)
*   [创建和销毁子上下文](create.html)

## 组态

在对命名或目录服务执行任何操作之前，您需要获取 _ 初始上下文 _ - 命名空间的起点。这是因为命名和目录服务的所有方法都是相对于某些上下文执行的。要获取初始上下文，您必须执行以下步骤。

1.  选择要访问的相应服务的服务提供商。
2.  指定初始上下文所需的任何配置。
3.  调用 [`InitialContext`](https://docs.oracle.com/javase/8/docs/api/javax/naming/InitialContext.html#constructor_detail)构造函数。

## 步骤 1：为初始上下文选择服务提供者

您可以通过创建一组 _ 环境属性 _（ `Hashtable` ）并向其添加服务提供者类的名称来指定要用于初始上下文的服务提供者。环境属性在 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/beyond/env/index.html)中有详细描述。

如果您使用的是 JDK 中包含的 LDAP 服务提供程序，那么您的代码将如下所示。

```
Hashtable<String, Object> env = new Hashtable<String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.ldap.LdapCtxFactory");

```

要在 JDK 中指定文件系统服务提供程序，您可以编写如下所示的代码。

```
Hashtable<String, Object> env = new Hashtable>String, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, 
        "com.sun.jndi.fscontext.RefFSContextFactory");

```

您还可以使用 _ 系统属性 _ 指定要使用的服务提供商。有关详细信息，请查看 [JNDI 教程](https://docs.oracle.com/javase/jndi/tutorial/beyond/index.html)。

## 步骤 2：提供初始上下文所需的信息

不同目录的客户端可能需要各种信息来联系目录。例如，您可能需要指定服务器正在运行的计算机以及识别目录用户所需的信息。此类信息通过环境属性传递给服务提供者。 JNDI 指定了服务提供者可以使用的一些通用环境属性。您的服务提供商文档将提供有关这些属性所需信息的详细信息。

LDAP 提供程序要求程序指定 LDAP 服务器的位置以及用户身份信息。要提供此信息，您可以编写如下所示的代码。

```
env.put(Context.PROVIDER_URL, "ldap://ldap.wiz.com:389");
env.put(Context.SECURITY_PRINCIPAL, "joeuser");
env.put(Context.SECURITY_CREDENTIALS, "joepassword");

```

本教程使用 JDK 中的 LDAP 服务提供程序。这些示例假设已在本地计算机上的端口 389 上设置了服务器，其根目录名称为`“o = JNDITutorial”`，并且更新目录时不需要身份验证。它们包括以下用于设置环境的代码。

```
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

```

如果您使用的是以不同方式设置的目录，则需要相应地设置这些环境属性。您需要将`“localhost”`替换为该机器的名称。您可以针对任何[公共目录服务器](../software/index.html)或在不同计算机上运行的您自己的服务器运行这些示例。您需要将`“localhost”`替换为该机器的名称，并将 `o = JNDITutorial` 替换为可用的命名上下文。

## 第 3 步：创建初始上下文

您现在可以创建初始上下文了。为此，您将 [`InitialContext` 构造函数](https://docs.oracle.com/javase/8/docs/api/javax/naming/InitialContext.html#constructor_detail)传递给您之前创建的环境属性：

```
Context ctx = new InitialContext(env);

```

现在您已经引用了 [`Context`](https://docs.oracle.com/javase/8/docs/api/javax/naming/Context.html)对象，您可以开始访问命名服务。

要执行目录操作，需要使用 [`InitialDirContext`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/InitialDirContext.html)。为此，请使用其[构造函数之一](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/InitialDirContext.html#constructor_detail)：

```
DirContext ctx = new InitialDirContext(env);

```

该语句返回对 [`DirContext`](https://docs.oracle.com/javase/8/docs/api/javax/naming/directory/DirContext.html)对象的引用，用于执行目录操作。