java总结(三)——jndi在j2ee和j2se中的应用

JNDI,Java命名和目录接口,允许应用程序通过公共接口访问各种命名和目录服务。下图显示了JNDI架构。如JDBC(Java数据库连接),JNDI是不是服务,而是一组接口; 它允许应用程序使用一个标准化的API来访问许多不同的目录服务供应商。就像使用JDBC,那么JDK包含了JNDI接口,但不包括JNDI服务提供者 - 尽管Sun Microsystems公司提供的适配器,用于连接到现有的目录服务供应商,如LDAP(轻量级目录访问协议),DNS(域名服务)和CORBA。但是,您可以使用多种免费或开源的JNDI供应商在你的J2SE(Java
2平台标准版)的应用程序之一。

JNDI是保存在一起的J2EE(Java2平台企业版)应用的胶水。JNDI被设计用来支持高动态应用程序组装和部署,与组件不断添加和更新,无需重建整个系统。命名服务有助于通过充当中央登记成分组织的企业应用程序。J2EE应用程序通常使用JNDI在几个方面:

·        随着存储应用程序的配置信息在一个集中,层次型数据库的一种手段

·        作为应用程序组件之间共享的活动对象,它可以在不同的JVM或者在不同系统上运行的存储库

·        作为一个接口与现有的目录服务,如LDAP(使用特定的提供给外部服务)

·        作为一个轻量级的,分层数据库,用于存储瞬态应用程序状态

像J2EE应用程序,更大或更动态的J2SE应用程序可以受益于松散耦合和动态绑定提供了一个积极的目录服务。

一个简单的JNDI例子

从JNDI名称空间存储和检索对象是相当简单的; 你第一次得到一个JNDI 命名上下文,然后使用bind()方法和lookup()方法来存储和检索对象,如清单1所示:

清单1。从JNDI名称空间存储和检索对象

  importjavax.naming.*;
  public voidcreateName() throws NamingException {
    Context context= new InitialContext();
   context.bind("/config/applicationName", "MyApp");
  }
  public StringgetName() throws NamingException {
    Context context= new InitialContext();
    return (String)context.lookup("/config/applicationName");
  } 

清单1演示了最常见的JNDI操作-创建一个JNDI上下文,在上下文绑定的对象,然后从上下文检索对象。请注意,JNDI名称空间和客户端可能驻留在不同的JVM,并Bind()和lookup()的调用可能会同样发生在不同的JVM。一个JNDI提供者使用了多种技术,包括系列化,以确保对象可以从JVM移动到JVM中,但仍然可以检索到它的原始形式。

清单1中的代码片段有几个隐藏的假设:JNDI如何知道使用哪个提供商创建上下文时?对于需要身份验证提供程序,凭据从何而来?一般情况下,您可以通过设置在系统属性中的JNDI几个特定的属性指定供应商及其他连接参数,或通过设置他们在jndi.properties中的文件。此外,任何给定的供应商可能无法绑定或检索任意对象。例如,一些供应商,如DNS提供商,是只读的,而有些供应商可能会更灵活一些,他们可以绑定的对象的类型。大多数厂商提供的JNDI提供商可以存储和检索实现的java.io.Serializable,java.rmi.Remote的,或javax.naming.Referenceable的一个对象

隐藏的JNDI提供

在上图所示的JNDI供应商都有一个共同点 - 他们的请求委托给外部的目录服务,如LDAP。然而,此图没有显示JNDI提供者的一个重要类型:内置于所有J2EE容器,它存储的目录信息在内部数据库中的JNDI提供者。当我们谈论在J2EE应用程序中使用JNDI,我们通常所说的这个容器提供的供应商。

如何J2EE使用JNDI?

J2EE应用程序是组装出来的组件。该方法的组件的配置和相互连接是在部署时指定的;大部分信息都存储在JNDI名称空间。J2EE应用程序使用JNDI来存储配置信息(如字符串和数值常量),无状态的对象(包括对象工厂),和EJB(E??nterprise JavaBean组件)home接口。

JNDI是,它允许您构建J2EE应用了如servlet,JSP页面(JavaServer页面),和EJB组件的胶水。在J2EE应用程序中,每个组件发现其他组件无法通过静态连接,而是通过JNDI查找。J2EE应用程序允许部署时间,同时保持型和链路安全通过让每个组件出口的外部组件和资源,它需要一个列表绑定。部署者确保每个进口都有正确类型的应用程序中的相应部分。J2EE容器包括工具,以帮助您正确做到这一点。

如何J2SE应用程序使用JNDI?

像J2EE应用程序,J2SE应用程序可以使用JNDI作为命名的配置参数,对象和对象工厂的共享存储库。工厂创建模式中使用JNDI非常合适,因为你可以存储你的工厂在JNDI名称空间。J2SE应用程序也可以使用JNDI作为一个更强大,功能丰富,并集中更换为RMI(远程方法调用)。

大多数J2SE应用程序的配置文件,这些文件存储无论是作为属性文件或XML文档加载其配置信息。这些配置文件中指定的各种配置信息; 一些更复杂的应用程序存储信息的实例化对象,如类名和构造函数的参数,在配置文件中。

使用JNDI来存储常量,对象和对象工厂相对于传统的配置机制有些优势。由于大多数的JNDI提供者是网络访问的,你不需要保持一个组配置文件一致的每个主机在分布式应用程序。此外,使用反射来实例化一个对象时,需要更多的代码(尤其是更多的错误恢复代码)不能简单地检索出该对象JNDI名称空间中。虽然使用JNDI一般无须从配置信息实例化一个对象(当你填入的命名空间,一般在应用程序启动时),这种复杂性被分解远离大多数的应用程序代码,它可以简单地从JNDI名称空间检索所需的对象。

另一个原因在分布式应用程序使用JNDI而不是配置文件是因为一个配置文件的信息可能是敏感的,例如用于数据库访问的密码。通过存储数据源的JNDI名称空间,你可以提供给整个应用程序的数据库连接,而不会使密码提供给整个应用程序。(例如,PoolMan包,一种广泛使用的开源连接池包,存储一个数据源对象中的JNDI名称空间(如果有)。)

使用JNDI与J2SE应用程序,您首先需要一个JNDI提供者,因为JDK中不包括的。如果你只是想使用JNDI来访问外部的目录,例如LDAP,则可以使用Sun提供的供应商之一。但通常情况下,你会希望有一个独立的供应商,有几个你可以使用。

一个独立的JNDI提供

JBoss的开源J2EE服务器包括一个JNDI供应商(JNP),可以作为一个独立的服务运行; 它提供了一个极好的轻量级网络访问的JNDI服务。JNP采用内存数据库来存储对象,所以命名空间的内容并不在服务重新启动仍然存在。您可以轻松地自行运行JNP或配置JBoss容器,开始只有JNP服务。

选项??1配置JNP服务器JBoss的服务

JBoss应用服务器是建立在JMX(Java管理扩展)框架; 该框架允许应用程序服务进行模块化为JMX MBean的,它可以启动和管理独立。该文件jboss.jcml包含的mbeans容器启动时,将加载的列表。JBoss的默认配置包括50多个MBean的,但如果你指定jboss.jcml应该只包含清单2中所示的单报关,然后启动JBoss服务器,服务器将只加载了JNDI提供者,没有其他的J2EE应用服务:

清单2。JNDI只jboss.jcml文件

<?xml version="1.0"encoding="UTF-8"?>
<server>
  <mbeancode="org.jboss.naming.NamingService"
        name="DefaultDomain:service=Naming">
    <attributename="Port">1099</attribute>
  </mbean>
</server>

选项??2。配置JNP服务器独立

JNP也可以作为一个独立的服务器应用程序运行。要配置它是这样,你需要两个jar文件:

·        jnpserver.jar -从JBoss分布,在lib
/ ext目录目录

·        log4j.jar -广泛使用的日志工具,来自Apache
Jakarta项目; 你还会发现它在JBoss分布在lib / ext目录

此外,你需要一个log4j.properties文件; 清单3显示了一个简单的问题。这个文件应该通过类路径是可访问:

清单3。简单的log4j.properties文件

 # Use aConsoleAppender -- write log data to standard out
log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p%c %x - %m%n

要运行JNP服务器在独立模式下,确保log4j.jar的文件时,jnpserver.jar文件,包含目录log4j.properties都在你的classpath中。然后,启动JNP服务器,如下所示:

javaorg.jnp.server.Main

您还可以使用org.jnp.server对象到应用程序的JVM中启动JNDI服务。

使用JNDI服务

一旦JNP服务器正在运行,你可以配置你的应用程序使用JNP通过包括JNP-client.jar中的文件在classpath和指定java.naming.provider.url的和java.naming.factory.initial无论是在系统属性属性或的jndi.properties文件。清单4显示了一个示例的jndi.properties文件:

清单4。的jndi.properties文件

 java.naming.provider.url=jnphost.mycompany.com:1099
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming

下面的示例显示了如何你可以用字符串,整数,并在属性中指定的对象值参数文件填充一个JNDI名称空间在应用程序启动时间,以及应用程序组件如何能找回这些属性。为了简便起见,清单5A假设方法的存在解析XML配置文件,省略了错误处理代码:

清单5A。从配置文件中加载一个JNDI名称空间

 public voidloadJNDI() {
    Context context= new InitialContext();
    ConfigItem[]items = getConfigItems();
    for (int i=0;i<items.length; i++) {
      Objecto=null;
      if(items[i].getType().equals("Integer"))
        o = Integer.decode(items[i].getValue());
      else if(items[i].getType().equals("String"))
        o =items[i].getValue();
      else if(items[i].getType().equals("Object"))
        o =Class.forName(items[i].getValue()).newInstance();
     context.bind(items[i].getName(), o);
    }
  }

清单5b所示。示例XML配置文件

  <config>
    <itemname="config/screen/resolutionX" type="Integer"
         value="1024" />
    <itemname="config/screen/resolutionY" type="Integer"
         value="768" />
    <itemname="converters/html" type="Object"
         value="com.mycompany.converters.HtmlRenderer" />
    <itemname="converters/pdf" type="Object"
         value="com.pdfmonger.PdfRenderer" />
  </config>

清单5C。从JNDI检索和使用对象

public void convert(InputStream in, OutputStream out) {
    // Retrieve the converter object fromJNDI
    Context context = newInitialContext();
    Renderer renderer = (Renderer)context.lookup("converters/html");
    // Use the converter object
    renderer.convert(in, out);
  }

正如你可以看到,从JNDI中检索对象是相当方便,简单。通过使用JNDI来存储配置信息,无状态对象或对象的工厂,你可以轻松地构建灵活的应用程序包含了配置的复杂性在一个地方,同时,即使是分布式应用程序。(如果您的组件从JNDI名称空间访问对象,在组件的Javadoc中记录这些依赖关系。)

JNDI是不是只是用于J2EE

尽管JNDI客户端接口是J2SE发行版的一部分,大多数的J2SE应用程序不使用JNDI。那些做一般只使用JNDI来访问外部的目录服务(如LDAP)。然而,J2SE应用程序也可以使用部署时绑定,只有J2EE应用程序通常都使用迄今为止功能。有了这样JNP可自由查看的JNDI提供者的实现,需要一个命名服务的任何应用程序可以拥有一个。

java总结(三)——jndi在j2ee和j2se中的应用,码迷,mamicode.com

时间: 2024-08-05 19:22:25

java总结(三)——jndi在j2ee和j2se中的应用的相关文章

Effective Java 第三版——46. 优先考虑流中无副作用的函数

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java

Effective Java 第三版——16.在公共类中使用访问方法而不是公共属性

Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 16. 在公共类中使用访问方法而不是公共属性 有时候,你可能会试图写一些退化的类(degenerate classes),除了集中实例属性之外别无用处: // Degene

J2EE、J2SE、J2ME

http://developer.51cto.com/art/200906/130453.htm 本文介绍Java的三大块:J2EE.J2SE和J2ME.J2SE就是Java2的标准版,主要用于桌面应用软件的编程:J2ME主要应用于嵌入是系统开发,如手机和PDA的编程:J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统. AD:51CTO网+ 首届中国APP创新评选大赛火热招募中…… Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE

J2EE和J2se的区别

不管是J2ee还是J2se,都是Java为不同用户提供的不同服务,也就是通过提供不同类型的类库满足不同用户的需求. 一.概述 j2se.j2ee和J2me是Java2平台的三个版本.其中:  J2se(Java  2  standard edition),是Java2的标准版,主要用于开发桌面的应用程序.J2se包含了构成Java语言核心的类:数据库连接.接口定义.输入输出.网络编辑等: J2se是最基础的运行Java程序的工具包,包含了基本的Java类库,开发程序时不用使用http这些对象.

Java学习——何为JNDI

曾记得在做机房收费系统的时候就接触到了API,由于它的功能很强大,但是自己对它却不怎么了解,所以当时是又爱又怕.如今,一路走来才明白,其实它就是一组接口.只要我们去了解它就会发现,它其实也没想的那么可怕.今天我们来看一下java中的接口--JNDI. 概念 Java命名和目录接口(Java Naming and Directory Interface,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API.命名服务即将名称与对象相关联,以便能通过相应名称访问这些对象.而目录服务即其对

Java系列之JNDI

  简介   JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互.目录服务是命名服务的一种自然扩展.两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有emai

Java分为三个体系

Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由JamesGosling和同事们共同研发,并在1995年正式推出. Java分为三个体系: JavaSE(J2SE)(Java2PlatformStandardEdition,java平台标准版) JavaEE(J2EE)(Java2Platform,EnterpriseEdition,java平台企业版) JavaME(J2ME)(Java2PlatformMicroEdit

[Java面试三]JavaWeb基础知识总结.

1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变. • 动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同. l 静态web资源开发技术 • Html l 常用动态web资源开发技术: • JSP/Servlet.ASP

解析JDK、J2EE、J2SE、J2ME的区别

JAVA开发四年,许多东西概念性却很模糊,这里给自己补习一下,也和大家分享一下. 你对JDK.J2EE.J2SE.J2ME概念是否了解,这里和大家分享一下JDK.J2EE.J2SE.J2ME的概念以及他们的关系区别,相信本文介绍一定会让你有所收获. JDK,J2EE,J2SE,J2ME的概念区别是什么呢? 1.JDK是Javadevelopmenttoolkit,相当于是Java的库函数,是编译,运行java程序的工具包. J2EE是Java2enterpriseedition是Java的一种企