`
huangyuanmu
  • 浏览: 289836 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

JNDI笔记(三)

阅读更多

原帖地址:http://blog.csdn.net/qhmao/archive/2008/10/19/3097753.aspx

 

在J2SE下使用JNDI下就显得困难一些,首先,我们没有单独的JNDI服务器可以用,JBoss提供了一个免费的JNP服务,通过配置可以作为 单独的JNDI服务器启用。不过这里就不这么麻烦了,如何使用JBOSS作为JNDI服务器,以后将单独撰文讲述,这里我使用sun提供的 com.sun.jndi.fscontext.RefFSContextFactory作为JNDI服务器,其实这是使用文件系统来存储JNDI对象。 至于如何存储后文还将专门描述。

为了在J2SE下使用JNDI,我们首先得到sun的网站上下载3个包,jndi.jar、fscontext.jar和providerutil.jar,前者提供了JNDI服务的接口,后两者是我们要使用的文件系统作为JNDI服务器的支持包。

使用RefFSContextFactory,要求绑定的对象必须实现javax.naming.Referencable接口,否则在绑定时将报如下错误:

Can only bind References or Referenceable objects

各个JDBC驱动提供商提供的DataSource类都实现了Referencable接口,可以直接使用。不过本着学习的态度,我还是在这里演示一下如何实现Referencable接口。

这个如何实现将在后文结合代码详细介绍。本例包括4个类,说明如下:

  • BindedClass:自定义的实现Referenceable接口的类
  • BindedClassFactory:工厂类,能够把一个Reference对象转换为BindedClass对象
  • Bind:测试类,用于在JNDI中绑定对象
  • Loopup:测试类,用于从JNDI中获取对象

3.1 BindedClass和BindedClassFactory

3.1.1 BindedClass

package  lld.test.jndi;

import  javax.naming.NamingException;
import  javax.naming.Reference;
import  javax.naming.Referenceable;
import  javax.naming.StringRefAddr;

public   class  BindedClass  implements  Referenceable 
... {
    
public  String value; 
    
    
public  BindedClass()
    
... {
    }

    
    @Override
    
public  Reference getReference()  throws  NamingException
    
... {
        Reference r 
=   new  Reference( this .getClass().getName(), BindedClassFactory. class .getName(),  null );
        r.add(
new  StringRefAddr( " value " this .getValue()));
        
return  r;
    }


    
public  String getValue()
    
... {
        
return  value;
    }


    
public   void  setValue(String value)
    
... {
        
this .value  =  value;
    }


}

 

3.1.2 BindedClassFactory

package  lld.test.jndi;

import  java.util.Hashtable;

import  javax.naming. * ;
import  javax.naming.spi. * ;

public   class  BindedClassFactory  implements  ObjectFactory
... {
    @Override
    
public  Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable
<? ?>  environment)  throws  Exception
    
... {
        
if (obj  instanceof  Reference)
        
... {
            Reference ref 
=  (Reference)obj;
            String val 
=  (String)ref.get( " value " ).getContent();
            BindedClass o 
=   new  BindedClass();
            o.setValue(val);
            
return  o;
            
        }

        
return   null ;
    }

}

 

3.1.3 代码解释

Referenable接口只有一个方法,就是getReference(),返回一个Reference对象,BindedClass只设了一个 示例成员变量Value,存储一个字符串值,在创建Refernce对象时,要指定它引用的类名以及创建该类的工厂对象,JNDI Context在绑定该对象时就会将这些信息都存到文件中,将来从JNDI中取对象时可就全靠工厂对象根据文件中的内容重建BindedClass对象 了。我这里提前把绑定后生成的文件内容说一下,大家会更有一个直观的印象,其内容如下所示:

bind1/RefAddr/0/Type=value
bind1/ClassName=lld.test.jndi.BindedClass
bind1/RefAddr/0/Encoding=String
bind1/FactoryName=lld.test.jndi.BindedClassFactory
bind1/RefAddr/0/Content=abcdefg

大家看到了,前面在BindedClass.getReference()方法中使用了如下语句:

r.add(new StringRefAddr("value", this.getValue()));

就是定义要将这些信息存储到JNDI中呢,至于最后的“bind1/RefAddr/0/Content=abcdefg”,那是因为我在后面的示 例Bind.java中将其值设成了“abcdefg”而已,呵呵。而BindedClassFactory.getObjectInstance()方 法中

String val = (String)ref.get("value").getContent();

就是用来取到存储的值呢。

3.2 Bind.java

本例用来绑定一个BindedClass对象

package  lld.test.jndi;

import  java.util.Properties;

import  javax.naming.Context;
import  javax.naming.directory.DirContext;
import  javax.naming.directory.InitialDirContext;

public   class  Bind
... {
    
public   static   void  main(String[] args)  throws  Exception
    
... {
        Properties ps 
=   new  Properties();
        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
" com.sun.jndi.fscontext.RefFSContextFactory " );
        ps.setProperty(Context.PROVIDER_URL, 
" file:JNDI_REF " );
        DirContext ctx 
=   new  InitialDirContext(ps);
        String key 
=   " bind1 " ;

        BindedClass b 
=   new  BindedClass();
        b.setValue(
" abcdefg " );
        ctx.rebind(key, b);

        System.out.println(
" Binded successfully! " );
        ctx.close();
    }

}

 

3.3 Lookup.java

本例用来从JNDI中获取绑定的BindedClass对象

package  lld.test.jndi;

import  java.util.Properties;

import  javax.naming.Context;
import  javax.naming.directory.DirContext;
import  javax.naming.directory.InitialDirContext;

public   class  Lookup
... {
    
public   static   void  main(String[] args)  throws  Exception
    
... {
        Properties ps 
=   new  Properties();
        ps.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
" com.sun.jndi.fscontext.RefFSContextFactory " );
        ps.setProperty(Context.PROVIDER_URL, 
" file:JNDI_REF " );
        DirContext ctx 
=   new  InitialDirContext(ps);
        String key 
=   " bind1 " ;
        BindedClass o 
=  (BindedClass)ctx.lookup(key);
        System.out.println(o.getValue());    
        
        ctx.close();
    }


}
分享到:
评论

相关推荐

    初学jndi笔记

    #### 三、JNDI的工作原理 1. **JNDI架构**:JNDI的核心概念包括**JNDI管理器**、**服务提供者接口(SPI)**和**应用程序接口(API)**。其中,**JNDI管理器**负责管理命名空间和目录信息;**SPI**定义了服务提供者必须...

    DBCP 数据库连接池JNDI连接 学习笔记

    这篇“DBCP 数据库连接池JNDI连接 学习笔记”主要探讨了如何结合JNDI(Java Naming and Directory Interface)来使用DBCP进行数据库连接管理。JNDI提供了一种标准的方式来查找和绑定资源,如数据源,在企业级应用中...

    servlet学习笔记_JNDI.doc

    ### JNDI (Java Naming and Directory Interface)学习笔记 #### 一、JNDI简介 JNDI(Java Naming and Directory Interface),即Java命名和目录接口,是在分布式计算环境中使用的一种标准化接口,它允许Java应用...

    Tomcat学习笔记 - 【使用JNDI数据源】

    【标题】"Tomcat学习笔记 - 使用JNDI数据源" 在Java应用服务器如Tomcat中,使用JNDI(Java Naming and Directory Interface)数据源是一种标准的方式,它允许我们集中管理和配置数据库连接,提高应用的可移植性和可...

    李兴华--J2EE核心框架 笔记

    笔记可能涉及JNDI的基本操作和在J2EE应用中的应用场景。 6. **JTA(Java Transaction API)**:JTA为分布式事务处理提供了标准接口,确保在多组件环境中的数据一致性。笔记可能会讲解事务的ACID属性和JTA的使用方法...

    JAVA WEB学习笔记

    【JAVA WEB学习笔记】——Tomcat中数据源的配置与使用 在Java Web开发中,数据源(DataSource)是管理数据库连接的关键组件。它提供了一种高效、灵活的方式来获取和管理数据库连接,尤其是在大型企业级应用中。...

    javaweb笔记+狂神+知识总结

    7. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一种标准的方式来查找和访问各种命名和目录服务,常用于在JavaWeb应用中查找数据库连接池、邮件服务器配置等资源。 8. **DAO(Data Access Object...

    JAVAWEB开发实战经典(课堂笔记)

    5. **Java EE相关技术**:包括JNDI(Java Naming and Directory Interface)、JTA(Java Transaction API)和JMS(Java Message Service)等,这些在企业级Java应用中广泛使用,笔记可能涉及这些技术的基本概念和...

    java web 笔记整理

    这份"java web 笔记整理"涵盖了该领域的关键概念和技术,包括Servlet、JSP、MVC模式、JNDI、JTA以及EJB等核心内容。以下是根据笔记内容整理出的知识点详解: 1. **Servlet**:Servlet是Java平台上的服务器端组件,...

    基于j2ee开发的web笔记

    这个压缩包很可能包含了多个文件,如HTML、PDF或Markdown格式的笔记文档,它们可能分别对应J2EE的不同组件和技术,如Servlet、JSP、EJB、JNDI、JTA、JMS、JPA等。这些文件可能按照课程章节或主题进行组织,以便读者...

    Javaee课堂笔记精华总结就业必备

    8. **JNDI(Java Naming and Directory Interface)**:JNDI为Java应用提供了一种查找和管理资源的接口,如EJB、数据源等。 9. **JAX-RS(Java API for RESTful Web Services)**:JAX-RS是JavaEE中的RESTful服务...

    达内java笔记,精挑细选(达内助教整理)

    6. **JNDI(Java Naming and Directory Interface)**:JNDI提供了一个统一的接口来查找和管理网络资源,如EJB、数据库连接等。 在"达内笔记(达内助教整理的)"中,你可能会发现以下内容: - **基础篇**:Java...

    魔乐科技 J2EE详细笔记 很经典的

    3. JNDI(Java Naming and Directory Interface):服务发现和绑定,用于查找和访问各种资源。 通过学习《魔乐科技 J2EE详细笔记》,开发者可以深入了解J2EE的各个层面,掌握企业级应用开发的必备技能。这份笔记...

    javaee思维导图版笔记-吉林大学

    本笔记主要涵盖了Java EE的基础知识,包括Servlet、JSP、JNDI、JPA等方面的内容。 一、Servlet概述 Servlet是Java EE中的一种服务器端组件,用于处理HTTP请求并返回响应。Servlet的生命周期包括初始化、提供服务和...

    Servlet学习笔记3

    ### Servlet学习笔记3:深入理解Servlet...综上所述,本学习笔记涵盖了Servlet技术的核心概念、Tomcat服务器配置、JNDI和数据源管理以及Java EE架构的概览,是Java Web开发者深入理解和掌握Servlet技术的重要参考资料。

    java系列笔记【全套15个文档】

    3. **JNDI**:命名和目录服务,用于查找和管理资源。 4. **EJB**:企业JavaBean,提供分布式计算,事务管理,安全性等功能。 5. **JMS**:Java消息服务,实现异步通信和解耦。 6. **JTA**:Java事务API,处理分布式...

    韩顺平JSP学习笔记+源代码

    在韩顺平老师的教学笔记中,首先提到了J2EE平台下的十三种核心技术,这些技术对于理解JSP及其相关的Web开发环境至关重要。 1. **Java数据库连接(JDBC)** - **JDBC-ODBC桥**:早期的一种解决方案,通过ODBC(开放...

    MLDN李兴华视频教程学习笔记j2ee web.rar

    学习笔记会讲解如何通过JNDI查找和管理这些服务。 5. **JTA(Java Transaction API)和JPA(Java Persistence API)**:JTA提供了一种统一的事务管理机制,确保多操作的原子性。JPA则简化了对象关系映射(ORM),...

Global site tag (gtag.js) - Google Analytics