1、 摘要随着互联网络的发展,在自由精神与共享精神的影响下博客(Weblog,Blog)诞生了。Blog的产生让我们可以有更多的机会向别人展示我们自己的见解与日常生活中的信息。JAVA作为目前最为流行的技术之一,其企业版本(J2EE)在设计与实现Web应用方面非常适合。并且,目前基于J2EE的开源框架也已经非常成熟。可以利用现有的优秀框架进行系统的设计与构建。使用J2EE技术来设计实现Blog正是本文的目的所在。本文将设计并实现一个基于J2EE的Blog系统。该系统以Struts、Spring以及Hibernate框架为基础进行设计与构建。Struts、Spring以及Hibernate都是开源框
2、架,分别实现MVC(Model-View-Control)、依赖注入(Dependency Injection)以及ORM(Object/Relation Mapping)。为了提高系统的性能,持久层使用了延迟加载方式。而这种方式需要持久层接口的生命周期延续到表示层。通过对现有技术的分析并结合本系统的特点,笔者设计了一个延长持久层接口生命周期的有效方式,LongPersist机制。在利用以上技术的同时,通过分析Blog的特点,最终完成系统结构的设计与实现。本系统主要完成了用户的登录、注册以及管理功能,实现了用户文章的发表与管理。通过使用URL Rewrite方式使用户方便的浏览自己以及其他用户
3、的Blog。关键词:博客;J2EE;Struts;Spring;Hibernate;框架;I目录前言11 项目概述21.1 系统概述21.1.1 Blog21.1.2 J2EE Web技术31.1.3 Struts框架31.1.4 Spring框架41.1.5 Hibernate框架41.1.6 Geronimo J2EE 开源服务器41.2 业务流程描述42 可行性分析62.1 技术可行性62.2 经济可行性82.2.1支出92.2.2效益92.2.3收益/投资比92.3 操作可行性93 需求分析103.1 系统的设计思想103.1.1 表示层103.1.2 中间层123.1.3 业务逻辑层
4、123.1.3 持久层123.1.3 简单JAVA对象(POJO)133.2 总体目标133.3 具体目标133.3.1 系统功能设计143.3.2 系统特点143.4 系统数据流程图153.5 数据字典184 概要设计244.1 Blog系统结构图244.2 Blog系统接口设计244.3 数据库设计254.3.1 数据库需求分析254.3.2 数据库概念结构设计264.3.3 关系模式设计284.3.3 数据库表结构294.5运行设计314.6安全技术335 详细设计345.1 Blog系统层间协作设计345.2 Blog系统功能模块设计375.2.1 用户身份375.2.2 用户Blog
5、列表显示385.2.3 用户Blog操作395.2.4 Blog评论435.2.5 文章分类管理435.2.6 系统支撑455.3 Blog系统Long Persist机制455.3.1 利用request对象和Service对象的finalize方法实现465.3.2 利用request对象和EL语言实现476 编码496.1 系统使用的语言496.2 编码工具497 系统实现507.1 用户注册界面507.2 用户登录界面507.3 Blog导航界面507.4 用户Blog显示界面527.5 用户信息管理界面538 测试568.1 用户注册测试568.1.1用户名测试用例568.1.2用户
6、密码测试用例568.1.3用户E-mail地址测试用例578.1.4用户Blog空间标题测试用例578.1.5用户Blog空间描述测试用例588.2 用户登录测试588.3用户文章发表测试598.4 用户评论发表测试598.5 Blog系统测试结论59结论60辽宁工程技术大学毕业设计(论文)前言Blog是Web logs的简称,中文名称为博客。Web logs是Web和Log的组合,Web意为环球网络,Log意为航海日志,也就是在海上航行的记录。Web log可以意为在网络上“航行”的记录。Blog表现了互联网的自由、共享的精神。使得每个人成为信息传播的参与者,而使得传统媒体的信息垄断被打破。
7、Blog用它的创新给网络带来了新的生命力,让不同年龄层和不同背景的人们能够互动起来。是继Email、BBS、ICQ之后出现的第四种网络交流方式,是网络时代的个人“读者文摘”,是以超级链接为武器的网络日记,是代表着新的生活方式和新的工作方式,更代表着新的学习方式。Blog的出现集中体现了互联网时代非商业化自由以及大众化的信息传播。1 项目概述一个Blog就是一个或几个网页,它通常是由简短且经常更新的日志(log)所构成。Blog的内容和目的有很大的不同,从对其他网站的超级链接和评论,有关公司、个人、构想、新闻到日记、照片、诗歌、散文,甚至科幻小说的发表或张贴都有,涉及各行各业。许多Blog是个人
8、心中所想之事情的发表,倾向于个人情感的体现活动。其它Blog则是一群人基于某个特定主题或共同利益领域的集体创作。Blog好像对网络传达的实时信息。撰写这些Weblog或Blog的人就叫做 Blogger或Blog writer。本Blog系统是为Bloggers提供编写、管理日志的空间的基于J2EE技术以及开源框架的Web 应用程序。1.1 系统概述Blog系统,为Bloggers提供编写日志的空间。Bloggers可以通过注册获得属于自己的Blog空间,从而建立自己的Blog。本系统在提供空间的同时,也允许网友对自己关注的Blog进行评论,方便与编写者进行直接的讨论。使用J2EE技术构建,集
9、合主流的Struts、Spring以及Hibernate开源J2EE框架。这种以开源技术为基础的构建方式对于以自由共享精神为基础的Blog来说是再合适不过的了。由于Blog系统的业务逻辑等相对简单,所以将系统设计为轻量级J2EE应用,而不使用EJB等重量级企业应用。1.2 业务流程描述 Blog系统的一般业务流程如下:1) 用户账户注册;2) 用户登录;3) 发表及管理日志,浏览、评论其他用户或自己的日志;4) 登出系统。图1-1 系统业务流程图2 可行性分析2.3 操作可行性使用本系统的用户需要了解一些上网常识,会浏览网页,并对Blog或BBS有一定的了解就可直接进行操作。管理员要有一定计算
10、机知识的人员,对网站规划有一定的了解。可及时对系统及数据库进行定期的整理。3 需求分析Blog系统的存在就是为了使用户可以更好的表达自我,记录身边的事物。为了达到这一目的,本系统主要以操作的简便性、沟通的便捷性以及用户的隐私安全等方面为标准进行系统设计。3.2 总体目标Blog是一种崇尚自由、共享精神的大众化的信息传播方式。更重视个人观点的表达,而不是如传统媒体那样让读者以被动式接受的方式来传播信息。Blog一般都比较简短,更新速度较快。所以,Blog系统应该更重视操作的简便性和系统的快速性。这就要求系统的设计在实现基本功能的基础之上尽可能的简洁。同时,还要提供用户隐私的保护。Blog系统应该
11、提供用户和浏览者之间讨论的渠道,使作者可以在第一时间了解读者对于自己文章的看法,也使读者有机会与作者进行直接的沟通。3.3 具体目标通过总体目标的规划,设计了下面的具体目标。包括系统应具备功能以及本Blog系统统所具有的特点。3.3.1 系统功能设计本Blog系统将完成以下功能:1) 用户的注册、登录和登出;用户注册成功后,自动为其建立文章分类“默认分类”;2) 显示用户主页;可以分页、分类显示用户的文章(Log)列表;在浏览器地址栏中输入“http:/server:port/Blog系统 /用户名”即可显示该用户的主页;3) 显示用户文章以及对该文章的评论;4) 登录后的用户可以评论自己以及
12、别人的文章;5) 登录后的用户可以发表文章,编辑自己的文章,删除自己的文章;支持用户发表带有格式的文章;并可以选择文章的分类以及是否公开;6) 登录后的用户可以管理所有人对自己文章的评论;7) 登录后的用户可以管理自己的文章分类,包括新建、修改和删除,其中对于删除的分类,其下的所有文章归入“默认分类”;默认分类不可修改或删除。8) 管理员可以管理用户的文章,包括删除、编辑;9) 管理员可以管理所有评论;10) 管理员可以管理用户的文章分类;11) 管理员的操作全部在普通页面中进行,无须建立管理员专区。3.3.2 系统特点1) 整个系统建立在严密的身份验证基础上,对不同权限的用户提供不同的服务;
13、2) 系统的各项功能简单实用。只要对网络稍有了解的人都可以在几分钟之内熟练操作本系统;3) 文章列表采取分页方式显示,并且可以按照类别过滤。方便读者浏览;4) 非公开内容对于除作者和管理员之外都是不可见的;5) 管理员的所有管理操作都可以在普通的页面上完成,无须建立管理员专区。管理员的管理操作可以即时的反映出来。4 概要设计4.1 Blog系统结构图根据Blog系统需求,设计系统功能如图4-1所示:图4-1 系统结构图Fig.4-1 System chart4.2 Blog系统接口设计1) 用户界面设计在用户界面部分,根据分析的结果,用户需要一个友善的界面。在界面设计上,应该做到简单明了,易于
14、操作,并且要注意到界面的布局。考虑到Blog系统的用户为互联网的使用者,决定采用瘦客户端(浏览器),搭建Web应用程序。系统用户界面简单、易于操作学习。2) 软件接口与数据库服务器通过持久层调用JDBC驱动MySQL数据库。采用驱动程序为:mysql-connector-java-5.0.0-beta-bin.jar。3) 硬件接口采用键盘、鼠标进行输入。4.3 数据库设计数据库在一个系统中占有非常重要的作用,数据库结构设计的好坏将直接的影响到系统得效率,以及实现的效果。合理的数据库设计可以提高数据存储的效率,保证数据的完整和一致性9。Blog系统的设计在数据库系统方面先充分的了解用户各个方面
15、的需求,包括现有的和将来可能增加的需求。数据库设计一般有以下的几个步骤:1) 数据库需求分析。2) 数据库概念结构设计。3) 数据库逻辑结构设计。4.3.1 数据库需求分析用户的需求具体的体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能够满足各种信息的输入输出。通过对系统需求的分析,Blog系统的数据库系统存在以下需求:1) 用户具有用户信息,每个用户具有一种账户状态用于标识权限;2) 用户空间与用户一一对应,具有空间属性;3) 每个用户都可以发表多篇文章(Log);4) 每个用户可以拥有多个文章分类;5) 每篇文章属于其发表者拥有的分类中的一个;6) 每个用户可以对任何一篇公开文
16、章进行评论,并且可以对同一篇文章多次评论。根据以上分析,设计数据结构如下:1) 用户信息:用户账号,用户密码,电子邮件,性别,出生日期,注册日期;2) Blog空间信息:空间标题,空间描述,空间访问计数;3) 文章类别信息:分类名称;4) 文章信息:文章分类,标题,内容,发布时间,公开,浏览量;5) 文章评论:评论内容,发布时间;6) 用户状态:账户状态描述。4.3.2 数据库概念结构设计得到了以上的数据项和数据结构后,就可以设计出能够满足用户需求的各种实体,以及它们之间的关系,为后面的逻辑结构设计做铺垫。这些实体包含各种具体信息,通过相互间的作用形成数据间的流动。同时,考虑到本Blog系统采
17、用ORM框架Hibernate作为层,所有实体及关系的设计在不违反设计原则的基础上最大程度的利于ORM。用户信息实体图如图4-2:图4-2 用户信息实体图Fig.4-2 User information entity plan空间信息实体图如图4-3:图4-3 空间信息实体图Fig.4-3 Blog space information entity plan文章信息实体图如图4-4:图4-4 文章信息实体图Fig.4-4 Blog information entity plan账户状态信息实体图如图4-5:图4-5 账户状态信息实体图Fig.4-5 User accout statement
18、information entity plan文章分类信息实体图如图4-6:图4-6 文章分类信息实体图Fig.4-6 Category information entity plan实体间关系图(ER图)如图4-7:图4-7 各实体间的E-R图Fig.4-7 All inter-entity E-R plan4.3.3 关系模式设计本系统数据库设计采用了关系模式设计。本系统的关系模式(带下划线的为主码):1) 用户(用户ID,用户账号,用户密码,电子邮件,账户状态ID,性别,出生日期,注册日期);2) Blog空间(用户ID,空间标题,空间描述,访问计数);3) 文章分类(文章分类ID,用户
19、ID,分类名称);4) Blog文章(Blog ID,用户ID,文章分类ID,标题,内容,发布时间,公开,浏览量);5) 评论(评论ID,被评论Blog的ID,评论者ID,评论内容,发布时间);6) 用户状态(账户状态ID,账户状态描述)。4.3.3 数据库表结构数据库表结构是由数据库中所建的表来完成的。数据库的概念结构设计完成后,就可以将数据库概念结构转化为一种数据库系统所支持的实际数据模型。1) 用户信息表(user),用来保存注册到Blog系统中的用户的个人信息。结构如表4-1:表4-1 用户信息表Tablet.4-1 user information table列名称数据类型大小Not
20、 NullNot Equal备注user_idINTEGER依赖于数据库主键user_nameVARCHAR50user_pwdVARCHAR50user_emailVARCHAR255user_stateINTEGER依赖于数据库外键user_sexVARCHAR4user_birthdayDATE依赖于数据库user_reg_dateDATE依赖于数据库2) Blog空间信息表(space),存放用户Blog空间的相关属性。结构如表4-2:表4-2 Blog空间信息表Tablet.4-2 space information table列名称数据类型大小Not NullNot Equal备注
21、user_idINTEGER依赖于数据库主键、外键space_titleVARCHAR50space_descriptionVARCHAR100space_countINTEGER依赖于数据库3) 文章分类表(category),存放用户建立的文章分类的相关属性。结构如表4-3:表4-3 文章分类表Tablet.4-3 blog category table列名称数据类型大小Not NullNot Equal备注category_idINTEGER依赖于数据库主键user_idINTEGER依赖于数据库外键category_nameVARCHAR454) 文章表(blog),存放用户文章的相关
22、属性。表4-4 文章表Tablet.4-4 blog table列名称数据类型大小Not NullNot Equal备注blog_idINTEGER依赖于数据库主键user_idINTEGER依赖于数据库外键category_idINTEGER依赖于数据库外键blog_titleVARCHAR60blog_bodyTEXT65535blog_timeDATE依赖于数据库blog_PublicTINYINT1blog_countINTEGER依赖于数据库5) 文章评论表(comment),存放用户文章的相关属性。表4-5 文章评论表Tablet.4-5 blog comments table列名
23、称数据类型大小Not NullNot Equal备注comment_idINTEGER依赖于数据库主键blog_idINTEGER依赖于数据库外键user_idINTEGER依赖于数据库外键续表 4-5列名称数据类型大小Not NullNot Equal备注comment_bodyTEXT65535comment_timeDATE依赖于数据库6) 用户状态表(accountState),存放用户文章的相关属性。结构如表4-6:表4-6 用户状态表Tablet.4-6 user account state table列名称数据类型大小Not NullNot Equal备注user_stateIN
24、TEGER依赖于数据库主键state_descriptionVARCHAR60各表间关系如图4-3:图4-3 各表间关系图Fig.4-3 table relations chart至此,数据库的逻辑结构设计就完成。4.5运行设计本节主要描述本Blog系统的运行环境。包括系统数据库、JDK、操作系统、J2EE服务器以及对环境的配置。1) 数据库本Blog系统采用MySQL 5.0数据库。为提高数据库安全性,为数据库设定密码,并禁用来宾用户。考虑到本系统研究目的多于使用目的,数据库的连接数限制为15个。这样可以在构建系统时第一时间发现连接池泄漏等问题。数据库性能采用开发模式配置,保证开发于系统运行
25、可同时进行。禁用用户的远程连接,以确保数据库无法被远程访问。2) JDK使用J2SE 1.6.0 作为JAVA系统环境。但考虑到Blog系统的兼容,系统设计上并未使用泛型等JAVA 5.0以后的新增特性。由于,商用服务器使用的JDK一般的是较老但稳定的JDK版本,这样可以保证一旦项目需要向商用服务器移植,可以很容易的完成。配置JDK需要配置以下环境变量:a) JAVA_HOME:设定JDK的根目录;b) CLASS_PATH:设定JAVA的类路径。3) 操作系统考虑到Windows 系统的易用性,但是Windows 2003 Server版本价格较高等因素,决定采用Windows XP Pro
26、fessional作为运行环境的操作系统。但由于本Blog系统基于J2EE技术,具有良好的可移植性,如果需要可以在不修改代码的前提下由Windows平台移植到UNIX或Linux平台。另外,为了实现系统的完全可移植性,在数据库方面页选择了对UNIX和Windows系统都支持的MySQL数据库。其它如开发用IDE以及J2EE服务器都是基于技术的,所以无论是开发环境还是运行环境本Blog系统都可以在各主流操作系统平台间移植。4) Geronimo J2EE服务器Geronimo 是Apache旗下的J2EE应用服务器。但它并没有重新实现现有的J2EE服务器功能,而是集成了目前大部分的主流开源项目。
27、其Web部分集成了Apache Tomcat,Jetty这两种Web服务器。考虑到本Blog系统的开发使用的IDE为NetBeans 5.5,其内建对Tomcat的支持并提供绑定的Tomcat服务器,为了提高系统构建效率在决定在Geronimo中使用默认配置的Tomcat 作为Web服务器。另外,Geronimo支持动态部署J2EE应用程序并进行管理。对Geronimo的控制可以在基于Web的图形界面中完成,十分接近商用服务器,方便了系统的管理与维护。4.6安全技术Blog系统是一个信息的发布与交流的平台,信息安全显得尤为重要。1) 数据安全a) 数据库表设计使用了主键和外键,保证了数据的实体
28、以及应用完整性;b) 数据库操作全部使用事务。避免发生数据操作错误;c) 取消数据库所有用户远程访问权限,防止数据库被非法远程连接;d) 定期进行数据库数据的备份操作。2) 用户身份验证用户的在Blog系统的操作除浏览外,都需要对用户身分进行验证。系统会根据用户的身份显示不同的导航页面。具有不同权限的用户所看到的页面内容也是不同的。在服务器端表示层以及业务逻辑层中也对用户身分进行严格认证,防止非法用户通过构造特殊URL的形式对系统进行非法操作。5 详细设计本章主要讨论Blog系统的具体设计思想与方法。给出主要功能模块的设计结构并且对在本系统中使用的一些由笔者自己实现的技术进行讨论。5.1 Bl
29、og系统层间协作设计如本文3.1节所述,本Blog系统共分为6个层次,见图3-1。各层的作用已在第3章中进行了比较详细的讨论,本节主要就各层间主要的通信与协作方式进行阐述。由于事物存在的普遍性的同时也存在的特殊性,所以依赖于功能模块的,较特殊的层间协作方式在对该功能模块进行阐述时一并讨论。1) 简单JAVA对象(POJO,Plain Old Java Objects)POJO是Blog系统的数据载体。同时也是ORM层使用的数据库映射对象。由ORM将数据库中的关系映射为POJO间对象的关系。由于建立POJO目的是要用其作为VO、PO,所以,如无特殊说明,以下阐述的POJO类的与成员都是经过封装(
30、即拥有getter和setter)的。为了保证系统的性能,对各对象的关联都是双向的,并且关系对象的加载都使用了延迟加载技术且没有设定级联加载。但是由于这些技术的使用导致了在某些情况下对象加载失败的情况,在后文中将详细介绍这一问题,并给出解决办法。下面对本系统中的POJO进行说明:a) AccountState类该类用于与表accountState进行映射,加载用户账户状态信息。 b) Blog类该类用于与表blog进行映射,加载文章信息。c) Category类该类用于与表category进行映射,加载文章的分类信息。d) Comment类该类用于与表comment进行映射,加载一条评论。e)
31、 Space类该类用于与表space进行映射,加用户的空间信息。f) User类该类用于与表user进行映射,加载用户信息。由于考虑到设计以及编码的方便,该类被设计成为轻映射类,并没有将accountstate作为关联对象进行映射。2) 浏览器表示层表示层是Blog系统与用户交互的层次,主要利用Struts以及JSP技术实现。具体实现过程在本文的第2章中进行了讨论,这里不再赘述。由于浏览器表示层负担着向用户有组织的显示数据的任务。虽然可以不与其它层进行通信或协作,但是本Blog系统采用了Hibernate作为持久层框架,这就使得在显示数据时会涉及到POJO对象属性的延迟加载。如果该POJO已经
32、脱管,Hibernate Session已经关闭,就会导致5.1.1中提到的延迟加载失败。3) 业务逻辑层与服务端表示层业务逻辑层负责完成Blog系统的业务逻辑。而服务器表示层则负责调用适当的业务逻辑并向业务逻辑层传送参数。即由Action 调用一个特定的Service类的实例并传递相应的参数到该Service类的实例。这样就会导致Action与具体的Service类的耦合。而这种耦合在所有的Action与Service之间都是存在的。为了降低两层间的耦合,笔者设计了一个BlogService接口如图5-1。该接口提供了一个doService方法来处理业务逻辑。考虑到业务逻辑层处理的灵活性,除
33、了一个Object型的对象参数外,将request以及response也一并作为参数传给Service层。特别是当业务逻辑需要返回一个非字符串对象时,用Request作为参数载体非常有效。另外,该接口还提供了几个字符串作为返回值。通过这个返回值Action可以确定应该如何进行页面的跳转。使用了这个接口之后,Action与某个Service之间不再有直接联系,而是通过Service的统一接口完成业务逻辑的调用,从而解除表示层与业务逻辑层的耦合。图5-1 BlogService类图Fig.5-1 BlogService class diagram并且,通过对BlogService中的字符串常量配置
34、相应的跳转页面,可以实现默认情况下的页面跳转,从而减少编码量,提高系统的可信度。以下是struts-config.xml配置文件中的片段: 由于FAILED属于相对较严重的错误,一般也是不可回复的,所以并没有定义跳转页面。各跳转页面利用EL和Script搭建了客户端跳转控制机制。可以在Action中设定request对象的attribute集合中的键值对来设定页面在客户端的行为。4) 业务逻辑层与持久层业务逻辑层在完成业务逻辑的过程中,不可避免的要与数据库进行交互。这就使得持久层需要由业务逻辑层调用。由于持久层使用了Hibernate框架,只需向业务逻辑层暴露Hibernate Session
35、这一持久层接口即可。5) 中间层与其它各层正如前文说所,中间层是Blog系统的结构核心。利用Spring框架的依赖注入能力,去除各层间的依赖。表示层与用户交互,是每一次的业务处理过程的起始点。为了达到使Blog系统中的各层都可以进行依赖注入的目的,将Struts 的Action交给Spring进行全权代理。这样做除了可以使中间层在服务器处理的一开始就可以介入系统对Action实施注入,同时可以将Action由Singleton转变为prototype。对Struts设定全权代理后,当Struts需要调用Action时,Spring就会在配置中寻找Action所依赖的业务逻辑处理类。在找到该类后
36、,会为该类建立实例,并注入持久层接口Session。最后将业务逻辑类的实例注入到Action中。此时,Action就可以通过BlogService接口调用由Spring注入的对象了。5.2 Blog系统功能模块设计本Blog系统的模块划分结构见图4-1。本节对各主要功能模块设计进行较为详尽的描述,对于较为复杂的模块提供相应的流程图。下面,对各主要功能模块进行描述。5.2.1 用户身份用户身份部分主要完成用户的注册、登录以及登出等关于用户身份验证的功能。1) 用户注册用户通过用户注册功能在Blog系统中建立属于用户的空间,并对用户账户进行初始化。具体流程见图5-2。2) 用户登录与登出完成用户的
37、登录与登出。登录时通过密码验证后将在服务器端的HttpServletSession的一个对象中加入用户信息对象。当登出时该对象将被清除。用户登录与登出模块较为简单,这里不提供流程图。图5-2 用户注册流程图Fig.5-2 User registration flow chart5.2.2 用户Blog列表显示用户的Blog列表,也就是用户空间的首页。由于用户的文章比较多,所以文章的内容显示的都为摘要。并且提供分页以及分类查看功能。流程图如图5-3。为了使用户的Blog有更高的独立性,提升用户的归属感,本Blog系统提供了使用用户明作为URL的一部分即可访问用户的空间。如,使用http:/loc
38、alhost:8080/LordSimonBlog/lordsimon即可访问用户“lordsimon”的Blog空间。这一机制利用J2EE Web技术中的Filter实现。图5-3 用户Blog列表显示流程图Fig.5-3 User blog list flow chart首先对用户的请求字符串进行分析。去除ServletContext后的串如果符合用户名的构成规则,则将这个请求重新定向。这样一来,就使得显示Blog列表的真实请求对于用户实现了隐藏。用户主页的地址记忆起来也方便了很多。过滤器的工作流程如图5-4。5.2.3 用户Blog操作主要完成用户Blog文章的显示、添加、删除以及修改等
39、操作。1) 文章发表文章发表流程图如图5-5。图5-4 用户Blog列表显示重定向流程图Fig.5-4 User blog list redirection filter flow chart图5-5 文章发表流程图Fig.5-5 Blog creation flow chart2) 文章显示为了提高Blog系统管理员的管理效率,对于文章的删改等操作都在显示功能中提供操作接口。这样不但可以不需要建立管理员专用的页面,降低后台的暴露程度,而且可使管理员即时的看到修改的效果。同时,该模块还负责将对文章的评论一并显示,并提供文章作者和管理员管理接口。流程图如图5-6。3) 文章删除和修改较文章发表模
40、块,增加了用户身份与文章作者身份是否相符或用户是否为管理员验证。如果为真,则允许删除修改操作。这里不再提供流程图。图5-6 文章显示流程图Fig.5-6 Blog display flow chart5.2.4 Blog评论为已登录的用户提供文章评论功能。并为用户和管理员提供对评论的管理。1) 发表评论发表一篇对于一个文章的评论。流程图如图5-7。图5-7 评论流程图Fig.5-7 Comment flow chart2) 删除评论提供用户和管理员删除文章的评论的功能。流程图如图5-8。5.2.5 文章分类管理文章管理为用户和管理员提供对已发表文章进行编辑和修改的功能,如图5-9。图5-8 评
41、论删除流程图Fig.5-8 Comment delete flow chart图5-9 文章分类管理流程图Fig.5-9 Category management flow chart5.2.6 系统支撑系统支撑部分主要包含Blog系统运行所需要的基本功能。1) 页面框架完成Blog系统的页面显示以及导航等功能。2) 编码过滤器由于本Blog系统是中文系统。在数据提交时,如果不做处理,会使提交的非英文字符成为乱码。为了修正系统的编码,而设计了一个专门用于改变Request以及Response字符编码的的过滤器。由于过滤器可以在Request和Response产生的第一时间由Web服务器进行调用,
42、所以,可以很方便的在其它处理执行之前将Request以及Response的字符编码设定为GB2312。使得在Struts对ActionForm进行填充时,可将Request中的数据以正确的编码方式进行处理。3) 通用数据校验为系统提供数据正确完整性等通用验证。如Email地址格式等。用来替代struts中提供的Validate框架,使数据的校验更符合本Blog系统。4) 业务逻辑接口提供Action调用业务逻辑的接口。通过该接口,完成表示层与业务逻辑层间的解耦。同时提供了实现Long Persist机制的基类(详见5.3节)。5.3 Blog系统Long Persist机制在前文中提到过,本B
43、log系统使用Hibernate 框架作为持久层。为了保证系统性能,在POJO的Hibernate映射配置文件中,启用了延迟加载技术。这一技术可以保证对象的级联对象只在被访问时才会被加载,而不是对象持久化时加载。通常,在业务逻辑层中通过Hibernate访问数据库,Hibernate Session(以下所提到的Session如无特殊说明均指Hibernate Session)实例是需要关闭的。如果不关闭,会导致数据库连接池的连接资源耗尽。但是,一旦Session被关闭,没有持久化的对象会转变为脱管态。这种状态下,对象就丧失了级联加载关联对象或对象集合的能力。这种情况就导致了当业务逻辑结束并关
44、闭Session后,当页面利用EL与Taglib输出数据时,对象的属性不能加载最终导致页面显示失败。经过再三的考虑,笔者认为,解决的方法应该是延长对象的持久态时间。即在页面显示完成之前,都保证POJO的持久态并且延长Session的生命周期到页面显示结束。但这种方式需要在页面中显示调用业务逻辑层对象释放资源。不但产生了耦合、破坏了系统整体的层次结构,而且导致页面编码的混乱。本节的主要目的就是要解决这一问题。5.3.1 利用request对象和Service对象的finalize方法实现在Service对象(即业务逻辑层对象)的doService方法调用时,将该对象的引用加入到request对象中。并在Service类中覆盖finalize方法,在其中对Session资源进行释放。由于Action在进行页面跳转的过程中使用的是Forward方式,这就使得request对象的生命周期会持续到页面显示结束。而在这期间,Service对象的引用也就