论坛首页 Java版 Hibernate

Velocity和Hibernate做了一个MVC兼内容管理系统(CMS)

浏览 8701 次
该帖已经被评为精华帖
作者 正文
时间:2004-03-08
我们用Velocity和Hibernate做了一个MVC兼内容管理系统(CMS). JSP中无任何HTML内容. HTML内容全部以
Velocity模版存在Hibernate管理的一个数据库中.图像,Flash等内容也以binary格式存在库中.
内容在库中均被版本控制.

网页美工通过专门的WEB界面直接上传和修改这些内容,
美工所做的修改目前立即被网站的访问者看到, 正在开发一个功能使
得美工可以对整个内容库的所有内容进行发布(Release).
可以设定网站的外部访问者只看到某个Release,
这样美工更新的内容只有到成熟之后才被发布而不影响网站的现状

演示:
1. 美工界面: http://cmsdemo.gaocan.com/index.html (用户名和密码都是cms, 请reload左边frame的folder树)
2. 用户看到的网站 http://cmsdemo.gaocan.com/demo/reportIp.jsp
(请试验通过美工界面修改/demo/reportIp.vm HTML 代码 and /images/hibernatelogo.gif,修改应该立即反映在reportIp.jsp上 (need Reload)).
3.我们的商业网站 www.gaocan.com 目前采用这个CMS系统.

源程序下载:
http://www.gaocan.com/CMS/jpenguin-cms-src.zip


编译过程:
1. ant initdbpostgresql 或 ant initdbmysql 创建CMS数据库
2. ant deploy 生成 WAR 文件


开发心得:
1. Lazy loading of binary data, 对ContentVersion, ContentVersionData采用lazy loading 和 one-to-one mapping 以发挥Hibernate cache的作用.

2.采用native ID generator.目前default是Postgresql,但只要稍微修改hibernate-cms.cfg.xml and hibernate-cms-dev.cfg.xml就可以移植到Mysql上.

3. 美工界面和外部网站可以是两个不同的Web App(分别有自己的hibernate.jar),但这时Content,Folder等类无法Cache否则美工做的修改外部网站的Web app无法看到.

演示Source简介:

Hibernate Mapping:
[code:1]
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class name="org.jpenguin.cms.Cabinet">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name" length="64" not-null="true" unique="true"/>
<one-to-one name="rootFolder" class="org.jpenguin.cms.Folder"
constrained="true" cascade="all" outer-join="true"/>
</class>

<class name="org.jpenguin.cms.Folder">
<id name="id">
<generator class="native"/>
</id>
<property name="path" length="1024" not-null="true"/>
<many-to-one name="parentFolder" column="parent_folder_id"/>
<set name="subFolders" inverse="true" lazy="true" cascade="all-delete-orphan" sort="natural">
<key column="parent_folder_id"/>
<one-to-many class="org.jpenguin.cms.Folder"/>
</set>
<map name="contents" inverse="true" lazy="true" cascade="all-delete-orphan" sort="natural">
<key column="folder_id"/>
<index column="name" type="string"/>
<one-to-many class="org.jpenguin.cms.Content"/>
</map>
</class>

<class name="org.jpenguin.cms.Content">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="contentType"/>
<property name="lastVersionNumber"/>
<set name="versions" inverse="true" lazy="true" sort="natural" cascade="delete">
<!-- no cache here because we want one webapp for CMS admin and if it adds new version
the new version need be seen by othe webapps -->
<!-- <cache usage="read-write"/> -->
<key column="content_id"/>
<one-to-many class="org.jpenguin.cms.ContentVersion"/>
</set>
<many-to-one name="folder" class="org.jpenguin.cms.Folder" column="folder_id" not-null="true"/>
<map name="releasedVersions" lazy="false">
<key>
<column name="content_id"/>
</key>
<index-many-to-many column="release_id" class="org.jpenguin.cms.Release"/>
<many-to-many column="version_id" class="org.jpenguin.cms.ContentVersion"/>
</map>
</class>

<class name="org.jpenguin.cms.ContentVersion" lazy="true">
<cache usage="read-write"/>
<id name="id">
<generator class="assigned"/>
</id>
<property name="versionNumber"/>
<property name="size"/>
<property name="htmlEncoding"/>
<property name="authorName"/>
<property name="checkInDate"/>
<property name="checkInComment"/>
<many-to-one name="content" class="org.jpenguin.cms.Content" column="content_id" not-null="true"/>
<!-- do not want to cascade update or save here because never need to update a binary data -->
<one-to-one name="data" class="org.jpenguin.cms.ContentVersionData" constrained="true" cascade="delete" outer-join="false"/>
</class>

<class name="org.jpenguin.cms.ContentVersionData" lazy="true">
<cache usage="read-write"/>
<id name="id">
<generator class="native"/>
</id>
<property name="data" type="binary" length="16777215"/>
</class>

<class name="org.jpenguin.cms.Release">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="dateCreated"/>
<property name="comment"/>
</class>

</hibernate-mapping>

[/code:1]

reportIp.jsp:
[code:1]
<%@ taglib uri="http://www.jpenguin.org/cmstaglib" prefix="jpcms" %>
<%@ page contentType="text/html;charset=gb2312" %>
<%@page import="java.util.HashMap"%>
<%
pageContext.setAttribute("yourIp", request.getRemoteAddr());
String[] days= {"Sunday","Monday", "Tuesday", "Wednesday"};
HashMap map = new HashMap();
map.put("Sunday","星期日");
map.put("Monday", "星期一");
map.put("Tuesday","星期二");
map.put("Wednesday","星期三");
pageContext.setAttribute("daysEnglishToChinese", map);
pageContext.setAttribute("daysEnglish", days);

%>
<jpcms:template contentPath="/reportIpAddr.vm"/>

[/code:1]

Velocity template (reportIp.vm):
[code:1] <html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>

<body>
<center>
你的IP地址是:$yourIp.
English for week days:
#foreach ($day in $daysEnglish)
$day
#end
Chinese days:
<table>
#foreach ($dayEntry in $daysEnglishToChinese.entrySet())
<TR> <TD> $dayEntry.key <TD> $dayEntry.value </TR>
#end
</table>
<P>
Powered by
<A HREF="http://jakarta.apache.org/velocity/"> <IMG SRC="../images/velocitylogo.gif"/> </A>
<A HREF="http://www.hibernatej.org/velocity/"> <IMG SRC="../images/hibernatelogo.gif"/> </A>

</center>
</body>
</html>

[/code:1]
   
时间:2004-03-11
觉得操作不方便..

有没有代码下载的呢???
我只想知道框架是怎么样的..
   
0 请登录后投票
时间:2004-03-11
您是gaocan的头头?
   
0 请登录后投票
时间:2004-03-11
xiaoyu 写道
觉得操作不方便..

有没有代码下载的呢???
我只想知道框架是怎么样的..


源程序下载:
http://www.gaocan.com/CMS/jpenguin-cms-src.zip

准备在Sourceforge或中国的 http://gro.clinux.org 建成开源项目.
   
0 请登录后投票
时间:2004-03-13
多谢楼上。。

人真好。我喜欢。嘻嘻
Thank you
   
0 请登录后投票
时间:2004-03-15
^_^......
我也正在做个这样的框架
   
0 请登录后投票
时间:2004-03-15
喔,连不到,能不能e给我呢: 520lan@21cn.com
谢谢啦
   
0 请登录后投票
时间:2004-03-16
BlueDavy 写道
^_^......
我也正在做个这样的框架

交流交流? My email :
javaeye @ gaocan dot com
   
0 请登录后投票
时间:2004-09-23
如果说cms的话,图片,文件以静态文件保存更好,放在数据库里不太好

觉得有时候不要为了技术而技术,为了分离而分离,这样容易走极端
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐