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

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

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

    posts - 193,  comments - 520,  trackbacks - 0
    獲得列表
    在上一步中我們已經(jīng)把數(shù)據(jù)保存到了內(nèi)容倉庫中,那我們?nèi)绾未_定數(shù)據(jù)確實保存進去了呢?getBlogList() 這個方法將返回根節(jié)點下所有名為blogEntry.的子節(jié)點。
    public?ArrayList?getBlogList()?throws?BlogApplicationException?{
    ????Session?session?
    =?JackrabbitPlugin.getSession();
    ????ArrayList?blogEntryList?
    =?new?ArrayList();
    ????Node?rootNode?
    =?session.getRootNode();
    ????NodeIterator?blogEntryNodeIterator?
    =?rootNode.getNodes();

    ????
    while?(blogEntryNodeIterator.hasNext())?{
    ????????Node?blogEntry?
    =?blogEntryNodeIterator.nextNode();
    ????????
    if?(blogEntry.getName().equals("blogEntry")?==?false)
    ????????????
    continue;
    ????????String?title?
    =?blogEntry.getProperty("title").getString();
    ????????String?blogContent?
    =?blogEntry.getProperty("blogContent").getString();
    ????????Value?creationTimeValue?
    =?(Value)?blogEntry.getProperty(
    ????????????????
    "creationTime").getValue();
    ????????String?userName?
    =?blogEntry.getProperty("userName").getString();
    ????????BlogEntryDTO?blogEntryDTO?
    =?new?BlogEntryDTO(userName,?title,
    ????????????????blogContent,?creationTimeValue.getDate());
    ????????blogEntryList.add(blogEntryDTO);
    ????}
    ????
    return?blogEntryList;
    }

    一旦你獲得了根節(jié)點這個對象,你就可以通過調(diào)用getNodes()這個方法來獲取它所有的子節(jié)點。如果這個節(jié)點沒有子節(jié)點,將返回一個空的NodeIterator 對象。我們可以遍歷這個NodeIterator 對象來獲得名為blogEntry 的節(jié)點集合,然后通過getProperty()方法來獲得節(jié)點上的屬性,即我們保存的真實數(shù)據(jù)。getProperty()方法返回Value對象的一個實例。因為存儲數(shù)據(jù)類型的不同,所以返回的Value對象實例是不同的。根據(jù)不同的數(shù)據(jù)類型,你應(yīng)該調(diào)用特定的方法來獲取數(shù)據(jù),比如getString()來獲取字符串,而getDate()獲得一個日期。

    查找內(nèi)容(用XPath的方式)
    JSR-170定義了兩種方式來查找內(nèi)容(也可以理解為查找節(jié)點)。一種使用XPath語法,另一種使用SQL語法。JSR-170要求Level 1必須實現(xiàn)XPath的方式,而SQL的方式則作為一個可選的功能。

    XPath原本是一種設(shè)計用來查找XML元素的語言。因為我們的workspace是樹狀的結(jié)構(gòu),很像XML。所以XPath語法非常適合于在這里查找內(nèi)容。下面的代碼演示了通過作者名來查找節(jié)點。
    Session?session?=?JackrabbitPlugin.getSession();
    ????Workspace?workSpace?
    =?session.getWorkspace();
    ????QueryManager?queryManager?
    =?workSpace.getQueryManager();

    ????StringBuffer?queryStr?
    =?new?StringBuffer(
    ????????????
    "//blogEntry[@"+PROP_BLOGAUTHOR?+"=?'");
    ????queryStr.append(userName);
    ????queryStr.append(
    "']");
    ????Query?query?
    =?queryManager.createQuery(queryStr.toString(),
    ????????????Query.XPATH);

    ????QueryResult?queryResult?
    =?query.execute();

    ????NodeIterator?queryResultNodeIterator?
    =?queryResult.getNodes();
    ????
    while?(queryResultNodeIterator.hasNext())?{

    ????????Node?blogEntry?
    =?queryResultNodeIterator.nextNode();
    ????????String?title?
    =?blogEntry.getProperty(PROP_TITLE).getString();
    ????????String?blogContent?
    =?blogEntry.getProperty(PROP_BLOGCONTENT).getString();
    ????????Value?creationTimeValue?
    =?(Value)?blogEntry.getProperty(
    ????????????????PROP_CREATIONTIME).getValue();
    ????????BlogEntryDTO?blogEntryDTO?
    =?new?BlogEntryDTO(userName,?title,
    ????????????????blogContent,?creationTimeValue.getDate());
    ????????blogEntryList.add(blogEntryDTO);
    ????}

    首先獲得session 對象,通過它獲得它連接的workspace,然后就可以通過workspace獲得這個workspace的QueryManager 。QueryManager 接口定義了很多用來查詢的方法。接下來我們要做的是創(chuàng)建一條查詢語句。我們這里這樣寫"http://blogEntry[@blogAuthor='<bloggerName>'"。這句話的意思是查找所有名為blogEntry ,含有blogAuthor 屬性且屬性值為<bloggerName>的節(jié)點。具體可以看JSR-170規(guī)范。

    通過queryManager's createQuery()方法創(chuàng)建一個查詢對象,這個方法需要兩個參數(shù),一個是我們的查詢語句,另一個是查詢的方式,這里使用XPath。獲得這個Query 查詢對象后,調(diào)用它的execute() 方法開始執(zhí)行查詢,返回一個QueryResult 對象。注意,查詢的結(jié)果受到當前session的限制,換句話說,就是如果這個session沒有權(quán)限查看一個特定的節(jié)點,哪怕這個節(jié)點滿足我們查詢的條件,在我們的查詢結(jié)果里也是看不到這個節(jié)點的。所有的查詢數(shù)據(jù)來自于該workspace已經(jīng)持久化的數(shù)據(jù),哪些已經(jīng)改變但還沒有通過session.save()(item.save())持久化到workspace的數(shù)據(jù)不在查詢之列。獲得QueryResult 對象后,我們就可以通過調(diào)用getNodes()方法來獲得符合查詢條件的節(jié)點的一個遍歷。

    剩下的兩個未實現(xiàn)的方法是updateBlogEntry() 和 removeBlogEntry(),它們實現(xiàn)起來都很簡單。我們把BOLG 標題作為主鍵,通過標題來獲得相關(guān)的節(jié)點。在updateBlogEntry()方法里,我們直接設(shè)定需要改變的屬性;在 removeBlogEntry()方法里,我們獲得目標節(jié)點后直接在節(jié)點上調(diào)用remove()方法。最后別忘了一定要調(diào)用session.save()方法把我們改變的數(shù)據(jù)持久化。

    處理二進制內(nèi)容
    對內(nèi)容倉庫來說,處理二進制內(nèi)容是個很基本的要求,比如說圖片。現(xiàn)在我們的示例程序容許給每個BLOG附加一張圖片。下面分別是附加圖片和獲取圖片的方法。
    public?void?attachFileToBlogEntry(String?blogTitle,
    ??InputStream?uploadInputStream)?
    throws?BlogApplicationException?{
    ????Session?session?
    =?JackrabbitPlugin.getSession();
    ????Node?blogEntryNode?
    =?getBlogEntryNode(blogTitle,?session);
    ????blogEntryNode.setProperty(PROP_ATTACHMENT,?uploadInputStream);
    ????session.save();

    }
    public?InputStream?getAttachedFile(String?blogTitle)?throws?BlogApplicationException?{
    ????InputStream?attachFileIS?
    =?null;
    ????Node?blogEntryNode?
    =?getBlogEntryNode(blogTitle);
    ????Value?attachFileValue?
    =?(Value)?blogEntryNode.getProperty(PROP_ATTACHMENT).getValue();
    ????attachFileIS?
    =?attachFileValue.getStream();
    ??
    return?attachFileIS;
    }

    正如你看到的那樣,我們的代碼在處理二進制內(nèi)容和一般內(nèi)容間并沒有什么太大的區(qū)別。僅僅一點不同的是你要通過InputStream 對象來保存和獲取二進制數(shù)據(jù)。在我們的配置文件里關(guān)于persistent manager會有一個externalBLOBs 屬性。把這個屬性設(shè)為true, 圖片將會保存在文件里,相反則會保存在數(shù)據(jù)庫的blob字段里。

    總結(jié)
    到這里,我們對 JSR-170, Jackrabbit以及如何使用 JSR-170 API開發(fā)一個簡單的應(yīng)用程序都有了大概的了解。我們的討論更多的在于基礎(chǔ)。相信大家一定會對內(nèi)容倉庫有個初步的認識。

    http://m.tkk7.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)
    posted on 2007-01-28 23:55 ronghao 閱讀(1856) 評論(3)  編輯  收藏 所屬分類: cms

    FeedBack:
    # re: 什么是JAVA內(nèi)容倉庫(Java Content Repository)(4完)
    2007-02-05 15:25 | Tesrio
    你把圖片以InputStream 的形式保存到節(jié)點里,我想問下,你是如何處理圖片的顯示的呢?  回復  更多評論
      
    # re: 什么是JAVA內(nèi)容倉庫(Java Content Repository)(4完)
    2007-02-06 18:10 | ronghao
    正常的讀出文件流就可以啊,和其他的處理沒什么兩樣:)  回復  更多評論
      
    # re: 什么是JAVA內(nèi)容倉庫(Java Content Repository)(4完)
    2012-02-03 15:41 | 雪浪
    這系列文章不錯,對我有幫助,謝謝!  回復  更多評論
      
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    關(guān)注工作流和企業(yè)業(yè)務(wù)流程改進。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網(wǎng)站

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲大尺度无码无码专区| 久久精品亚洲AV久久久无码| 中文字幕亚洲一区二区va在线| 亚洲自偷自偷图片| 一级毛片免费不卡| 1000部拍拍拍18勿入免费视频软件| 国产精品视_精品国产免费| 亚洲AV综合色区无码一区爱AV| 中文字幕在线日亚洲9| 三级网站免费观看| 成年性生交大片免费看| 亚洲色精品aⅴ一区区三区| 亚洲成在人线在线播放无码| 久久99精品视免费看| 亚洲人成国产精品无码| 亚洲精品GV天堂无码男同| 日韩一区二区免费视频| 亚洲六月丁香六月婷婷蜜芽 | 亚洲?v女人的天堂在线观看| 亚洲成aⅴ人片在线观| 免费无码又爽又刺激一高潮| 国产99视频免费精品是看6| 亚洲国产精品综合久久20| 国产精品99精品久久免费| 一本色道久久88综合亚洲精品高清| 日韩电影免费在线观看网址| 日韩精品电影一区亚洲| 美女巨胸喷奶水视频www免费| 免费少妇a级毛片人成网| 亚洲第一第二第三第四第五第六| 青青青国产免费一夜七次郎 | 亚洲精品色播一区二区| 成人伊人亚洲人综合网站222| 国产高清视频免费在线观看| 国产精品视频免费一区二区三区 | 丰满亚洲大尺度无码无码专线| 麻豆国产精品免费视频| 亚洲精华国产精华精华液网站| 日韩精品亚洲aⅴ在线影院| 久久福利资源网站免费看| 特级毛片全部免费播放a一级|