JNDI配置原理详解
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                JNDI配置原理详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            最近寫書,寫到JNDI,到處查資料,發現所有的中文資料都對JNDI解釋一通,配置代碼也是copy的,調了半天也沒調通,最后到SUN的網站參考了一下他的JNDI tutorial,終于基本上徹底明白了
 
 
上述代碼在J2EE服務器環境下工作得很好,但是在main()中就會報一個NoInitialContextException,許多文章會說你創建InitialContext的時候還要傳一個Hashtable或者Properties,像這樣:
Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL,"t3://localhost:7001"); InitialContext ctx = new InitialContext(env);這個在WebLogic環境下是對的,但是換到JBoss呢?再用JBoss的例子?
 
其實之所以有NoInitialContextException是因為無法從System.properties中獲得必要的JNDI參數,在服務器環境下,服務器啟動時就把這些參數放到System.properties中了,于是直接new InitialContext()就搞定了,不要搞env那么麻煩,搞了env你的代碼還無法移植,弄不好管理員設置服務器用的不是標準端口還照樣拋異常。
 
但是在單機環境下,可沒有JNDI服務在運行,那就手動啟動一個JNDI服務。我在JDK 5的rt.jar中一共找到了4種SUN自帶的JNDI實現:
 
LDAP,CORBA,RMI,DNS。
 
這4種JNDI要正常運行還需要底層的相應服務。一般我們沒有LDAP或CORBA服務器,也就無法啟動這兩種JNDI服務,DNS用于查域名的,以后再研究,唯一可以在main()中啟動的就是基于RMI的JNDI服務。
 
現在我們就在main()中啟動基于RMI的JNDI服務并且綁一個Date對象到JNDI上: 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();
注意,我直接把JNDI的相關參數放入了System.properties中,這樣,后面的代碼如果要查JNDI,直接new InitialContext()就可以了,否則,你又得寫Hashtable env = ...
 
在RMI中綁JNDI的限制是,綁定的對象必須是Remote類型,所以就自己擴展一個。
 
其實JNDI還有兩個Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果訪問JNDI需要用戶名和口令,這兩個也要提供,不過一般用不上。
 
在后面的代碼中查詢就簡單了:
InitialContext ctx = new InitialContext(); Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
 
 
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
                        
                        
                        和多數java服務一樣,SUN對JNDI也只提供接口,使用JNDI只需要用到JNDI接口而不必關心具體實現:
Java 代碼
 
上述代碼在J2EE服務器環境下工作得很好,但是在main()中就會報一個NoInitialContextException,許多文章會說你創建InitialContext的時候還要傳一個Hashtable或者Properties,像這樣:
Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL,"t3://localhost:7001"); InitialContext ctx = new InitialContext(env);這個在WebLogic環境下是對的,但是換到JBoss呢?再用JBoss的例子?
其實之所以有NoInitialContextException是因為無法從System.properties中獲得必要的JNDI參數,在服務器環境下,服務器啟動時就把這些參數放到System.properties中了,于是直接new InitialContext()就搞定了,不要搞env那么麻煩,搞了env你的代碼還無法移植,弄不好管理員設置服務器用的不是標準端口還照樣拋異常。
但是在單機環境下,可沒有JNDI服務在運行,那就手動啟動一個JNDI服務。我在JDK 5的rt.jar中一共找到了4種SUN自帶的JNDI實現:
LDAP,CORBA,RMI,DNS。
這4種JNDI要正常運行還需要底層的相應服務。一般我們沒有LDAP或CORBA服務器,也就無法啟動這兩種JNDI服務,DNS用于查域名的,以后再研究,唯一可以在main()中啟動的就是基于RMI的JNDI服務。
現在我們就在main()中啟動基于RMI的JNDI服務并且綁一個Date對象到JNDI上: 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();
注意,我直接把JNDI的相關參數放入了System.properties中,這樣,后面的代碼如果要查JNDI,直接new InitialContext()就可以了,否則,你又得寫Hashtable env = ...
在RMI中綁JNDI的限制是,綁定的對象必須是Remote類型,所以就自己擴展一個。
其實JNDI還有兩個Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL,如果訪問JNDI需要用戶名和口令,這兩個也要提供,不過一般用不上。
在后面的代碼中查詢就簡單了:
InitialContext ctx = new InitialContext(); Date startTime = (Date) ctx.lookup("java:comp/env/systemStartTime");
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的JNDI配置原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Replace Type Code wi
- 下一篇: Java加密与解密的艺术~数字签名~EC
