学习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 plain copy //创建一个InitialContext context ctx=new InitialContext();
(2)、从任何一个地方连接到JNDI:
创建Environment对象:
[java] view plain copy weblogic.jndi.Enviroment env=new weblogic.jndi.Enviroment();
填写Environment:
[java] view plain copy 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 plain copy //创建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 plain copy 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 plain copy 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 plain copy Java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory Java.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 plain copy 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 plain copy 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 plain copy 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
转载于:https://www.cnblogs.com/isoftware/p/3760326.html
相关资源:java jndi的使用