• JNDI 使用


    J2EE技术规范(一)——JNDI

    分类: java 基础 1539人阅读 评论(14) 收藏 举报

    学习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 plaincopy
     
    1. //创建一个InitialContext  
    2.      context ctx=new InitialContext();  

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

        创建Environment对象:

    [java] view plaincopy
     
    1. weblogic.jndi.Enviroment env=new  
    2.     weblogic.jndi.Enviroment();  

    填写Environment:

    [java] view plaincopy
     
    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();  

    创建Subcontext:

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

    [java] view plaincopy
     
    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();  

    其他连接到JNDI的方法:

    (1)使用‘Constant’Properties名和Hashtable类:

    [java] view plaincopy
     
    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);  

    (2)使用‘Hardcoded’名和Properties类:

    [java] view plaincopy
     
    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);  

    五、一些JNDI环境属性:

    jndi.properties:

    (1)、jndi.properties文件为所有的Initial Contexts设置默认的属性

    (2)、jndi.properties文件的搜索次序

    A、CLASSPATH

    B、$JAVA_HOME/lib/

    我们看一下jndi.properties示例:

    [java] view plaincopy
     
    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();  

    六、从JNDI查找:

    (1) Lookup()从JNDI树获得对象

    (2) 通过lookup()返回的对象必须映射到它们合适的类型

    [java] view plaincopy
     
    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) {...}  

    七、远程绑定对象:

    (1) 绑定到远程命名服务的对象必须是序列化的

    (2) 访问命名服务时,对象是采用复制机制

    这两句话很重要:

    a、绑定的对象是序列化到命名服务器的

    b、查找的对象是序列化到客户的

    我们接下来看一个Binding示例:

    [java] view plaincopy
     
    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();  

    还有一个Un-Binding示例:

    [java] view plaincopy
     
    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();  

    八、可能的命名异常

    当与JNDI交互时可能发生的例外i:

             AuthenticationException认证

             CommunicationException通信

             InvalidNameException无效名称

             NameNotFoundException名字没有找到

             NoInitialContextException没有连接initialcontext

  • 相关阅读:
    Java3D实例应用载入VRML模型
    Tomcat数据库连接池的配置方法总结
    WebGL学习笔记使用3D引擎threeJS实现星空粒子移动
    mybatis应用实例学习
    springmvc 实例应用
    springmvc定制伪REST风格及JSR303Bean校验整合
    SpringMVC中应用Ajax异步通讯
    Java3D实例应用载入3ds 模型
    Device Mutipath参数设置
    Nginx+FastCGI+Python
  • 原文地址:https://www.cnblogs.com/isoftware/p/3760326.html
Copyright © 2020-2023  润新知