`
primer_2004
  • 浏览: 128047 次
  • 性别: 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

    Java Naming and Directory Interface (JNDI) 是Java应用程序用来访问命名和目录服务的一组API。JNDI的主要目的是提供一种标准化的方式来查找、访问和管理分布式环境中的资源,这些资源可以是对象、配置信息或者服务...

    websphere上发布基于jndi的应用

    在IT行业中,WebSphere是一款由IBM开发的企业级应用服务器,广泛用于部署和管理Java应用程序,尤其是基于JNDI(Java Naming and Directory Interface)的应用。JNDI是Java平台的一个核心API,它为Java应用程序提供了...

    基于JNDI的应用程序开发

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

    J2EE应用程序开发指南

    ### J2EE应用程序开发指南知识点总结 #### 一、J2EE概述 - **定义**:J2EE(Java 2 Platform, Enterprise Edition)是一种基于Java的平台标准,专为开发企业级应用而设计。 - **历史背景**:1993年,James Gosling...

    Spring JMS消息处理-不基于JNDI

    Spring JMS为应用程序提供了与消息中间件交互的能力,允许我们构建可扩展且解耦的系统。JNDI通常用于查找JMS资源,如ConnectionFactory和Destination,但在某些环境中,我们可能需要避免使用JNDI,例如在本地开发或...

    JSP 应用程序开发指南

    **JSP(JavaServer Pages)应用程序开发指南** JSP是一种基于Java技术的动态网页开发工具,它允许开发者在HTML或XML文档中嵌入Java代码,从而实现动态网页的创建。本指南将深入讲解JSP的核心概念,帮助你掌握JSP的...

    Spring JMS 消息处理-基于JNDI

    在IT行业中,Spring框架是Java开发中的重要工具,它提供了丰富的功能来简化应用程序的构建,尤其是在企业级应用中。Spring JMS(Java消息服务)模块是Spring框架的一部分,用于处理消息队列通信,这是一种异步处理和...

    Tomcat中JNDI原理

    JNDI提供了一种查找和定位应用程序所用资源的标准化方式,这些资源包括数据库连接、消息队列、EJBs、对象引用等。JNDI的核心概念包括: - **命名**:使用名字来标识资源。 - **目录服务**:存储命名信息和资源的...

    jdbc构建基于web的应用程序

    在Web应用程序中,JDBC常用于实现用户登录验证、数据存储和检索等功能,极大地提升了开发效率和代码的可移植性。 1. **JDBC基础知识** - **JDBC驱动**:JDBC驱动是Java程序与数据库之间的桥梁,主要有四种类型的...

    网站开发JNDI与连接池.pptx

    【网站开发JNDI与连接池】是Java Web开发中重要的技术组件,它们对于提高应用程序的性能和资源管理效率有着显著的作用。 **JNDI(Java Naming and Directory Interface)** 是Java EE的一项核心技术,它提供了一组...

    Struts+Jndi+Ajax

    Struts是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。Struts提供了处理HTTP请求、业务逻辑控制和视图展示的结构,使得开发者能够更好地组织代码,...

    基于Java的实例开发源码-EJB中JNDI的使用源码例子.zip

    总的来说,JNDI在Java和EJB开发中扮演着关键角色,它为应用程序提供了一种统一的方式来访问和管理各种资源和服务。通过深入学习和实践,开发者可以更好地利用Java EE提供的强大功能,构建更高效、可扩展的企业级应用...

    JNDI 详细解读

    在实际的应用程序中,开发人员通常只需要使用上述几个包中的类即可,具体的调用细节对用户来说是透明的。JNDI API 提供了一个统一的接口来访问不同的 JNDI 服务,这些服务的具体实现可以由不同的 ServiceProvider 来...

    快速的开发Hibernate应用程序

    总之,通过Eclipse 3.0.1中的Hibernate Synchronizer插件,开发者能够快速、高效地构建基于Hibernate的应用程序,减少与数据库交互的繁琐工作,专注于业务逻辑的实现。而随着Eclipse和Hibernate的不断升级,这样的...

    JavaEE程序设计与应用开发7.6作业答案

    3. **MVC(Model-View-Controller)模式**:这是一种常见的Web应用程序设计模式,JavaEE中的Struts、Spring MVC等框架都是基于此模式。在作业中,学生可能需要实现模型、视图和控制器之间的交互。 4. **JNDI(Java ...

    jndi配置

    在 Web 应用程序中,特别是 Java EE 应用程序,JNDI 常用于管理资源绑定,例如数据源(DataSource)。通过将数据源等资源绑定到 JNDI 上,可以在不修改代码的情况下更改资源的配置细节,从而实现灵活的应用部署和...

    基于NetBeans的Java EE客户端应用程序.

    基于NetBeans的Java EE客户端应用程序的开发涉及到多个关键知识点: 1. **NetBeans IDE**:NetBeans提供了友好的图形用户界面,用于编写、调试和部署Java应用程序。它的特性包括代码提示、自动完成、项目管理、版本...

    Jndi.pdf

    - **客户端**:应用程序通过 JNDI API 进行命名和目录服务的操作。 - **服务提供商**:实现特定命名或目录服务的具体类库。 - **服务提供商接口 (SPI)**:定义了服务提供商必须实现的接口。 - **命名和目录服务**:...

    基于J2EE的BS方案数据应用开发

    - 应用程序通过Context对象在目录结构中查找和操作资源,每个Context代表目录结构中的一个节点。 - 初始化Context通常是通过`InitialContext`类完成,然后可以使用这个Context遍历整个目录树以获取所需资源。 在...

Global site tag (gtag.js) - Google Analytics