Magnolia学习笔记(一个基于JSR170的内容管理系统) ( by quqi99 )
作者:张华 发表于:2007-05-24 ( http://blog.csdn.net/quqi99 )
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。
Magnolia
1、 Magnolia 包括两个部分:内容存储库(基于 JSR170 )与内容管理系统。
2、 管理端 : http://localhost:8080/magnoliaAuthor 用户名,密码 superuser
3、 Manolia Sitedesigner 说白了就是另一个模块 ( 可在学习完模块之后再看不迟 )
4、 如何变中文?新增用户,并修改对应的 Language 为 Chinese(China) ,保存,打开新的 ie ,用新的用户登陆。
5、 Magnolia ,而是 Magnolia 的兄弟产品 MagnoliaQT ,一个 Magnolia 媒体增强的 CMS 系统,其利用 QuickTimeJava 可以很方便的处理各种图像、音频、视频
6、 一个很有趣的工具,可以以手绘的形式设计网站,很适合初期大家一起设计网站结构的时候使用,随手在上面写写画画,可以以手绘的方式设置页面间链接 : http://dub.washington.edu/denim/
7 、学习文档: http://documentation.magnolia.info/docs/en.html
8 、 Java Content Repository API 简介 : http://www.ibm.com/developerworks/cn/java/j-jcr/
9 、 这句代码 , 如果用的是 jdk1.5, 必须加上这段代码 , 否则会报 javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found 异常 .
10 . JackRabbit 是基于 JSR170 的一个实现,运行它需要下列 JAR 包:
要使用和运行这篇文章中的示例,请将下面这些库放在类路径中:
? jackrabbit-core :针对 JSR-170 的 Jackrabbit 内容仓库核心实现和来自 Apache 的公共实用代码。
? commons-collections :包含强大数据结构的框架,该框架可以加快 Java 应用程序的开发。
? concurrent :这个库提供通常在 Java 并发编程中会遇到的工具类的标准化的、有效率的版本。
? derby :一个 Apache 数据库子项目,它提供完全用 Java 语言实现的关系数据库。
? jcr :一组符合 JSR-170 规范的接口。
? log4j :运行时日志库。
? lucene :高性能的全功能文本搜索引擎库。
? slf4j (针对 Java 的简单日志 Facade ):目的是充当不同日志 API 的简单 facade ,允许用户在部署时插入需要的实现。
? xerces :高级 XML 解析器,支持 SAX 版本 2 、 DOM 1 级和 SAX 版本 1 API 。
Repository.xml 用来配置 Repository, workspace.xml 用来配置 workspace
Repository 元素包括:
? FileSystem 元素:虚拟文件系统,用来存储全局状态如注册名空间,客户化节点类型等
? Security 元素:指明在 JAAS 配置与访问管理器中 app-entry 的名字。
? Workspaces 元素:指明 workspace 的根目录与默认 workspace 的名字,它用于在没有节 workspace 时通过 API 创建默认的 workspace
? Versioning 元素:配置与版本相关的设置
? SearchIndex 元素:用于设置在 /jcr:system 树上与索引相关的设置
例如:
<Repository>
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/repository"/>
</FileSystem>
<Security appName="Jackrabbit">
<AccessManager class="org.apache.jackrabbit.core.security.SimpleAccessManager">
<!-- <param name="config" value="${rep.home}/access.xml"/> -->
</AccessManager>
<LoginModule class="org.apache.jackrabbit.core.security.SimpleLoginModule">
<param name="anonymousId" value="anonymous"/>
<!-- <param name="defaultUserId" value="superuser"/> -->
</LoginModule>
</Security>
<Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
<Workspace name="${wsp.name}">
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${wsp.home}"/>
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.state.db.DerbyPersistenceManager">
<param name="url" value="jdbc:derby:${wsp.home}/db;create=true"/>
<param name="schemaObjectPrefix" value="${wsp.name}_"/>
</PersistenceManager>
<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
<param name="path" value="${wsp.home}/index"/>
</SearchIndex>
</Workspace>
<Versioning rootPath="${rep.home}/version">
<FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
<param name="path" value="${rep.home}/version" />
</FileSystem>
<PersistenceManager class="org.apache.jackrabbit.core.state.db.DerbyPersistenceManager">
<param name="url" value="jdbc:derby:${rep.home}/version/db;create=true"/>
<param name="schemaObjectPrefix" value="version_"/>
</PersistenceManager>
</Versioning>
<SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
<param name="path" value="${rep.home}/repository/index"/>
</SearchIndex>
</Repository>
Magonia 中的每一个页面都是由模板(主 JSP/Servlet ,或者其他脚本)动态生成。
新建一个模板时,相当于在 website 这个 repository 中增加一个 node ,并添加属性 ”title” 与 ”template”
有 page template, Paragraph template , Dialog Template.
配置一个模板就是一个添加 Template Definition 的过程,一个模板被配置在 Configuration/modules/templating (这里面的就是模板定义,也就是 node 的属性)中
页面中用模板
参考文档: http://www.oreilly.com.cn/news/jsppart3.php?c=java
JSP2 。 0 使 XML 与 JSP 协同变得更容易。支持两种写法,一种是常规的,一种是符合 XML 文档的,如下:
常规的 JSP 页面 |
JSP 文档 |
<%@ page attribute list %> |
<jsp:directive.pageattribute list /> |
<%@ include file="path " %> |
<jsp:directive.include file="path " /> |
<%! declaration %> |
<jsp:declaration>declaration </jsp:declaration> |
<%= expression %> |
<jsp:expression>expression </jsp:expression> |
<% scriptlet %> |
<jsp:scriptlet>scriptlet </jsp:scriptlet> |
首先对于JSP 2.0 来说,一个JSP Document 必须要有一个<jsp:root> 根元素用以告诉容器它是哪一种类型的JSP 页面。JSP 2.0 通过这种新的方式来标识一个JSP Document 文件解决了这个限制。如果以下条件中有一个为true ,这个文件就将被JSP 2.0 容器作为一个JSP Document 来处理:
这些新的规则使采用一个常规的XHTML 文件(用JSP element 处理动态内容)的形式来编写JSP Document 成为可能,比如:不需要将所有的内容都放到<jsp:root> element 中。如果类似下面的例子那样创建一个JSP property group ,你甚至可以用扩展名为.html 的文件:
<jsp-config>
<jsp-property-group>
<url-pattern>*.html</url-pattern>
<is-xml>true</is-xml>
</jsp-property-group>
</jsp-config>
JSP2 。0 的一个例子:
<jsp:root version="1.2" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:cms="urn:jsptld:cms-taglib"
xmlns:cmsu="urn:jsptld:cms-util-taglib" xmlns:c="urn:jsptld:http://java.sun.com/jsp/jstl/core"
xmlns:fmt="urn:jsptld:http://java.sun.com/jsp/jstl/fmt">
<jsp:directive.page contentType="text/html; charset=UTF-8" session="false" />
<jsp:text>
<![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> ]]>
</jsp:text>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<c:import url="/templates/samples/templates/inc/head.jsp" />
</head>
<body>
<cms:mainBar paragraph="samplesPageProperties" />
<div id="contentDivMainColumn">
<c:import url="/templates/samples/templates/inc/columnMain.jsp" />
<div id="footer">
<cms:adminOnly>
<fmt:message key="buttons.editfooter" var="label" />
<cms:editButton label="${label}" paragraph="samplesPageFooter" contentNodeName="footerPar" />
</cms:adminOnly>
<cms:ifNotEmpty nodeDataName="footerText" contentNodeName="footerPar">
<p>
<cms:out nodeDataName="footerText" contentNodeName="footerPar" />
</p>
</cms:ifNotEmpty>
<a href="http://www.magnolia.info">
<img src="${pageContext.request.contextPath}/docroot/samples/imgs/poweredSmall.gif"
alt="Powered by Magnolia" />
</a>
</div>
</div>
<div id="contentDivRightColumn">
<cms:contentNodeIterator contentNodeCollectionName="rightColumnParagraphs">
<div style="clear:both;">
<cms:editBar adminOnly="true" />
<cms:includeTemplate />
</div>
</cms:contentNodeIterator>
<cms:adminOnly>
<div style="clear:both;">
<cms:newBar contentNodeCollectionName="rightColumnParagraphs" paragraph="samplesRightColumn" />
</div>
</cms:adminOnly>
</div>
<div style="position:absolute;left:0px;top:0px;">
<cmsu:img nodeDataName="headerImage" inherit="true" />
</div>
<cmsu:simpleNavigation />
</body>
</html>
</jsp:root>
1 、 <cms:setNode var="pageProperties" /> 将 content node (模板就是一个 node )作为一个 nodeData 对象的 Map 放到 pagecontext 范围之内。目的是为了 JSTL 能访问。然后可这样取: ${pageProperties.title} ,
<meta name="description" content="${pageProperties.metaDescription}" />
<meta name="keywords" content="${pageProperties.metaKeywords}" />
2 、 <cms:links /> : add magnolia css and js links
取应用目录: ${pageContext.request.contextPath}
3 、 <cms:mainBar paragraph="samplesPageProperties" /> 用于显示上面的头。