• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于JCR的內(nèi)容管理系統(tǒng)

      2011-08-16 01:10:04景慎艷
      關(guān)鍵詞:知識(shí)庫(kù)結(jié)點(diǎn)倉(cāng)庫(kù)

      景慎艷

      (遼寧對(duì)外經(jīng)貿(mào)學(xué)院信息技術(shù)系,遼寧大連 116052)

      0 引 言

      隨著紙制文檔向電子文檔的過(guò)渡,人們意識(shí)到管理電子文檔的優(yōu)勢(shì)。大量的軟件提供商也開(kāi)發(fā)了各式各樣的內(nèi)容管理系統(tǒng),雖然這些內(nèi)容管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方式各不相同,但是他們都有一個(gè)共同的特點(diǎn),也可以說(shuō)是缺點(diǎn),那就是開(kāi)發(fā)的產(chǎn)品都是建立在私有倉(cāng)庫(kù)引擎基礎(chǔ)之上。這種無(wú)法互相兼容不但增加了系統(tǒng)的復(fù)雜性,還給系統(tǒng)的擴(kuò)展和長(zhǎng)期維護(hù)增加了難度??偟膩?lái)說(shuō),就是內(nèi)容管理系統(tǒng)的開(kāi)發(fā)缺少一套可遵循的標(biāo)準(zhǔn)和規(guī)范,從而導(dǎo)致各系統(tǒng)間的交互、系統(tǒng)的升級(jí)、維護(hù)非常困難[1]。

      Content Repository for Java Technology API(JSR-170)就是為解決上述問(wèn)題而產(chǎn)生的一套標(biāo)準(zhǔn)接口。

      為了滿足面向內(nèi)容的應(yīng)用需要,JCR規(guī)范為數(shù)據(jù)存儲(chǔ)和相關(guān)服務(wù)定義了一個(gè)抽象的模型和一套Java API。JCR的目標(biāo)不僅包括傳統(tǒng)的內(nèi)容管理系統(tǒng),更廣泛地講,任何應(yīng)用都必須處理非結(jié)構(gòu)化的數(shù)字資產(chǎn)以及結(jié)構(gòu)化或半結(jié)構(gòu)化的信息。

      通過(guò)一個(gè)簡(jiǎn)單、通用的API和一個(gè)強(qiáng)大的、可擴(kuò)展的對(duì)象類型系統(tǒng),JCR倉(cāng)庫(kù)模型能夠高效地訪問(wèn)大型二進(jìn)制對(duì)象和精細(xì)結(jié)構(gòu)的分層數(shù)據(jù)。此外,許多RDBMS和文件系統(tǒng)上的特性已被納入到知識(shí)庫(kù)中,包括查詢、訪問(wèn)控制的支持、版本控制、鎖定。這些服務(wù)的標(biāo)準(zhǔn)化支持能夠使應(yīng)用更容易地使用這些功能。

      1 JCR知識(shí)庫(kù)模型

      JCR所定義的知識(shí)庫(kù)模型如圖1所示。

      圖1 JCR知識(shí)庫(kù)模型

      描述了一個(gè)知識(shí)庫(kù) R,具有W0,W1,和 W2這3個(gè)工作區(qū)。W1的項(xiàng)圖包含一個(gè)根節(jié)點(diǎn)和A,B,C 3個(gè)子結(jié)點(diǎn)。A包含一個(gè)屬性D和一個(gè)子結(jié)點(diǎn)E,其中D是ST RING類型的屬性。E包含一個(gè)具有二進(jìn)制類型的屬性 I。B包含一個(gè)LONG類型的屬性F和一個(gè)BOOLEAN類型的屬性G。結(jié)點(diǎn)C包含一個(gè)DOUBLE類型的屬性H[2]。

      該模型就像是一個(gè)具有n個(gè)分支的樹(shù),它由單一的知識(shí)庫(kù)構(gòu)成,每個(gè)知識(shí)庫(kù)中可以擁有一個(gè)或多個(gè)工作區(qū),每個(gè)工作區(qū)都包含一個(gè)項(xiàng)目樹(shù),項(xiàng)目樹(shù)中包含結(jié)點(diǎn)和屬性,結(jié)點(diǎn)可以具有一個(gè)或多個(gè)子結(jié)點(diǎn)以及一個(gè)或多個(gè)屬性。實(shí)際的數(shù)據(jù)都是保存在屬性中,而結(jié)點(diǎn)相當(dāng)于實(shí)際數(shù)據(jù)所保存的路徑。

      每個(gè)節(jié)點(diǎn)都有且只有一個(gè)主節(jié)點(diǎn)類型。主節(jié)點(diǎn)類型定義了節(jié)點(diǎn)的特征,例如允許節(jié)點(diǎn)擁有的屬性和子節(jié)點(diǎn)。除了主節(jié)點(diǎn)類型之外,節(jié)點(diǎn)還可以有一個(gè)或多個(gè)混合(mixin)類型?;旌项愋透裥揎椘?向節(jié)點(diǎn)提供額外的特征。

      具體來(lái)說(shuō),JCR實(shí)現(xiàn)可以提供3種預(yù)定義混合類型:

      mix:versionable:允許節(jié)點(diǎn)支持版本管理;

      mix:lockable:支持節(jié)點(diǎn)的鎖定功能;

      mix:referenceable:提供自動(dòng)創(chuàng)建的jcr:uuid屬性,給節(jié)點(diǎn)一個(gè)惟一可以引用的標(biāo)識(shí)符。

      2 基于JCR的內(nèi)容管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

      2.1 TaobaoShop的設(shè)計(jì)策略

      文中以淘寶商店(TaobaoShop)為例,說(shuō)明基于JCR的內(nèi)容管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。

      T aobaoShop的存儲(chǔ)結(jié)構(gòu)拓?fù)鋱D如圖 2所示[3]。

      圖2 TaobaoShop的存儲(chǔ)結(jié)構(gòu)拓?fù)鋱D

      “taobao:shopCatagory”結(jié)點(diǎn)代表店鋪的類別,例如服裝、電器、家居等。店鋪類別結(jié)點(diǎn)包含一個(gè)“taobao:catagoryName”(類別名稱)屬性。

      “taobao:shop”結(jié)點(diǎn)是“taobao:shopCatagory”的子結(jié)點(diǎn),代表店鋪。店鋪包含“taobao:shopName”(店鋪名稱)屬性。

      “taobao:product”結(jié)點(diǎn)是“taobao:shop”的子結(jié)點(diǎn),代表某一店鋪的商品。包含“taobao:productName”(商品名稱)、“taobao:productPrice”(商品價(jià)格)以及“taobao:productIntroduction”(商品介紹)屬性。

      “taobao:transRecord”結(jié)點(diǎn)是“taobao:shop”的子結(jié)點(diǎn),代表某一店鋪的交易記錄,包含“taobao:orderId”(訂單編號(hào))、“taobao:order-Price”(訂單金額)以及“taobao:orderAddress”(訂單地址)屬性。

      2.2 TaobaoShop的實(shí)現(xiàn)

      上面描述了TaobaoShop的存儲(chǔ)結(jié)構(gòu),下面利用JCR的開(kāi)源實(shí)現(xiàn)Jackrabbit來(lái)實(shí)現(xiàn)上面的存儲(chǔ)模型。

      2.2.1 獲得知識(shí)庫(kù)

      要訪問(wèn)知識(shí)庫(kù),首先必須要獲得一個(gè)知識(shí)庫(kù)[4]。

      String configFile="repository.xml";

      String repHomeDir="repository";

      Hashtable env=new Hashtable();

      env.put(Context.INITIA L_CONTEXT_FACTORY,

      "org.apache.jackrabbit.core.jndi"+".provider.DummyInitialContextFactory");

      env.put(Context.PROVIDER_URL,"localhost");

      InitialContext ctx=new InitialContext(env);

      RegistryHelper.registerRepository(ctx,"repo",configFile,

      repHomeDir,true);

      //得到知識(shí)庫(kù)

      Repository repository=(Repository)ctx.lookup("repo");

      2.2.2 獲得工作區(qū)

      要訪問(wèn)知識(shí)庫(kù),必須要登錄到知識(shí)庫(kù)中的某一工作區(qū)。

      SimpleCredentials cred=new SimpleCredentials("userid",

      "password".toCharArray());

      Session session=repository.login(cred,null);

      //獲得默認(rèn)工作區(qū)

      Workspace ws=session.getWorkspace();

      //獲得工作區(qū)ws的根節(jié)點(diǎn)

      Node rootNode=session.getRootNode();

      2.2.3 將內(nèi)容添加到JCR倉(cāng)庫(kù)中

      //在根節(jié)點(diǎn)下添加"taobao:shopping"子結(jié)點(diǎn)。

      NodetaobaoShopping= rootNode.addNode("taobao:shopping");

      //在"taobao:shopping"結(jié)點(diǎn)下添加"taobao:shop-Catagory"子結(jié)點(diǎn)。

      Node shopCatagory=taobaoShopping.addNode("taobao:shopCatagory");

      //為"taobao:shopCatagory"結(jié)點(diǎn)定義"taobao:catagoryName"屬性和屬性值。

      shopCatagory.setProperty("taobao:catagoryName","服裝");

      //在服裝類別下添加一個(gè)店鋪?zhàn)咏Y(jié)點(diǎn)。

      Node shop=shopCatagory.addNode("taobao:shop");

      //定義店鋪名稱

      shop.setProperty("taobao:shopName","上海淘樂(lè)服裝店");

      //為"上海淘樂(lè)服裝店"添加商品子結(jié)點(diǎn)

      Node product=shop.addNode("taobao:product");//定義商品名稱

      product.setProperty("taobao:productName","蘭蘭S01男裝");

      product.setProperty("taobao:productPrice",129.00);

      product.setProperty("taobao:productIntroduction","商品詳細(xì)描述");

      //為"上海淘樂(lè)服裝店"添加交易記錄子結(jié)點(diǎn)

      Node transRecord=shop.addNode("taobao:transRecord");

      //定義訂單編號(hào)

      transRecord.setProperty("taobao:orderId","2011030400000001");

      //定義訂單縱金額

      transRecord.setProperty("taobao:orderPrice",569.30);

      //定義訂單物流信息

      transRecord.setProperty("taobao:orderAddress","北京市海淀區(qū)xxxxxx");

      //保存添加的所有內(nèi)容

      session.save();

      2.2.4 取得內(nèi)容

      可以通過(guò)獲取NodeIterator(它返回特點(diǎn)節(jié)點(diǎn)的所有子節(jié)點(diǎn))來(lái)瀏覽知識(shí)庫(kù)中的所有內(nèi)容。下面代碼可以獲取到某一店鋪的所有商品信息[5]。

      Node shopping=rootNode.getNode("taobao:shopping");

      Node shopCatagory=rootNode.getNode("taobao:shopCatagory");

      NodeIterator it=shopCatagory.getNodes("taobao:shop");

      while(it.hasNext()){

      Node entry=it.nextNode();

      System.out.println(entry.getName());System.out.println(entry.getProperty("taobao:shop-Name").

      getString());

      }

      2.2.5 用XML導(dǎo)入和導(dǎo)出內(nèi)容

      JSR-170為了確???JCR實(shí)現(xiàn)的移植性已經(jīng)做了許多工作。它促進(jìn)移植性的方式之一就是使用標(biāo)準(zhǔn)的XML導(dǎo)入和導(dǎo)出特性。通過(guò)使用這些工具,符合規(guī)范的供應(yīng)商倉(cāng)庫(kù)內(nèi)容可以很容易地轉(zhuǎn)移到另一個(gè)符合規(guī)范的供應(yīng)商倉(cāng)庫(kù)。使用XML進(jìn)行序列化的另一個(gè)優(yōu)勢(shì)是:可以用傳統(tǒng)的XML解析工具操縱導(dǎo)出的倉(cāng)庫(kù)[6]。

      File outputFile=new File("shopping.xml");

      FileOutputStream out=new FileOutputStream(outputFile);

      session.exportSystemView("/taobao:shopping",out,false,false);

      可以把生成的XM L文件導(dǎo)入到另一個(gè)知識(shí)庫(kù)[7]。

      File inputFile=new File("shopping.xml");

      FileInputStream in=new FileInputStream(input-File);

      session.importXML("/",in,ImportUUIDBehavior.IMPORT_UUID_CREA TE_NEW);session.save();

      2.2.6 添加二進(jìn)制內(nèi)容

      “taobao:productIntroduction”屬性的類型為“nt:file”,也就是說(shuō)該屬性可以保存二進(jìn)制流。

      下面的代碼可以把圖片文件以二進(jìn)制流的形式保存到“taobao:productIntroduction”屬性中[8]。

      File file=new File("蘭蘭S01男裝.gif");

      MimeTable mt=MimeTable.getDefaultTable();

      String mimeType=mt.getContentTypeFor(file.getName());

      if(mimeType==null)mimeType="application/octet-stream";

      product.setProperty("jcr:mimeType",mimeType);

      product.setProperty("jcr:encoding","");

      product.setProperty("jcr:data",new FileInput-Stream(file));

      Calendar lastModified=Calendar.getInstance();

      lastModified.setTimeInMillis(file.lastM odified());

      product.setProperty("jcr:lastModified",lastModified);

      3 結(jié) 語(yǔ)

      通過(guò)對(duì)淘寶商店的設(shè)計(jì),可以感受到通過(guò)JCR建立內(nèi)容存儲(chǔ)倉(cāng)庫(kù),有效地降低了系統(tǒng)開(kāi)發(fā)、維護(hù)成本,可以大大降低企業(yè)在不同底層存儲(chǔ)之間的數(shù)據(jù)遷移成本。隨著社會(huì)信息化程度的提高,內(nèi)容管理應(yīng)用的領(lǐng)域?qū)?huì)越來(lái)越多。應(yīng)用不斷增多,對(duì)于公共的、標(biāo)準(zhǔn)的內(nèi)容倉(cāng)庫(kù)API的需求也將變得日益強(qiáng)烈。

      [1]孔佳,李昀.內(nèi)容管理系統(tǒng)的產(chǎn)生與發(fā)展[J].農(nóng)業(yè)網(wǎng)絡(luò)信息,2008,23(3):89-92.

      [2]于明達(dá).NET多層架構(gòu)在內(nèi)容管理系統(tǒng)的設(shè)計(jì)研究[D]:[碩士學(xué)位論文].大連:大連海事大學(xué),2009.

      [3]薛勝軍,成敏.Java內(nèi)容倉(cāng)庫(kù)及其在CMS中的應(yīng)用[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(1):241-244,247.

      [4]張亞男,王鑫.基于內(nèi)容管理的網(wǎng)站構(gòu)建系統(tǒng)的研究[J].硅谷,2010,9(23):85-86.

      [5]Sunil Patil.Advanced Java Content Repository API[EB/OL][2011-01-06].http://www.onjava.com/pub/a/onjava/2006/11/08/advanced-java-content-re.

      [6]黎文導(dǎo),盧瑜.J2EE平臺(tái)上基于XML數(shù)據(jù)交換系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2006,27(4):350-353.

      [7]佚名.Java Content Repository API簡(jiǎn)介[EB/OL][2011-01-06].http://www.ibm.com/developerworks/cn/java/j-jcr/.

      [8]張建,劉更,賀朝霞,等.基于XM L實(shí)現(xiàn)Java內(nèi)容倉(cāng)庫(kù)和關(guān)系型數(shù)據(jù)庫(kù)的雙向映射[J].計(jì)算機(jī)應(yīng)用研究,2009(1):211-214.

      猜你喜歡
      知識(shí)庫(kù)結(jié)點(diǎn)倉(cāng)庫(kù)
      倉(cāng)庫(kù)里的小偷
      填滿倉(cāng)庫(kù)的方法
      四行倉(cāng)庫(kù)的悲壯往事
      基于TRIZ與知識(shí)庫(kù)的創(chuàng)新模型構(gòu)建及在注塑機(jī)設(shè)計(jì)中的應(yīng)用
      Ladyzhenskaya流體力學(xué)方程組的確定模與確定結(jié)點(diǎn)個(gè)數(shù)估計(jì)
      高速公路信息系統(tǒng)維護(hù)知識(shí)庫(kù)的建立和應(yīng)用
      基于Drupal發(fā)布學(xué)者知識(shí)庫(kù)關(guān)聯(lián)數(shù)據(jù)的研究
      消防設(shè)備
      基于Raspberry PI為結(jié)點(diǎn)的天氣云測(cè)量網(wǎng)絡(luò)實(shí)現(xiàn)
      基于DHT全分布式P2P-SIP網(wǎng)絡(luò)電話穩(wěn)定性研究與設(shè)計(jì)
      信宜市| 长丰县| 西青区| 开远市| 筠连县| 靖远县| 石河子市| 霍州市| 武清区| 永康市| 彭泽县| 邵武市| 靖江市| 永吉县| 阿尔山市| 泽州县| 察哈| 鲁甸县| 大姚县| 衡山县| 磐安县| 平原县| 永济市| 湘西| 砚山县| 龙川县| 台中县| 陆良县| 汨罗市| 佳木斯市| 竹北市| 田林县| 涿鹿县| 开阳县| 溧阳市| 开江县| 湖州市| 泸水县| 同江市| 台前县| 南部县|