廉頗老矣,尚能飯否

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

          常用鏈接

          統(tǒng)計

          最新評論

          JNDI簡單入門

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

          在RMI中綁JNDI的限制是,綁定的對象必須是Remote類型,所以就需要自己擴(kuò)展一個。其實JNDI還有兩個Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果訪問JNDI需要用戶名和口令,這兩個也要提供,不過一般用不上。下面是兩個使用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類型
          // 外部擴(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 {
            // 為什么兩個jndi的例子不能同時運行
            // 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 閱讀(2205) 評論(1)  編輯  收藏 所屬分類: 重塑金身:2010-06-08

          評論

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

          因為綁定的是同一個端口,將initDate和initPerson的端口修改為不同的就可以了  回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 赤壁市| 老河口市| 永泰县| 内丘县| 荣昌县| 海城市| 南丰县| 三台县| 天等县| 东源县| 章丘市| 浙江省| 桦川县| 明星| 文水县| 芜湖市| 温州市| 美姑县| 新宁县| 汉中市| 孟州市| 五寨县| 婺源县| 宁陕县| 锦州市| 太和县| 定安县| 三原县| 饶河县| 南部县| 遵义县| 蒙自县| 疏勒县| 读书| 榆中县| 开江县| 夏津县| 白山市| 洛南县| 中牟县| 石狮市|