J2EE技术规范(一)——JNDI

学习Java,我们首先要掌握的就是十三种技术规范,我们接下来就一步一步的来学习。今天主要是讲讲JNDI。

一、理解JNDI的用途:

    JNDI是用于访问不同的命名和目录服务的统一API接口。

二、那何时使用JNDI呢:

(1)JNDI是一种查找服务,用于查找:

    Web应用环境变量

    EJBs和它们的环境变量

    通过DataSources的数据库连接池

    JMS目标和连接工厂

    其他服务

(2)不要将JNDI当作数据库使用

    JNDI对象存储在内存中

    访问JNDI对象与网络性能有关

接下来我们看一下JNDI树:


接下来我们理解理解图上的意思;我们看到Initial Context是JNDI树所有搜索的起点  ,那么如何重建Initial Context呢?

三、有两种途径,我们接下来一一讲解:

(1)、从服务器端对象连接到JNDI:

//创建一个InitialContext
     context ctx=new InitialContext();

  (2)、从任何一个地方连接到JNDI:

    创建Environment对象:

weblogic.jndi.Enviroment env=new
    weblogic.jndi.Enviroment();

填写Environment:

env.setProviderur("t3://127.0.0.1:7001");//Weblogic
//Server的位置
env.setSecurityPrincipal("system");//安全信息
env.setSecurityCredentials("passWord");
//使用Environment对象创建InitialContext
context ctx=env.getInitialContext();

创建Subcontext:

四、创建一个用于绑定对象的新的Subcontext:

//创建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类:

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类:

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.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()返回的对象必须映射到它们合适的类型

   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示例:

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示例:

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


这些内容应用到实践当中去,意义就大了。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值