基于java的论坛管理系统设计(含源文件)

欢迎添加微信互相交流学习哦!

基于java的论坛管理系统设计(含源文件)

项目源码:https://gitee.com/oklongmm/biye

摘 要:当今社会正处在网络时代,信息化大潮席卷全球,网络正以前所未有的速度在我国普及开来。论坛以其独特的优势在信息化的过程中占有重要的一席。论坛的存在使得地球村的概念离我们越来越近,使得人与人之间的沟通、交流变得格外的容易。特别是在IT领域,只有有了很好的交流,技术才会得到进步。因此,掌握如何设计并开发一个论坛也显得格外的重要而且意义深远。
论坛采用B/S体系结构,其功能是让用户*地发表自己的帖子和回复其他用户的帖子。论坛包括用户模块、帖子模块、后台管理模块。论坛在Struts+Hibernate+Spring框架的基础上,用JSP语言进行开发,使用的数据库是MySQL,开发工具为MyEclipse10。本论坛界面简洁,具有可扩展性和可维护性。
关键词:BBS,S.S.H(Struts,Hibernate,Spring),JAVA,MySQL,JSP

 
Design and implementation of BBS based on SSH framework

Abstract:Society nowadays just be placed in the network for ages, the information-based big tide rolls up the word, the network is making widely available to open in the our country with the unprecedented speed. Forum with its unique advantages in the process of information occupies the important a seats. Forum makes the existence of the concept of global village closer and closer, making communication between people, communication becomes particularly easy. Especially in the IT field, only a very good exchange, technology will be progress. Therefore, mastering how to design and develop a forum is particularly important, and far-reaching.
This forum uses the B/S system structure, its function is to let users to freely express own posts and respond to other users posts. The forum includes user module, the posts module, background management module. The forum is a based on Struts, Hibernate and Spring, develops with JSP, the use of the database is MySQL, development tools for MyEclipse10. This forum interface is simple and it has scalability and maintainability.
Keywords:BBS, SSH(Struts , Hibernate ,Spring) , JAVA , SQL ,JSP

 
目  录
摘 要    I
Abstract    II
第 1 章 绪论    1
1.1研究背景    1
1.2研究目的    1
1.3研究方法    2
第 2 章 系统分析    3
2.1技术分析    3
2.1.1 开发语言综述    3
2.1.2 S.S.H框架的优点    3
2.1.3 系统层次设计    5
2.2需求分析    6
2.2.1功能需求    6
2.2.2性能需求    7
2.2.3系统开发运行环境    7
第 3 章 系统设计    8
3.1 概要设计    8
3.1.1功能模块设计    8
3.1.2系统界面设计    9
3.2 数据库设计    10
3.2.1概念模型设计(E-R图)    10
3.2.2数据库表及关系建立    11
3.2.3详细数据库结构设计    11
第 4 章 系统实现    15
4.1 系统框架实现    15
4.1.1底层数据库的建立    15
4.1.2持久化层的建立(Hibernate)    16
4.1.3业务逻辑层的建立    16
4.1.4表示层的建立    16
4.2 系统功能模块实现    17
4.2.1用户模块实现    17
4.2.2帖子模块实现    21
4.2.3后台管理模块实现    23
第 5 章 系统测试    24
5.1 测试概述    24
5.1.1软件测试的目的    24
5.1.2软件测试的任务    24
5.1.3测试环境    24
5.2 单元测试    25
5.3 集成测试    26
5.4 功能测试    26
第 6 章 总结    28
参考文献    29
致  谢    30

 
第 1 章 绪论
1.1研究背景
1978年在美国芝加哥开发出一套基于8080芯片的CBBS/Chicago (Computerized Bulletin Board System/Chicago),此乃最早的一套BBS系统。之后随着苹果机的问世,开发出基于苹果机的Bulletin Board System和大众信息系统Peoples Message System两种BBS系统。1981年IBM个人计算机诞生时,并没有自己的BBS系统。直到1982年,Buss Lane 才用Basic语言为IBM个人计算机编写了一个原型程序。其后经过几番增修,终于在1983年通过Capital PC User Group的Communication Special Interest Group会员的努力,改写出了个人计算机系统的BBS。经Thomas Mach整理后,终于完成了个人计算机的第1版BBS系统——RBBS-PC。这套BBS系统的最大特色是其源程序全部公开,有利于日后的修改和维护,因此后来在开发其他的BBS系统时都以此为框架,所以RBBS-PC赢得了BBS鼻祖的美称。
大约是从1991年开始,国内开始了第一个BBS论坛。经过长时间的发展,直到1995年,随着计算机及其外设的大幅降价,BBS论坛才逐渐被人们所认识。1996年更是以惊人的速度发展起来。国内的BBS论坛,大多数还是大型综合性BBS论坛。随着计算机的普及,特别是宽带的普及,BBS的活动将会进一步高涨。但是,随之而来对专注于领域方面的BBS将会慢慢增加需求。尽管BBS论坛的数量在不断增长,但BBS的发展过程,也出现了一些问题。由于国内使用的BBS架站软件,都是从国外引进的,因此没有必要的中文说明。虽然一些热心的站长翻译了一些资料,但是仅靠这些是远远不够的。而国内自己开发的BBS基本上都是处于最原始的JSP MODEL1模式,这种模式是控制层与表示层合二为一,虽然开发简单,但是拥有很差的扩展性,可维护性,这样极大地限制了BBS站点的扩展。于是在这种情况下,本文提出了基于MVC模式的SSH框架的BBS论坛。本论坛的优点在于它具有强大的可扩展性和可维护性,适合网民创建自己的中小型BBS论坛。
1.2研究目的
进入二十一世纪,计算机技术迅速向着网络化、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息(多媒体)的新一代网络版应用软件,而目前网络版软件中似乎存在着两种不同的趋势,一种是称为客户端——服务器的C/S结构,这类软件具有结构严谨,运行效率高,服务器端压力小,安全性好等优点,被广泛运用于局域网中。而另一种,也是本毕业设计所采用的,是称为浏览器——服务器的B/S结构,它的特点是在客户端直接采用了功能强大的浏览器软件作为界面,其优点在于软件开发效率高,客户端不受操作平台的限制、也不受地域的限制,网络传输量少,既适用于局域网,又适用于Internet,而且投资小、见效快,用户可以不必进行服务器方面的投资,而是去租用,甚至是免费使用ISP的服务器资源,因而受到越来越多中小型单位的青睐。
随着Internet技术的不断发展,以及用户群爆炸性地增长,网络不再仅仅是信息的被动获取来源,更成为人们探讨问题、交换观点的场所,其中,网上论坛扮演了极其重要的角色,随着时间的推移,论坛站点中积存了丰富的信息资源,不但有各类技术资料和新闻文档,还包含着用户的判断和评论,论坛站点己成为Web信息库的重要组成部分,自网上论坛诞生20多年以来,随着Web技术的发展,己经由原来简单的电子公告板系统发展为功能丰富的网上论坛和虚拟社区模式。各种论坛随着网络迅速发展,几乎充实着生活工作的每一个方面,无论是商界、政界,还是娱乐界,都有各种论坛。互联网正在融入我们的生活,网络提供给我们的不只是一个获取信息的来源,而且还是一个可以相互交流的空间,网上论坛正是一种供人们进行交流的网络空间, 影响和改变着我们的生活。为了方便信息交流,在结合java和ssh技术之下开发了这个快捷、界面友好的交流系统,实现了一个功能相对齐全的论坛系统,网友可以*地提出问题以及帮助他人解决问题,或者交流经验。
1.3研究方法
论坛在Struts+Spring+Hibernate 扩展Structs框架的基础上,用今天主流的网站开发技术jsp语言进行开发。论坛将采用B/S体系结构,人们通过浏览器就可以访问网站的主页。在这论坛可以*地发表自己的观点和对论坛主题发表意见,我们还可以对网友的问题进行及时的解决,获取对自己有用的知识。本网站按照软件项目开发的流程进行开发,对于网站开发的可行性分析、需求分析、概要设计、详细设计以及对网站的测试与维护都有详细的论述和实现过程。


 
第 2 章 系统分析
2.1技术分析
2.1.1 开发语言综述
本系统是基于面向对象思想的JAVA语言中J2EE平台进行编写,J2EE平台具有以下优点。
1.简化结构:J2EE平台支持简化的、基于组件开发模型,遵循J2EE标准的所有服务器都支持该模型。J2EE标准还允许客户订购与J2EE兼容的第三方的现成组件,把其部署到异构环境中,节省了由自己制订整个方案所需的费用。
2. 提高开发效率:由于组件技术的使用,可以按照开发人员的技能对应用程序开发进行分工,并行开发,提供整体开发效率。例如:图形设计师创建JSP模板,商业逻辑由该领域的专家完成,JSP页面由Java工程师完成,应用程序的装配和部署由团队中其他的成员完成,其中许多工作可以同时进行,有助于加速应用程序的开发。
3.易于维护:基于组件的设计简化了应用程序的维护。由于组件可以被独立地更新和替代,通过更新应用程序中特定的组件,新的功能可以被很容易地增加。
4.可伸缩性:基于J2EE平台的应用程序可被部署到各种操作系统上,例如,可被部署到高端UNIX或其他的大型机系统上。J2EE领域的供应商提供了更为广泛的负载平衡策略,能消除系统中的瓶颈,允许多台服务器集成部署,实现可高度伸缩的系统,满足未来商业应用的需要。
2.1.2 S.S.H框架的优点
S.S.H框架是J2EE应用中Struts+Spring+Hibernate三大免费开源框架的结合使用, 它可以看成工具,也是中间件。它是用来提高我们的开发效率,提高我们软件产品的可维护性、可扩展性乃至敏捷性的。它有很多优秀的设计理念及模式应用。比如,Struts属于MVC框架,关键是要了解MVC的概念及大致原理;Hibernate属于ORM系统,属于持久层的解决方案,同样需要对ORM的概念及原理有一个总体的了解;Spring属于应用程序框架,其核心是IOC容器以及AOP,Spring中还集成了很多适用东西,比如对JDBC的封装、自己的MVC、对动态语言的简洁访问等。
S.S.H由以下3个框架构成:
1.Struts框架
Struts 是Apache软件基金会(ASF)赞助的一个开源项目。它通过采用Servlet/JSP技术,实现了基于Java EE Web应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。其基本构成如图2.1所示。
 
图2.1 Struts框架工作流程

2.Spring框架
Spring是一个开源框架,Spring 是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring框架由以下7个部分组成。
 
图2.2 Spring框架构成
3.Hibernate框架
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲地使用面向对象编程思想来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
 
图2.3 Hibernate框架

2.1.3 系统层次设计
系统根据S.S.H框架的特点,决定使用四层结构,这样做的优点是
1、可以分层开发,访问数据库与业务逻辑实现能够分开。
2、提高代码的复用
表示层
业务逻辑层
持久化层
数据库层
图2.4 BBS系统的分层结构

 
2.2需求分析
2.2.1功能需求
对于访问论坛的用户,可分为注册会员和普通用户,这两种用户有着不同的权限,比如普通用户只能发普通帖,回帖,而注册会员除此之外,还可以发含有图片,附件的帖,并且可以对自己的注册资料进行修改等等。
以下为用户角色划分:
1.普通用户(游客):普通用户以游客身份登录本系统,只具有发普通帖,回帖的功能。
2.注册用户:具备普通用户所有的能力。并且注册用户可以发含有图片、附件的帖,可以登录,修改个人信息。
3.管理员:登录以后可以对论坛系统进行管理,包括用户管理、帖子管理、论坛信息管理。
本系统是一套网上交流的BBS软件,根据用户的需要和实际的管理条件,应由用户功能模块,帖子功能模块和后台管理模块等几个模块所构成,用户可以对一些数据进行查找和修改,并且注册的用户可以对帖子进行特定的操作,而管理员可以对用户和帖子进行相关的管理。
鉴于本系统的性质,系统应该实现以下功能。
1.    用户功能模块
1)用户的登录:用户输入登录信息,如用户名、密码,以注册会员的身份进入论坛;
2)用户的注册:主要是指除管理员以外的用户角色(一般为游客),在网上在线填写一些会员的注册信息。注册后即可成为论坛的注册会员;
3)用户资料的修改:注册会员登录成功后,可以修改自己的注册信息,如密码或者其它的内容等。
2.    帖子功能模块
1)帖子的发表:游客或者登陆成功的注册用户可以选择自己感兴趣的版块,发表自己的帖子;
2)帖子的回复:游客或者登陆成功的注册用户可以查看感兴趣的帖子并且进行回复。
3.    后台管理模块
3)用户的管理:管理员登录成功后,可以查看论坛的所有注册用户的信息并且进行必要的修改;
4)帖子的管理:管理员登录成功后,可以查看论坛的所有版块的所有帖子并且进行必要的管理,如删除帖子、帖子加精、帖子置顶;
5)论坛信息的管理:管理员登录成功后,可以查看论坛所有信息,并且可对论坛基本信息,如公告,版块等进行管理。
2.2.2性能需求
1.    响应时间:50个用户同时在线时响应时间不超过3秒。
2.    易用性:符合一般人的操作习惯,出现问题时,能够提示。
3.    可修改性:能够根据需求,增加或减少模块。
2.2.3系统开发运行环境
开发环境: Windows 7  Tomcat7.0  JDK1.6
硬件实现: CoreP7350@2.0GHz  4G内存 80G硬盘
开发语言:  Java
数 据 库:  MySQL5.5
开发工具:  MyEclipse10 
预期成果: 一个可扩展的基于MVC模式的 BBS论坛

 
第 3 章 系统设计
3.1 概要设计
根据需求分析的结果,对系统进行详细的概要设计。
3.1.1功能模块设计
绘制出的用例图,将本系统分为三个大的模块,它们分别是会员资料模块,帖子资料模块和后台管理模块。本系统的功能层次图如图3.1所示。

图3.1系统功能层次图
如图3.1,BBS系统实现了如下的功能。
1.用户模块:此模块用来实现用户的登陆注册和会员资料的修改。
1).用户登陆模块:用户可以通过此模块对论坛进行登陆,登陆后便可以使用所有的会员功能,比如上传图片和附件等等。
2).用户注册模块:没有帐号的用户,可以通过此模块添加用户信息,添加成功后便可登陆论坛,使用会员功能。
3).资料修改模块:已注册的用户在登陆后,可以通过此模块,对会员的基本资料,联系方式,密码,头像等资料进行修改。 
2.帖子模块:
1).发表帖子模块:用户可以在相应的版区中,发表自己的主题,发表成功后,其他用户便可以在相应的版区中看到这篇帖子,并可以对其进行回复等操作。
2).回复帖子模块:用户在发表完主题后,用户便可查看相关内容,并可以对已发表的帖子进行回复。
3.后台管理:
1).帖子管理模块:帖子管理模块是管理员对帖子管理的平台,如果管理员查看到帖子有不适宜发表的内容时,可以对帖子选择删除或者锁定等操作,如果看到优秀的帖子,还可以将帖子进行置顶,加精。
图3.2帖子管理模块功能层次图
2).用户管理模块:管理员可以通过此模块,对用户进行管理,对一些不法的用户可以修改或者删除资料。
3).论坛管理模块:管理员对论坛的添加,创建,删除等功能都是在此模块里进行处理。
3.1.2系统界面设计
对于系统来说,用户界面设计将非常重要,因为一个交互良好的界面能够加深浏览者的印象。设计的实现可以分为两个部分。第一部分为站点的规划及草图的绘制,这一部分可以在纸上完成。第二部分为网页的制作,这一过程是在计算机上完成的。
设计首页的第一步是设计版面布局。我们可以将网页看作传统的报刊杂志来编辑,这里面有文字、图像乃至动画,我们要做的工作就是以最适合的方式将图片和文字排放在页面的不同位置。 除了要有一台配置不错的计算机外,软件也是必需的。不能简单地说一个软件的好坏,只要是设计者使用起来觉得方便而且能得心应手的,就可以称为好软件。当然,它应该能满足设计者的要求。常用的软件是Macromedia的Dreamweaver以及Adobe的Photoshop。
设计是有原则的,无论使用何种手法对画面中的元素进行组合,都一定要遵循五个大的原则:统一、连贯、分割、对比及和谐。
统一是指设计作品的整体性,一致性。设计作品的整体效果是至关重要的,在设计中切勿将各组成部分孤立分散,那样会使画面呈现出一种枝蔓纷杂的凌乱效果。
连贯是指要注意页面的相互关系。设计中应利用各组成部分在内容上的内在联系和表现形式上的相互呼应,并注意整个页面设计风格的一致性,实现视觉上和心理上的连贯,使整个页面设计的各个部分极为融洽,犹如一气呵成。
分割是指将页面分成若干小块,小块之间有视觉上的不同,这样可以使观者一目了然。在信息量很多时为使观者能够看清楚,就要注意到将画面进行有效的分割。分割不仅是表现形式的需要。换个角度来讲,分割也可以被视为对于页面内容的一种分类归纳。
对比是指通过矛盾和冲突,使设计更加富有生气。对比手法很多,例如:多与少、曲与直、强与弱、长与短、粗与细、疏与密、虚与实、主与次、黑与白、动与静、美与丑、聚与散等等。在使用对比的时候应慎重,对比过强容易破坏美感,影响统一。
和谐是指整个页面符合美的法则,浑然一体。如果一件设计作品仅仅是色彩、形状、线条等的随意混合,那么作品将不但没有“生命感”,而且也根本无法实现视觉设计的传达功能。和谐不仅要看结构形式,而且要看作品所形成的视觉效果能否与人的视觉感受形成一种沟通,产生心灵的共鸣。这是设计能否成功的关键。
3.2 数据库设计
数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。
数据库和设计概述
1.数据库是信息系统的核心和基础,把信息系统中大量的数据按一定的模型组织起来,提供存储、维护、检索数据的功能,使信息系统可以方便、及时、准确地从数据库中获得所需的信息。
2.数据库是信息系统的各个部分能否紧密地结合在一起以及如何结合的关键所在。
3.数据库设计是信息系统开发和建设的重要组成部分。
3.2.1概念模型设计(E-R图)
数据模型是是数据特征的抽象,从抽象层次上描述了系统的静态特征、动态行为和约束条件,为数据库系统的信息表与操作提供一个抽象的框架。描述了数据结构、数据操作及数据约束。 
E-R图概念化地构建实体间关系的模型,这使得它们区别于数据库模型图。E-R图的理念是:项目所有参与者能理解E-R图。E-R图由不同实体类型、关系、特性和类型构成。实体是诸如用户的实际对象,有时更抽象,但必须有业务意义。特性用于描述实体,关系用于实体之间。
1.实体:现实世界中的事物;
2.属性:事物的特性;
3.联系:现实世界中事物间的关系。实体集的关系有一对一、一对多、多对多的联系。
本系统的ER图。
 
图3.4 系统E-R图
3.2.2数据库表及关系建立
根据以上这些步骤就可以创建一个数据库,依次建立下列表结构。
1.    用户基本信息表
2.    用户详细信息表
3.    论坛帖子表
4.    论坛回复表
5.    论坛版区表
表与表之间的关系如下:
1.用户基本信息表和用户详细信息表是一对一的关系,一个用户对应一个详细信息表。
2.用户基本信息表和论坛帖子表是一对多的关系,一个用户可以发表多篇帖子。
3.用户基本信息表和论坛回复表是一对多的关系,一个用户可以回复多篇帖子。
4.论坛回复表和论坛帖子表是一对多的关系,一篇帖子后面可以跟多篇回复。
5.论坛版区表和论坛帖子表是一对多的关系,在一个版区中可以含有多篇帖子。
3.2.3详细数据库结构设计
1、用户基本信息表
用户基本信息表中存放的是用户登陆时所需要或者记录用户的基本信息,包含比如登陆名、密码、最后登陆时间等。用户基本信息表的建立主要是记录用户最常用的一些信息。    
表3.1用户基本信息表
字段名    数据类型    为空    说明
id    int(11)    否    主键
userName    varchar(20)    否    用户名(唯一)
nickName    varchar(60)    否    昵称
passwd    varchar(40)    否    密码
email    varchar(255)    否    Email
question    varchar(255)    否    问题
answer    varchar(255)    否    答案
regTime    datetime    否    注册时间
loginTime    datetime    否    登录时间
loginIP    varchar(20)    否    登录IP
coin    int(11)        财富值

2、用户详细信息表
用户详细信息表中存放的是用户的身高,体重,联系方式等详细资料,建立此表的目的是把一些用户不经常用到的详细信息,单独存放到一张表中,可以节约系统的资源。
表3.2 用户详细信息表
字段名    数据类型    为空    说明
id    int(11)    否    主键(外键-userInfo.id)
height    varchar(255)        身高
weight    varchar(255)        体重
interest    varchar(255)        兴趣
graduate    varchar(255)        毕业院校
favourPerple    varchar(255)        偶像
favourArt    varchar(255)        喜爱的艺术
favourMusic    varchar(255)        喜爱的音乐
favourPlace    varchar(255)        喜爱的地方
favourMovie    varchar(255)        喜爱的电影
favourBook    varchar(255)        喜爱的书
qqNo    varchar(255)        qq号
sex    int(1)        性别
3、论坛帖子表
论坛帖子表存放的是用户所发表的主题帖信息。
表3.3 论坛帖子表
字段名    数据类型    为空    说明
id    int(11)    否    主键
boardid    int(11)    否    版区ID(外键-board.id)
reNum    int(11)        回复数量
userID    int(11)        用户ID
userName    varchar(20)        用户名
nickName    varchar(60)        昵称
title    varchar(150)        标题
detail    text        内容
click    int(11)        点击数
postTime    datetime        发表时间
lastTime    datetime        最后回复时间
delSig    int(1)        删除标记

4、论坛回复表
论坛回复表存放的是用户回复主题的回复信息。
表3.4 论坛回复表
字段名    数据类型    为空    说明
id    int(11)    否    主键
pid    int(11)    否    父级ID
userID    int(11)        用户ID
userName    varchar(20)        用户名
nickName    varchar(60)        昵称
context    text        内容
postTime    datetime        发表时间
delSig    int(1)        删除标记

5、论坛版区表
论坛版区表是存放的是论坛中版块信息。
表3.5 论坛版区表
字段名    数据类型    为空    说明
id    int(11)    否    主键
pid    int(11)    否    父级ID
boardName    varchar(60)    否    版区名称
explains    text        版区说明
mainPostNum    int(11)        主题数量
postNum    int(11)        回复数量
 
第 4 章 系统实现
4.1 系统框架实现
在系统的整体设计中,我们采取了三层结构。这样结构的优点是灵活,移植和可维护性比较高。每个层在处理程序上都应该有一项明确的责任,而不应该在功能上与其它层混合,并且每个层要与其它层分开的。
 
图4.1 S.S.H框架的结合使用
4.1.1底层数据库的建立
在前期的数据库选用中,本系统选取了适合中小型网站的MySQL数据库,而在数据库的设计中,本文已经确立了表结构。根据这些就可以创建一个数据库,在数据库创建并连接好后,就可以创建表、修改表和删除表,创建、修改、和删除主键、外键等等。选中“spring”数据库,“use spring;”并使用“create table <表名>”sql语句,依次创建以下表结构。
表4.1表结构
userInfo    用户基本信息表
userDetail    用户详细信息表
boardTag    论坛版区表
board    论坛版块表
forum    帖子表
reply    回复表

 
4.1.2持久化层的建立(Hibernate)
本论坛利用了DAO设计模式结合Hibernate框架来创建数据持久化层。DAO(Data Access Object)模式称为数据访问对象模式,其本质是向外部提供一个访问数据源的统一接口,对外隐藏操作数据源的实现细节,而DAO的实现使用的是Hibernate。首先,在spring的配置文件bean.xml中配置dataSource、sessionFactory、transactionManager,然后编写entity层中的实体类。在实体类中,需要加上无参的空实现的构造器,还有getter和setter方法。Hibernate通过注解来映射(OR)对象。注解比以往使用xml文档实现的映射文件更加便捷,只需在实体类中标记“@entity”、“@Id”等,便可声明Hibernate中持久化类的属性与数据库对应表之间字段的映射关系。接着是DAO接口的定义。DAO接口中定义了特定持久化类所对应的抽象业务逻辑方法。最后是DAO接口的实现类。该类利用HibernateAPI实现DAO接口所定义的抽象方法。这样的设计的有利于当改用其他的持久化机制或持久化中间件时(例如,出现了更好地ORM框架),由于DAO向上层调用者提供的接口不会变化,只需创建新的DAO实现类而无需更改应用中的业务逻辑代码。
4.1.3业务逻辑层的建立
本系统的业务逻辑是交由Struts中的Action进行判断的,比如判断登陆的业务逻辑时,会建立一个LoginAction类来进行逻辑判断,而一些关联的映射,本系统是写在Struts的struts.xml中。
从编码的视角来看,这层是最容易被忽视的一层。 我们往往在持久层周围看到这些业务处理的代码,这其实是不正确的,因为它导致了程序代码的紧密偶合,这样一来,随着时间推移这些代码很难维护。针对这一问题,本系统可以使用Spring框架来解决,利用Spring框架中的“依赖注射”(“控制反转”)把程序中所涉及到包含业务逻辑和Dao的Objects,例如transaction management handler(事物管理控制)、Object Factoris(对象工厂)、service objects(服务组件)都放在Spring的容器中,通过Spring来管理。这种方式让你的对象从创建中释放了出来,降低了偶合度。
4.1.4表示层的建立
在表示层上,主要是基于JSP和AJAX异步传输技术来进行建立,最后通过Struts框架的struts.xml文件进行关联映射.具体的页面设计,会在后面的章节中进行介绍。
4.2 系统功能模块实现
4.2.1用户模块实现
在用户模块的设计中,首先完成的是业务逻辑层的相应action类的编写,之后在通过具体的需要,编写相应的数据库访问DAO。在一切结束之后,从DAO和业务逻辑类中抽象出接口,通过Spring的IOC对接口进行对象注入。
在模块的设计过程中,遇到的难点是在注册时使用的AJAX异步传输,来判断用户名是否可以被注册。AJAX技术是一个基于Javascript脚本语言的技术,目前对这种技术的使用还不是很多,但通过反复的调试,逐渐的掌握了AJAX的要点。
其主要代码如下:
function changeStyle(elementID, toStyle, showText) {
    document.getElementById(elementID).className = toStyle;
    document.getElementById(elementID).innerText = showText;
}

function checkUserName() {
    var username = $('userName').value;
    if (username == "" || username == null) {
        $('usernameMsg').innerHTML = "<font color='red'>不能为空!</font>";
    } else if (!username.match(/^\w+$/)) {
        $('usernameMsg').innerHTML = "<font color='red'>用户名只能由英文、数字和下划线组成!</font>";
    } else if (username.length<3||username.length>12) {
        $('usernameMsg').innerHTML = "<font color='red'>长度要在3到12个字符内!</font>";
    } else {
        $('usernameMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('usernameMsg').className = "msg1";
}

function checkNickName() {
    var nickname = $('nickName').value;
    if (nickname == "" || nickname == null) {
        $('nicknameMsg').innerHTML = "<font color='red'>请输入昵称.</font>";
    } else {
        $('nicknameMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('nicknameMsg').className = "msg1";
}

function checkEmail() {
    var email = $('email').value;
    if (email == "" || email == null) {
        $('emailMsg').innerHTML = "<font color='red'>请输入email.</font>";
    } else if (!email.match(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/)) {
        $('emailMsg').innerHTML = "<font color='red'>请输入正确的email.</font>";
    } else {
        $('emailMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('emailMsg').className = "msg1";
}

function checkPassword() {
    var passwd = $('passwd').value;
    if (passwd == "" || passwd == null) {
        $('passwdMsg').innerHTML = "<font color='red'>请输入密码.</font>";
    } else if (passwd.length < 6) {
        $('passwdMsg').innerHTML = "<font color='red'>密码不能少于6个字符</font>";
    } else if (passwd.length > 20) {
        $('passwdMsg').innerHTML = "<font color='red'>密码不能大于20个字符</font>";
    } else {
        $('passwdMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('passwdMsg').className = "msg1";
}

function checkRePassword() {
    if ($('rePasswd').value != $('passwd').value) {
        $('passwdreMsg').innerHTML = "<font color='red'>不一致</font>";
    } else {
        $('passwdreMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('passwdreMsg').className = "msg1";
}

function checkQuestion() {
    if ($('question').value == "" || $('question').value == null) {
        $('questionMsg').innerHTML = "<font color='red'>请输入问题.</font>";
    } else {
        $('questionMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('questionMsg').className = "msg1";
}

function checkAnswer() {
    if ($('answer').value == "" || $('answer').value == null) {
        $('answerMsg').innerHTML = "<font color='red'>请回答.</font>";
    } else {
        $('answerMsg').innerHTML = "<font color='blue'>ok.</font>";
    }
    $('answerMsg').className = "msg1";
}

function checkUserNameAction() {
    if ($('userName').value == "" || $('userName').length == 0) {
        alert("请填写用户名!");
        return;
    }
    $('checkUserNameMsg').className = "msg2";
    $('checkUserNameMsg').innerHTML = "检测中,请等待...";
    if (typeof XMLHttpRequest != "undefined") {
        var sUrl = "checkUsername.action?userName="+$('userName').value;
        var oRequest = new XMLHttpRequest();
        oRequest.onreadystatechange = function() {
            if (oRequest.readyState == 4) {
                var result = eval('(' + oRequest.responseText + ')');
                $('checkUserNameMsg').innerHTML="<font color='blue'>"+ result.checkedMessage + "</font>";
            }
        };
        $('checkUserNameMsg').className = "msg1";
        oRequest.open('POST', sUrl);
        oRequest.send(null);
    }
}

图4.2  AJAX技术在本系统中的应用
当用户登录时,会有“自动登录”的选项,其实现是在登录时,检测是否勾选“自动登录”,若勾选了,会往浏览器发送cookie,以保留登录信息,下次访问时就不用再输入用户名和密码就可以自动登录了。
发送cookie代码如下:
if (checkAuto != null && "auto".equals(this.getCheckAuto()[0])) {
    Cookie cookie = new Cookie("forumCookie", this.getUsername());
    cookie.setMaxAge(60 * 60 * 24 * 7);
    this.getResponse().addCookie(cookie);
} else {
    Cookie cookie = new Cookie("forumCookie", "forum");
    this.getResponse().addCookie(cookie);
}
接收cookie代码(拦截器)如下:
public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext ac = invocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) ac
                .get(ServletActionContext.HTTP_REQUEST);
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("forumCookie".equals(cookie.getName())) {
                    String value = cookie.getValue();
                    if (!"forum".equals(value)) {
                        Map<String, Object> session = ac.getSession();
                        if (session.get("userInfo") == null) {
                            UserInfo userInfo = new UserInfo();
                            userInfo.setUserName(value);
                            session.put("userInfo", userInfo);
                        }
                    }
                    break;
                }
            }
        }
        return invocation.invoke();
    }

图4.3 cookie的应用

当用户登录成功后,用户可以选择进入到个人中心,来管理个人信息。个人中心分为用户的操作框和具体信息显示框两部分。用户可以选择修改签名、编辑头像、更改个人信息等操作。

 
图4.4个人中心

 
4.2.2帖子模块实现
帖子模块的完成流程和用户模块类似,都是先根据JSP网页,建立相应的Action逻辑判断类,之后建立和帖子有关的数据库访问DAO,最后抽象出接口进行依赖注入。编写帖子模块首先遇到的难点是分页功能的实现,当打开某个论坛时,如果论坛中的帖子数量不能在一页中显示出来,那么怎样进行处理。在一些参考学习后,本系统最后编写了一个分页类,来解决这个难题。Pages.java、PageList.java位于com.oyj.forum.service.web包下,其中的属性有:
表4.2  Pages类的属性
Pages.java
int page    页号
long totalNum    记录总数
int perPageNum    每页显示记录数
int allPage    总页数
int cpage    当前页
int spage    起始记录数

表4.3 PageList类的属性
PageList.java
List<E> objectList    记录列表
Pages pages    分页信息

图4.5分页的实现

当用户进入某版块时,就会显示出分页信息,并且把相关的帖子发列表送给用户。当我们每次查看某个帖子,或回复某个帖子时,回复数量、点击数量都会进行自增。进入帖子后,系统会根据文章发表时间的顺序,将帖子和相关的回复显示出来。
 
图4.6查看帖子
4.2.3后台管理模块实现
后台管理模块是管理员对论坛进行管理的平台。管理员可以在此模块中主要完成对帖子和用户的管理,管理员可以通过用户的ID和用户名对其进行搜索,从而实现管理。
 
图4.7 管理员对用户进行管理

此外管理员还可以进行添加,修改论坛信息。
 
图4.8管理员对版区进行管理
 
第 5 章 系统测试
5.1 测试概述
5.1.1软件测试的目的
软件测试是软件开发过程中的一个重要组成部分,其目的就是对软件产品(包括阶段性成果)进行验证和确认的活动过程,尽快尽早地发现在软件产品中所存在的各种问题。
软件测试是由“验证(verification)”和“有效性确认(validation)”活动构成的整体:
    “验证”是检验软件是否已正确地实现了产品规格书所定义的系统功能和特性。验证过程提供证据表明软件相关产品与所有生命周期活动的要求(如正确性、完整性、一致性、准确性等)相一致。相当于以软件产品设计规格说明书为标准进行软件测试的活动。
    “有效性确认”是确认所开发的软件是否满足用户真正需求的活动。一切从客户出发,理解客户的需求,对软件需求定义、设计的怀疑,发现需求定义和产品设计中的问题。这主要通过各种软件评审活动来实现,包括让客户参加评审、测试活动。
5.1.2软件测试的任务
1.    寻找Bug;
2.    避免软件开发过程中的缺陷;
3.    衡量软件的品质;
4.    关注用户的需求。
总的目标是:确保软件的质量。
5.1.3测试环境
测试环境是在windows版本的Tomcat7.0下进行的。

5.2 单元测试
单元测试是在编码阶段,针对每个程序单元而进行的测试,其测试的对象是程序系统中的最小单元——类、函数、模块或组件等。单元测试主要使用白盒测试方法,从程序的内部结构出发设计测试用例,检查程序模块或组件已实现的功能与定义的功能是否一致,以及编码中是否存在错误。白盒测试使用了junit工具,结合Spring的事务管理,可以在不对数据库产生任何影响下,安全地进行白盒测试,并且测试时可以使用Spring的容器,省去了创建对象的操作。
以下为UserInfoDAOimpl.java的部分测试代码。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/beans.xml" })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class UserInfoDAOimplTest {

    @Autowired
    private UserInfoDAO userInfoDAO;

    @Test
    public void saveUserInfoTest() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUserName("kevin");
        userInfo.setPasswd("123");
        userInfo.setNickName("欧文");
        userInfo.setQuestion("你是谁");
        userInfo.setAnswer("我是我");
        userInfoDAO.saveUserInfo(userInfo);
    }

    @Test
    public void findUserInfoByIdTest() {
        UserInfo userInfo = userInfoDAO.findUserInfoById(1);
        System.out.println(userInfo.getNickName());
    }
}

以下为BoardDAOimplTest.java的部分测试代码。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/beans.xml" })
@Transactional
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BoardDAOimplTest {
    
    @Autowired
    private BoardDAO boardDAO;

    @Test
    public void testSaveBoard() {
        Board board = new Board();
        boardDAO.saveBoard(board);
    }

    @Test
    public void testGetBoardByID() {
        Board board = boardDAO.getBoardByID(1);
        System.out.println(board.getBoardName());
        System.out.println("boardTag="+board.getBoardTag().getTagName());
    }

    @Test
    public void testFindBoardsAll() {
        List<Board> list = boardDAO.findBoardsAll();
        Iterator<Board> boards = list.iterator();
        while(boards.hasNext()){
            System.out.println(boards.next().getBoardName());
        }
    }

5.3 集成测试
集成测试,也称组装测试、联合测试、子系统测试,在单元测试的基础上,按照设计要求不断进行集成而进行的相应测试,目的是发现单元之间的接口问题,如接口参数类型不匹配、接口数据在传输中丢失、数据误差不断积累等问题。
选择什么样的方式把单元组装起来形成一个可运行的系统,直接影响到测试成本,测试计划、测试用例的设计、测试工具的选择等。本论坛采用渐增式集成。首先对某两、三个单元进行测试,然后将这些单元逐步组装成较大的系统。在组装的过程中,一边连接一边测试,以发现连接过程中产生的问题,最后完成所有单元的集成,构造为一个完整的论坛。
5.4 功能测试
功能测试应该在集成测试完成之后进行,而且是针对应用系统进行测试。功能测试是基于产品功能说明书、用户角度来对各项功能进行验证,以确认每个功能是否都能正常使用。在测试时,不考虑程序内部结构和实现方式,只检查程序功能是否按照需求规格说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息,并且保持外部信息(如数据库或文件)的完整性。功能测试包括用户界面、各种操作、不同的数据输入输出和存储等的测试。

表5.1登陆测试用例
测试用例描述    操作过程及数据    预期结果
按不同的输入格式输入个人信息,进行注册。    进入注册界面,按提示的输入格式输入个人信息,进行注册。    注册成功,显示注册成功。居民信息保存到数据库。
用户名有重名的    进入注册界面,用户名输入,其它按提示的输入格式输入个人信息,进行注册。    注册失败,不能注册。
邮箱按邮箱有效地址输入,其它按规定输入,进行注册。    进入注册界面,输入例如:abcd.com其它按提示的输入格式输入个人信息,进行注册。    注册失败,不能注册。
输入为空时,进行注册。    进入注册界面,输入为空,进行注册。    无法注册

表5.2发贴测试用例
测试用例描述    操作过程及数据    预期结果
按要求输入帖子的相关信息    进入发贴界面,输入帖子内容,标题,内容,再提交。    发贴成功,跳转到帖子界面。
没输入标题    进入发贴界面,没输入标题,再提交    发贴失败。
输入为空    进入发贴界面,输入为空,再提交。    无法发贴。


 
第 6 章 总结
经过努力,已经基本完成了BBS系统的开发和设计。完成了用户模块、帖子模块和后台管理模块的开发,并基本实现了前期所制定的功能。
BBS系统在不断的设计更改过程中,逐渐的成熟。在编码阶段,参考了一些设计模式,在业务逻辑代码和数据库连接DAO中抽象出了若干接口,并对其进行了对象的依赖注入,大大的减少了模块之间的耦合,使系统具有很高的灵活性和可维护性,这是BBS系统最大的优点。
系统的另一个优点就是JQuery和AJAX异步传输技术的结合使用,既减轻了服务器的负担,也加快了用户的访问效率。
当然BBS系统也存在很多不足的地方,比如用户的权限判断过于简单,安全性低,希望在今后的学习中,逐步的进行改进。
通过这次的设计,加深了对S.S.H框架,以及AJAX的一些理解。对于软件工程方面的设计思想也有了更深一步的理解,只有在不断的实践于学习中,才会得到最丰厚的回报。

 
参考文献
[1]马赛斯扎克.实用软件工程[M].北京:机械工业出版社,2007,391-420.
[2]刘易斯.数据库与事务处理[M].北京:机械工业出版社,2005,10-35.
[3]Dave Crane.Ajax in Action[M].北京:人民邮电出版社,2006,289-338.
[4]孙卫琴.精通struts[M].北京:电子工业出版社,2004,50-70.
[5]孙卫琴.精通hibernate[M].北京:电子工业出版社,2005,100-120.
[6]林信良.spring2.0技术手册[M].北京:电子工业出版社,2006,50-100.
[7]佚名.MySQL数据库下的JSP分页查询模块源码[EB/OL].http://developer.51cto.com/art/200907/132916.htm.
[8](美)MartyHall.Servlet与JSP核心编程[M].北京:清华大学出版社,2009,54-56.
[9]冯燕奎,赵德奎.JSP实用案例教程[M].北京:清华大学出版社,2004,70-100.
[10](美)Jim Arlow.UML2.0 and the Unified Process[M].北京:机械工业出版社,2006,30-40.
[11]徐建波,周新莲.Web设计原理于编程技术[M].北京:中南大学出版社,2005,185-193.
[12]孙鑫编.Java Web开发详解[M].北京:电子工业出版社,2006,189-274.
[13]林上杰,林康司.JSP2.0技术手册[M].北京:电子工业出版社,2004,3-6.
[14]萨师煊,王珊.数据库系统概论(第三版)[M].北京:高等教育出版社,1998.
[15]蔡剑,景楠.Java Web应用开发:J2EE和Tomcat[M].北京:清华大学出版社,2004.
[16]朱少民.软件测试方法和技术[M].北京:清华大学出版社,2010.

 

上一篇:【Python】Python实现论坛自动签到


下一篇:LINUX 构建Discuz! X论坛系统