﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-心情小站-随笔分类-cms</title><link>http://www.blogjava.net/RongHao/category/19517.html</link><description>心有多大，舞台就有多大</description><language>zh-cn</language><lastBuildDate>Thu, 05 Apr 2007 22:32:57 GMT</lastBuildDate><pubDate>Thu, 05 Apr 2007 22:32:57 GMT</pubDate><ttl>60</ttl><item><title>Jackrabbbit数据源改为jndi</title><link>http://www.blogjava.net/RongHao/archive/2007/04/05/108765.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 05 Apr 2007 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/04/05/108765.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/108765.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/04/05/108765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/108765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/108765.html</trackback:ping><description><![CDATA[最新的1.2*版本开始支持jndi数据源，版本与1.*完全兼容。注意的是以前的jackrabbit-core-1.x.jar现在<br>需要jackrabbit-core.jar，jackrabbit-api.jar, jackrabbit-jcr-commons.jar三个包来替代；另外，其要求Lucene 的版本要2.0，下了个2.1不行。<br>然后就是改配置文件。<br>原先的配置<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PersistenceManager&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="org.apache.jackrabbit.core.state.db.SimpleDbPersistenceManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="driver"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="com.newatlanta.jturbo.driver.Driver"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="url"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="jdbc:JTurbo://192.168.0.2:1433/bizfocus50"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="schema"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="mssql"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="user"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="sa"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="sa"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="schemaObjectPrefix"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="${wsp.name}_"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="externalBLOBs"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">PersistenceManager</span><span style="color: #0000ff;">&gt;</span></div>
<br>现在的配置：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">PersistenceManager&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="org.apache.jackrabbit.core.persistence.db.JNDIDatabasePersistenceManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSourceLocation"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="java:comp/env/jdbc/wfmsDataSource"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="schemaObjectPrefix"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="DEFAULT_"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="externalBLOBs"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">PersistenceManager</span><span style="color: #0000ff;">&gt;</span></div>
<br>还有就是：不要仅仅修改你总的那个配置文件，每个工作区间下的配置文件都要同时修改，却记却记啊！<br><img src ="http://www.blogjava.net/RongHao/aggbug/108765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-04-05 18:44 <a href="http://www.blogjava.net/RongHao/archive/2007/04/05/108765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JAVA内容仓库(Java Content Repository）(4完)</title><link>http://www.blogjava.net/RongHao/archive/2007/01/28/96417.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Sun, 28 Jan 2007 15:55:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/01/28/96417.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/96417.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/01/28/96417.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/96417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/96417.html</trackback:ping><description><![CDATA[
		<b>获得列表</b>
		<br />在上一步中我们已经把数据保存到了内容仓库中，那我们如何确定数据确实保存进去了呢？getBlogList() 这个方法将返回根节点下所有名为blogEntry.的子节点。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ArrayList getBlogList() </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException {<br />    Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> JackrabbitPlugin.getSession();<br />    ArrayList blogEntryList </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ArrayList();<br />    Node rootNode </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> session.getRootNode();<br />    NodeIterator blogEntryNodeIterator </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> rootNode.getNodes();<br /><br />    </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (blogEntryNodeIterator.hasNext()) {<br />        Node blogEntry </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntryNodeIterator.nextNode();<br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (blogEntry.getName().equals(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">blogEntry</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">false</span><span style="color: rgb(0, 0, 0);">)<br />            </span><span style="color: rgb(0, 0, 255);">continue</span><span style="color: rgb(0, 0, 0);">;<br />        String title </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntry.getProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">title</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).getString();<br />        String blogContent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntry.getProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">blogContent</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).getString();<br />        Value creationTimeValue </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Value) blogEntry.getProperty(<br />                </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">creationTime</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).getValue();<br />        String userName </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntry.getProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">userName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).getString();<br />        BlogEntryDTO blogEntryDTO </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> BlogEntryDTO(userName, title,<br />                blogContent, creationTimeValue.getDate());<br />        blogEntryList.add(blogEntryDTO);<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> blogEntryList;<br />}</span></div><br />一旦你获得了根节点这个对象，你就可以通过调用getNodes()这个方法来获取它所有的子节点。如果这个节点没有子节点，将返回一个空的NodeIterator 对象。我们可以遍历这个NodeIterator 对象来获得名为blogEntry 的节点集合，然后通过getProperty()方法来获得节点上的属性，即我们保存的真实数据。getProperty()方法返回Value对象的一个实例。因为存储数据类型的不同，所以返回的Value对象实例是不同的。根据不同的数据类型，你应该调用特定的方法来获取数据，比如getString()来获取字符串，而getDate()获得一个日期。<br /><br /><b>查找内容（用XPath的方式）</b><br />JSR-170定义了两种方式来查找内容（也可以理解为查找节点）。一种使用XPath语法，另一种使用SQL语法。JSR-170要求Level 1必须实现XPath的方式，而SQL的方式则作为一个可选的功能。<br /><br />XPath原本是一种设计用来查找XML元素的语言。因为我们的workspace是树状的结构，很像XML。所以XPath语法非常适合于在这里查找内容。下面的代码演示了通过作者名来查找节点。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> JackrabbitPlugin.getSession();<br />    Workspace workSpace </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> session.getWorkspace();<br />    QueryManager queryManager </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> workSpace.getQueryManager();<br /><br />    StringBuffer queryStr </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> StringBuffer(<br />            </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">//blogEntry[@</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">PROP_BLOGAUTHOR </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">= '</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />    queryStr.append(userName);<br />    queryStr.append(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">']</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />    Query query </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> queryManager.createQuery(queryStr.toString(),<br />            Query.XPATH);<br /><br />    QueryResult queryResult </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> query.execute();<br /><br />    NodeIterator queryResultNodeIterator </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> queryResult.getNodes();<br />    </span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);"> (queryResultNodeIterator.hasNext()) {<br /><br />        Node blogEntry </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> queryResultNodeIterator.nextNode();<br />        String title </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntry.getProperty(PROP_TITLE).getString();<br />        String blogContent </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> blogEntry.getProperty(PROP_BLOGCONTENT).getString();<br />        Value creationTimeValue </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Value) blogEntry.getProperty(<br />                PROP_CREATIONTIME).getValue();<br />        BlogEntryDTO blogEntryDTO </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> BlogEntryDTO(userName, title,<br />                blogContent, creationTimeValue.getDate());<br />        blogEntryList.add(blogEntryDTO);<br />    }</span></div><br />首先获得session 对象，通过它获得它连接的workspace，然后就可以通过workspace获得这个workspace的QueryManager 。QueryManager 接口定义了很多用来查询的方法。接下来我们要做的是创建一条查询语句。我们这里这样写"//blogEntry[@blogAuthor='&lt;bloggerName&gt;'"。这句话的意思是查找所有名为blogEntry ，含有blogAuthor 属性且属性值为&lt;bloggerName&gt;的节点。具体可以看JSR-170规范。<br /><br />通过queryManager's createQuery()方法创建一个查询对象，这个方法需要两个参数，一个是我们的查询语句，另一个是查询的方式，这里使用XPath。获得这个Query 查询对象后，调用它的execute() 方法开始执行查询，返回一个QueryResult 对象。注意，查询的结果受到当前session的限制，换句话说，就是如果这个session没有权限查看一个特定的节点，哪怕这个节点满足我们查询的条件，在我们的查询结果里也是看不到这个节点的。所有的查询数据来自于该workspace已经持久化的数据，哪些已经改变但还没有通过session.save()(item.save())持久化到workspace的数据不在查询之列。获得QueryResult 对象后，我们就可以通过调用getNodes()方法来获得符合查询条件的节点的一个遍历。<br /><br />剩下的两个未实现的方法是updateBlogEntry() 和 removeBlogEntry()，它们实现起来都很简单。我们把BOLG 标题作为主键，通过标题来获得相关的节点。在updateBlogEntry()方法里，我们直接设定需要改变的属性；在 removeBlogEntry()方法里，我们获得目标节点后直接在节点上调用remove()方法。最后别忘了一定要调用session.save()方法把我们改变的数据持久化。<br /><br /><b>处理二进制内容</b><br />对内容仓库来说，处理二进制内容是个很基本的要求，比如说图片。现在我们的示例程序容许给每个BLOG附加一张图片。下面分别是附加图片和获取图片的方法。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> attachFileToBlogEntry(String blogTitle,<br />  InputStream uploadInputStream) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException {<br />    Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> JackrabbitPlugin.getSession();<br />    Node blogEntryNode </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getBlogEntryNode(blogTitle, session);<br />    blogEntryNode.setProperty(PROP_ATTACHMENT, uploadInputStream);<br />    session.save();<br /><br />}<br /></span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> InputStream getAttachedFile(String blogTitle) </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException {<br />    InputStream attachFileIS </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />    Node blogEntryNode </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> getBlogEntryNode(blogTitle);<br />    Value attachFileValue </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (Value) blogEntryNode.getProperty(PROP_ATTACHMENT).getValue();<br />    attachFileIS </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> attachFileValue.getStream();<br />  </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> attachFileIS;<br />}</span></div><br />正如你看到的那样，我们的代码在处理二进制内容和一般内容间并没有什么太大的区别。仅仅一点不同的是你要通过InputStream 对象来保存和获取二进制数据。在我们的配置文件里关于persistent manager会有一个externalBLOBs 属性。把这个属性设为true, 图片将会保存在文件里，相反则会保存在数据库的blob字段里。<br /><br /><b>总结</b><br />到这里，我们对 JSR-170, Jackrabbit以及如何使用 JSR-170 API开发一个简单的应用程序都有了大概的了解。我们的讨论更多的在于基础。相信大家一定会对内容仓库有个初步的认识。<img src ="http://www.blogjava.net/RongHao/aggbug/96417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-01-28 23:55 <a href="http://www.blogjava.net/RongHao/archive/2007/01/28/96417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JAVA内容仓库(Java Content Repository）(3)</title><link>http://www.blogjava.net/RongHao/archive/2007/01/25/96065.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 25 Jan 2007 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/01/25/96065.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/96065.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/01/25/96065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/96065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/96065.html</trackback:ping><description><![CDATA[
		<b>开发我们的例子程序</b>
		<br />jackrabbit已经配置好了，现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然，我们需要做两件事情：一个是作为后台的对数据进行增删改查（持久层），另一个是开发相对应的UI界面（WEB 层）。首先，让我们定义一个DAO接口。这个接口BlogEntryDAO.java 如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">interface</span><span style="color: rgb(0, 0, 0);"> BlogEntryDAO {<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> insertBlogEntry(BlogEntryDTO blogEntryDTO)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> updateBlogEntry(BlogEntryDTO blogEntryDTO)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ArrayList getBlogList()<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> BlogEntryDTO getBlogEntry(String blogTitle)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> removeBlogEntry(String blogTitle)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> ArrayList searchBlogList(String userName)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> attachFileToBlogEntry(String blogTitle, InputStream uploadInputStream)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> InputStream getAttachedFile(String blogTitle)<br />        </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException;<br />}</span></div><br />正如你看到的，这个接口提供了增删改查的方法，同时还提供了两个方法来处理附件。接下来，我们需要一个DTO对象用来在两个层之间传递数据。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> BlogEntryDTO {<br /><br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> String userName;<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> String title;<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> String blogContent;<br />    </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"> Calendar creationTime;<br /><br />    </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Getter and setter methods for each of these properties        </span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">}</span></div><br />这里我们将仅仅讨论持久层。<br /><br /><b>连接jackrabbit</b><br />现在，第一件事情是开发一个组件，获得一个到jackrabbit内容仓库的连接。为了简单，我们将在程序启动的时候获得这个连接，然后在程序停止的时候释放这个连接。这里我们使用了Struts ，所以我们需要开发一个PlugIn 类。如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> JackrabbitPlugin </span><span style="color: rgb(0, 0, 255);">implements</span><span style="color: rgb(0, 0, 0);"> PlugIn{<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Session session;<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> destroy() {<br />        session.logout();<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> init(ActionServlet actionServlet, ModuleConfig moduleConfig) <br />    </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> ServletException {<br />        </span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);"> {<br />            System.setProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.repository.home</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />                </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">c:/temp/Blogging</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />            Repository repository </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> TransientRepository();<br />            session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> repository.login(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> SimpleCredentials(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">username</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,<br />                    </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">password</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.toCharArray()));<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (LoginException e) {<br />            </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ServletException(e);<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (IOException e) {<br />            </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ServletException(e);<br />        } </span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);"> (RepositoryException e) {<br />            </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> ServletException(e);            <br />        }<br />    }<br />    </span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);"> Session getSession() {<br />        </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> session;<br />    }<br />}</span></div><br />init()方法将会在程序启动的时候调用，destroy()将会在程序停止的时候调用。我们在init()方法里获得了到jackrabbit内容仓库的连接。看看代码，我们做的第一件事是设定了org.apache.jackrabbit.repository.home这个系统属性，在上篇文章里提到，这个属性是用来指向我们的内容仓库主目录。这里我们设定它为c:/temp/blogging。接下来，我们创建了TransientRepository的一个实例。这是jackrabbit提供的类，它提供了一个到内容仓库的代理。它在第一个session 打开的时候自动启动内容仓库，在最后一个session 关闭的时候自动关闭内容仓库。<br />一旦我们获得了一个内容仓库对象，我们就可以调用它的login() 方法来打开一个连接。login() 方法需要一个Credential 对象作为参数。如果Credential 对象是NULL，jackrabbit会认为其他的机制做了这个验证（比如JAAS）。login() 方法还可以传入一个workspace名字作为参数，如果不传入这个参数，jackrabbit会返回一个session对象指向默认的workspace。注意workspace和session是一对一的，即一个session仅对应一个workspace。（注：如果不传入Credential对象，返回的session对workspace是只读的）<br /><br /><b>增加内容</b><br />连接已经建立起来了，下面让我们实现BlogEntryDAO这个接口。第一个我们想实现的方法是插入数据 insertBlogEntry()<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);"> insertBlogEntry(BlogEntryDTO blogEntryDTO)<br />            </span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);"> BlogApplicationException {<br />        Session session </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> JackrabbitPlugin.getSession();<br />        Node rootNode </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> session.getRootNode();<br />        Node blogEntry </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> rootNode.addNode(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">blogEntry</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />        blogEntry.setProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">title</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, blogEntryDTO.getTitle());<br />        blogEntry.setProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">blogContent</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, blogEntryDTO.getBlogContent());<br />        blogEntry.setProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">creationTime</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, blogEntryDTO.getCreationTime());<br />        blogEntry.setProperty(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">userName</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, blogEntryDTO.getUserName());            <br />        session.save();<br />}</span></div><br />首先获得session 对象，即到内容仓库特定workspace的连接。然后，我们在这个session 对象上调用getRootNode() 方法，获得这个workspace的根节点，这个根节点的路径是（"/"）.一旦我们获得这个根节点，我们就可以通过addNode()方法在这个根节点下增加新的子节点。新节点的名字是blogEntry. 通过setProperty() 方法我们把数据存储到节点的property里。正如我们先前说明的，真实的数据是存储在property元素里，property元素是叶子。<br />注意session.save() 这行代码。这个方法是必须调用的，这个方法调用之前，任何 Node,Property的改变都被保存在这个session的一个临时区域里，其他的和该session连接到相同workspace的session都看不到这些改变。当这个方法被调用并被成功执行后，这些Node,Property的改变才会被持久化到这个session关联的workspace里，同时所有与这个workspace关联的session才可见这些变化。相对应的，Session.refresh(false)将会丢弃所有这些改变。item.save()和Item.refresh(false)作用相似，只是影响范围限定在单个Item上（注意，包括它的子节点）<img src ="http://www.blogjava.net/RongHao/aggbug/96065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-01-25 23:12 <a href="http://www.blogjava.net/RongHao/archive/2007/01/25/96065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JAVA内容仓库(Java Content Repository）(2)</title><link>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 23 Jan 2007 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/95637.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/95637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/95637.html</trackback:ping><description><![CDATA[
		<b>内容仓库模型</b>
		<br />JSR-170 是这样定义内容仓库的，内容仓库由一组 workspace（工作空间）组成，这些workspace通常应该包含相似的内容。一个内容仓库有一个到多个 workspace。每个workspace都是一个树状结构，都有一个唯一的树根节点（root node）。树上的item（元素）或者是个node（节点）或者是个property（属性）。每个node都可以有零个到多个子节点和零个到多个子属性。只有根节点没有父节点，其余所有的节点都有一个父节点。property 也必须有一个父节点，但它没有子节点或是子属性，property 是叶子元素。property是真正存储数据的元素。<br /><br />下图描述了一个blog应用程序的内容仓库模型。每个root node（根节点）的子节点都代表了一个blog实体。与这个blog实体有关的数据都存储在 bolgEntry 节点的属性里，其中一个 blogAttachment property 存储了一个二进制图片文件。<br /><img src="http://www.blogjava.net/images/blogjava_net/ronghao/repositorymodel3.gif" alt="repositorymodel3.gif" border="0" height="263" width="550" /><br />根据内容仓库实现的功能，JSR-170定义了三种级别：<br />Level 1：定义了一个只读的内容仓库。功能包括读取内容，将内容导出为XML和查找内容。<br />Level 2：定义了可写的内容仓库。Level 2是Level 1的扩展，新增的功能包括往内容仓库里写入内容，和从XML导入数据到仓库。<br />Advanced options：定义实现五种附加功能，版本控制、JTA、SQL查询、清晰的内容锁定和监视。<br /><br /><b>什么是Apache JackRabbit？</b><br />Apache JackRabbit是一个开放源码的JSR-170 实现，实现了Level 2，但它还有许多扩展的功能。详细可以去它的官方网站。<br /><br />下面我们决定用Apache JackRabbit来作为我们示例程序的内容仓库。<br /><br /><b>如何配置Apache JackRabbit</b><br />JackRabbit需要两个参数来配置一个内容仓库实例。<br />1.内容仓库主目录：这个文件目录下通常包含了所有的内容，搜索索引，内部配置文件和其他持久化信息。它的结构看起来会像下面这个样子：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">   c:</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">temp<br />        </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 0);">|--</span><span style="color: rgb(0, 0, 0);">Blogging<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">repository<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">index<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">meta<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">namespaces<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">       </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">nodetypes             <br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">version<br />                </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                </span><span style="color: rgb(0, 0, 0);">|-</span><span style="color: rgb(0, 0, 0);">workspace<br />                        </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />                        </span><span style="color: rgb(0, 0, 0);">|--</span><span style="color: rgb(0, 0, 255);">default</span></div><br />  在上面的情况下，内容仓库主目录是c:/temp/Blogging.<br />2.内容仓库配置文件：一个典型的配置文件如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Repository</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/repository</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Security appName</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Jackrabbit</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">AccessManager </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.security.SimpleAccessManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">LoginModule </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.security.SimpleLoginModule</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">anonymousId</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">anonymous</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">LoginModule</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Security</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Workspaces rootPath</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/workspaces</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> defaultWorkspace</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">default</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Workspace name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.home}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">PersistenceManager <br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.state.db.DerbyPersistenceManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">jdbc:derby:${wsp.home}/db;create=true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">schemaObjectPrefix</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.name}_</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">PersistenceManager</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">SearchIndex </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.query.lucene.SearchIndex</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${wsp.home}/index</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">SearchIndex</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Workspace</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Versioning rootPath</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/version</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">FileSystem </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.fs.local.LocalFileSystem</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/version</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">FileSystem</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">PersistenceManager <br />        </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.state.db.DerbyPersistenceManager</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">url</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">jdbc:derby:${rep.home}/version/db;create=true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">schemaObjectPrefix</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">version_</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">PersistenceManager</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Versioning</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">SearchIndex </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">org.apache.jackrabbit.core.query.lucene.SearchIndex</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />   </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">path</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">${rep.home}/repository/index</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">SearchIndex</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">Repository</span><span style="color: rgb(0, 0, 0);">&gt;</span></div><br />  <br />  在这个配置文件里，&lt;Repository&gt;元素是根元素，它包含了下面这些元素：<br />  <b>a</b>，&lt;FileSystem&gt;: 该元素配置了内容仓库的全局数据存储位置，这些全局数据包括已注册的命名空间，定制的节点类型等等。        JackRabbit 提供了几种选择，一种是像上面例子里配置的存储在本地文件里，LocalFileSystem. 如果你想把它们存储在数据库里，你可以使用 DbFileSystem.<br />  <b>b</b>，&lt;Security&gt;:内容仓库的安全配置，它有两个子元素：&lt;AccessManager&gt;和&lt;LoginModule&gt;。&lt;AccessManager&gt;配置的类用来判断用户有没有权限来对特定数据执行特定的操作。<br />  <b>c</b>，&lt;Workspaces&gt;:这个元素的配置对所有的workspace都通用。它的rootPath 属性是所有workspace文件夹的根目录，在我们的例子里它是c:/temp/Blogging/Workspace；defaultWorkspace 属性则包含了workspace的默认名。<br />  <b>d</b>，&lt;Workspace&gt;:这个元素是所有workspace的默认配置模板。去每个workspace文件夹下你都会发现一个workspace.xml文件，这个文件和这个元素的配置一模一样。三个子元素：&lt;FileSystem&gt;，和这个workspace相关数据的存储位置；&lt;PersistenceManager&gt; ，这个workspace内容节点存储策略；&lt;SearchIndex&gt;，可选，全文检索。<br />  <b>e</b>，&lt;Versioning&gt;:配置一个版本相关的对象。其实JackRabbit也是把它作为节点来处理的。<br /><br />这两个参数可以通过两种方式设置，一种是在仓库实例创建时直接传到Jackrabbit里去，一种是间接的通过设置JNDI object factory。<br />你可以设置org.apache.jackrabbit.repository.home 这个系统属性的值来指定你的内容仓库主目录；也可以设置<br />org.apache.jackrabbit.repository.conf 这个系统属性的值来指定你的内容仓库配置文件repository.xml。如果你不设定这两个<br />参数，Jackrabbit会把当前目录作为内容仓库主目录，同时，它有一个默认的内容仓库配置文件。<img src ="http://www.blogjava.net/RongHao/aggbug/95637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-01-23 23:57 <a href="http://www.blogjava.net/RongHao/archive/2007/01/23/95637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JAVA内容仓库(Java Content Repository）(1)</title><link>http://www.blogjava.net/RongHao/archive/2007/01/23/95547.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Tue, 23 Jan 2007 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2007/01/23/95547.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/95547.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2007/01/23/95547.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/95547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/95547.html</trackback:ping><description><![CDATA[		原文地址：http://www.onjava.com/pub/a/onjava/2006/10/04/what-is-java-content-repository.html?page=4<br />JSR-170把自己定义为一个能与内容仓库互相访问的，独立的，标准的方式。同时它也对内容仓库做出了自己的定义，它认为内容仓库是一个高级的信息管理系统，该系统是是传统的数据仓库的扩展，它提供了诸如版本控制、全文检索，访问控制，内容分类、访问控制、内容事件监视等内容服务。<br /><br />Java Content Repository  API（JSR-170）试图建立一套标准的API去访问内容仓库。如果你对内容管理系统（CMS）不熟悉的话，你一定会对内容仓库是什么感到疑惑。你可以这样去理解，把内容仓库理解为一个用来存储文本和二进制数据（图片，word文档，PDF等等）的数据存储应用程序。一个显著的特点是你不用关心你真正的数据到底存储在什么地方，是关系数据库？是文件系统？还是XML？不仅仅是数据的存储和读取，大多数的内容仓库还提供了更加高级的功能，例如访问控制，查找，版本控制，锁定内容等等。<br /><br />一段时间以来市场上出现了各个厂家开发的不同的CMS系统，这些系统都建立在他们各自的内容仓库之上。<br />问题出现了，每个CMS开发商都提供了他们自己的API来访问内容仓库。这对应用程序的开发者带来了困扰，因为他们要学习不同的开发商提供的API，同时，他们的代码也与这些特定的API产生了绑定。<br /><br />JSR-170正是为解决这一问题而出现的，它提供了一套标准的API来访问任何数据仓库。通过JSR-170，你开发代码只需要引用 javax.jcr.* 这些类和接口。它适用于任何兼容JSR-170规范的内容仓库。<br /><br />我们将通过一个例子来逐步了解JSR-170。<br /><br /><b>为什么需要 Java Content Repository API</b><br /><br />随着各个厂家各自的内容仓库实现数量的增长，人们越来越需要一组通用的编程接口来使用这些内容仓库，这就是JSR-170所要做的东西。它提供一组通用的编程接口来连接内容仓库。你可以把JSR-170理解为和JDBC类似的API，这样你可以不依赖任何具体的内容仓库实现来开发你的程序。你可以直接使用支持JSR-170的内容仓库；或者如果一些厂家的内容仓库不支持JSR-170则可以通过这些厂家提供的JSR-170驱动来完成从JSR-170与厂家特定的内容仓库的转换。<br /><br />下面这张图描述了使用JSR-170开发的应用系统的结构。在该系统运行的时候，它可以操作内容仓库1，2，3中的任意一个。在这些内容仓库当中，只有2是直接支持JSR-170的，剩下的两个都需要JSR-170驱动来和应用系统交互。注意：你的应用系统完全不用关心你的数据是如何存储的。1可能使用了关系数据库来存储，而2使用了文件系统，至于上，它甚至更前卫的使用了XML。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/ronghao/repositorymodel1.gif" alt="repositorymodel1.gif" border="0" height="397" width="550" /><br /><br />JSR-170 API对不同的人员提供了不同的好处。<br /><br />●对于开发者无需了解厂家的仓库特定的API，只要兼容JSR-170就可以通过JSR-170访问其仓库。<br />●对于使用CMS的公司则无需花费资金用于在不同种类CMS的内容仓库之间进行转换。<br />●对于CMS厂家，无需自己开发内容仓库，而专注于开发CMS应用。<img src ="http://www.blogjava.net/RongHao/aggbug/95547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2007-01-23 15:13 <a href="http://www.blogjava.net/RongHao/archive/2007/01/23/95547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用freemarker给cms生成静态html</title><link>http://www.blogjava.net/RongHao/archive/2006/11/27/83858.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Mon, 27 Nov 2006 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2006/11/27/83858.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/83858.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2006/11/27/83858.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/83858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/83858.html</trackback:ping><description><![CDATA[作为CMS内容发布来说，将要显示的内容html化无疑是一个很基本的要求，这样可以提高整个系统的效率。<br />考虑一个内容节点Content,其中节点有个pagecontent的属性，这个属性用来存储用户在后台输入的内容，<br />内容+模板=显示，这里是：<br />内容+模板--&gt;显示静态html<br />内容用FCK来编辑，模板也同样用FCK编辑，这里用freemarker无疑是一个好的选择。这里是个最简单的例子。<br />首先定义一个最简单的模板content.ftl<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">html</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /><img id="Codehighlighter1_8_16_Open_Image" onclick="this.style.display='none'; Codehighlighter1_8_16_Open_Text.style.display='none'; Codehighlighter1_8_16_Closed_Image.style.display='inline'; Codehighlighter1_8_16_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_8_16_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_8_16_Closed_Text.style.display='none'; Codehighlighter1_8_16_Open_Image.style.display='inline'; Codehighlighter1_8_16_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />$</span><span id="Codehighlighter1_8_16_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_8_16_Open_Text"><span style="color: rgb(0, 0, 0);">{content}</span></span><span style="color: rgb(0, 0, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">html</span><span style="color: rgb(0, 0, 0);">&gt;</span></div>然后就是把内容填充进去：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: rgb(0, 0, 0);"> Configuration cfg </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> Configuration();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">模板存储的目录</span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);"> cfg.setDirectoryForTemplateLoading(Path.getTemplateDirectory());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> </span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">默认</span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);"> cfg.setObjectWrapper(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> DefaultObjectWrapper());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">填充数据        </span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">Map root </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />root.put(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">content</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, c.getPageContent());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     Template temp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> cfg.getTemplate(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">content.ftl</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">发布日期</span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">String date</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">c.getActivedate();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String filename </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> c.getId()</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.html</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">创建目录</span><span style="color: rgb(0, 128, 0);"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: rgb(0, 0, 0);">Path.createFold(Path.getWebCmsHtmlDirPath(),date);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Writer out </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> OutputStreamWriter(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"> FileOutputStream(Path.getWebCmsHtmlDirPath()</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">date</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">filename));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />temp.process(root, out);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />out.flush();</span></div>其实就是这么简单！对html的管理就很容易了，基本的FILE操作<img src ="http://www.blogjava.net/RongHao/aggbug/83858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2006-11-27 18:51 <a href="http://www.blogjava.net/RongHao/archive/2006/11/27/83858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始开发ＣＭＳ</title><link>http://www.blogjava.net/RongHao/archive/2006/11/16/81638.html</link><dc:creator>ronghao</dc:creator><author>ronghao</author><pubDate>Thu, 16 Nov 2006 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/RongHao/archive/2006/11/16/81638.html</guid><wfw:comment>http://www.blogjava.net/RongHao/comments/81638.html</wfw:comment><comments>http://www.blogjava.net/RongHao/archive/2006/11/16/81638.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/RongHao/comments/commentRss/81638.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RongHao/services/trackbacks/81638.html</trackback:ping><description><![CDATA[平台新版本将要发布，目前还缺CMS．原计划是将原先的CMS移植过来即可，原先的版本是基于Slide开发的，后来经过讨论还是决定重新架构．新版本基于jackrabbit．大概考虑了一下需求：<br />1.很多CMS都包括了发布模板、显示模板，这里不用考虑，CMS仅仅是内容管理，负责内容存储，至于展现，那是门户事情．内容和展现分开．CMS作为门户数据源的一个选择．<br />2.一个完整的CMS并不是作为一个所谓的栏目信息，它还必须包括对各种文件的保存．对整个平台的文件和附件进行统一管理<br />3.版本管理<br />4.全文检索<br />5.权限管理，具体到每一个节点的配置．不仅仅是在CMS内部，用户通过门户看到的信息也是要经过权限过滤（内网门户）<br />6.一套可扩展的组织用户接口（目前是直接用平台内部的组织用户，考虑到CMS将来的独立性，这个也是必要的）<br />7.文件的webdav支持<br />大概就是这些了，已初步完成了对jcr的封装和架构．感到spring有劲使不上，呵呵．<br />CMS信息发布需求<br />信息分两种：未发布的和发布的<br />1、未发布的信息可以进行增删改查、版本管理、上传和下载附件<br />2、将未发布的信息发布，信息的状态将置为发布状态同时结合模板生成静态HTML<br />3、发布的信息本身会增加一个对静态HTNL联接的属性，在后台即可以对静态HTML进行浏览<br />4、发布的信息依旧可以进行内容修改和版本恢复，这样会将生成的静态HTML删除然后再重新生成<br />5、发布的信息可以删除，信息进入回收站，静态HTML同时被删除<br />6、从回收站恢复信息，信息重新发布，生成静态HTML<br />7、通过栏目的设置来决定信息的发布是直接发布还是通过工作流发布<img src ="http://www.blogjava.net/RongHao/aggbug/81638.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RongHao/" target="_blank">ronghao</a> 2006-11-16 22:55 <a href="http://www.blogjava.net/RongHao/archive/2006/11/16/81638.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>