`
primer_2004
  • 浏览: 123911 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

开发基于JNDI的应用程序3

    博客分类:
  • Java
阅读更多

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)

分享到:
评论

相关推荐

    2022年基于JNDI的应用程序开发Java教程.docx

    2022年基于JNDI的应用程序开发Java教程.docx

    基于JNDI的应用程序开发

    JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务...

    用JNDI建立数据库连接池实例

    基于JNDI的应用程序开发 在以TOMCAT为WEB服务器的项目中,用JNDI建立数据库连接池实例.

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    中文名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 原名: 经典Java EE企业应用实战--基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发 作者: 李刚 资源格式: PDF 版本: 第一版 出版社: 电子...

    J2EE应用开发详解

    141 9.1.2 JSF应用程序配置 142 9.2 一个简单的JSF应用 142 9.2.1 JSF应用程序开发步骤 143 9.2.2 用户登录实例 143 9.3 JSF应用程序架构 147 9.3.1 JSF请求处理生命周期 147 9.3.2 JSF事件驱动模型 148 9.3.3 JSF...

    Spring3.x企业应用开发实战(完整版) part1

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    Spring.3.x企业应用开发实战(完整版).part2

    13.6.4 Web应用程序中调度器的启动和关闭问题 13.7 小结 第14章 使用OXM进行对象XML映射 14.1 认识XML解析技术 14.1.1 什么是XML 14.1.2 XML的处理技术 14.2 XML处理利器:XStream 14.2.1 XStream概述 14.2.2 快速...

    深入掌握J2EE编程技术

    《深入掌握J2EE编程技术》全面深入地介绍了当今最热闹的编程技术——J2EE平台开发技术,该技术主要用于开发基于Internet的多层结构应用程序。《深入掌握J2EE编程技术》全面介绍了JSP层,EJB层和EIS层的设计思想与...

    java应用软件程序设计

    197 实例67 实现C/S多线程 198 实例68 客户端程序 200 实例69 服务器端程序 201 实例70 C/S结构聊天室 203 实例71 基于C/S的小游戏 209 实例72 应用C/S数据库 237 实例73 实现客户端程序 ...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    不过,针对 Java EE 开发的服务器端应用,可以通过集成 BlazeDS,充分利用 AMF 协议并能轻易与 Flex 前端交换数据,这种方式是 Java EE 应用程序集成 Flex 的首选。 BlazeDS 是 Adobe LifeCycle Data Services 的...

    Spring面试专题.md

    是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置. 主要由以下几个模块组成...

    J2EE的13种核心技术简介.doc

     J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持。在本文中将解释支撑J2EE的13种核心技术:JDBC,JNDI,EJBs,RMI,JSP,Javaservlets,XML,JMS,JavaIDL, JTS,...

    J2EE_的_13_种核心技术.doc

     J2EE平台由一整套服务(Services)、应用程序接口(APIs)和协议构成,它对开发基于Web的多层应用提供了功能支持。  在本文中我将解释支撑J2EE的13种核心技术:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML,...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...

    深入掌握J2EE编程技术(卷二)

    本书全面深入地介绍了当今最热门的编程技术———J2EE平台开发技术,该技术主要用于开发基于Internet的多层结构应用程序。本书全面介绍了JSP层,EJB层和EIS层的设计思想与编程技术,涉及的内容包括:JDBC,JNDI,...

    深入掌握J2EE编程技术(卷一)

    本书全面深入地介绍了当今最热门的编程技术———J2EE平台开发技术,该技术主要用于开发基于Internet的多层结构应用程序。本书全面介绍了JSP层,EJB层和EIS层的设计思想与编程技术,涉及的内容包括:JDBC,JNDI,...

    Java相关技术(详细资料)

     3、Java RMI(Java Remote Method Invocation)用来开发分布式Java应用程序。一个Java对象的方法能被远程Java虚拟机调用。这样,远程方法激活可以发生在对等的两端,也可以发生在客户端和服务器之间,只要双方的应用...

Global site tag (gtag.js) - Google Analytics