<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://m.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)論排行榜

    主站蜘蛛池模板: 久久亚洲色一区二区三区| 免费h成人黄漫画嘿咻破解版| 亚洲精品美女久久久久99| 美女羞羞免费视频网站| 国产视频精品免费| 综合偷自拍亚洲乱中文字幕| 免费一级毛片不卡在线播放| 黄页视频在线观看免费| 亚洲中文字幕无码专区| 精品国产污污免费网站| 亚洲av色福利天堂| 91精品国产免费| 亚洲av永久综合在线观看尤物| 成人性生交大片免费看无遮挡| 亚洲日韩国产AV无码无码精品| 日韩免费无砖专区2020狼| 男人扒开添女人下部免费视频| 国产亚洲精午夜久久久久久| 今天免费中文字幕视频| 亚洲成AV人综合在线观看| 一二三四在线观看免费高清中文在线观看| 亚洲av永久无码精品三区在线4 | 国产免费拔擦拔擦8X高清在线人| 亚洲AV午夜福利精品一区二区 | 国产在线播放线91免费| 亚洲AV永久青草无码精品| 久视频精品免费观看99| 亚洲欧美自偷自拍另类视| 亚洲 无码 在线 专区| 在线免费播放一级毛片 | 亚洲影院在线观看| 成年女性特黄午夜视频免费看 | 四虎影视在线看免费观看| 亚洲αv在线精品糸列| 野花高清在线电影观看免费视频| 极品色天使在线婷婷天堂亚洲| 亚洲精品一级无码鲁丝片| 久久A级毛片免费观看| 亚洲国产欧洲综合997久久| 久久亚洲色一区二区三区| 噼里啪啦电影在线观看免费高清 |