基于 J2EE 体系实现多层结构 Blog 平台(1)

开发者在线 Builder.com.cn 更新时间:2007-09-01作者:中国IT实验室 来源:中国IT实验室

本文关键词: J2ee Blog

        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个主键。

查看本文来源

用户评论

  • 用户名
  • 评论内容
  • Brielle
  • Vous avez de bons points il, c\est pourquoi j\aime toujours verifier votre blog, Il semble que vous etes un expert dans ce domaine. maintenir le bon travail, Mon ami recommander votre blog. Mon f
用户名:      邮件地址: