(1)概念
Java命名和目录接口
命名和目录服务把标识符和资源关联起来
(2)图解
JNDI是用于访问不同的命名和目录服务的统一API接口
(3)何时使用JNDI
JNDI是一种查找服务,用于查找:
Web应用环境变量
EJBs和它们的环境变量
通过DataSources的数据库连接池
JMS目标和连接工厂
其它服务
不要将JNDI当作数据库使用:
JNDI对象储存在内存中
访问JNDI对象与网络性能有关
(4)JNDI树
Initial Context,对象(叶子结点),Context(结点)
(5)连接到JNDI的方法
<1>不带参数
//从服务器端对象连接到JNDI
Contextctx = new InitialContext();
<2>跟Environment
weblogic.jndi.Environmentenv = new weblogic.jndi.Environment();
env.setProviderurl("t3://127.0.0.1:7001");
env.setSecurityPrincipal("system");
env.setSecurityCredentials("PassWord");
contextctx = env.getInitialContext();
创建Environment对象:
填写Environment:
WebLogicServer的位置
安全信息
使用Environment对象创建InitialContext
创建Subcontext
创建一个用于绑定对象的新Subcontext:
Contextctx = env.getInitialContext();
Contextsubcontext = ctx.createSubcontext("newSubcontext");
subcontext.rebind("boundObject",object);
subcontext.close();
ctx.close();
//首先必须获得存在的Subcontext或InitialContext
//在当前的Context下创建新的Subcontext
//绑定一个对象
//当结束时关闭访问的资源
<3>跟Hashtable
Hashtableenv = 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_CRRDENTIALS,"PassWord");
Contextctx = new InitalContext(env);
<4>使用Properties
Propertiesenv = new Properties();
env.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
env.setProperty("java.naming.provider.url","t3://192.2.56.102:7001");
env.setProperty("java.naming.security.principal","system");
env.setProperty("java.naming.security.credentials","PassWrod");
Contextctx = new InitialContext(env);
(6)一些JNDI环境属性
环境属性 | 等同的Environment方法 | 作用 |
---|---|---|
java.naming.factory.initial | Environment.setInitialContextFactory(java.lang.StringfactoryName) | 上下文工厂的类名。这是服务提供者给定的类名。 |
java.naming.provider.url | Environment.setProviderUrl(java.lang.Stringurl) | 服务提供者所使用的配置信息。在这里指出网络位置信息。 |
java.naming.security.principal | Environment.setSecurityPrincipal(java.lang.Stringprincipal) | 使用服务提供者的人员身份标识 |
java.naming.security.credentials | Environment.setSecurityCredenttials(java.lang.Objectcredentials) | 该身份的密码 |
(7)jndi.properties
jndi.properties文件为所有的InitialContexts设置默认的属性
jndi.properties文件的搜索次序:CLASSPATH,$JAVA_HOME/lib/
(8)从JNDI查找
Lookup()从JNDI树获得对象
通过lookup()返回的对象必须映射到它们合适的类型
importjavax.naming.*;
try{
Contextic = new Context();
Objectobj;
obj= ic.lookup("javax.transaction.UserTransaction");
UserTransactionut = (UserTransaction)obj;
ut.begin();
...
ic.close();
}catch(NamingException e) {...}
(9)远程绑定对象
绑定到远程命名服务的对象必须是序列化的
访问命名服务时,对象是采用复制机制
(绑定的对象是序列化到命名服务器的,查找的对象是序列化到客户的)
(10)一个Binding示例
public static Context getInitialContext()throws NamingException {
Environmentenv = new Environment();
env.setProviderUrl("t3://localhost:7001");
env.setSecurityPrincipal("system");
env.setSecurityCredentials("weblogic");
Contextcontext = env.getInitialContext();
returncontext;
}
Context ctx = getInitialContext(); //获得initial context
Bank myBank = new Bank(); //创建名为Bank的对象
ctx.rebind("theBank", myBank); //把对象绑定到JNDI树
ctx.close();
(11)一个Un-Binding示例
public static Context getInitialContext()throws NamingException {
Environmentenv = new Environment();
env.setProviderUrl("http://localhost:7001");
env.setSecurityPrincipal("system");
env.setSecurityCredentials("weblogic");
Contextcontext = env.getInitialContext();
returncontext;
}
Context ctx = getInitialContext(); //获得initial context
ctx.unbind("theBank"); //解除绑定到“theBank”的对象
ctx.close();
(12)可能的命名异常
当与JNDI交互时可能发生的例外i:
AuthenticationException认证
CommunicationException通信
InvalidNameException无效名称
NameNotFoundException名字没有找到
NoInitialContextException没有连接initialcontext