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

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

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

    posts - 97,  comments - 93,  trackbacks - 0
    今天瀏覽網(wǎng)頁(yè),看見(jiàn)篇寫(xiě)JNDI比較基礎(chǔ),也比較詳細(xì)的文章,又自己整理了一下,post到新手區(qū)了,。。。。:)

    JNDIjava訪問(wèn)名字和目錄服務(wù)的接口,與JDBC一樣,它僅僅只定義了一套服務(wù)接口,實(shí)現(xiàn)由具體廠商提供。作為j2ee核心組件之一,它為應(yīng)用程序查找其他程序組件和資源提供了統(tǒng)一的接口,其中最常見(jiàn)的用途就是數(shù)據(jù)源的配置、EJB名字查找、JMS相關(guān)配置等。JNDI的架構(gòu)如下圖。在JDK1.3中,已經(jīng)包含了JNDI,它分成五個(gè)包。每個(gè)包提供的功能:

    -          javax.naming,包含訪問(wèn)命名服務(wù)的類(lèi)和接口定義。

    -          javax.naming.directory,包含訪問(wèn)目錄服務(wù)的類(lèi)和接口定義。

    -          javax.naming.ldap,為ldapv3提供的擴(kuò)展操作提供支持。

    -          javax.naming.event,為訪問(wèn)命名和目錄服務(wù)時(shí)的事件通知提供支持。

    -          javax.naming.spi,為服務(wù)提供商提供的接口,一般用戶(hù)不會(huì)涉及。

    基本概念

     

           了解名字服務(wù)和目錄服務(wù)的相關(guān)概念,有助于更好的使用JNDI

    Naming service

           名字服務(wù)定義了如何將名字與對(duì)象關(guān)聯(lián),并通過(guò)名字如何找到對(duì)象的方法。典型的例子如:DNS將域名與IP關(guān)聯(lián),文件系統(tǒng)將文件名與文件相關(guān)聯(lián)。在名字服務(wù)中,主要的概念:

    -          名字(Names),在名字系統(tǒng)中實(shí)際對(duì)象的代號(hào),如文件名,域名等,它會(huì)被用來(lái)查找關(guān)聯(lián)的對(duì)象。不同的系統(tǒng)中會(huì)有不同的命名規(guī)范,如文件系統(tǒng)采用“\”來(lái)表示層級(jí),而DNS則使用“.”。

    -          綁定(Bindings),名字和實(shí)際對(duì)象的關(guān)聯(lián)。

    -          引用和地址(References and Addresses),當(dāng)對(duì)象不能直接被存儲(chǔ)在名字系統(tǒng)時(shí),就必須使用引用,通過(guò)引用找到實(shí)際的對(duì)象。在系統(tǒng)中,保存的引用的內(nèi)容被稱(chēng)為地址。引用還有另一個(gè)用處:在名字系統(tǒng)中,缺少象關(guān)系數(shù)據(jù)庫(kù)中外鍵的概念。通過(guò)使用引用,可以作為外鍵的一個(gè)取代辦法。

    -          上下文(Context),它是一個(gè)名字-對(duì)象集合,提供了與名字系統(tǒng)交互的主要操作,如查找、綁定、去綁定。子上下文(subcontext)與它的關(guān)系類(lèi)似文件系統(tǒng)中目錄和子目錄的關(guān)系,子上下文被包含在一個(gè)上下文中,通過(guò)父上下文中的一個(gè)名字與子上下文關(guān)聯(lián)。

    -          名字系統(tǒng)和名字空間(Naming Systems and Namespaces),名字系統(tǒng)是相同類(lèi)型的上下文的集合,它提供名字服務(wù);名字空間,是名字系統(tǒng)中的名字集合,如文件系統(tǒng)的文件名和目錄。

    Directory service

           目錄服務(wù)是名字服務(wù)的擴(kuò)展,它除了關(guān)聯(lián)名字和對(duì)象,還允許對(duì)象包含屬性。目錄系統(tǒng)通常以層次結(jié)構(gòu)組織數(shù)據(jù)。在目錄服務(wù)中的主要概念:

    -          屬性(Attributes),它屬于目錄對(duì)象,它是(名字,值)對(duì),屬性可以有多個(gè)值。

    -          目錄和目錄服務(wù)(Directories and Directory Services),目錄是目錄對(duì)象的集合;目錄服務(wù)則提供與目錄相關(guān)的服務(wù),創(chuàng)建、刪除和修改存放在目錄中的對(duì)象的屬性。

    -          查找和查找過(guò)濾器(Searches and Search Filters),獲取目錄對(duì)象的操作就是查找;過(guò)濾器是類(lèi)似查找條件的對(duì)象。

    基本使用

     

    ²        注冊(cè)JNDI提供者

    在使用JNDI之前,需要先獲取JNDI的提供者,并在系統(tǒng)注冊(cè)它。與JNDI相關(guān)的系統(tǒng)屬性在javax.naming.Context中定義,常用的屬性:

    -          java.naming.factory.initial,服務(wù)提供者用來(lái)創(chuàng)建InitialContext的類(lèi)名。

    -          java.naming.provider.url,用來(lái)配置InitialContext的初始url

    -          java.naming.factory.object,用來(lái)創(chuàng)建name-to-object映射的類(lèi),用于NameClassPairReferences。

    -          java.naming.factory.state,用來(lái)創(chuàng)建jndi state的類(lèi)

    對(duì)于目錄服務(wù),由于一般需要安全設(shè)置,還通常使用:

    -          java.naming.security.authentication,安全類(lèi)型,三個(gè)值:none,simplestrong。

    -          java.naming.security.principal,認(rèn)證信息。

    -          java.naming.security.credentials,證書(shū)信息。

    -          java.naming.security.protocol,安全協(xié)議名。

    使用System.setProperty注冊(cè),如果程序不顯示說(shuō)明,那么java會(huì)在classpath內(nèi)查找jdni.properties文件來(lái)完成注冊(cè)。jdni.properties例子:

    java.naming.factory.initial=com.codeline.db.MockInitialContextFactory

    ²        連接服務(wù)

    注冊(cè)之后,就可以實(shí)施服務(wù)連接了。對(duì)于名字服務(wù)由InitialContext開(kāi)始,目錄服務(wù)則使用InitialDirContext。它們分別實(shí)現(xiàn)了ContextDirContext,這兩個(gè)接口分別對(duì)應(yīng)名字服務(wù)和目錄服務(wù)的接口,也是JNDI中最重要的兩個(gè)接口。

    -          連接名字服務(wù):

                        

    1System.setProperty(Context.INITIAL_CONTEXT_FACTORY," 
    2   com.sun.jndi.fscontext.FSContextFactory"); 
    3InitialContext ctx = new InitialContext(); 
    4
    5

    -          連接目錄服務(wù):

    1  Hashtable env = new Hashtable(); 
    2    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    3    env.put(Context.PROVIDER_URL, "ldap://myserver.com/");
    4    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    5    //登錄ldap server需要的用戶(hù)名 
    6    env.put(Context.SECURITY_PRINCIPAL, "ldapuser"); 
    7    //登錄ldap server需要的密碼 
    8    env.put(Context.SECURITY_CREDENTIALS, "mypassword"); 
    9InitialDirContext ctx = new InitialDirContext(env); 


    -          多服務(wù)提供者:如果應(yīng)用包含多個(gè)服務(wù)提供者,在連接時(shí)略有不同。以名字服務(wù)為例:

     

    1Hashtable env = new Hashtable(); 
    2  env.put(Context.INITIAL_CONTEXT_FACTORY, 
    3"com.sun.jndi.rmi.registry.RegistryContextFactory"); 
    4  env.put(Context.PROVIDER_URL, "rmi://myserver.com:1099"); 
    5  //使用不同的構(gòu)造函數(shù) 
    6InitialContext ctx = new InitialContext(env); 

    ²        查找對(duì)象

    不論名字服務(wù)還是目錄服務(wù),都是使用lookup來(lái)查找對(duì)象的。除了可以使用String作為參數(shù)之外,lookup還可使用Name接口作為參數(shù)。

    1Greeter greeter = (Greeter)ctx.lookup("SayHello"); 

    如果想要獲得上下文中所有的對(duì)象名字,就使用lis返回NameClassPair列表。NameClassPair包含對(duì)象名字和對(duì)象類(lèi)名。如果想要獲得實(shí)際的對(duì)象實(shí)例列表,就使用listBindings,它返回Binding列表。BindingNameClassPair的子類(lèi),它包含對(duì)象的實(shí)例。
    -          list

    1NamingEnumeration list = ctx.list("awt"); 
    2while (list.hasMore()) 
    3    NameClassPair nc = (NameClassPair)list.next(); 
    4    System.out.println(nc); 
    5}
     


    -          listBindings

    1NamingEnumeration bindings = ctx.listBindings("awt"); 
    2while (bindings.hasMore()) 
    3    Binding bd = (Binding)bindings.next(); 
    4    System.out.println(bd.getName() + "" + bd.getObject()); 
    5}
     

     

    ²        對(duì)象綁定

          -          使用bind添加綁定

    1Fruit fruit = new Fruit("orange");
    2ctx.bind("favorite", fruit); 

         -          使用rebind修改綁定

    1Fruit fruit = new Fruit("lemon");
    2ctx.rebind("favorite", fruit); 

    -          使用unbind去除綁定。

     

    1ctx.unbind("favorite"); 

    ²        對(duì)象改名

    使用rename可以給一個(gè)在上下文中的對(duì)象改名

    1ctx.rename("report.txt""old_report.txt"); 

    ²        獲取屬性

    屬性相關(guān)的接口是AttributeAttributes,它們都在javax.naming.directory包內(nèi)。通過(guò)DirContextgetAttributes方法就可以獲得對(duì)象的屬性集合,然后使用Attributesget方法獲得對(duì)應(yīng)的屬性,最后通過(guò)Attributeget方法就可以獲得屬性值。

    1String dn = "uid=me, dc=mycompany, dc=com, ou=customer, o=ExampleApp"
    2Context user = (Context)ctx.lookup(dn); 
    3//獲得所有屬性 
    4Attributes attrs = user.getAttributes(""); 
    5Attribute test= attrs .get("test"); 
    6Object testValue= test.get(); 

    上例中獲得的是user的所有屬性,在實(shí)際使用過(guò)程中,考慮網(wǎng)絡(luò)帶寬的影響,可以設(shè)置獲取要獲取的屬性列表:

    1String reqd_attrs = new String[] "surname""initials","title""rfc822mailalias"}
    2Attributes attrs = user.getAttributes("", reqd_attrs); 

     

    ²        查找和過(guò)濾

    使用search方法完成。

     

     1   public DirContext[] findUser(String initials,String surname,String country,String phone) 
     2        //構(gòu)造條件 
     3        BasicAttributes search_attrs = new BasicAttributes(); 
     4        search_attrs.put("initials", initials); 
     5        search_attrs.put("sn", surname); 
     6        search_attrs.put("c", country); 
     7        if(phone != null
     8          search_attrs.put("phonenumber", phone); 
     9        NamingEnumeration results = initial_ctx.search("ou=Customer,o=ExampleApp", search_attrs); 
    10        LinkedList found = new LinkedList(); 
    11        while(results.hasMore()) 
    12            SearchResults sr = (SearchResults)results.next(); 
    13            String name = sr.getName(); 
    14            Object ctx = sr.getObject(); 
    15            if((ctx == null|| !(ctx instanceof DirContext)) 
    16                found.add(initial_ctx.lookup(name)); 
    17            else 
    18               found.add(ctx); 
    19        }
     
    20        DirContext[] ret_val = new DirContext[found.size()]; 
    21        found.toArray(ret_val); 
    22        return ret_val; 
    23   }
     

    DirContext接口主要過(guò)濾方式:

    1.使用過(guò)濾字符串

     

    1String reqd_attrs = new String[] "cn""uid","rfc822mailalias" }
    2NamingEnumeration results = initial_ctx.search("ou=Customer, o=ExampleApp",search_attrs,reqd_attrs); 

    2.使用SearchControls,獲得更多的控制

     

    1SearchControls ctrls = new SearchControls(); 
    2ctrls.setCountLimit(20); 
    3ctrls.setTimeLimit(5000); 
    4ctrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    5NamingEnumeration results = initial_ctx.search("cat=books,ou=Products, 
    6o=ExampleApp","title=*Java*",ctrls); 

    ²        修改屬性

    使用DirContextInitialDirContextmodifyAttributes方法完成。所謂的修改過(guò)程,實(shí)際就是先構(gòu)造要修改的屬性列表,然后使用上述方法提交。對(duì)于屬性包含多個(gè)值時(shí),需要把屬性的不修改的值也要包含,否則服務(wù)器會(huì)認(rèn)為那些值不再需要而刪除它們。

     1public void updateAddress(String dn,String address, String country, String phone) 
     2        BasicAttributes mod_attrs = new BasicAttributes(); 
     3        if(address != null
     4            mod_attrs.put("address", address); 
     5        if(country != null
     6            mod_attrs.put("c", country); 
     7        if(phone != null
     8            mod_attrs.put("phonenumber", phone); 
     9        if(mod_attrs.size() != 0
    10            initial_ctx.modifyAttributes(dn, DirContext.REPLACE_ATTRIBUTE, mod_attrs); 
    11}
     

    使用ModificationItem,也可一次進(jìn)行多個(gè)不同的修改操作:

    ModificationItem[] mod_items = new ModificationItems[2];

    Attribute email = new BasicAttribute("rfc822mailalias", new_email);

    ModificationItem email_mod = new ModificationItem(DirContext.ADD_ATTRIBUTE, email);

    Attribute addr = new BasicAttribute("address", address);

    ModificationItem addr_mod = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, addr);

    mod_items[0] = email_mod;

    mod_items[1] = addr_mod;

    initial_ctx.modifyAttributes(dn, mod_items);

    ²        創(chuàng)建上下文

    使用createSubcontext方法完成。

     

     1BasicAttributes attrs = new BasicAttributes(); 
     2attrs.put("initials", initials); 
     3attrs.put("sn", surname); 
     4attrs.put("rfc822mailalias", email); 
     5if(address != null
     6    attrs.put("address", address); 
     7if(country != null
     8    attrs.put("c", country); 
     9if(phone != null
    10    attrs.put("phonenumber", phone); 
    11initial_ctx.createSubcontext(dn, attrs); 

    ²        刪除上下文

    使用destroySubcontext方法完成。

    1initial_ctx.destroySubcontext(dn); 

     


     


    posted on 2007-05-14 23:33 wqwqwqwqwq 閱讀(816) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Simple Java
    <2007年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789




    常用鏈接

    留言簿(10)

    隨筆分類(lèi)(95)

    隨筆檔案(97)

    文章檔案(10)

    相冊(cè)

    J2ME技術(shù)網(wǎng)站

    java技術(shù)相關(guān)

    mess

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    校園夢(mèng)網(wǎng)網(wǎng)絡(luò)電話(huà),中國(guó)最優(yōu)秀的網(wǎng)絡(luò)電話(huà)
    主站蜘蛛池模板: 亚洲伊人精品综合在合线| 亚洲电影在线免费观看| 热久久精品免费视频| 57PAO成人国产永久免费视频| 91视频免费观看| xxxxx做受大片视频免费| 国产精品亚洲专区无码牛牛 | 亚洲一级毛片免费看| 国产啪精品视频网站免费尤物 | 黄色免费在线观看网址| 亚洲男人的天堂网站| 亚洲AV无码精品蜜桃| 亚洲 欧洲 自拍 另类 校园| 亚洲xxxxxx| 亚洲爆乳精品无码一区二区| 亚洲色偷偷综合亚洲AV伊人蜜桃| 最新国产成人亚洲精品影院| 亚洲av无码不卡久久| 亚洲国产成人精品久久 | 无码一区二区三区免费视频| 成人免费视频小说| 又黄又爽的视频免费看| 亚洲不卡AV影片在线播放| 亚洲最大AV网站在线观看| 亚洲中文字幕无码一区 | 亚洲成A人片在线观看无码不卡| 久久精品国产精品亚洲蜜月| 久久精品国产亚洲av影院| 亚洲欧洲日韩极速播放| 黄色a级片免费看| 国产成年无码久久久免费| 男女超爽刺激视频免费播放| 日韩免费高清一级毛片在线| 综合亚洲伊人午夜网 | 狠狠色伊人亚洲综合成人| 亚洲精品国产成人99久久| 亚洲男人的天堂网站| 一级**爱片免费视频| 99热免费在线观看| 免费中文字幕一级毛片| 亚洲国产福利精品一区二区|