码迷,mamicode.com
首页 > 其他好文 > 详细

JNDI

时间:2015-02-26 21:44:10      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

一、JNDI概述

        

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


二、何为JNDI

       
       JNDI 的主要功能可以这样描述,它使用一张哈希表存储对象(大多数的J2EE容器也的确是这样做的),然后,开发人员可以使用键值——也就是一个字符串——来获 取这个对象。这里就包括取JNDI的两个最主要操作,bind和lookup。bind操作负责往哈希表里存对象,存对象的时候要定义好对象的键值字符 串,lookup则根据这个键值字符串往外取对象。
       JNDI的命称可能会让人产生混淆,似乎觉得这是一个用来操作目录的,事实上,我更愿意把这个目录理解成为JNDI存放对象时使用的格式,也就是说,JNDI以目录的方式存储对象的属性。例如,用户通过JNDI存储一个汽车对象,那么,汽 车就是根目录,汽车的轮子、引擎之类的子对象就算是子目录,而属性,比如说汽车的牌子、重量之类,就算是汽车目录下的文件。
      JNDI的功能既然就是根据一个字符串键值就可以取得一个想要得到的对象,这不就是跟COM或CORBA一样吗?

三、JBOSS7下使用JNDI绑定简单对象


封装将简单对象绑定到JNDI,通过JNDI查找对象
package com.zhouxiang;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JndiTest {
	
	   //将当前对象绑定到<span style="font-family: Arial; font-size: 14px; line-height: 26px;">目录容器环境中</span>
	    public void registerInJndi() {
	        try {
	            Context context = new InitialContext();
	            context.bind("java:global/JndiEjb", this);
	         
	        } catch (NamingException e) {
	           
	        }
	    }
           //通过jndi查找并返回<span style="font-family: 'Microsoft YaHei UI', 'Microsoft YaHei', SimSun, 'Segoe UI', Tahoma, Helvetica, sans-serif, 'Microsoft YaHei', Georgia, Helvetica, Arial, sans-serif, 宋体, PMingLiU, serif;">当前对象</span>
	    public void retrieveFromJndi() {
	        try {
	            Context context = new InitialContext();
	            Object lookup = context.lookup("java:global/JndiEjb");
	            if(lookup != null && lookup instanceof  JndiTest) {
	                
	                JndiTest jndiEjb = (JndiTest)lookup;
	                jndiEjb.helloWorld();
	            }
	        } catch (NamingException e) {
	          
	        }
	    }

	    public void helloWorld() {
	      System.out.println("hello world");
	    }
	
}

通过servlet注册、查找Jndi

package com.zhouxiang;

import java.io.IOException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class CDITest
 */
public class ServletTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
 
    private JndiTest test1=new JndiTest();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CDITest() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request,response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		test1.registerInJndi();
		test1.retrieveFromJndi();
	}

}


四、总结

       
       J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。JNDI的具体应用如绑定数据源、EJB远程对象查找、用于DNS查询的JNDI服务程序等等。


JNDI

标签:

原文地址:http://blog.csdn.net/leimengyuanlian/article/details/43955655

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!