<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
    開發(fā)我們的例子程序
    jackrabbit已經(jīng)配置好了,現(xiàn)在讓我們來(lái)創(chuàng)建我們的示例程序。這個(gè)例子程序?qū)⒄{(diào)用JCR-170 API。很顯然,我們需要做兩件事情:一個(gè)是作為后臺(tái)的對(duì)數(shù)據(jù)進(jìn)行增刪改查(持久層),另一個(gè)是開發(fā)相對(duì)應(yīng)的UI界面(WEB 層)。首先,讓我們定義一個(gè)DAO接口。這個(gè)接口BlogEntryDAO.java 如下:
    public?interface?BlogEntryDAO?{
    ????
    public?void?insertBlogEntry(BlogEntryDTO?blogEntryDTO)
    ????????
    throws?BlogApplicationException;
    ????
    public?void?updateBlogEntry(BlogEntryDTO?blogEntryDTO)
    ????????
    throws?BlogApplicationException;
    ????
    public?ArrayList?getBlogList()
    ????????
    throws?BlogApplicationException;
    ????
    public?BlogEntryDTO?getBlogEntry(String?blogTitle)
    ????????
    throws?BlogApplicationException;
    ????
    public?void?removeBlogEntry(String?blogTitle)
    ????????
    throws?BlogApplicationException;
    ????
    public?ArrayList?searchBlogList(String?userName)
    ????????
    throws?BlogApplicationException;
    ????
    public?void?attachFileToBlogEntry(String?blogTitle,?InputStream?uploadInputStream)
    ????????
    throws?BlogApplicationException;
    ????
    public?InputStream?getAttachedFile(String?blogTitle)
    ????????
    throws?BlogApplicationException;
    }

    正如你看到的,這個(gè)接口提供了增刪改查的方法,同時(shí)還提供了兩個(gè)方法來(lái)處理附件。接下來(lái),我們需要一個(gè)DTO對(duì)象用來(lái)在兩個(gè)層之間傳遞數(shù)據(jù)。
    public?class?BlogEntryDTO?{

    ????
    private?String?userName;
    ????
    private?String?title;
    ????
    private?String?blogContent;
    ????
    private?Calendar?creationTime;

    ????
    //Getter?and?setter?methods?for?each?of?these?properties????????
    }

    這里我們將僅僅討論持久層。

    連接jackrabbit
    現(xiàn)在,第一件事情是開發(fā)一個(gè)組件,獲得一個(gè)到j(luò)ackrabbit內(nèi)容倉(cāng)庫(kù)的連接。為了簡(jiǎn)單,我們將在程序啟動(dòng)的時(shí)候獲得這個(gè)連接,然后在程序停止的時(shí)候釋放這個(gè)連接。這里我們使用了Struts ,所以我們需要開發(fā)一個(gè)PlugIn 類。如下:
    public?class?JackrabbitPlugin?implements?PlugIn{
    ????
    public?static?Session?session;
    ????
    public?void?destroy()?{
    ????????session.logout();
    ????}
    ????
    public?void?init(ActionServlet?actionServlet,?ModuleConfig?moduleConfig)?
    ????
    throws?ServletException?{
    ????????
    try?{
    ????????????System.setProperty(
    "org.apache.jackrabbit.repository.home",
    ????????????????
    "c:/temp/Blogging");
    ????????????Repository?repository?
    =?new?TransientRepository();
    ????????????session?
    =?repository.login(new?SimpleCredentials("username",
    ????????????????????
    "password".toCharArray()));
    ????????}?
    catch?(LoginException?e)?{
    ????????????
    throw?new?ServletException(e);
    ????????}?
    catch?(IOException?e)?{
    ????????????
    throw?new?ServletException(e);
    ????????}?
    catch?(RepositoryException?e)?{
    ????????????
    throw?new?ServletException(e);????????????
    ????????}
    ????}
    ????
    public?static?Session?getSession()?{
    ????????
    return?session;
    ????}
    }

    init()方法將會(huì)在程序啟動(dòng)的時(shí)候調(diào)用,destroy()將會(huì)在程序停止的時(shí)候調(diào)用。我們?cè)趇nit()方法里獲得了到j(luò)ackrabbit內(nèi)容倉(cāng)庫(kù)的連接??纯创a,我們做的第一件事是設(shè)定了org.apache.jackrabbit.repository.home這個(gè)系統(tǒng)屬性,在上篇文章里提到,這個(gè)屬性是用來(lái)指向我們的內(nèi)容倉(cāng)庫(kù)主目錄。這里我們?cè)O(shè)定它為c:/temp/blogging。接下來(lái),我們創(chuàng)建了TransientRepository的一個(gè)實(shí)例。這是jackrabbit提供的類,它提供了一個(gè)到內(nèi)容倉(cāng)庫(kù)的代理。它在第一個(gè)session 打開的時(shí)候自動(dòng)啟動(dòng)內(nèi)容倉(cāng)庫(kù),在最后一個(gè)session 關(guān)閉的時(shí)候自動(dòng)關(guān)閉內(nèi)容倉(cāng)庫(kù)。
    一旦我們獲得了一個(gè)內(nèi)容倉(cāng)庫(kù)對(duì)象,我們就可以調(diào)用它的login() 方法來(lái)打開一個(gè)連接。login() 方法需要一個(gè)Credential 對(duì)象作為參數(shù)。如果Credential 對(duì)象是NULL,jackrabbit會(huì)認(rèn)為其他的機(jī)制做了這個(gè)驗(yàn)證(比如JAAS)。login() 方法還可以傳入一個(gè)workspace名字作為參數(shù),如果不傳入這個(gè)參數(shù),jackrabbit會(huì)返回一個(gè)session對(duì)象指向默認(rèn)的workspace。注意workspace和session是一對(duì)一的,即一個(gè)session僅對(duì)應(yīng)一個(gè)workspace。(注:如果不傳入Credential對(duì)象,返回的session對(duì)workspace是只讀的)

    增加內(nèi)容
    連接已經(jīng)建立起來(lái)了,下面讓我們實(shí)現(xiàn)BlogEntryDAO這個(gè)接口。第一個(gè)我們想實(shí)現(xiàn)的方法是插入數(shù)據(jù) insertBlogEntry()
    public?void?insertBlogEntry(BlogEntryDTO?blogEntryDTO)
    ????????????
    throws?BlogApplicationException?{
    ????????Session?session?
    =?JackrabbitPlugin.getSession();
    ????????Node?rootNode?
    =?session.getRootNode();
    ????????Node?blogEntry?
    =?rootNode.addNode("blogEntry");
    ????????blogEntry.setProperty(
    "title",?blogEntryDTO.getTitle());
    ????????blogEntry.setProperty(
    "blogContent",?blogEntryDTO.getBlogContent());
    ????????blogEntry.setProperty(
    "creationTime",?blogEntryDTO.getCreationTime());
    ????????blogEntry.setProperty(
    "userName",?blogEntryDTO.getUserName());????????????
    ????????session.save();
    }

    首先獲得session 對(duì)象,即到內(nèi)容倉(cāng)庫(kù)特定workspace的連接。然后,我們?cè)谶@個(gè)session 對(duì)象上調(diào)用getRootNode() 方法,獲得這個(gè)workspace的根節(jié)點(diǎn),這個(gè)根節(jié)點(diǎn)的路徑是("/").一旦我們獲得這個(gè)根節(jié)點(diǎn),我們就可以通過(guò)addNode()方法在這個(gè)根節(jié)點(diǎn)下增加新的子節(jié)點(diǎn)。新節(jié)點(diǎn)的名字是blogEntry. 通過(guò)setProperty() 方法我們把數(shù)據(jù)存儲(chǔ)到節(jié)點(diǎn)的property里。正如我們先前說(shuō)明的,真實(shí)的數(shù)據(jù)是存儲(chǔ)在property元素里,property元素是葉子。
    注意session.save() 這行代碼。這個(gè)方法是必須調(diào)用的,這個(gè)方法調(diào)用之前,任何 Node,Property的改變都被保存在這個(gè)session的一個(gè)臨時(shí)區(qū)域里,其他的和該session連接到相同workspace的session都看不到這些改變。當(dāng)這個(gè)方法被調(diào)用并被成功執(zhí)行后,這些Node,Property的改變才會(huì)被持久化到這個(gè)session關(guān)聯(lián)的workspace里,同時(shí)所有與這個(gè)workspace關(guān)聯(lián)的session才可見(jiàn)這些變化。相對(duì)應(yīng)的,Session.refresh(false)將會(huì)丟棄所有這些改變。item.save()和Item.refresh(false)作用相似,只是影響范圍限定在單個(gè)Item上(注意,包括它的子節(jié)點(diǎn))

    http://www.tkk7.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:)
    posted on 2007-01-25 23:12 ronghao 閱讀(3833) 評(píng)論(0)  編輯  收藏 所屬分類: cms
    <2007年1月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

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

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網(wǎng)站

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲色婷婷综合开心网| 又粗又大又长又爽免费视频| 18禁止看的免费污网站| 无码视频免费一区二三区| 免费v片在线观看无遮挡| 亚洲国产精品ⅴa在线观看| 久久国产精品萌白酱免费| 嫩草影院免费观看| 亚洲精品自产拍在线观看| 久久精品国产亚洲AV久| 91在线免费视频| 免费视频淫片aa毛片| 久久久久亚洲精品美女| 黄色免费网址大全| 久久受www免费人成_看片中文| 亚洲线精品一区二区三区影音先锋| 亚洲日本久久一区二区va| 叮咚影视在线观看免费完整版| 又黄又爽的视频免费看| 国产福利免费视频| 成人免费777777| 免费国产高清毛不卡片基地 | 亚洲欧美日韩综合久久久| 中文字幕版免费电影网站| 国产yw855.c免费视频| 亚洲日日做天天做日日谢| 久久免费福利视频| 亚洲国产av高清无码| 无码人妻丰满熟妇区免费| 国产亚洲色视频在线| 国产亚洲综合精品一区二区三区| 一二三四免费观看在线视频中文版| 亚洲一区精品中文字幕| 成人一区二区免费视频| 亚洲综合久久1区2区3区| 亚欧免费一级毛片| 亚洲中文字幕无码久久| 免费看少妇作爱视频| 三级网站在线免费观看| 激情综合亚洲色婷婷五月APP| 亚洲国产V高清在线观看|