zoukankan      html  css  js  c++  java
  • jndi 小案例

    JNDI就是为JAVA中命名和目录服务定义的JAVA API,是命名服务的抽象机制。在J2EE中,JNDI的目的是用来查找J2EE服务器的注册资源只要该对象在命名服务器上注册过,且你知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。这样你就可以在无需知道对象位置的情况下获取和使用对象。SUN对JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必关心具体实现

    现在我们就可以在main()中启动基于RMI的JNDI服务并且绑一个对象到JNDI上。注意,我直接把JNDI的相关参数放入了System.properties中,这样,后面的代码如果要查JNDI,直接new InitialContext()就可以了

    在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型,所以就需要自己扩展一个。其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果访问JNDI需要用户名和口令,这两个也要提供,不过一般用不上。下面是两个使用JNDI的简单例子的代码,可以直接运行。

    使用main方法做JNDI的demo时出现NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数,在服务器环境下,服务器启动时就把这些参数放到System.properties中了,于是直接new InitialContext()就搞定了。但是在单机环境下,可没有JNDI服务在运行,那就需要手动启动一个JNDI服务。在JDK 5的rt.jar中一共找到了4种SUN自带的JNDI实现:LDAP,CORBA,RMI,DNS。 
    这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器,也就无法启动这两种JNDI服务,DNS用于查域名的,以后再研究,唯一可以在main()中启动的就是基于RMI的JNDI服务。

    package com.ellen.jndi;
    
    import java.io.Serializable;
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.util.Date;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    //在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
    class Person implements Remote, Serializable {
     private static final long serialVersionUID = -8592182872966400365L;
    
     private String name;
     private String pass;
    
     public String getName() {
      return name;
     }
    
     public void setName(String name) {
      this.name = name;
     }
    
     public String getPass() {
      return pass;
     }
    
     public void setPass(String pass) {
      this.pass = pass;
     }
    
     public String toString() {
      return "name=" + this.getName() + "&pass=" + this.getPass();
     }
    
    }
    
    // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
    // 外部扩展,可以内部扩展也可以外部扩展
    class RemoteDate extends Date implements Remote {
    };
    
    public class Demo {
     public static void initDate() throws NamingException, RemoteException {
      // 设置参数
      LocateRegistry.createRegistry(1099);
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
      System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
      InitialContext ctx = new InitialContext();
      // 在RMI中绑JNDI的限制是,绑定的对象必须是Remote类型
      // 内部扩展,可以内部扩展也可以外部扩展
      class RemoteDate extends Date implements Remote {
      }
      ;
      ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
      ctx.close();
     }
    
     public static void initDate2() throws NamingException, RemoteException {
      // 设置参数
      LocateRegistry.createRegistry(1099);
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
      System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
      InitialContext ctx = new InitialContext();
      // 自己扩展,可以内部扩展也可以外部扩展
      // class RemoteDate extends Date implements Remote {
      // }
      // ;
      ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
      ctx.close();
     }
    
     public static void findDate() throws NamingException, RemoteException {
      // 直接使用
      InitialContext ctx = new InitialContext();
      Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
      System.out.println("+++++++++++++++++++++++" + startTime.toString());
      ctx.close();
     }
    
     public static void jndiDate() throws NamingException, RemoteException {
      // Demo.initDate();
      Demo.initDate2();
      Demo.findDate();
     }
    
     public static void initPerson() throws NamingException, RemoteException {
      // 设置参数
      LocateRegistry.createRegistry(1099);
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
      System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
      InitialContext ctx = new InitialContext();
      // Person person = new Person();
      // person.setName("ellen");
      // person.setPass("000727");
      ctx.bind("java:comp/env/person", new Person());
      ctx.close();
     }
    
     public static void initPerson2() throws NamingException, RemoteException {
      // 设置参数
      LocateRegistry.createRegistry(1099);
      System.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
      System.setProperty(Context.PROVIDER_URL, "rmi://localhost:1099");
      InitialContext ctx = new InitialContext();
      Person person = new Person();
      person.setName("ellen");
      person.setPass("000727");
      ctx.bind("java:comp/env/person", person);
      ctx.close();
     }
    
     public static void findPerson() throws NamingException, RemoteException {
      // 直接使用
      InitialContext ctx = new InitialContext();
      Person person = (Person) ctx.lookup("java:comp/env/person");
      System.out.println("------" + person.toString());
      System.out.println("------" + person.getName());
      System.out.println("------" + person.getPass());
      ctx.close();
     }
    
     public static void jndiPerson() throws NamingException, RemoteException {
      // Demo.initPerson();
      Demo.initPerson2();
      Demo.findPerson();
     }
    
     public static void main(String[] args) throws NamingException, RemoteException {
      // 为什么两个jndi的例子不能同时运行
      // internal error: ObjID already in use
      // Demo.jndiDate();
      Demo.jndiPerson();
     }
    
    }
    

      

  • 相关阅读:
    Ubuntu配置sublime text 3的c编译环境
    ORA-01078错误举例:SID的大写和小写错误
    linux下多进程的文件拷贝与进程相关的一些基础知识
    ASM(四) 利用Method 组件动态注入方法逻辑
    基于Redis的三种分布式爬虫策略
    Go语言并发编程总结
    POJ2406 Power Strings 【KMP】
    nyoj 会场安排问题
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    Java的String、StringBuffer和StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/zengda/p/4767036.html
Copyright © 2011-2022 走看看