什么是
JNDI
?
The Java Naming and Directory Interface
是访问不同名字和目录服务的统一
API
接口。
不同的服务使用不同的名字格式。
Java
程序需要以相同的格式访问数据库,文件,目录,对象和网络。
JNID
有两部分接口:应用程序接口和提供服务的接口。在应用程序中使用
API
来访问名字或目录服务,在一个新的服务中使用
SPI
来提供服务。
JNDI
结构
名字服务(
Naming Services
)
名字服务提供一种方法,映射标识符到实体或对象。
你需要知道的几条基本条款:
绑定:
绑定是将一个不可分割的名字(
"
原子
"
名字)与一个对象联系起来。像
DNS
,我们用名字
www.yahoo.com
与
IP
地址
216.32.74.53
联系起来,一个文件对象用文件名
afile.txt
联系起来。
名字空间;
名字空间包含一组名字,但名字空间内每个名字是唯一的。一个文件目录就是一个简单的名字空间,如目录
C:temp
,在这个目录下,不能有两个相同名字的文件,但是,不同目录下的两个文件可能有相同的名字。
复合名字:
复合名字是用名字空间构成的唯一名字,有一个或多个
"
原子
"
名字构成,取决于所在的名字空间。文件路径就是一个复合名字,比如我们用
C:tempmyfile.txt
,我们可以看到,这个名字由根目录名(
C:
),临时目录名(
temp
)和一个文件名(
myfile.txt
)构成,这
3
个名字复合起来表示一个唯一的名字。
组合名字:
组合名字能跨越多个名字空间。一个
URL
就是一个组合名字,如果你看见
http://www.npu.edu/index.htm
,你使用
http
服务连接到服务器,然后使用另一个名字空间
/index.htm
来访问一个文件。
目录服务
目录服务提供一组分成等级的目录对象,具有可搜索的能力。
在目录服务中存储的对象可以是任何能用一组属性描述的对象,每个对象都可通过一组属性来描述该对象的能力。例如,一个
Person
对象可能有
height
,
hair color
,
age
,
sex
等属性。目录服务还可提供根据要求来搜索的能力,如我们可以使用
Person
的
age
属性,搜索
20-25
岁间的
Person
对象,目录服务将返回符合条件的
Persion
对象。这通常被称作基于内容的搜索。
在客户端使用
JNDI
:
u
创建一个
java.util.Hashtable
或者
java.util.Properties
的实例。
u
添加变量到
Hashtable
或
Properties
对象:
由
naming server
提供的
JNDI class
类名。
包含
aming server
位置的
URL
。
安全信任书。
u
通过
Hashtable
或
Properites
或
jndi
属性文件创建一个
InitialContext
对象。
示例:
import java.util.*;
import javax.naming.*;
…
env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext ctx = new InitialContext(env);
环境变量
|
相应的常量
|
说明
|
java.naming.factory.initial
|
Context.INITIAL_CONTEXT_FACTORY
|
Context Factory
类名,由服务提供商给出。
|
java.naming.provider.url
|
Context.PROVIDE_URL
|
初始化地址。
|
java.naming.security.
principal
|
Context.SECURITY_PRINCIPAL
|
服务使用者信息。
|
java.naming.security.
credentials
|
Context.SECURITY_CREDENTIAL
|
口令。
|
更多的配置示例:
Hashtable env = new Hashtable();
env.put (Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.SECURITY_PRINCIPAL, "system");
env.put(Context.SECURITY_CREDENTIALS, "password here");
Properties env = new Properties();
env.setProperties ("java.naming.factory.initial",
"weblogic.jndi.WLInitialContextFactory");
env.setProperties("java.naming.provider.url" , "t3://localhost:7001");
env.setProperties("java.naming.security.principal" , "tommy");
env.setProperties("java.naming.security.credentials" ,"password here");
创建
InitialContext
:
Class Name: javax.naming.InitialContext
Interfaces that it implements: javax.naming.Context
Constructors:
public InitialContext();
public InitialContext(Hashtable configuration);
public InitialContext(Properties configuration);
以上所有方法都可能抛出
NamingException
。
一个
Binding
示例:
public static InitialContext getInitialContext() throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext context = new InitialContext(env);
return context;
}
//Obtain the initial context
InitialContext initialContext = getInitialContext();
//Create a Bank object.
Bank myBank = new Bank();
//Bind the object into the JNDI tree.
initialContext.rebind("theBank",myBank);
一个
Lookup
示例:
public static InitialContext getInitialContext() throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,"t3://localhost:7001");
InitialContext context = new InitialContext(env);
return context;
}
//Obtain the initial context
InitialContext initialContext = getInitialContext();
//Lookup an existing Bank object.
Bank myBank = (Bank) initialContext.lookup("theBank");
可能发生的
NamingException
:
AuthenticationException
CommunicationException
InvalidNameException
NameNotFoundException
NoInitialContextException
枚举所有名字对象:
NamingEnumeration Declaration:
public interface NamingEnumeration extends Enumeration {
public boolean hashMore() throws NamingException;
public Object next() throws NamingException;
public void close() throws NamingException; //jndi 1.2
}
try {
…
NamingEnumeration enum = ctx.list("");
while (enum.hasMore()) {
NameClassPair ncp = (NameClassPair) enum.next();
System.out.println("JNDI name is:" + ncp.getName());
}
}
catch (NamingException e) {…}
最后的示例:
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;
import java.io.*;
public class ListAll {
public static void main(java.lang.String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
try {
InitialContext ctx = new InitialContext(env);
NamingEnumeration enum = ctx.listBindings("");
while(enum.hasMore()) {
Binding binding = (Binding) enum.next();
Object obj = (Object) binding.getObject();
System.out.println(obj);
}
} catch (NamingException e) {
System.out.println(e);
}
} // end main
} // end List
-------------------------------------------------------------------------
用hashtable:
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
ht.put(Context.SECURITY_PRINCIPAL,"guest");
ht.put(Context.SECURITY_CREDENTIALS,"guestpassword");
Context ctx = new InitialContext(ht);
Object obj = ctx.lookup("Name_Of_Object");
-----------------------------------------------------------------------
ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
ht.put(Context.PROVIDER_URL, "t3://localhost:7001");
/* 如果要验证(一般不需要):
ht.put(Context.SECURITY_PRINCIPAL,"用户名");
ht.put(Context.SECURITY_CREDENTIALS,"口令");
*/
注意:
InitialContextFactory是接口,不同厂商提供不同的实现类,
weblogic.jndi.WLInitialContextFactory是weblogic的实现类,改成sun的就可以了,写类的全名,你需要查sun app server的文档看看jndi怎么写(如果有FAQ多半可以搜索jndi找到这个设置)
URL是一个查找服务器的格式,weblogic的格式为
t3://ip-address:7001/
sun app server肯定不一样,看看文档就知道格式怎么写了
当你指定URL后,特定厂商的InitialContextFactory会识别这个URL,所以这个URL是厂商自己规定的,jndi并没有规定
-------------------------------------------------------------------------
这是JBOSS的
Hashtable env=new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL,"192.168.0.81:2198");
env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
分享到:
相关推荐
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...
对于session对象的setMaxInactiveInterval(int interval) 如果参数设置为负数.....
JNDI全称 Java Naming and Directory Interface JNDI 是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应...
JNDI全名为Java Naming and Directory Interface.JNDI主要提供应用程序所需要资源上命名与目录服务。在Java EE环境中,JNDI扮演了一个很重要的角色,它提供了一个接口让用户在不知道资源所在位置的情形下,取得该...
(1)JNDI:Java Naming & Directory Interface,JAVA命名目录服务.主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能. (2)JMS:Java ...
JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。
JCDF集中JSP(Java Server Pages),Servlets,EJB(Enterprise JavaBeans)组件,JDBC,JNDI(Java Naming and Directory Interface),标签库(TagLib),XML文档格式等关键技术,采用众多开发模式,为基于J2EE...
Advanced Java Programming is a textbook specially... Java Naming and Directory Interface Chapter 25. Java Message Service Chapter 26. Introduction to J2EE Chapter 27. Java and CORBA 28. Java Server Faces
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...
Resources and JNDI Naming 529 DataSource Objects and Connection Pools 530 Resource Injection 531 Resource Adapters and Contracts 534 Metadata Annotations 538 Common Client Interface 540 Further ...
JNDI (Java Naming and Directory Interface) 它还提供一些高级特性,比如集群、JMX、Web Service。它还整合了IIOP(Internet Inter-ORB Protocol)。 因为JBoss代码遵循LGPL许可,你可以在任何商业应 用中免费使用...
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务...
JNDI(Java Naming and Directory Interface)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI SPI的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,...
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,...
Java Naming & Directory Interface (JNDI) 1.2.1 Java Servlet 2.3 & JavaServer Pages (JSP) 1.2 Java Transaction API (JTA) 1.0.1b Java API for XML Processing (JAXP) 1.1 Java Authentication & ...
JNDI全名叫做Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API,JNDI是J2EE的核心技术之一,JNDI的功能简单说是可以简单的方式去查找某种...
5、JNDI(Java Naming and Directory Interface)提供从Java平台到的统一的无缝的连接。这个接口屏蔽了企业网络所使用的各种命名和目录服务。 6、JMAPI(Java Management API)为异构网络上系统、网络和服务管理的...
Defines the Java Naming and Directory Interface (JNDI) API. java.prefs Defines the Preferences API. java.rmi Defines the Remote Method Invocation (RMI) API. java.scripting Defines the Scripting API...
☆ Java Naming and Directory Interface (JNDI,Java名字与目录接口) ☆ XML ☆ J2EE Connector Architecture (J2EE连接器架构) ☆ JavaMail ☆ JDBC <br> 当你准备创建自己的大型...