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

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

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

    學習筆記

    Simple is beautiful.

    導航

    <2007年3月>
    25262728123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統計

    公告

    ...

    常用鏈接

    留言簿(1)

    隨筆分類(2)

    隨筆檔案(56)

    Weblog

    搜索

    最新評論

    評論排行榜

    什么是JAVA內容倉庫(Java Content Repository)(3)


    開發我們的例子程序

    jackrabbit已經配置好了,現在讓我們來創建我們的示例程序。這個例子程序將調用JCR-170 API。很顯然,我們需要做兩件事情:一個是作為后臺的對數據進行增刪改查(持久層),另一個是開發相對應的UI界面(WEB 層)。首先,讓我們定義一個DAO接口。這個接口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;
    }

    正如你看到的,這個接口提供了增刪改查的方法,同時還提供了兩個方法來處理附件。接下來,我們需要一個DTO對象用來在兩個層之間傳遞數據。
    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
    現在,第一件事情是開發一個組件,獲得一個到jackrabbit內容倉庫的連接。為了簡單,我們將在程序啟動的時候獲得這個連接,然后在程序停止的時候釋放這個連接。這里我們使用了Struts ,所以我們需要開發一個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()方法將會在程序啟動的時候調用,destroy()將會在程序停止的時候調用。我們在init()方法里獲得了到jackrabbit內容倉庫的連接。看看代碼,我們做的第一件事是設定了org.apache.jackrabbit.repository.home這個系統屬性,在上篇文章里提到,這個屬性是用來指向我們的內容倉庫主目錄。這里我們設定它為c:/temp/blogging。接下來,我們創建了TransientRepository的一個實例。這是jackrabbit提供的類,它提供了一個到內容倉庫的代理。它在第一個session 打開的時候自動啟動內容倉庫,在最后一個session 關閉的時候自動關閉內容倉庫。
    一旦我們獲得了一個內容倉庫對象,我們就可以調用它的login() 方法來打開一個連接。login() 方法需要一個Credential 對象作為參數。如果Credential 對象是NULL,jackrabbit會認為其他的機制做了這個驗證(比如JAAS)。login() 方法還可以傳入一個workspace名字作為參數,如果不傳入這個參數,jackrabbit會返回一個session對象指向默認的workspace。注意workspace和session是一對一的,即一個session僅對應一個workspace。(注:如果不傳入Credential對象,返回的session對workspace是只讀的)

    增加內容
    連接已經建立起來了,下面讓我們實現BlogEntryDAO這個接口。第一個我們想實現的方法是插入數據 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 對象,即到內容倉庫特定workspace的連接。然后,我們在這個session 對象上調用getRootNode() 方法,獲得這個workspace的根節點,這個根節點的路徑是("/").一旦我們獲得這個根節點,我們就可以通過addNode()方法在這個根節點下增加新的子節點。新節點的名字是blogEntry. 通過setProperty() 方法我們把數據存儲到節點的property里。正如我們先前說明的,真實的數據是存儲在property元素里,property元素是葉子。
    注意session.save() 這行代碼。這個方法是必須調用的,這個方法調用之前,任何 Node,Property的改變都被保存在這個session的一個臨時區域里,其他的和該session連接到相同workspace的session都看不到這些改變。當這個方法被調用并被成功執行后,這些Node,Property的改變才會被持久化到這個session關聯的workspace里,同時所有與這個workspace關聯的session才可見這些變化。相對應的,Session.refresh(false)將會丟棄所有這些改變。item.save()和Item.refresh(false)作用相似,只是影響范圍限定在單個Item上(注意,包括它的子節點)

    posted on 2007-03-19 01:04 Ecko 閱讀(304) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费中文熟妇在线影片| aⅴ在线免费观看| 免费中文字幕在线观看| 鲁死你资源站亚洲av| 日本xxwwxxww在线视频免费| 亚洲中文字幕乱码一区| 破了亲妺妺的处免费视频国产| 亚洲精品人成网在线播放影院| 在线观看av永久免费| 亚洲成a人片在线观看天堂无码| 国产一级淫片视频免费看| 精品国产日韩亚洲一区91| 又大又粗又爽a级毛片免费看| 未满十八私人高清免费影院| 超清首页国产亚洲丝袜| 国产亚洲免费的视频看| 亚洲精品不卡视频| 精品国产免费观看久久久| 乱淫片免费影院观看| 亚洲国产精品VA在线看黑人| 在免费jizzjizz在线播| 亚洲精品美女久久7777777| 国产成人精品日本亚洲专区 | 亚洲大成色www永久网站| 免费人成黄页在线观看日本| 亚洲图片一区二区| 成人免费无遮挡无码黄漫视频| 精品免费AV一区二区三区| 亚洲熟妇无码AV在线播放| 18女人毛片水真多免费| 亚洲色大成网站www| 国产亚洲精品国看不卡| 最近中文字幕电影大全免费版| 亚洲熟妇无码一区二区三区导航 | 亚洲av无码乱码国产精品fc2| 免费能直接在线观看黄的视频 | 99在线免费观看视频| 亚洲日韩精品无码专区加勒比☆| 亚洲一区二区三区乱码A| 在线免费观看亚洲| 青青青视频免费观看|