<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    廉頗老矣,尚能飯否

    java:從技術(shù)到管理

    常用鏈接

    統(tǒng)計(jì)

    最新評論

    JNDI簡單入門

    JNDI就是為JAVA中命名和目錄服務(wù)定義的JAVA API,是命名服務(wù)的抽象機(jī)制。在J2EE中,JNDI的目的是用來查找J2EE服務(wù)器的注冊資源只要該對象在命名服務(wù)器上注冊過,且你知道命名服務(wù)器的地址和該對象在命名服務(wù)器上注冊的JNDI名。這樣你就可以在無需知道對象位置的情況下獲取和使用對象。SUN對JNDI只提供接口,使用JNDI只需要用到JNDI接口而不必關(guān)心具體實(shí)現(xiàn)
    使用main方法做JNDI的demo時(shí)出現(xiàn)NoInitialContextException是因?yàn)闊o法從System.properties中獲得必要的JNDI參數(shù),在服務(wù)器環(huán)境下,服務(wù)器啟動時(shí)就把這些參數(shù)放到System.properties中了,于是直接new InitialContext()就搞定了。但是在單機(jī)環(huán)境下,可沒有JNDI服務(wù)在運(yùn)行,那就需要手動啟動一個(gè)JNDI服務(wù)。在JDK 5的rt.jar中一共找到了4種SUN自帶的JNDI實(shí)現(xiàn):LDAP,CORBA,RMI,DNS。
    這4種JNDI要正常運(yùn)行還需要底層的相應(yīng)服務(wù)。一般我們沒有LDAP或CORBA服務(wù)器,也就無法啟動這兩種JNDI服務(wù),DNS用于查域名的,以后再研究,唯一可以在main()中啟動的就是基于RMI的JNDI服務(wù)。
    現(xiàn)在我們就可以在main()中啟動基于RMI的JNDI服務(wù)并且綁一個(gè)對象到JNDI上。注意,我直接把JNDI的相關(guān)參數(shù)放入了System.properties中,這樣,后面的代碼如果要查JNDI,直接new InitialContext()就可以了

    在RMI中綁JNDI的限制是,綁定的對象必須是Remote類型,所以就需要自己擴(kuò)展一個(gè)。其實(shí)JNDI還有兩個(gè)Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果訪問JNDI需要用戶名和口令,這兩個(gè)也要提供,不過一般用不上。下面是兩個(gè)使用JNDI的簡單例子的代碼,可以直接運(yùn)行。

    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類型
    // 外部擴(kuò)展,可以內(nèi)部擴(kuò)展也可以外部擴(kuò)展
    class RemoteDate extends Date implements Remote {
    };

    public class Demo {
     public static void initDate() throws NamingException, RemoteException {
      // 設(shè)置參數(shù)
      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類型
      // 內(nèi)部擴(kuò)展,可以內(nèi)部擴(kuò)展也可以外部擴(kuò)展
      class RemoteDate extends Date implements Remote {
      }
      ;
      ctx.bind("java:comp/env/systemStartTime", new RemoteDate());
      ctx.close();
     }

     public static void initDate2() throws NamingException, RemoteException {
      // 設(shè)置參數(shù)
      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();
      // 自己擴(kuò)展,可以內(nèi)部擴(kuò)展也可以外部擴(kuò)展
      // 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 {
      // 設(shè)置參數(shù)
      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 {
      // 設(shè)置參數(shù)
      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 {
      // 為什么兩個(gè)jndi的例子不能同時(shí)運(yùn)行
      // internal error: ObjID already in use
      // Demo.jndiDate();
      Demo.jndiPerson();
     }

    }



    柳德才
    13691193654
    18942949207
    QQ:422157370
    liudecai_zan@126.com
    湖北-武漢-江夏-廟山

    posted on 2010-06-20 09:31 liudecai_zan@126.com 閱讀(2216) 評論(1)  編輯  收藏 所屬分類: 重塑金身:2010-06-08

    評論

    # re: JNDI簡單入門 2011-04-28 09:47 路過

    因?yàn)榻壎ǖ氖峭粋€(gè)端口,將initDate和initPerson的端口修改為不同的就可以了  回復(fù)  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产大片免费观看中文字幕| 成人免费网站视频www| 久久国产免费观看精品| 亚洲精品综合久久| jzzjzz免费观看大片免费| 亚洲国产av无码精品| 成人无码a级毛片免费| 亚洲亚洲人成综合网络| 91精品全国免费观看青青| 亚洲国产成人高清在线观看| 国产啪精品视频网站免费尤物| 亚洲av永久无码精品网站| 久久久久久夜精品精品免费啦 | 亚洲一区二区三区国产精品| 久久亚洲国产伦理| 免费日本一区二区| 亚洲第一香蕉视频| 无限动漫网在线观看免费| 国产亚洲精品AAAA片APP| 亚洲成人国产精品| 十八禁在线观看视频播放免费| 亚洲一卡2卡三卡4卡有限公司 | 尤物永久免费AV无码网站| 免费福利资源站在线视频| 亚洲中文字幕无码久久精品1| 日本不卡免费新一区二区三区| 亚洲精品美女在线观看播放| 四虎影视免费在线| 中文在线观看免费网站| 亚洲男人天堂影院| 国产精品无码一区二区三区免费| 一进一出60分钟免费视频| 青青草原精品国产亚洲av| 成人免费毛片观看| aa级毛片毛片免费观看久| 亚洲三级中文字幕| 亚洲精品无码久久不卡| 国产精品久久久久久久久免费| 婷婷亚洲综合五月天小说在线| 亚洲国产综合专区电影在线| 中文字幕免费在线观看动作大片|