论坛首页 Java企业应用论坛

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

浏览 13927 次
该帖已经被评为精华帖
作者 正文
   发表时间: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:
<?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>



reportIp.jsp:
<%@ 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"/>



Velocity template (reportIp.vm):
      <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>

   发表时间: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企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics