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

來源:互聯網
上載者:User
開發我們的例子程式
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上(注意,包括它的子節點)

http://www.blogjava.net/ronghao 榮浩原創,非常感謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.