开发基于JNDI的应用程序3

本文介绍了JNDI DNS服务提供程序如何使基于JNDI的应用程序能够访问DNS中的信息,并通过示例代码展示了如何使用JNDI API访问DNS资源记录。此外,还探讨了JNDI在J2EE中的应用,特别是如何使用JNDI来访问环境变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNDI DNS 服务提供程序

DNS服务提供程序使得基于JNDI的应用程序能够访问存储在DNS中的信息。DNS服务提供程序将DNS命名空间呈现为JNDI 目录上下文的一棵树,而将DNS 资源记录呈现为JNDI 属性。

示例代码 4 演示了如何使用DNS 服务提供程序检索环境和IP地址(A记录)的信息。

示例代码 4: TestDNS.java

import javax.naming.*;

import com.sun.jndi.dns.*;

import java.util.Hashtable;

public class TestDNS {

   public static void main(String[] argv) {

      Name cn = null;

      String name = argv[0];

      Hashtable env = new Hashtable();

      env.put(Context.INITIAL_CONTEXT_FACTORY,

                     "com.sun.jndi.dns.DnsContextFactory");

      env.put(Context.PROVIDER_URL, "dns://IP for DNS Server/");

      try {

         // Create the initial context

         Context ctx = new InitialContext(env);

         // print the fully qualified name (.)

         System.out.println("Name in namespace: "+ctx.getNameInNamespace());

         // retrieve the parser associated with the named context

         NameParser np = ctx.getNameParser(ctx.getNameInNamespace());

          if (argv.length != 1) {

            System.out.println("Usage: java TestDNS ");

            System.exit(-1);

         }

         // parse the name into its components and print them

         cn = np.parse(name);

         System.out.println("Name is: "+cn.toString());

         System.out.println("The parsed name has "+cn.size()+" components:");

         for (int i=0; i<cn.size(); i++){

            System.out.println(cn.get(i));

         }

         System.out.print("Trying to lookup ");

         // get the prefix (domain) and suffix (hostname)

         Name domain = cn.getPrefix(cn.size()-1);

         Name host = cn.getSuffix(cn.size()-1);

         System.out.println("DNS Host: "+host+" Domain: "+domain);

         // retrieve the named object

         Object obj = ctx.lookup(domain);

         System.out.println(domain.toString()+" is bound to: "+obj);

         // retrieve and print the environment in effect

         System.out.println("Domain properties: "+ ((Context)obj).getEnvironment());

         // retrieve and print the IP address (the DNS A records)

         System.out.println("IP for: "+cn+ " is: "+

                            ((DnsContext)obj).getAttributes(host, new String[]{"A"}));

         // we're done so close the context

         ctx.close();

      } catch (NamingException e) {

         System.err.println("Problem looking up " + cn + ": " + e);

      }

   }

}

在您运行这个应用程序之前,确保您指定了DNS服务器的IP地址。

下面是一次示范运行:

prompt> java TestDNS prep.ai.mit.edu

Name in namespace: .

Name is: prep.ai.mit.edu

The parsed name has 4 components:

edu

mit

ai

prep

Trying to lookup DNS Host: prep Domain: ai.mit.edu

ai.mit.edu is bound to: com.sun.jndi.dns.DnsContext@b89838

Domain properties: {java.naming.provider.url=dns://IP for DNS Server/, java.namin

g.factory.initial=com.sun.jndi.dns.DnsContextFactory}

IP for: prep.ai.mit.edu is: {a=A: 199.232.41.9}

JNDI J2EE

JNDI J2EE平台的标准服务API之一。包含它的目的是为应用程序组件提供一个标准的API,用于引用资源和其他应用程序组件。J2EE还定义了一种标准的命名策略(逻辑和真实的名称),以和 JNDI一起使用,这样就可以采用一种与部署环境无关的方式编写应用程序。您可以引用 J2EE服务,具体方法是根据其逻辑名称在目录中查找它们。为了实现这一点,每个符合 J2EE规范的系统均提供了一个称为环境JNDI 服务,该环境包括:

  • 环境变量
  • EJB 引用
  • 资源工厂引用

注意:在这里,我只讨论环境变量。想要了解EJB引用和资源工厂引用方面的更多信息,请参见这篇文章

环境变量

应用程序组件的命名环境允许您定制应用程序组件,而不需要访问或修改组件的源代码。每个应用程序组件定义它自己的环境入口的集合。同一个容器中,一个应用程序组件的所有实例共享同一个入口。注意,不允许应用程序组件实例在运行时修改环境。

声明环境变量

应用程序组件提供程序必须声明从应用程序的组件代码访问的所有环境入口。它们是在部署描述器(例如Tomcat中的web.xml)中通过使用<env-entry> 标签来声明的. <env-entry> 标签的元素有:

  • <description>:环境入口的可选描述。
  • <env-entry-name>: 环境入口名。
  • <env-entry-type>:期望的环境变量类型。它可以是以下 Java 类型之一: Boolean、Byte、 Double、Character、 Float、 Integer、 Long、Short、String 。
  • <env-entry-value>: 必须匹配所提供类型的环境入口值。
  • <env-entry-type>. 这个值可以稍后改变,但是如果它没有被设定,那么在部署期间必须为它指定一个值。

示例代码 5中的例子给出了两个环境入口的声明。要为一个新环境指定一个声明,您只要把它添加给您的web应用程序描述器 (web.xml) 即可。

示例代码 5: 声明环境变量

<env-entry>

<description>welcome message</description>

<env-entry-name>greetings</env-entry-name>

<env-entry-type>java.lang.String</env-entry-type>

<env-entry-value>Welcome to the Inventory Control

                           System</env-entry-value>

</env-entry>

<env-entry>

<description>maximum number of products</descriptor>

<env-entry-name>inventory/max</env-entry-name>

<env-entry-type>java.lang.Integer</env-entry-type>

<env-entry-value>27</env-entry-value>

</env-entry>

每个<env-entry>标签描述一个环境入口。所以在这个例子中,定义了两个环境入口。第一个叫做greetings, 是 String 类型,初始的默认值为: Welcome to the Inventory Control System。第二个入口叫做 inventory/max,是 Integer类型,初始的默认值为 27。

现在,应用程序组件实例可以使用JNDI定位环境入口. 它使用不带参数的构造器创建了一个javax.naming.InitialContext 对象。接着,它通过InitialContext查找命名环境,所使用的是以java:comp/env打头的JNDI URL。示例代码 6 说明了一个应用程序组件如何访问它的环境入口。

示例代码 6: 访问环境入口

// obtain the application component's environment

// naming context

javax.naming.Context ctx =

new javax.naming.InitialContext();

javax.naming.Context env =

ctx.lookup("java:comp/env");

// obtain the greetings message

//configured by the deployer

String str = (String) env.lookup("greetings");

// use the greetings message

System.out.println(greetings);

// obtain the maximum number of products

//configured by the deployer

Integer maximum = (Integer) env.lookup(

"inventory/max");

//use the entry to customize business logic

注意,应用程序组件还可以使用如下的完整路径名查找环境入口:

javax.naming.Context ctx =

new javax.naming.InitialContext();

String str = (String) ctx.lookup(

"java:comp/env/greetings");

这段代码片断可以用在一个 JSP 页面中,如 示例代码 7所示

示例代码 7: 从一个 JSP页面访问环境入口

<HTML>

<HEAD>

<TITLE>JSP Example</TITLE>

</HEAD>

<BODY BGCOLOR="#ffffcc">

<CENTER>

<H2>Inventory System</H2>

<%

javax.naming.Context ctx =

new javax.naming.InitialContext();

javax.naming.Context myenv =

   (javax.naming.Context) t.lookup("java:comp/env");

java.lang.String s = (java.lang.String)

    myenv.lookup("greetings");

out.println("The value is: "+greetings);

%>

</CENTER>

</BODY>

</HTML>

结束语

JNDI是使用命名/目录服务增强您的网络应用程序的一组 API。本文通篇给出的例子演示了,开始使用JNDI开发基于目录的应用程序是一件多么简单的事情。这些例子还演示了 如何使用相同的API访问不同的命名/目录服务。开发人员不必学习不同的 API。在某些情况下,比如在 RMI 和 CORBA应用程序中, JNDI 允许您将命名服务的选择延至部署阶段。

JNDI 未来的期望有: 与标准的Java SASL API (JSR-28)结合,支持国际化的域名,而且支持安全的 DNS 。

要开始学习和使用JNDI 和 LDAP,下载Sun ONE Directory Server的试用版,它可以用于各种平台和各种语言。

更多信息

LDAP v3
JNDI
The JNDI Tutorial
JNDI Service Providers
Sun ONE Directory Server
JNDI-INTEREST Mailing List (for discussing JNDI)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值