¡¡
学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步一步的来学习。今天主要是讲讲JNDI。
一、理解JNDI的用途:
JNDI是用于访问不同的命名和目录服务的统一API接口。
二、那何时使用JNDI呢:
(1)JNDI是一种查找服务,用于查找:
Web应用环境变量
EJBs和它们的环境变量
通过DataSources的数据库连接池
JMS目标和连接工厂
其他服务
(2)不要将JNDI当作数据库使用
JNDI对象存储在内存中
访问JNDI对象与网络性能有关
接下来我们看一下JNDI树:
接下来我们理解理解图上的意思;我们看到Initial Context是JNDI树所有搜索的起点,那么如何重建Initial Context呢?
三、有两种途径,我们接下来一一讲解:
(1)、从服务器端对象连接到JNDI:
[java]view plaincopyprint?
1. //创建一个InitialContext
2. context ctx=new InitialContext();
//创建一个InitialContext context ctx=new InitialContext();
(2)、从任何一个地方连接到JNDI:
创建Environment对象:
[java]view plaincopyprint?
1. weblogic.jndi.Enviroment env=new
2. weblogic.jndi.Enviroment();
weblogic.jndi.Enviroment env=new weblogic.jndi.Enviroment();
填写Environment:
[java]view plaincopyprint?
1. env.setProviderur("t3://127.0.0.1:7001");//Weblogic
2. //Server的位置
3. env.setSecurityPrincipal("system");//安全信息
4. env.setSecurityCredentials("passWord");
5. //使用Environment对象创建InitialContext
6. context ctx=env.getInitialContext();
env.setProviderur("t3://127.0.0.1:7001");//Weblogic//Server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentials("passWord");
//使用Environment对象创建InitialContext
context ctx=env.getInitialContext();
创建Subcontext:
四、创建一个用于绑定对象的新的Subcontext:
[java]view plaincopyprint?
1. //创建Environment对象
2. Contextctx = env.getInitialContext();//首先必须获得存在的Subcontext或InitialContext
3. //填写Environment
4. Contextsubcontext = ctx.createSubcontext("newSubcontext");//在当前的Context下创建新的Subcontext
5. subcontext.rebind("boundObject",object);//创建一个对象
6. subcontext.close();//当结束时经常关闭访问的资源
7. ctx.close();
//创建Environment对象Contextctx = env.getInitialContext();//首先必须获得存在的Subcontext或InitialContext
//填写Environment
Contextsubcontext = ctx.createSubcontext("newSubcontext");//在当前的Context下创建新的Subcontext
subcontext.rebind("boundObject",object);//创建一个对象
subcontext.close();//当结束时经常关闭访问的资源
ctx.close();
其他连接到JNDI的方法:
(1)使用‘Constant’Properties名和Hashtable类:
[java]view plaincopyprint?
1. Hashtableenv = new Hashtable();
2. env.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
3. env.put(Context.PROVIDER_URL,"t3://localhost:7001");
4. env.put(Context.SECURITY_PRINCIPAL,"system");
5. env.put(Context.SECURITY_CRRDENTIALS,"PassWord");
6. Contextctx = new InitalContext(env);
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);
(2)使用‘Hardcoded’名和Properties类:
[java]view plaincopyprint?
1. Propertiesenv = new Properties();
2. env.setProperty("java.naming.factory.initial","weblogic.jndi.WLInitialContextFactory");
3. env.setProperty("java.naming.provider.url","t3://192.2.56.102:7001");
4. env.setProperty("java.naming.security.principal","system");
5. env.setProperty("java.naming.security.credentials","PassWrod");
6. Contextctx = new InitialContext(env);
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);
五、一些JNDI环境属性:
jndi.properties:
(1)、jndi.properties文件为所有的Initial Contexts设置默认的属性
(2)、jndi.properties文件的搜索次序
A、CLASSPATH
B、$JAVA_HOME/lib/
我们看一下jndi.properties示例:
[java]view plaincopyprint?
1. Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
2. Java.naming.provider.url=t3://localhost:7001
3. Java.naming.security.principal=system
4. Java.naming.security.credentials=password
5. //使用这些默认值:
6. Context ctx=new InitialContext();
Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactoryJava.naming.provider.url=t3://localhost:7001
Java.naming.security.principal=system
Java.naming.security.credentials=password
//使用这些默认值:
Context ctx=new InitialContext();
六、从JNDI查找:
(1) Lookup()从JNDI树获得对象
(2) 通过lookup()返回的对象必须映射到它们合适的类型
[java]view plaincopyprint?
1. importjavax.naming.*;
2. try{
3. Contextic = new Context();
4. Objectobj;
5. obj= ic.lookup("javax.transaction.UserTransaction");
6. UserTransactionut = (UserTransaction)obj;
7. ut.begin();
8. ...
9. ic.close();
10. }catch(NamingException e) {...}
importjavax.naming.*; try{
Contextic = new Context();
Objectobj;
obj= ic.lookup("javax.transaction.UserTransaction");
UserTransactionut = (UserTransaction)obj;
ut.begin();
...
ic.close();
}catch(NamingException e) {...}
七、远程绑定对象:
(1) 绑定到远程命名服务的对象必须是序列化的
(2) 访问命名服务时,对象是采用复制机制
这两句话很重要:
a、绑定的对象是序列化到命名服务器的
b、查找的对象是序列化到客户的
我们接下来看一个Binding示例:
[java]view plaincopyprint?
1. public static Context getInitialContext()throws NamingException {
2. Environmentenv = new Environment();
3. env.setProviderUrl("t3://localhost:7001");
4. env.setSecurityPrincipal("system");
5. env.setSecurityCredentials("weblogic");
6. Contextcontext = env.getInitialContext();
7. returncontext;
8. }
9. Context ctx = getInitialContext(); //获得initial context
10. Bank myBank = new Bank(); //创建名为Bank的对象
11. ctx.rebind("theBank", myBank); //把对象绑定到JNDI树
12. ctx.close();
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();
还有一个Un-Binding示例:
[java]view plaincopyprint?
1. public static Context getInitialContext()throws NamingException {
2. Environmentenv = new Environment();
3. env.setProviderUrl("http://localhost:7001");
4. env.setSecurityPrincipal("system");
5. env.setSecurityCredentials("weblogic");
6. Contextcontext = env.getInitialContext();
7. returncontext;
8. }
9. Context ctx = getInitialContext(); //获得initial context
10. ctx.unbind("theBank"); //解除绑定到“theBank”的对象
11. ctx.close();
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();
八、可能的命名异常
当与JNDI交互时可能发生的例外i:
AuthenticationException认证
CommunicationException通信
InvalidNameException无效名称
NameNotFoundException名字没有找到
NoInitialContextException没有连接initialcontext