posts - 193,  comments - 520,  trackbacks - 0
          開發(fā)我們的例子程序
          jackrabbit已經(jīng)配置好了,現(xiàn)在讓我們來創(chuàng)建我們的示例程序。這個例子程序?qū)⒄{(diào)用JCR-170 API。很顯然,我們需要做兩件事情:一個是作為后臺的對數(shù)據(jù)進(jìn)行增刪改查(持久層),另一個是開發(fā)相對應(yīng)的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對象用來在兩個層之間傳遞數(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ā)一個組件,獲得一個到j(luò)ackrabbit內(nèi)容倉庫的連接。為了簡單,我們將在程序啟動的時候獲得這個連接,然后在程序停止的時候釋放這個連接。這里我們使用了Struts ,所以我們需要開發(fā)一個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()方法將會在程序啟動的時候調(diào)用,destroy()將會在程序停止的時候調(diào)用。我們在init()方法里獲得了到j(luò)ackrabbit內(nèi)容倉庫的連接。看看代碼,我們做的第一件事是設(shè)定了org.apache.jackrabbit.repository.home這個系統(tǒng)屬性,在上篇文章里提到,這個屬性是用來指向我們的內(nèi)容倉庫主目錄。這里我們設(shè)定它為c:/temp/blogging。接下來,我們創(chuàng)建了TransientRepository的一個實例。這是jackrabbit提供的類,它提供了一個到內(nèi)容倉庫的代理。它在第一個session 打開的時候自動啟動內(nèi)容倉庫,在最后一個session 關(guān)閉的時候自動關(guān)閉內(nèi)容倉庫。
          一旦我們獲得了一個內(nèi)容倉庫對象,我們就可以調(diào)用它的login() 方法來打開一個連接。login() 方法需要一個Credential 對象作為參數(shù)。如果Credential 對象是NULL,jackrabbit會認(rèn)為其他的機(jī)制做了這個驗證(比如JAAS)。login() 方法還可以傳入一個workspace名字作為參數(shù),如果不傳入這個參數(shù),jackrabbit會返回一個session對象指向默認(rèn)的workspace。注意workspace和session是一對一的,即一個session僅對應(yīng)一個workspace。(注:如果不傳入Credential對象,返回的session對workspace是只讀的)

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

          http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請注明出處:)
          posted on 2007-01-25 23:12 ronghao 閱讀(3831) 評論(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)站

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 花垣县| 车致| 晋城| 德州市| 定远县| 响水县| 方城县| 安泽县| 虎林市| 潼南县| 涟源市| 泸水县| 伊通| 安多县| 叶城县| 筠连县| 红河县| 平利县| 玛多县| 麻阳| 华池县| 镇原县| 含山县| 洛扎县| 揭阳市| 德清县| 昔阳县| 乐业县| 怀仁县| 宁远县| 芮城县| 邹城市| 紫阳县| 界首市| 安阳县| 永德县| 深州市| 全南县| 巨野县| 洪雅县| 梧州市|