`
esteem
  • 浏览: 156599 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JNDI学习

    博客分类:
  • J2EE
阅读更多

首先,我来介绍一下JNDI服务中的Reference对象。
  一般来说,我们可以把一个对象注册到JNDI服务中,通过调用InitialContext的bind和rebind方法即可。这个被注册的对象,我们称之为“被引用对象”,它是驻扎在内存中的运行时对象。JNDI服务的功能不是仅限于此,它还可以注册各种资源,例如网络打印机。这类资源可不是内存中可以找到的运行时对象,所以它们不能直接注册到JNDI的命名空间中,而必须以某种间接的方式注册。以网络打印机为例,JNDI服务可以注册它的IP地址和端口,有了通信地址,总是可以访问到网络打印机的。
    在JNDI API的javax.naming包中,有一个Reference类,它就是代表这些网络打印机这类资源的。Reference对象包含一系列RefAddr对象,RefAddr对象就表示资源的通信地址。Reference对象中还包含被引用对象的类名和对象工厂的类名,当被引用对象被lookup的时候,对象工厂会实时创建被引用对象的实例。举个列子,如果客户需要通过JNDI去获得一个唯一的ID,那么我们在JNDI中注册一个IDFactory。这个工厂以递增的次序创建ID。当客户调用lookup方法获得ID的时候,每次得到的是不同的、唯一的ID。

 

http://blog.csdn.net/lldwolf/archive/2008/04/17/2299622.aspx 这篇文章比较好的介绍了Referencable、Reference等的用法。

BindedClass和BindedClassFactory

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;
    }

}

 

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;
    }
}

 

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();

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

 

Bind.java

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();
    }
}

 

Lookup.java

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学习资料,有关使用和配置

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它提供了一种标准的方法来查找和绑定各种类型的名字。在IT领域,JNDI主要被用来管理和查找数据源(DataSource),特别是在...

    JNDI学习总结(一)——JNDI数据源的配置.html

    JNDI学习总结,JNDI配置数据源,资料详细,适合初学者

    jndi学习经典

    javaEE学习EJB的jndi,一个小代码,易于理解

    JNDI学习文档.doc

    **Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的一组API。它提供了一个统一的接口来查找、访问和管理分布式系统中的资源,如数据库连接池、邮件服务器、对象服务等。JNDI的核心...

    JNDI介绍和学习资料

    关于JNDI的介绍和个人总结 还请多多指教 大家来分享学习 共同进步 谢谢

    JNDI学习总结.docx

    java - 访问数据库学习 在Java开发中,使用JDBC操作数据库的步骤 数据源由来、数据源配置

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

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

    JNDIDemo 以及相关文档

    通过学习这些文档和实践`JNDIDemo`,你可以掌握JNDI的基本用法,理解其在企业级应用中的重要性,以及如何在实际项目中利用JNDI进行资源管理。这将有助于提升你的Java编程技能,特别是对于处理分布式系统和企业级Java...

    JNDI示例整合SSH

    **标题:“JNDI示例整合SSH”** 在IT领域,`JNDI`(Java Naming and Directory Interface)是...为了深入学习和实践,你可以解压并研究这些文件,结合文章链接中提供的详细教程,进一步理解JNDI在SSH框架中的应用。

    JNDI基础教程课件

    jndi入门学习资料,介绍jndi基本原理,安装和使用,基本配置

    JNDI简单应用示例

    通过阅读和学习这个示例,你可以掌握如何在实际项目中利用JNDI来管理和查找资源,提高代码的可维护性和可扩展性。对于那些处理复杂企业级应用,尤其是需要频繁交互各种服务的开发者来说,理解并熟练使用JNDI是非常有...

    JNDI初步学习资料

    JNDI(Java Naming and Directory Interface)是Java平台中用于访问命名和目录服务的API,它为Java应用程序提供了一种标准的方式来查找、管理和组织资源。JNDI与具体的命名或目录服务实现无关,这意味着开发者可以...

    JNDI注入学习1

    **JNDI注入详解** Java Naming and Directory Interface (JNDI) 是Java应用程序用来查找和管理网络资源的接口。它不依赖于特定的目录服务,而是通过服务提供者接口(SPI)来支持多种不同的目录服务,如LDAP、DNS等...

    JNDI.rar_JINI jndi_JNDI相关书籍_jndi

    **在学习JNDI时,你可能会遇到的几个关键知识点:** 1. **Naming Contexts**:命名上下文是JNDI的核心,它代表了一个命名空间,可以包含其他上下文和对象。 2. **Lookup操作**:通过指定的名字在命名上下文中查找...

    JNDI配置原理详解.doc

    通过本文的学习,我们了解了JNDI的基本原理及其在不同环境下的配置方法。特别地,对于非服务器环境,我们探讨了如何通过启动本地RMI服务来模拟JNDI行为。此外,还简要介绍了JNDI的安全性配置选项。掌握这些知识将有...

    JNDI使用

    - **学习曲线**:JNDI API相对复杂,需要花费时间学习。 - **性能**:相比于直接访问服务,通过JNDI进行查找可能稍慢。 通过上述介绍,我们可以看出JNDI在Java应用程序中起着至关重要的作用,尤其是在企业级应用中...

    jndi测试小项目,初学者

    **学习JNDI的关键点**: 1. **理解Naming和Directory的区别**:Naming服务主要是用来管理简单的名字到对象的映射,而Directory服务则可以存储和检索更复杂的对象,包括属性和层次结构。 2. **JNDI API的使用**:熟悉...

    JNDI数据链接池示例

    **JNDI(Java Naming and Directory Interface)**是Java平台中的一个重要组件,它提供了一种标准的方法来查找和访问...TestJNDI文件提供了实践这一概念的实际代码,对学习和掌握JNDI数据链接池有着重要的指导作用。

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip

    Java Naming and Directory Interface (JNDI) 是Java平台中用于访问命名和目录服务的API,它允许程序查找和操作各种...通过学习和理解这个工具包,开发人员和安全专家能够增强他们的系统安全性,防止这类威胁的发生。

Global site tag (gtag.js) - Google Analytics