什么是jndi

关键字: 什么是jndi jndi

JNDI全称 Java Naming and Directory Interface

JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。

JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。

JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如,每个上下文提供了一个查找操作,返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间,即使用分层上下文以及使用相同命名语法的子上下文。

jndi的用途:

1。你可以用jndi来得到object类的属性

如:Attribute attr =directory.getAttributes(personName).get("email");

String email = (String)attr.get();

2。你可以用jndi来搜索对象

如:foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);

查找谁的名字叫Fox在wiz部门的员工?

3。你可以用jndi通过naming/directory服务查询像printers和databases的对象

如:查询 Printer

Printer printer = (Printer)namespace.lookup(printerName);

printer.print(document);

4。你可以用jndi列表出命名空间的特殊级别的内容

如:

NamingEnumeration list = namespace.list("o=Widget, c=US");

while (list.hasMore()) {

NameClassPair entry = (NameClassPair)list.next();

display(entry.getName(), entry.getClassName());

}

以上根据jndi文档翻译的

地址:

http://java.sun.com/products/jndi/overview.html

tomcat数据库连接池配置中的

java:comp/env代表你的JVM的环境,comp=computer env=environment

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

命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用

JNDI概述

我们大家每天都不知不觉地使用了命名服务。例如,当你在web浏览器输入URL,http://java.sun.com时,DNS(Domain Name System,域名系统)将这个符号URL名转换成通讯标识(IP地址)。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。

目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性(例如,用户有email地址),而命名服务中对象没有属性。因此,在目录服务中,你可以根据属性搜索对象。JNDI允许你访问文件系统中的文件,定位远程RMI注册的对象,访问象LDAP这样的目录服务,定位网络上的EJB组件。

对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址薄这样的应用来说,JNDI是一个很好的选择。

JNDI架构

JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,因此不管应用

访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要你有目录的服务提供接口(或驱动),你就可以使用目录。

JNDI是一组API,它用命名/目录服务增强了网络应用。本文中的示例说明了用JNDI开发基于目录的应用是多么容易。它也说明了如何用同样的API访问不同的命名/目录服务。开发者不必学习不同的API。在某些情况下,例如,在RMI和CORBA应用中,JNDI允许你部署时才选择命名服务。

JNDI未来将增加的功能包括:与标准的Java SASL API(JSR-28,http://jcp.org/aboutJava/communityprocess/review/jsr028/) 的集成、支持国际化域名、支持安全DNS。

为了开始使用JNDI和LDAP,下载Sun ONE目录服务器试用版(http://wwws.sun.com/software/products/directory_srvr/home_directory.html),这个服务器支持多种语言、多种平台。

-----------------------------------

JNDI介绍(详解,什么是JNDI)

JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。

JNDI可访问的现有的目录及服务有:

DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol 轻型目录访问协议)、 CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。

JNDI优点:

包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务;

可以同时连接到多个命名或目录服务上;

建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必指导对象或资源的物理ID。

JNDI程序包:

javax.naming:命名操作;

javax.naming.directory:目录操作;

javax.naming.event:在命名目录服务器中请求事件通知;

javax.naming.ldap:提供LDAP支持;

javax.naming.spi:允许动态插入不同实现。

利用JNDI的命名与服务功能来满足企业级APIs对命名与服务的访问,诸如EJBs、JMS、JDBC 2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。

JNDI与JDBC:

JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个纪录,同时返回数据库连接建立所必须的信息。

代码示例:

try{

Context cntxt = new InitialContext();

DataSource ds = (DataSource) cntxt.lookup("jdbc/dpt");

}

catch(NamingException ne){

...

}

JNDI与JMS:

消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。

代码示例:

try{

Properties env = new Properties();

InitialContext inictxt = new InitialContext(env);

TopicConnectionFactory connFactory = (TopicConnectionFactory) inictxt.lookup("TTopicConnectionFactory");

...

}

catch(NamingException ne){

...

}

访问特定目录:举个例子,人是个对象,他有好几个属性,诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法

Attribute attr =

directory.getAttributes(personName).get("email");

String email = (String)attr.get();

通过使用JNDI让客户使用对象的名称或属性来查找对象:

foxes = directory.search("o=Wiz,c=US", "sn=Fox", controls);

通过使用JNDI来查找诸如打印机、数据库这样的对象,查找打印机的例子:

Printer printer = (Printer)namespace.lookup(printerName);

printer.print(document);

浏览命名空间:

NamingEnumeration list = namespace.list("o=Widget, c=US");

while (list.hasMore()) {

NameClassPair entry = (NameClassPair)list.next();

display(entry.getName(), entry.getClassName());

}

常用的JNDI操作:

void bind(String sName,Object object);――绑定:把名称同对象关联的过程

void rebind(String sName,Object object);――重新绑定:用来把对象同一个已经存在的名称重新绑定

void unbind(String sName);――释放:用来把对象从目录中释放出来

void lookup(String sName,Object object);――查找:返回目录总的一个对象

void rename(String sOldName,String sNewName);――重命名:用来修改对象名称绑定的名称

NamingEnumeration listBinding(String sName);――清单:返回绑定在特定上下文中对象的清单列表

NamingEnumeration list(String sName);

代码示例:重新得到了名称、类名和绑定对象。

NamingEnumeration namEnumList = ctxt.listBinding("cntxtName");

...

while ( namEnumList.hasMore() ) {

Binding bnd = (Binding) namEnumList.next();

String sObjName = bnd.getName();

String sClassName = bnd.getClassName();

SomeObject objLocal = (SomeObject) bnd.getObject();

}

JNDI连接数据库模型

package DBUtil;

import java.sql.Connection;

import java.sql.Statement;

import java.sql.ResultSet;

import java.sql.SQLException;

import javax.sql.DataSource;

import javax.naming.Context;

import javax.naming.InitialContext;

public class DBConnection {

private Connection conn = null;

private Statement stmt = null;

private ResultSet rs = null;

private int resultNum = 0;

/**

* 构造函数

* 找到数据源,并用这个数据源创建连接

*/

public DBConnection() {

try {

Context ctx = new InitialContext();

if (ctx == null) throw new Exception("No Context");

DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/oracle");

if (ds == null) throw new Exception("jdbc/oracle is an unknown DataSource");

conn = ds.getConnection();

stmt = conn.createStatement();

} catch (Exception e) {

System.out.println("naming:" + e.getMessage());

}

}

/**

* 执行SQL语句:查询记录

* @param sql SQL语句

* @return ResultSet 记录集

*/

public ResultSet executeQuery(String sql) {

rs = null;

try {

rs = stmt.executeQuery(sql);

} catch(SQLException se) {

System.out.println("Query error:" + se.getMessage());

}

return rs;

}

/**

* 执行SQL语句 :插入与更新记录

* @param sql SQL语句

* @return int resultNum 更新的记录数

*/

public int executeUpdate(String sql) {

resultNum=0;

try {

resultNum = stmt.executeUpdate(sql);

} catch (SQLException se) {

System.err.println("Update error:" + se.getMessage());

}

return resultNum;

}

/**

* 关闭连接

*/

public void close() {

try {

if (rs != null) {

rs.close();

rs = null;

}

if (stmt != null) {

stmt.close();

stmt = null;

}

if (conn != null) {

conn.close();

conn = null;

}

} catch (SQLException se) {

System.out.println("close error:" + se.getMessage());

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值