浏览 13927 次
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-03-08
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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-03-11
觉得操作不方便..
有没有代码下载的呢??? 我只想知道框架是怎么样的.. |
|
返回顶楼 | |
发表时间:2004-03-11
您是gaocan的头头?
|
|
返回顶楼 | |
发表时间:2004-03-11
xiaoyu 写道 觉得操作不方便..
有没有代码下载的呢??? 我只想知道框架是怎么样的.. 源程序下载: http://www.gaocan.com/CMS/jpenguin-cms-src.zip 准备在Sourceforge或中国的 http://gro.clinux.org 建成开源项目. |
|
返回顶楼 | |
发表时间:2004-03-13
多谢楼上。。
人真好。我喜欢。嘻嘻 Thank you |
|
返回顶楼 | |
发表时间:2004-03-15
^_^......
我也正在做个这样的框架 |
|
返回顶楼 | |
发表时间:2004-03-15
喔,连不到,能不能e给我呢: 520lan@21cn.com
谢谢啦 |
|
返回顶楼 | |
发表时间:2004-03-16
BlueDavy 写道 ^_^......
我也正在做个这样的框架 交流交流? My email : javaeye @ gaocan dot com |
|
返回顶楼 | |
发表时间:2004-09-23
如果说cms的话,图片,文件以静态文件保存更好,放在数据库里不太好
觉得有时候不要为了技术而技术,为了分离而分离,这样容易走极端 |
|
返回顶楼 | |