blog(weblog)在internet上越来越流行。许多网友都有了自己的blog,通过blog展示自己,结识更过的网友。比较著名的blog平台是基于asp.net的开源项目.text。但是它的逻辑全部以存储过程的形式放在数据库中。虽然存储过程能大大提高数据操作的效率,但是存储过程本身是结构化的程序,无法发挥面向对象的威力,也不便于实现代码复用。
因此,我决定实现一个基于j2ee体系的多层结构的blog平台,功能和界面和.text非常类似,暂命名为crystal blog。实现的功能有:发表和编辑文章;多用户支持;全文检索;rss支持;图片管理;smtp邮件发送等常见功能。界面如下:

一、选择平台和框架
由于使用j2ee平台,我们准备采用weblogic server 8.1作为运行平台,使用weblogic workshop8.1这个强大的集成化ide作为开发工具。数据库选择ms sql server 2000 sp3,建立一个名为blog的数据库存储所有的用户数据。
由于我们并没有针对特定数据库编码,稍后我们会使用其他数据库测试。在系统设计之前,选择一个优秀的框架能大大提高开发效率。spring是一个轻量级的j2ee框架。它覆盖了从后台数据库的jdbc封装到前台web框架的几乎所有方面。并且,spring的各个模块耦合非常松散,我们既可以用它作为整个应用程序的框架,也可以仅仅使用它的某一个模块。此外,spring非常强大的集成功能使我们可以轻易地集成struts编写的web端,或者使用hibernate作为后端的o/r mapping方案。
spring的核心思想便是ioc和aop,spring本身是一个轻量级容器,和ejb容器不同,spring的组件就是普通的java beans,这使得单元测试可以不再依赖容器,编写更加容易。spring负责管理所有的java beans组件,同样支持声明式的事务管理。我们只需要编写好java beans组件,然后将它们“装配”起来就可以了,组件的初始化和管理均由spring完成,只需在配置文件中声明即可。这种方式最大的优点是各组件的耦合极为松散,并且无需我们自己实现singleton模式。
由于后台要使用关系数据库存储数据,使用o/r mapping必不可少。ibatis是又一个类似于hibernate的o/r mapping方案,特点是小巧,配置简单,查询灵活,完全符合我们的要求。
除了spring和ibatis,用到的第三方组件还有:用于全文搜索的lucene引擎,用于文件上传的common-file-upload1.0,用于输出rss的rsslibj1.0 rc2。
由于使用spring这个轻量级框架,就无需ejb服务器,只需要web服务器即可。因此,系统可以运行在weblogic server,tomcat和resin等支持servlet和jsp的web服务器上。
二、系统设计
很显然,多层结构的j2ee架构能保证系统的灵活性和可扩展性。我们仍然采用表示层/逻辑层/持久层三层设计。

整个系统以spring为基础,持久层采用dao模式和ibatis o/r mapping,封装所有数据库操作;中间层是由spring管理的普通的javabean,采用fa?ade模式;表示层使用spring提供的mvc框架。由于spring对其他框架的良好集成,我们采用velocity作为view。由于velocity不能调用java代码,从而强制使用mvc模式而不是在view中嵌入逻辑代码。
三、配置服务器
在weblogic中新建一个configuration,命名为blog,添加一个数据源,命名为jdbc/blog:

整个应用程序的目录结构如下:
crystalblog/
+ doc/ (存放api文档)
+ report/ (存放junit测试结果)
+ src/ (存放java源程序)
+ web/ (web目录)
| + manage/ (存放blog管理页)
| + skin/ (存放blog界面页)
| + upload/ (存放用户上传的图片)
| + web-inf/
| + classes/ (存放编译的class文件)
| + lib/ (存放用到的所有jar文件)
| + search/ (存放lucene的index)
| + c.tld (使用jstl必须的文件)
| + dispatcher-servlet.xml (spring配置文件)
| + web.xml (标准web配置文件)
+ blog.war (打包的可部署应用)
+ build.xml (ant脚本)
四、编写ant脚本
ant是一个非常棒的执行批处理任务的工具。使用ant能使编译、测试、打包、部署和生成文档等一系列任务全自动化,从而大大节省开发时间。首先我们把用到的所有.jar文件放到/web/web-inf/lib中,然后编写compile任务,生成的class文件直接放到web/web-inf/classes目录下。如果编译成功,就进行单元测试,单元测试的结果以文本文件存放在report目录中。如果测试通过,下一步便是打包成blog.war文件。接着把应用部署到服务器上,直接将web目录的内容复制到%bea_home%/user_projects/domains/blogdomain/applications/blog/目录下即可。如果要在tomcat上部署,直接将整个web目录复制到%tomcat%/webapps/blog/下。最后,如果需要,可以用javadoc生成api文档。
五、系统设计
crystal blog共分成三层结构:后台数据持久层,采用dao模式;中间逻辑层,采用facade模式;前端web层,采用mvc结构,使用jsp作为视图。
设计domain对象
domain层是抽象出的实体。根据我们要实现的功能,设计以下实体,它们都是普通的java bean: account:封装一个用户,包括用户id,用户名,口令,用户设置等等。 category:封装一个分类,一共有3种category,分别用来管理article,image和link,一个account对应多个category。
article:封装一篇文章,包括title,summary,content等等,一个category对应多个article。
feedback:封装一个回复,包括title,username,url和content,一个article对应多个feedback。
image:封装一个图片,image只包含图片信息(imageid,type),具体的图片是以用户上传到服务器的文件的形式存储的。一个category对应多个image。
link:封装一个链接,和category是多对一的关系。有title,url,rss等属性。
message:封装一个消息,使其他用户在不知道email地址的情况下能够通过系统发送邮件给某个用户。
最后,为了唯一标识每条数据库记录,我们需要一个主键。在ms sql server和oracle中可以使用自动递增的主键生成方式。但是很多数据库不支持自动递增的主键,考虑到移植性,我们自己定义一个sequence表,用于生成递增的主键。sequence表有且仅有7条记录,分别记录account到message对象的当前最大主键值。系统启动时,由sqlconfig负责初始化sequence表。sequencedao负责提供下一个主键,为了提高效率,一次缓存10个主键。
闽公网安备 35060202000074号