posts - 14,  comments - 37,  trackbacks - 0
          JNDI (The Java Naming and Directory InterfaceJava 命名和目錄接口) 是一組在Java 應用中訪問命名和目錄服務的API。為開發(fā)人員提供了查找和訪問各種命名和目錄服務的通用、統(tǒng)一的方式。借助于JNDI 提供的接口,能夠通過名字定位用戶、機器、網(wǎng)絡、對象服務等。
           
          命名服務:就像DNS一樣,通過命名服務器提供服務,大部分的J2EE 服務器都含有命名服務器。
           
          目錄服務:一種簡化的RDBMS 系統(tǒng),通過目錄具有的屬性保存一些簡單的信息。目錄服務通過目錄服務器實現(xiàn),比如微軟ACTIVE DIRECTORY 等。
           
          JNDI 的好處:
          1)包含大量命名和目錄服務,可以使用相同API 調(diào)用訪問任何命名或目錄服務。
          2)可以同時連接多個命名和目錄服務。
          3)允許把名稱同JAVA 對象或資源關聯(lián)起來,不必知道對象或資源的物理ID
          4)使用通用接口訪問不同種類的目錄服務
          5)使得開發(fā)人員能夠集中使用和實現(xiàn)一種類型的命名或目錄服務客戶API 上。
           
          上下文:由0 或多個綁定構成。比如java/MySqljava 為上下文(context),MySql 為命名
           
          子上下文subConext):上下文下的上下文。比如MyJNDITree/ejb/helloBeanejb 為子上下文
           
          因為JNDI 是一組接口,所以我們只需根據(jù)接口規(guī)范編程就可以。要通過JNDI 進行資源訪問,我們必須設置初始化上下文的參數(shù)主要是設置JNDI 驅(qū)動的類名(java.naming.factory.initial) 和提供命名服務的URL (java.naming.provider.url)
           
          因為Jndi 的實現(xiàn)產(chǎn)品有很多。所以java.naming.factory.initial 的值因提供JNDI 服務器的不同而不同java.naming.provider.url 的值包括提供命名服務的主機地址和端口號。
           
          訪問Jboss 服務器的例子代碼:
          Properties props = new Properties();
          props.setProperty(
          "java.naming.factory.initial""org.jnp.interfaces.NamingContextFactory");
          props.setProperty(
          "java.naming.provider.url""localhost:1099");
          InitialContext 
          = new InitialContext(props);
          HelloWorld helloworld 
          = (HelloWorld) ctx.lookup("HelloWorldBean/remote");

          訪問Sun 應用服務器的例子代碼:
          Properties props = new Properties();
          props.setProperty(
          "java.naming.factory.initial",
          "com.sun.enterprise.naming.SerialInitContextFactory");
          props.setProperty(
          "java.naming.provider.url""localhost:3700");
          InitialContext 
          = new InitialContext(props);
          HelloWorld helloworld 
          = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");

          訪問Weblogic10 應用服務器的例子代碼:
          Properties props = new Properties();
          props.setProperty(
          "java.naming.factory.initial""weblogic.jndi.WLInitialContextFactory");
          props.setProperty(
          "java.naming.provider.url""t3://localhost:7001");
          InitialContext 
          = new InitialContext(props);
          HelloWorld helloworld 
          = (HelloWorld) ctx.lookup("HelloWorldBean#com.foshanshop.ejb3.HelloWorld");

          JBOSS 環(huán)境下JNDI 樹的命名約定:
          1java:copm 這個上下文環(huán)境和其子上下文環(huán)境僅能被與之相關的特定應用組件訪問和使用
          2java: 子上下文環(huán)境和綁定的對象只能被Jboss 服務器虛擬機內(nèi)的應用訪問
          3)其他上下文環(huán)境 只要實現(xiàn)序列化就可以被遠程用戶調(diào)用。

           

           

          當你把EJB發(fā)布到JBOSS后,你就可以jboss 的管理平臺查看她們的JNDI ,輸入下面URL http://localhost:8080/jmx-console/點擊“service=JNDIView” link,在出現(xiàn)的page里找到“List of MBean operations:”欄的“list()”方法,click “Invoke”button,就會看到下面的界面
          在上圖中可以看見HelloWorld 會話Bean JNDI路徑,JNDI 路徑名的組成規(guī)則是“上層名稱/下層名稱每層之間以”/”分隔HelloWorld 會話Bean JNDI路徑名是:HelloWorldBean/remote
           
           
          下面要重點說明一下Jboss EJB JNDI 名稱默認的命名規(guī)則,命名規(guī)則如下:
          1> 如果EJB 打包進后綴為*.ear J2EE 發(fā)布文件,默認的JNDI 路徑名稱是
          訪問本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
          訪問遠程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
          例:EJB HelloWorld 打包進名為 HelloWorld.ear J2EE 應用,訪問她遠程接口的JNDI 名是:HelloWorld/HelloWorldBean/remote
           
          2> 如果EJB 應用打包成后綴為*.jar 的發(fā)布文件, 默認的JNDI 路徑名稱是
          訪問本地接口:EJB-CLASS-NAME/local
          訪問遠程接口:EJB-CLASS-NAME/remote
          例: HelloWorld 應用打包成HelloWorld.jar 文件,訪問她遠程接口的JNDI 名稱是:HelloWorldBean/remote
           
          注意:EJB-CLASS-NAME 是不帶包名的com.foshanshop.ejb3.impl.HelloWorldBean 只需取HelloWorldBean
           
          目前網(wǎng)上很多教材獲取JNDI 路徑名的方式不適用在jboss 下,如:
          HelloWorld helloworld = (HelloWorld) ctx.lookup(HelloWorld.class.getName());
          這種方式適用于Sun Application Server glassfish
           

           

            

          自定義JNDI 命名
          默認的JNDI 命名規(guī)則上面已經(jīng)介紹過,但有些情況下需要自定義名稱。Jboss 要自定義JNDI 名稱,可以使用@LocalBinding @RemoteBinding 注釋
           
          關鍵代碼(只需要在bean interface前加binding注釋):
          import org.jboss.annotation.ejb.RemoteBinding;
          ...
          @Remote
          @RemoteBinding (jndiBinding
          ="testbinding/myAccount")
          publicinterface MyAccount 
          extends Serializable {
              publicint Add(
          int a, int b);
              publicint getResult() ;
          }

           
          那么在client端調(diào)用上面的EJB的代碼為:
          InitialContext ctx 
          = new InitialContext(props);
          MyAccount bean1 
          = (MyAccount) ctx.lookup("testbinding/myAccount");
           

          posted on 2007-07-20 14:50 冰封的愛 閱讀(3949) 評論(2)  編輯  收藏 所屬分類: J2EE

          FeedBack:
          # re: 關于JNDI and EJB
          2008-09-14 01:16 | ember
          感謝,我以前是使用別人寫好的調(diào)用包調(diào)用EJB,所以沒感覺有這樣的問題。剛才自己寫了個簡單的EJB,發(fā)現(xiàn)調(diào)用一下的設置還是有些細微區(qū)別的。

          msn:ember_319@hotmail.com  回復  更多評論
            
          # re: 關于JNDI and EJB [未登錄]
          2008-12-06 15:17 | jack
          寫的不錯,以前不懂的地方,這都有寫  回復  更多評論
            
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 扎兰屯市| 闵行区| 阿鲁科尔沁旗| 外汇| 长宁县| 平度市| 塔城市| 会同县| 东莞市| 白水县| 株洲县| 台湾省| 云霄县| 佛山市| 镇安县| 股票| 沿河| 宝坻区| 山丹县| 乐至县| 苍溪县| 湖南省| 泰州市| 灌云县| 江口县| 金坛市| 九寨沟县| 新昌县| 中宁县| 八宿县| 鱼台县| 石家庄市| 峨眉山市| 虹口区| 含山县| 荔浦县| 佛教| 读书| 五大连池市| 丰顺县| 孝昌县|