Spring+Struts2+Hibernate的运动社区的设计与实现 下载本文

基本Spring+Struts2+Hibernate的运动社区的设计与实现

届 别 2009届 学 号 200514160119

毕业设计(论文)

基于Spring+Struts2+Hibernate 的运动社区的

设计与实现

姓 名 吴庆龙 系 别 、专 业 计算机科学系、网络工程 导师姓名、职称 李文锋 完 成 时 间

基本Spring+Struts2+Hibernate的运动社区的设计与实现

目 录

摘 要 .................................................................... IV Abstract .................................................................... V 前 言 ...................................................................... 1 第1章 开发背景与环境 ....................................................... 2

1.1 开发背景 -------------------------------------------------------- 2 1.2 开发环境 -------------------------------------------------------- 2 1.2.1 开发语言 ---------------------------------------------------- 2 1.2.2 开发工具 ---------------------------------------------------- 5 1.2.3 开发框架 ---------------------------------------------------- 5

1.3 可行性研究 ------------------------------------------------------ 7 第2章 系统设计知识概述 ..................................................... 9

2.1 数据库的相关理论 ------------------------------------------------ 9 2.1.1 数据库的基本概念 -------------------------------------------- 9 2.1.2 Oracle9i数据库简介 ---------------------------------------- 10 2.2 数据库的设计 --------------------------------------------------- 11 2.2.1 概述 ------------------------------------------------------- 11 2.2.2 数据库设计过程 --------------------------------------------- 12 2.3 软件工程的概述 ------------------------------------------------- 12 2.3.1 软件的定义 ------------------------------------------------- 13 2.3.2 软件的开发 ------------------------------------------------- 13 2.3.3 软件的维护 ------------------------------------------------- 14

2.4 需求分析 ------------------------------------------------------- 14 第3章 总体设计 ............................................................ 16

3.1 系统过程设计 --------------------------------------------------- 16 3.2 系统模块设计 --------------------------------------------------- 16 3.2.1总体设计框架 ----------------------------------------------- 16 3.2.2用户基本信息管理模块设计框架 ------------------------------- 18 3.2.3短管理模块设计框架 ----------------------------------------- 18 3.2.4联系人管理模块设计框架 ------------------------------------- 19 3.2.5论坛管理管理模块设计框架 ----------------------------------- 19 3.2.6后台管理模块设计框架 --------------------------------------- 20

3.3 数据库结构设计 ------------------------------------------------- 21 第4章 系统详细设计 ........................................................ 28

基本Spring+Struts2+Hibernate的运动社区的设计与实现

4.1 建立数据库 ----------------------------------------------------- 28 4.2 建立连接 ------------------------------------------------------- 29 4.3 配置模块 ------------------------------------------------------- 29 4.3.1 DAO(Data Access Object)层的配置模块 ---------------------- 29 4.3.2 Service(业务逻辑)层的配置模块 --------------------------- 31 4.3. 3 配置Struts.xml文件使Spring框架和Struts2框架完成自动集成 32 4.3. 4配置web.xml ----------------------------------------------- 37 4.4 日志设计 ------------------------------------------------------- 40 4.4. 1 配置日志模块 ---------------------------------------------- 40 4.4. 2 日志信息 -------------------------------------------------- 40 4.5 程序设计 ------------------------------------------------------- 41 4.5.1 用户登陆功能设计 ------------------------------------------- 41 4.5.2 修改个人空间功能设计 --------------------------------------- 44 4.5.3 发送信息功能设计 ------------------------------------------- 47 4.5.4 收件箱的功能设计 ------------------------------------------- 48 4.5 5 查询好友的功能设计 ----------------------------------------- 50 4.5 6 运动论坛查询所有贴子功能设计 ------------------------------- 51 4.5 7 后台管理会员管理功能设计 ----------------------------------- 53 4.5 8 后台管理积分动作管理功能设计 ------------------------------- 54 4.6 对本社区的说明 ------------------------------------------------- 55 4.6.1 查询数据库的说明 ------------------------------------------- 55

4.6.2 使用本社区的说明 ------------------------------------------- 57

第5章 系统测试与维护 ...................................................... 59

5.1 软件测试 ------------------------------------------------------- 59

5.2 运行和维护 ----------------------------------------------------- 60 结 论 ..................................................................... 61 注释 ....................................................................... 62 参考文献 ................................................................... 63 致谢 ....................................................................... 64

基本Spring+Struts2+Hibernate的运动社区的设计与实现

摘 要

随着人们生活水平的提高,越来越多的人们选择上网作为自己娱乐消遣的一种方式,并且随着互联网的发展,计算机的应用也越来越广泛,由于计算机和网络的发展,为了满足经常上网并且热爱运动的人的需要,而且宣传某公司的品牌及其公司形象。

开发了以下的基于Spring+Struts2+Hibernate的运动社区。

本社区是一个网络应用软件以MyEclipse为开发工具,以Oracle为后台数据库。针对网络运动爱好者作为用户而开发的,主要用来对网络运动爱好者的信息进行管理并且提供了一个供运动爱好者之间交流的平台。本系统采用前台采用流行的JSP、Ajax(Asynchronous JavaScript and XML)和JavaScrip技术实现了富客户端及动态生成网页的功能。还采用了目前最流行的SSH(Spring、Struts2 和Hibernate)组合技术实现了对业务逻辑的处理后台采用Oracle实现了对用户数据的持久操作。本系统实现了可实现了会员信息管理,短信管理,好友管理,管理员后台管理,运动论坛五大模块的全部功能。系统可以在应用环境为Windows2000及以上版本及相应Linux上运行。

系统具有界面直观友好、操作简单、功能强、自动化程度高等特点。系统能够同时承受500多的用户上线,满足了用户在网络交流方面的需求。

关键词:运动社区,Spring技术,MVC模式,Struts2框架,Jsp,Hibernate

基本Spring+Struts2+Hibernate的运动社区的设计与实现

Abstract

As people's living standards improve, more and more people to choose their own Internet as a way of entertainment, and along with the development of the Internet, computer applications are increasingly widespread, due to computer and network development, in order to meet regularly Internet and those who love the sport needs, and promote a company's brand and corporate image. Based on the development of the following Spring + Struts2 + Hibernate sports community.

This is a community web application software development tools for MyEclipse to the background for the Oracle database. Sports enthusiasts as the network for users developed mainly used for sports fans of the network information management and provides for a campaign platform for exchanges between the lovers. The present system of the future use of popular JSP, Ajax (Asynchronous JavaScript and XML) technology to realize JavaScrip and a rich client and dynamically generated pages. It also uses the most popular SSH (Spring, Struts2 and Hibernate) technology portfolio to achieve the business logic of the use of the background to deal with Oracle to achieve a lasting user data on the operation. The system can be achieved by member information management, text messages, friend, manager background, the five major sports forum for all the modules function. The system can be applied in the environment for Windows2000 and above and the corresponding version of Linux to run on.

The management of system has a friendly window, great function and high automatic degree, which can be operated simply. The system can bear 1200 users at one time, has satisfied the users’ demand in the travel information management.

Keywords:Sports ommunity , Spring Technology, MVC model, Struts2

framework, Jsp Technology, Hibernate Technolog

基本Spring+Struts2+Hibernate的运动社区的设计与实现

基本Spring+Struts2+Hibernate的运动社区的设计与实现

前 言

生命的意义在于运动,自古以来运动一直是人们所关注的话题。特别是我们国家综合国力日益强大的今天的,运动与健康一词更是被人广泛关注。而生活在当今社会的运动的追求者,追求的不仅仅是身体的健康,更重要是追求精神上的愉悦。

21世纪是一个信息化的时代,随着科学技术的不断发展,信息技术和计算机技术已经广泛的应用到人类社会生产和生活的各个领域,人类正朝着信息化社会的方向发展。伴随着信息技术的不断发展,人们的日常工作中越来越多的依赖信息技术和计算机技术,信息技术和计算机技术已经成为人们工作中不可缺少的一部分。为了满足那些运动爱好者的需要,我们提供了一个网上的交流的平台。这个平台不仅为运动爱好者提供了方便,而且对某公司品牌的宣传及其公司形象的宣传都起到很好的促进作用。

本系统使用Eclipse作为开发环境,连接Oracle数据库,采用Tomcat作为服务器,论文重点讲述运动社区的开发过程。本开发过程按照软件生存周期的开发步骤,首先进行需求分析,然后分析系统的可行性方案,确定了项目开发方案,并按照制定的计划进行了软件的总体设计和详细设计。最后对本软件进行了测试、运行和维护。

由于本人的水平有限,加上时间仓促论文中难免有不妥之处,敬请老师们批评指正以使系统更加完善。

下面将论文的内容介绍如下:

第1章主要是系统开发背景及对系统的可行性分析 第2章主要系统的总体设计。 第3章对本系统的数据库设计。

第4章主要是系统的实现,以及部分代码的展现。

第5章主要对系统用到的关键技术及系统安全性能做了阐述。

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

第1章 开发背景与环境

1.1 开发背景

21世纪是知识经济时代,计算机网络作为这一时代重要的生产工具,给各个国家带来了巨大的发展机遇。为了在以用户为中心的市场竞争中获胜,各单位须对不断变化的市场做出快速反应,把单位各关键部门结合成一体,形成一个坚强的信息共享共同体。国内一些中小型企业为了提高自身的工作效率,适应市场的需要,都实现了办公自动化(OA)[1]。

计算机已经成为我们学习和工作的得力助手。目前,计算机的价格十分低廉,性能却有了长足的进步。它已经被应用于许多领域,尤其是在管理领域,它可以简化大量繁琐的工作,提高工作效率,更重要的是能提高保密文件的安全性。

随着计算机的发展和普及,它已经成为人们获取信息的一种方便、快捷、有效的手段。现在我国很多管理机构信息的管理水平还停留在纸介质的基础上,这样的机制已经不能适应时代的发展,必然被以计算机为基础的信息管理所取代。

网运动好者社区系统是专门为运动爱好者提供的一个交流的平台,使跑步爱好者不需要进行面对面的交流,只需在网上查看运动爱好者的个人空间,从而了解他人的跑步爱好习惯,如果与自己的爱好相同或相似,就可以加对方为好友,并且能够发送短信息给自己的跑步好友。而且运动爱好者之间可以在运动论坛中交流彼此对运动的看法道出运动爱好者之间的心声。除此之外本系统管理者还可以通过后台管理对注册的会员信息和积分进行管理。

1.2 开发环境

1.2.1 开发语言

JSP语言的简介及其优点

1.一次编译,多次、多处运行,代码的执行效率高

JSP的脚本语言是JAVA语言,因此它具有JAVA语言的一切特性。同时,JSP也支持现在大部分平台。当JSP第一次被请求时,JSP页面转换成Servlet,然后被编译成.calss文件,以后(除非页面有改动或Web服务器被重新启动)再有客户请求该JSP页面时,JSP页面不被重新编译,而是直接执行已编译好的.class文件,因此执行效率特别高。

2.组件的重用性

可重用的、跨平台的JavaBeans和EJB(Enterprise JavaBeans)组件,为JSP程序的开发提供方便,我们可以将复杂的处理程序(如页面中需要显示的动态内容及对数据库的操作)放到组件中。可以多次使用这些组件,极大的减少了在JSP页面中重写重复的代码。

3.将内容的生成和显示进行分离

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

使用JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面。使用JSP标识或者脚本来生成页面上的动态内容。生成动态内容的语句一般被封装在JavaBean组件、EJB组件或JSP脚本段中。这样,页面的设计人员和页面的编程人员可以同步进行。同时在客户端通过查看源文件,看不到JSP标识的语句,更看不到JavaBean和EJB组件,也可以保护源程序的代码。

Servlet语言简介及其优点

Servlet是一种运行在支持Java语言的服务器上的组件,它与普通Java类的区别就是它运行在服务器上。使用Servlet可以很轻松地扩展Java网络服务器的功能,为网络客户提供安全可靠的、易于移植的动态网页。

Servlet容器的作用是负责处理客户请求。当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。当客户请求某个资源时,Servlet容器使用ServletRequest对象把客户的请求信息封装起来,然后调用Java Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的要返回给客户的结果封装到ServletResponse对象中,最后Servlet容器把客户的请求发送给客户,完成为客户的一次服务过程。Servlet容器的作用如图1-1所示。

request response Servlet容器 Servlet 1 Servlet 2 Servlet 3 Web 客户 图1-1 Servlet容器的作用

Servlet的优势在于:

1.高效率:使用线程取代操作系统进程,能够手工的控制线程,比以前单一的使用操作系统的进程效率高。

2.功能强大:提供数据共享,连接共享,持续存储等诸多功能,强大的功能性使其具有强大的实用性。

3.可移植性强:几乎可以在所有操作系统(如Unix、Windows操作系统)、所有服务器上(如Tomcat,Weblogic服务器)运行。

4.花费少:有众多免费或收费低廉的服务器可以选择,降低了使用的成本。

5.安全:不设计外壳程序,也就杜绝了使用转移符的攻击。没有缓冲区溢出的问题。 6.主流:目前市场上大部分产品都使用该技术。

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

Spring 语言简介及其优点

Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用

简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。

1.轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 2. 控制反转——Spring通过一种称作控制反转(IOC)的技术促进了松耦合。当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IOC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

3. 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

4. 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。

5. 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

Hibernate语言简介及其优点

Hibernate是一个数据持久层框架,是一种实现对象和关系之间映射(O/R Mapping)的工具,它对JDBC进行了轻量级的对象封装,使程序员可以使用对象编程思想来操作数据库。它不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来操作数据库,使用Hibernate能大大的提高实现的效率。

Hibernate框架用配置文件的形式来定义Java对象和数据表之间的映射关系,同时在

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

更深的层面将数据表之间的关系解释为Java对象之间的继承及包含等关系。通过使用HQL语句将复杂的关系算法用对象的方式描述,在很大程度上简化了对数据的查询,加快了开发的效率。在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要创建或修改这些对象,只需在程序中与它们进行交互,然后告诉Hibernate保存即可。这样,大量封装持久化操作的业务逻辑不再需要编写烦琐的JDBC语句,从而使数据持久层得到了极大的简化。 1.2.2 开发工具

运用MyEclipse开发工具,该开发工具是Eclipse的一个插件。Eclipse本身就是一个功能非常强大的开发工具,而MyEclipse在功能上与Tomcat进行了集成,并且能做到自动打包,并将包自动部署到服务器上。这从很大程度上提高了开发的效率,节约了开发的时间。

MyEclipse提供了对多重平台特性的支持。开发者可以使用他们感觉最舒适、最熟悉的平台,例如Windows、Linux等。Eclipse对每个平台都有其单独的图形工具包,这使得应用程序具有接近本地操作系统的外观和更好的性能。 1.2.3 开发框架

用Struts2实现MVC架构。MVC(Model-View-Controller)由Trygve Reenskaug提出,首先被应用在SmallTalk-80环境中,是许多交互和界面系统的构成基础。根据界面设计可变性的需求,MVC把交互系统的组成分解成模型、视图、控制器三部分。[6]

模型(Model)是软件所处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象,封装了问题的核心数据、逻辑和功能的计算关系,独立于具体的界面表达和I/O操作。视图(View)把表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。控制器(Controller)是处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。通常一个视图对应一个控制器。模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论 何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化传播机制。

Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。

一个请求在Struts2框架中的处理大概分为以下几个步骤:

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;

5、ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

1.2.4 SSH(Spring、 Struts2和 Hibernate)组合的优点:

典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。

表现层是传统的JSP技术,自1999年问世以来,经过多年的发展,其广泛的应用和稳定的表现,为其作为表现层技术打下了坚实的基础。

中间层采用的是流行的Spring+Hibernate,为了将控制层与业务逻辑层分离,又细分为以下几种。

Web层,就是MVC模式里面的“C”(controller),负责控制业务逻辑层与表现层的交互,调用业务逻辑层,并将业务数据返回给表现层作组织表现,该系统的MVC框架采用Struts。

Service层(就是业务逻辑层),负责实现业务逻辑。业务逻辑层以DAO层为基础,通过对DAO组件的正面模式包装,完成系统所要求的业务逻辑。

DAO层,负责与持久化对象交互。该层封装了数据的增、删、查、改的操作。 PO,持久化对象。通过实体关系映射工具将关系型数据库的数据映射成对象,很方便地实现以面向对象方式操作数据库,该系统采用Hibernate作为ORM框架。

Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合,

6

基本Spring+Struts2+Hibernate的运动社区的设计与实现

其数据服务层用来存放数据。

一个良好的框架可以让开发人员减轻重新建立解决复杂问题方案的负担和精力;它可以被扩展以进行内部的定制化;并且有强大的用户社区来支持它。框架通常能很好的解决一个问题。然而,你的应用是分层的,可能每一个层都需要各自的框架。仅仅解决UI问题并不意味着你能够很好的将业务逻辑和持久性逻辑和UI 组件很好的耦合。

在传统的Model 1的程序结构中,只要有一点小的需求发生改变,将意味着放弃整个页面。或者改写。虽然前期的开发速度快,除非可以保证以后永远不会改变应用的结构,否则不要采用Model 1的结构。

采用Hibernate作为持久层技术的最大的好处在于:可以完全以面向对象的方式进行系统分析、系统设计。

DAO模式需要为每个DAO组件编写DAO接口,同时至少提供一个实现类,根据不同需要,可能有多个实现类。用Spring容器代替DAO工厂

通常情况下,引入接口就不可避免需要引入工厂来负责DAO组件的生成。Spring实现了两种基本模式:单态模式和工厂模式。而使用Spring可以完全避免使用工厂模式,因为Spring就是个功能非常强大的工厂。因此,完全可以让Spring充当DAO工厂。

由Spring充当DAO工厂时,无须程序员自己实现工厂模式,只需要将DAO组件配置在Spring容器中,由ApplicationContext负责管理DAO组件的创建即可。借助于Spring提供的依赖注入,其他组件甚至不用访问工厂,一样可以直接使用DAO实例。

归纳起来,网络跑步爱好者社区系统的开发与运行环境如下。 开发环境:Unix

开发工具:MyEclipse 开发框架:MVC

数据库管理系统:Oracle9i

1.3 可行性研究

可行性分析的目的,就是用最小的代价在尽可能短的时间内确定问题是否能够解决。

Oracle9i具有强大的数据库支持功能,能够支持现今大多流行的数据库,可以方便的实现与各种数据库的连接,并且Oracle具有良好的用户操作界面。Oracle9i可以通过如SQL、Hibernate、JDBC等特定技术,方便地存储、检索和处理服务器平台上的关键信息,可以接受多种格式的数据,从而方便了用户在不同系统之间进行数据转换。Eclipse提供了强大的数据库应用程序开发功能和数据库辅助工具,程序员利用这些工具能够迅速开发出功能强大的数据库应用程序。此系统主要解决跑步爱好者信息管理的一系列问题,如添加、修改、删除、查询等,因为本管理系统有较高的保密性,要求对人员的各

7

基本Spring+Struts2+Hibernate的运动社区的设计与实现

种信息妥善管理,方便用户使用、且系统安全、高效、可靠。

通过需求阶段对该系统的可行性进行了彻底分析,随着计算机硬件的发展,各项功能日趋完善,使用MyEclipse、Oracle9i开发此系统无论从技术上、经济上、硬件上和操作上都是可行的。

1.技术分析

技术分析是最难决断和最关键的问题,它主要是从技术的角度对系统实现的可行性进行研究。经研究,确定使用MyEclipse作为开发工具,其强大的功能能够满足数据库设计上的需要,并能够完成本系统中待实现的所有功能。

2.操作分析

操作分析用来确定系统的运行方式是否可行。经研究,本系统属于(网络)管理信息系统。运行环境:pentium200以上的CPU,512M以上的内存,windows2000以上的操作系统。从运行上可以在网络跑步爱好者社区系统中实现。

并非任何问题都有简单明显的解决办法,事实上,许多问题不可能在预定的系统规模或时间期限之内解决。如果问题没有可行的解,那么花费在这项工程上的任何时间、人力、软硬件资源和经费,都是无谓的浪费。

8

基本Spring+Struts2+Hibernate的运动社区的设计与实现

第2章 系统设计知识概述

在内容正式叙述之前,我们有必要先了解数据库与数据库相关联的一些知识,及软件工程的概述,了解它们对我们的开发将会有全局性的作用。数据库系统开发的流程可以大致用下面的图2-1来表示:

数据库 图2-1 数据库系统开发大致流程图

程序开发 数据存取技术 2.1 数据库的相关理论

2.1.1 数据库的基本概念

1.概念模型[2]是在现实世界中对客观事物及其联系的一种抽象描述。涉及到下面几个术语:

(1).实体:我们把客观存在并且可以相互区别的事物称为实体。实体可以是实际事物,也可以是抽象事件。如一个职工、一场比赛等。

(2).实体集:同一类实体的集合称为实体集。如全体职工。注意区分\型\与\值\的概念。如每个职工是职工实体“型”的一个具体“值”。

属性:描述实体的特性称为属性。如职工的职工号,姓名,性别,出生日期,职称等关键字,如果某个属性或属性组合的值能唯一地标识出实体集中的每一个实体,可以选作关键字。用作标识的关键字,也称为码。如“职工号”就可作为关键字。 2.E-R模型

E-R模型(实体联系模型)简称E-R图。它是描述概念世界,建立概念模型的实用工具。E-R图包括三个要素:

(1).实体(型)――用矩形框表示,框内标注实体名称。 (2).属性――用椭圆形表示,并用连线与实体连接起来。

(3).实体之间的联系――用菱形框表示,框内标注联系名称,并用连线将菱形框分别与有关实体相连,并在连线上注明联系类型。 联系归结为三种类型:

①.一对一联系(1:1)

设A、B为两个实体集。若A中的每个实体至多和B中的一个实体有联系,反过来,

9

基本Spring+Struts2+Hibernate的运动社区的设计与实现

B中的每个实体至多和A中的一个实体有联系,称A对B或B对A是1:1联系。注意,1:1联系不一定都是一一对应的关系。可能存在着无对应。如一个公司只有一个总经理,一个总经理不能同时在其它公司再兼任总经理,某公司的总经理也可能暂缺。

②.一对多联系(1:n)

如果A实体集中的每个实体可以和B中的几个实体有联系,而B中的每个实体至我和A中的一个实体有联系,那么A对B属于1:n联系。如一个部门有多名职工,而一名职工只在一个部门就职,部门与职工属于一对多的联系。

③.多对多联系(m:n)

若实体集A中的每个实体可与和B中的多个实体有联系,反过来,B中的每个实体也可以与A中的多个实体有联系,称A对B或B对A是m:n联系。如一个学生可以选修多门课程,一门课程由多个学生选修,学生和课程间存在多对多的联系。必须强调指出,有时联系也有属性,这类属性不属于任一实体只能属于联系。 3.数据模型简介

数据模型由三部分组成,即模型结构、数据操作和完整性规则。这里主要介绍模型结构。DBMS所支持的数据模型分为四种:层次模型、网状模型、关系模型、面向对象模型。其中第四种数据模型目前并未成熟,因此传统的说法有前三种数据模型。

(1).基本层次联系

层次模型和网状模型有共同点,可以把它们统称为格式化模型。基本层次联系就是包括两结点和一边的基本单元,两个实体间的有向边代表的基本层次联系表示一对多的联系。通常把表示1的实体放在上方,称为父结点,把表示N的实体放在下面,称为子结点。

(2).层次数据模型

用村形结构表示实体及其之间的联系的模型称为层次模型。该模型的实际存储数据由链接指针来体现联系。特点:有且仅有一个结点无父结点,此结点即为根结点;其它结点有且仅有一个父结点。适合用表示一对多的联系。

(3).网状模型

用网状结构表示实体及其之间的联系的模型称为网状模型。允许结点有多于一个的父结点,可以有一个以上的结点无父结点。适合用于表示多对多的联系。

层次模型和网状模型从本质上都是一样的。存在的缺陷:难以实现系统扩充,插入或删除数据时,涉及到大量链接指针的调整。 2.1.2 Oracle9i数据库简介

Oracle9i[3]是以高级结构化查询语言(Sql)为基础的大型关系数据库,通俗地讲它是用方便逻辑管理的语言操纵大量有规律数据的集合。是目前最流行的客户/服务器(Client/Server)体系结构的数据库之一。

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

Oracle9i作为第一套完整、简单的软件基层结构,展现了前所未有的可扩展性、高性能和应用程序所需要的稳定性,是专门为因特网系统提供的新一代智能型集成应用软件。Oracle9i增强了Oracle的能力,使之在低档软硬件平台上用较少的资源就可以支持更多的用户,而在高档平台上可以支持成百上千个用户。它提供了基于角色(Role)分工的安全保密管理。在数据库管理功能、完整性检查、安全性、一致性方面都有良好的表现。加上它有许多优秀的前台开发工具如 Power Build、Sql*Forms、Visia Basic 等,可以快速发生成基于客户端PC 平台的应用程序,并具有良好的移植性。

Oracle9i数据库在物理上是存储于硬盘的各种文件。它是活动的,可扩充的,随着数据的添加和应用程序的增大而变化。在逻辑上是由许多表空间构成。主要分为系统表空间和非系统表空间。非系统表空间内存储着各项应用的数据、索引、程序等相关信息。

让我们来看一下以上Oracle9i的新的特性:

Oracle9i有超过400项的新特性及技术改进,有了PL/SQL Native Compile,为提高PL/SQL的执行速度,用户在不需要修改PL/SQL语句,只需对现有的PL/SQL语句进行编译,这样根本上改变了Oracle9i之前PL/SQL需要边解释边执行的状况,Oracle9i 将Java XML Developer Kit (XDK) 预装到Oracle9i中,开发者能够轻松地访问基于W3C的功能,这些功能在Oracle9i中生成,操纵,转换灭存储XML格式的数据。此外Oracle9i也推出新的数据类型XMLtype,方便并加速对XML数据的存取。

Compressed Bitmap Index 压缩位图索引是Oracle9i的专利的技术,它所带来的优势包括:性能极大的提高查询的执行时间显著加快,特别是对那些在索引栏中包含多种条件或选择了大量行的查询尤其如此。相对较少的存储花费,它对位图索引的存储不是动态生成的,不会产生巨大的存储量。由于在查询执行中采用了压缩的位图索引,提高了查询执行的性能。降低了维护需求和费用。

Oracle9i自动地维护和使用一次生成的索引。修改数据后是自动的对索引进行相应的调整。Bitmap Join Index (位映射或位图连接索引)允许用户对两个或两个以上表的连接Join建立位映射索引,大大提高了表连接的查询速度。

2.2 数据库的设计

数据是信息系统处理的对象,数据库设计是系统设计的重要组成部分。 2.2.1 概述

数据库设计是在需求分析的基础上,如何对应用系统所设计的数据进行分类、描述、关联和存取的一种技术。数据库设计通常是在一个通用的DBMS支持下进行的,对于一个给定的应用环境,构造最优的数据模式,使之能够有效的存储数据,满足各种用户的需要。数据库是信息系统的核心和基础,它将大量的数据按照一定的模型组织起来,提供存储、维护和检索数据的功能。只有对数据库进行合理的逻辑设计和有效的物理设计,才能开发出完善而高效的信息系统,用户才能方便、及时核准取得从数据库中

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

获取所需的信息。 2.2.2 数据库设计过程

对于信息管理系统,数据基本上都是使用数据库进行管理。数据库设计是对保存管理系统数据的数据库结构进行设计,对整个系统的开发具有非常重要的作用。数据库的设计通常分为6个阶段,分别是需求分析、概念结构设计、逻辑结构设计、物理设计、数据库实施阶段、运行和维护阶段[11]。

1.需求分析

需求分析包括收集和分析用户对数据的需求,它是数据库设计的第一阶段,也是非常重要的阶段。这一阶段收集到的基础数和数据流图是概念结构设计的基础。

2.概念结构设计

概念结构设计是独立于数据库管理系统的逻辑结构,它也独立于具体的机器。E-R模型是描述概念结构设计的有利工具。

3.逻辑结构设计

逻辑结构设计是将概念结构转换为某一数据库管理系统(DBMS)所支持。 4.物理设计

物理设计是指数据库在物理设备上的存储结构和存取方法,它依赖于具体的计算机系统。但随着计算机存储设备性能的提高和数据库管理系统技术的发展,已经减少了对存储空间、分块原则和块因子等因素的考虑。

5.数据库实施阶段

该阶段的主要工作是利用DBMS系统提供的数据定义的语言创建数据库表,向数据库中录入数据。

6.运行和维护阶段

如果是新建的数据库,还应包括试运行,其主要工作包括运行应用程序、对数据库执行各种操作、测试应用程序的功能和系统性能指标。维护阶段的主要工作是对数据安全性的控制、数据备份和恢复、性能的监视、分析和改进,以及数据库表结构的修改和调整。

2.3 软件工程的概述

软件工程是指导计算机软件和维护的工程学科,采用工程的概念、原理和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,这就是软件工程[19]。软件工程的七条基本原理如下[12]。

1.阶段的生命周期计划严格管理。 2.坚持进行阶段评审。 3.实行严格的产品控制。 4.采用现代程序设计技术。

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

5.结果应能清楚的审查。 6.开发小组的人员应该少而精。

7.承认不断改进软件工程实践的必要性。 2.3.1 软件的定义

软件定义阶段的任务是确定软件开发工程必须完成的总目标,即确定工程的可行性;导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该工程需要的资源和成本,制定工程进度表。通常,软件定义阶段又进一步划分为三个子阶段,即问题定义、可行性研究和需求分析[13]。

1.问题的定义

问题定义阶段必须回答的关键问题是:“要解决的问题是什么?”如果不清楚问题是什么就试图解决,显然是盲目的,只会白白浪费时间和金钱,最终得出的结果很可能是毫无意义的,扼要的写出对问题的理解、工程目标和规模的书面报告,改正和理解不准确的地方,得出一份双方都满意的有关问题定义的文档。

2.可行性研究

本阶段要回答的关键问题是:“上一个阶段确定的问题有行的通的解决办法吗?”为了回答这个问题,需要进行一次大大压缩和简化了的系统分析和设计过程,也就是在较抽象的高层次上进行分析和设计。可行性研究应该比较简短,因为这个阶段不是具体解决问题,而是研究问题的范围,探索可行的解决办法,并确定是否值得解决。可行性研究阶段应该导出系统的高层逻辑模型,并且在次基础上更准确、更具体的确定工程规模和目标,更精确的估计系统的成本和效益,仔细的完成成本、效益分析。

3.需求分析

这个阶段的任务是确定“为了解决这个问题,目标系统必须做什么?”确定目标系统应该具备哪些功能。软件开发人员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的完整准确的系统逻辑模型,但不必考虑实现的细节。 2.3.2 软件的开发

开发阶段的任务是具体设计和实现在前一个时期定义的软件。它通常由总体设计、详细设计、编码和单元测试、综合测试等四个子阶段组成[14]。

1.总体设计

本阶段必须回答的问题是:“概括的说,究竟如何解决这个问题?”即确定解决问题的策略及实现目标系统所需要的各种程序。通常要用层次图或结构图来描绘软件的结构。

2.详细设计

总体设计阶段应以比较抽象的方式提出解决问题的办法。详细设计阶段的任务就是把解法具体化,也就是回答关键问题:“应该怎样具体的实现这个系统呢?”这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

3.编码和单元测试

这个阶段的关键任务是编写正确的容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境,选择适当的程序设计语言,把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出来的每个程序模块。

4.综合测试

这个阶段的关键任务是通过各种类型的测试使软件达到预定要求。 2.3.3 软件的维护

维护时期的主要任务是使软件能够持久的满足用户的需求。包括软件在使用过程中发现错误时应该加以改正;环境改变时应该修改软件以适应新的环境;用户有新的要求时应当及时改进软件以满足用户的新需要。

2.4 需求分析

管理系统开发的起点是需求分析,这是整个系统开发中最重要的一步,它决定着开发的成败。

需求分析是软件定义时期的最后一个阶段,它的基本任务是准确的回答“系统必须做什么”这个问题。需求分析的任务还不是确定系统怎样完成它的工作,而仅仅是确定系统必须完成哪些工作,也就是对目标系统提出完整、准确、清晰、具体的要求。需求分析的结果是系统开发的基础,关系到工程的成败和软件产品的质量。因此,必须用行之有效的方法对软件需求进行严格的审查检验。

结合“基于Spring+Struts2+Hibernate的运动社区”的用户信息,切实了解他们整个系统期望具有的功能,分析他们的信息特点,与其共同决定系统具有以下功能。

1.用户登录:已经注册的用户可以直接登录,通过验证用户名和密码后就可以进入主页面;没注册的用户先注册,注册成功后返回登陆界面;在登录过程中,忘记密码的用户可以根据提示问题和答案找回密码。

2会员信息管理:用户登录后可以查看自己的信息也可以修改自己的基本信息,并可以创建或修改自己的个性空间。

3.短信息管理:用户可以给自己的好友发短信或回复好友的来信,并可以查看自己的发件箱或收件箱,以查看发送给好友或收到好友的短信。

4.好友管理:包括好友速配,好友名单,黑名单三个子模块.在好友速配时可以随机速配一个好友,也可以根据条件查询好友;在好友名单中,可以把好友移动到黑名单;在黑名单中,可以彻底删除好友,也把黑名单中的好友移动到好友名单中。

5.系统可以根据登陆的次数给用户加上相应的积分,也可以在用户注册时给相应的介绍人加上相应的积分。

6.运动论坛管理:用户可以在论坛中发表自己的心声唤起其它会员的响应,其它会员可以查看会员发表的文章并且作出自己的评论。除此之外用户还可以查看作者的相关

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

信息。

7.管理员后台管理:管理员可以查看整个系统的会员的信息记录。管理员可以注销或恢复一些用户的账号。注销的用户账号用户不能再通过这个账号登陆。管理员还可以查看会员的积分以及会员获得积分的原因。此外管理员还可以对所有的积分动作进行管理,管理员可以增加一个积会动作也可以对某个积分动作进行修改或删除。还可以注册一个新的管理员账号。

8.为了便于管理员对这个系统的维护本系统还提供了一个写日志的功能。系统把每天出现的异常写进日志里面。管理员通过日志信息可以很轻松查看系统运行情况能十分方便的维护这个系统。

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

第3章 总体设计

3.1 系统过程设计

首先根据需求分析和功能分析设计出数据库,包括各个数据表和数据表结构图的详细设计。

由功能分析可知,本系统主要包括用会员基本信息管理,短信息管理,好友管理、管理员后台管理等五大主要模块。实现功能模块时,采用先模块化,后集成的方式。即对系统各个功能模块分别独立设计和调试,在创建系统主窗体时再将各个功能模块通过主窗体的菜单系统集成到一起,最后进行系统整体设计调试。

在访问数据库时,采用公用数据模块访问数据库需要的对象。该模块在各个功能模块中被直接调用,避免对数据库的反复连接,并可减少代码编写,从而提高系统开发效率。

3.2 系统模块设计

3.2.1总体设计框架

在前面的系统规划与需求分析的基础上,对该系统进行了总体设计,不仅能满足用户修改个人的各种基本信息,能够创建和修改自己的个性空间,使更多的跑步爱好者了解自己,能够随机查找一个好友或根据条件查找到多个好友,而且还能够给自己的好友

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

发送短信,交流各自的跑步心得。

用户信息管理 个人基本信息用户注册管理 个性空间管理 查看基本信修改基本信创建个性空修改个性空发件箱信息管新建短信息 查看已收信删除已收信查看已收信短信息管理 收件箱信息管删除已收信回复信息 随机查找好基于Spring+Struts2+Hibernate 好友速配 多条件查找 添加好友 好友管理 删除好友 加入黑名单 查看黑名单 黑名单管理 发表新贴 查看作者信息 会员信息管回复贴子 会员身份管会员管理 积分动作管理 管理员管理 增加积分动修改积分动注册管理员 加为好友 删除黑名单 的设计与实现好友信息管理 的运动社区运动论坛管理 后台信息管理

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

图3-1 功能模块结构图

3.2.2用户基本信息管理模块设计框架

首先要实现它的基本功能,如用户的注册,登陆,密码的找回,信息的修改等最基本的功能,而这些是需要用户来完成的,也就是说可以定义在用户管理的模块中。为了更好的展示用户的的个人特征,也就是我们平时说的个性化,我们可以加上一个个人空间的管理。于是我们可以定义出用户管理信息的用例图

图3-2 用户基本信息管理

3.2.3短管理模块设计框架

为了方便用户间的交流系统提供一个收发信息的功能,它包括短信的创建,对已收信息和已发信息的删除和查看等功能。其用例图如下

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

图3-3 短信息管理

3.2.4联系人管理模块设计框架

联系人管理模块主要要实现对好友的管理和黑名单的管理可用下面的用例图来表示

图3-4 联系人管理

3.2.5论坛管理管理模块设计框架

运动爱好者可以在运动论坛中发表自己对某一个观点的看法找到自己的知音。可以通过交流结识更多朋友。

图3-5论坛管理管理

1

基本Spring+Struts2+Hibernate的运动社区的设计与实现

3.2.6后台管理模块设计框架

管理员为了更好的维护这个系统设计了后台管理模块主要实现对会员的管理、对积分动作的管理和对管理员的管理。其用例图可用下图表示:

图3-6 后台管理管理

根据系统功能模块结构图和管理流程,以及网络运动爱好者社区系统的需要总结出如下的数据字典。

1.系统用户数据:包含的数据项有系统用户名,密码,性别,年龄,邮箱,省份,地址,密码提示问题,密码提示答案等。

2.用户个人空间数据:包含的数据项有跑步观点,跑步时间,跑步地点,跑步习惯,电话,上传的图片等。

3.短信息数据:包含的数据项有发送者,接收者,发送时间,标题,内容等。 4.好友名单数据:包含的数据项有自己的名字,好友的名字。 5.黑名单数据:包含的数据项有自己的名字,黑名单的名字。

6.用户发表的贴子的数据:包括贴子的主题,内容,发表者,发表时间等。 7.贴子的回复信息数据:包括回复的信息,回复者的信息,回复时间等。 8.管理员数据:包括管理员的名字,管理员的密码,以及对管理员的描述。 9.省份数据:包括省份的代码,省份的名称,省份的id值 10.积分等级数据:最小积分,最大积分,等级名称,对应头像 11.积分动作数据:积分动作名称,可获积分,动作描述

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

12.积分记录数据:用户名称,获得时间等。

3.3 数据库结构设计

数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接影响到系统的效率及系统实现的效果。合理的数据结构设计可以提高数据存储的效率,保证数据的完整性和一致性。合理的数据库结构也将有利于程序的实现[15]。

1.数据库的需求分析

用户的需求具体体现在各种信息的添加、修改、删除和查询,这种数据库结构能够满足各种信息的输入和输出。收集基本数据、数据结构及数据处理的流程,组成一份详尽的数据字典,为后面的具体设计打下基础。

2.数据库创建的意义

数据表是一组有意义的,相对完整的数据的集合,它是构成数据库的最直接的单元。换句话说,数据库是由一个或多个数据表直接构成的。

3.根据数据字典和功能模块图设计出网络运动爱好者社区系统数据库中的各个数据表。根据小区管理要求得到以下几类数据表。

(1).用户信息数据表3-1,用于保存跑步爱好者的详细地址及联系方式,数据表名、 ” memberinfo_wuql”

表3-1 用户信息表

字段名 ID NickName Password Gender Age Email PasswordQuestion PasswordAnswer ProvinceCity Address Phone Point Recommender RegisterDate LatestDate Status IsOnline GradeId

字段类型 Number(Sequence) Varchar2(20) Varchar2(50) Nvarchar2(1) Number Nvarchar2(100) Nvarchar2(200) Nvarchar2(200) Nvarchar2(20) Nvarchar2(200) Varchar2(50) Number Varchar2(20) Date Date Number Number Number 约束或索引 PK Not Null Not Null Not Null Not Null Not Null Default=0 Default=0 Default=0 2

描述 记录流水号 用户昵称 MD5加密口令,页面上限制为16字节 性别,’男’或’女’ 年龄 电子邮件 密码提示问题 密码提示问题答案 所在省市 地址 联系电话 当前积分 推荐人 注册时间 上次上线时间 0-正常 1-注销 0-下线 1-在线 等级ID 基本Spring+Struts2+Hibernate的运动社区的设计与实现

建表语句如下所示:

create table memberinfo_wuql (

id number primary key, nickname varchar2(20) not null, password varchar2(50) not null, gender varchar2(1) not null, age number not null, email varchar2(100) not null, provincecity varchar2(10), address varchar2(200), phone varchar2(50),

passwordquestion varchar2(200), password answer varchar2(200), recommender varchar2(20), point number default 0, registerdate date, latestdate date, status number default 0, isonline number default 0, gradeid number,

constraint cp_info_grade foreign key(gradeid) references cp_graderecord(id) );

(2).用户个人空间表3-2,用于保存用户个人空间的基本信息,数据表名为“memberspace_wuql”。

表3-2 用户个人空间表

字段名 ID Runplace Runtime Runhabit RunStar Cellphone Opinion Icon

字段类型 Number(Sequence) Varchar2(20) Varchar2(20) Varchar2(20) Varchar2(20) Varchar2(20) Varchar2(200) Varchar2(50) 约束或索引 PK 2

描述 记录流水号 跑步地点 跑步时间 跑步习惯 喜欢的体育明星 正在使用的手机 个人对跑步的看法 个人空间头像图片存在的路径 基本Spring+Struts2+Hibernate的运动社区的设计与实现

Memberid Number 会员id(reference MemberInfo) 建表语句如下所示: create table memberspace_wuql ( );

(3).短信息数据表3-3,用于保存短信的基本信息,数据表名为“messagerecord_wuql

表3-3 短信息数据表 id number primary key, opinion varchar2(200), runtime varchar2(20), runplace varchar2(20), runstar varchar2(50), runhabit varchar2(50), cellphone varchar2(50), icon varchar2(200), memberid number,

constraint cp_space_info foreign key(memberid) references cp_memberinfo(id)

字段名 ID Sender Receiver SendDate Title Content Status SenderStatus ReceiverStatus 字段类型 Number(Sequence) Varchar2(20) Varchar2(20) Date NVarchar2(100) Nvarchar2(300) Number Number Number 约束或索引 描述 PK 记录流水号 Not Null 发件人登录名 Not Null 收件人登录名 Default=当前时间, 发送日期 Not Null Not Null 短信标题,页面上最多100字 Not Null 短信内容,页面上最多300字 Default=0 0-未阅读 1-已阅读 0-表示未删除 1-表示已删除Default=0 (发送者) 0-表示未删除 1-表示已删除Default=0 (接收者) 建表语句如下所示:

create table messagerecord_wuql (

id number primary key, sender varchar2(20) not null,

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

);

receiver varchar2(20) not null, senddate date not null, title varchar2(100) not null, content varchar2(300) not null, senderstatus number default 0, receiverstatus number default 0, status number default 0

(4).好友名单数据表3-4,用于保存好友的基本信息,数据表名为“friendrecord_wuql”

表3-4 好友名单数据表

字段名 ID SelfName FriendName

字段类型 Number(Sequence) Varchar2(20) Varchar2(20) 约束或索引 PK Not Null Not Null 描述 记录流水号 会员登录名 好友登录名 建表语句如下所示: create table friendrecord_wuql ( );

(5).黑名单数据表3-5,用于保存即将删除的好友,数据表名为“blackrecord_wuql”

表3-5黑名单数据表

id number primary key, selfname varchar2(20) not null, friendname varchar2(20) not null

字段名 ID SelfName BlackName

字段类型 Number(Sequence) Varchar2(20) Varchar2(20) 约束或索引 PK Not Null Not Null 描述 记录流水号 会员登录名 被加入黑名单者登录名 建表语句如下所示: create table blackrecord_wuql (

id number primary key, selfname varchar2(20) not null,

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

);

blackname varchar2(20) not null

(6). 用户发表的贴子的数据3-6,用于保存用户发表的贴子,数据表名为“bbsInfo_wuql”

表3-6 贴子信息表

字段名 ID Title Content Createdate CreaterId

字段类型 Number(Sequence) varchar2(100) varchar2(1000) date Number 约束或索引 PK Not Null Not Null Not Null FK 描述 记录流水号 贴子主题 贴子内容 创建日期 创建者id(reference MemberInfo) 建表语句如下所示: create table bbsInfo_wuql( id number primary key, title varchar2(100) not null, content varchar2(1000) not null, createdate date not null,

createrid number references memberinfo_wuql(id) );

(7). 贴子的回复信息表3-7,用于保存贴子回复信息,数据表名为“replyInfo_wuql”

表3-7贴子回复信息表

字段名 ID ReplyContent replyDate bbsid 字段类型 Number(Sequence) varchar2(150) date Number 约束或索引 PK Not Null Not Null FK 描述 记录流水号 回复内容 回复日期 回复贴子id(references bbsInfo_wuql) replyerid Number FK 回复者id(references memberinfo_wuql)

建表语句如下所示

create table replyInfo_wuql(

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

id number primary key,

replycontent varchar2(150) not null, replyDate date not null,

bbsid number references bbsInfo_wuql(id),

replyerid number references memberinfo_wuql(id) );

(8). 管理员数据表3-8,用于保存管理员信息,数据表名为“manager_wuql”

表3-9 管理员数据表

字段名 ID NickName Password Descr

字段类型 Number(Sequence) varchar2(30) varchar2(100) varchar2(200) 约束或索引 PK Not Null Not Null 描述 记录流水号 管理员账号 管理员密码 管理员描述 建表语句如下所示

create table manager_wuql( id number,

nickName varchar2(30) not null, password varchar2(100)not null, descr varchar2(200) );

(9). 积分等级数据表3-9,用于保存积分等级数据,数据表名为“graderecord_wuql” 建表语句如下所示

表3-10积分等级数据表

字段名 ID Minpoint 字段类型 Number(Sequence) Number 约束或索引 PK Not Null Not Null Not Null Not Null Maxpoint Number Gradename Varchar2(20) Iconpath Varchar2(50) create table graderecord_wuql( id number primary key, minpoint number not null, maxpoint number not null,

gradename varchar2(20) not null, iconpath varchar2(50) not null

2

描述 记录流水号 这个等级的最小分数据 这个等级的最大分数 等级名称 这个等级对应头像 基本Spring+Struts2+Hibernate的运动社区的设计与实现

);

(10). 积分动作数据表3-10,用于保存积分动作,数据表名为“blackrecord_wuql”

表3-10 积分等级数据表

字段名 ID Actionname Point Description

建表语句如下所示

create table pointaction_wuql( id number primary key, actionname varchar2(20), point number not null, description varchar2(200) );

(11). 省份数据表3-11,用于保存省份信息,数据表名为“provinces_wuql”

表3-11 省份数据表 字段类型 Number(Sequence) Varchar2(20) Number Varchar2(200) 约束或索引 PK Not Null 描述 记录流水号 积分动作名称 对应分数 积分动作描述 字段名 ID Province Code

字段类型 Number(Sequence) Varchar2(20) Varchar2(4) 约束或索引 PK Not Null Not Null 描述 记录流水号 省份 省份对应的编号 建表语句如下所示

create table provinces_wuql( id number primary key,

province varchar2(20) not null, code varchar2(4) not null );

(12). 积分记录数据表3-12,用于保存积分记录,数据表名为“blackrecord_wuql”

表3-12 积分记录数据表

字段名 ID Nickname Receivedate Pointactionid 字段类型 Number(Sequence) Varchar2(20) Date Number 约束或索引 PK Not Null Not Null FK 描述 记录流水号 用户账号 获得积分日期 积分id(references pointaction_wuql)

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

建表语句如下所示

create table pointrecord_wuql( id number primary key,

nickname varchar2(20) not null, receivedate date not null, pointactionid number ,

constraint record_action_wuql foreign key(pointactionid) references pointaction_wuql(id) );

如以上建立户主关系数据表为例,建立以下数据库:用户信息表,个人空间表,短信息表,好友名单表,黑名单表。数据表名分别为:“memberinfo_wul”、“memberspace_wuql”、“messagerecord_wuql”、“friendrecord_wuql”、“blackrecord_wuql”,保存数据库名称为“briupdb”,数据结构表建立完毕。

第4章 系统详细设计

4.1 建立数据库

本系统数据库使用Oracle,数据库名为“briupdb”,下面简单的介绍以下数据库建立的过程。

1.手工创建相关目录

2.手工创建初始化参数文件c:\\oracle\\admin\\web\\pfile\\init.ora

3.手工创建initweb.ora文件,内容:ifile=c:\\oracle\\admin\\web\\pfile\\init.ora 4.使用orapwd.exe命令,创建口令文件pwdweb.ora,命令格式如下:

orapwd.exe file=c:\\oracle\\ora90\\database\\pwdweb.ora password=ltjsb entries=5 5.通过oradim.exe命令,在服务里生成一个新的实例管理服务,启动方式为手工

set ORACLE_SID=web

C:\\oracle\\ora90\\bin\\oradim -new -sid WEB -startmode m -pfile C:\\oracle\\ora90\\database\\initweb.ora 6.创建数据库,执行createdb.sql脚本命令。 7.创建数据库数据文件,执行脚本createfiles.sql。 8.创建数据字典,运行createdbcatalog.sql脚本命令。

9.完善数据库,创建spfile文件,将数据库实例启动服务设置成自动启动方式。

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

4.2 建立连接

本系统使用Hibernate连接Oracle数据库,其实其底层使用JDBC连接的Oracle数据库,连接的配置界面如图4-1:

图4-1 连接Oracle数据库的配置界面

4.3 配置模块

目的:为了降低各个部分代码的耦合性提高代码的内聚从而提高代码的健状性。以及便于代码的后继更新升级常常把一些有可能变动的需要从系统外围传入的数据通过配置文件(通常用xml文件的形式传入)。

4.3.1 DAO(Data Access Object)层的配置模块

-

配置数据源 --> -

oracle.jdbc.driver.OracleDriver

-

jdbc:oracle:thin:@192.168.1.220:1521:briupdb

- runjd0807

2

基本Spring+Struts2+Hibernate的运动社区的设计与实现

- runjd0807 - -

- -

-

classpath:com/briup/run/bean -

class=\org.springframework.orm.hibernate3.HibernateTemplate\ lazy-init=\default\ autowire=\default\ dependency-check=\default\- -

lazy-init=\default\ autowire=\default\ dependency-check=\default\-

-

lazy-init=\default\ autowire=\default\ dependency-check=\default\- -

lazy-init=\default\ autowire=\default\ dependency-check=\default\- -

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

lazy-init=\default\ autowire=\default\ dependency-check=\default\-

-

name=\transactionManager\ lazy-init=\default\ autowire=\default\ dependency-check=\default\

-

通过这个配置模块把数据源注入到HibernateTemplate对象中去了,这样的话相当于所有的连接都从数据源中去获得从而减少了与数据库交互的次数从而提高系统的性能。此外在这个地方把事务也注入到了对应的DAO接口的实现类了把事务交给Spring容器去处理,从而减少了程序员通过手动去写代码控制事务的烦琐减少了错误率提高了代码的健状性。

4.3.2 Service(业务逻辑)层的配置模块

-

class=\org.springframework.orm.hibernate3.HibernateTransactionManager\ lazy-init=\default\ autowire=\default\ dependency-check=\default\- -

class=\org.springframework.transaction.interceptor.TransactionProxyFactoryBean\ lazy-init=\true\ autowire=\default\ dependency-check=\default\-

-

-DataAccessException,-CustomerSericeException

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

-

autowire=\default\ dependency-check=\default\-

lazy-init=\default\

lazy-init=\default\

lazy-init=\default\

lazy-init=\default\

lazy-init=\default\

lazy-init=\default\

在业务逻辑层没有直接去调用持久层的接口对象,而是把持久层的接口对象作为一个目标对象,通过往目标对象织入增强器从而形成一个代理对象。从而通过调用代理对象来对数据持久层进行操作的过程。

4.3. 3 配置Struts.xml文件使Spring框架和Struts2框架完成自动集成

- -

开启自动由spring来管理action对象, struts2和spring自动集成

-->

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

过虑器部分 --> -

-

method=\nickName\ -

method=\login\

-

method=\afterLogin\

type=\redirect\/pages/member/activity.jsp -

method=\{1}\

-

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

type=\redirect\/pages/member/nospace.jsp

type=\redirect\/pages/member/space.jsp

type=\redirect\/pages/member/space.jsp

type=\redirect\/pages/member/nospace.jsp

type=\redirect\/pages/member/space.jsp

name=\modifyspace-success\/pages/member/frame/rightframe.jsp

type=\redirect\/pages/member/frame/rightframe.jsp - -

-

method=\Inbox\

-

method=\Outbox\

-

method=\{1}\

-

-

-

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

- -

-

method=\buddyList\

-

method=\blackList\

-

name=\matchonefriend-success\/pages/messenger/matchOneFriend.jsp

name=\matchonefriend-failure\/pages/messenger/matchOneFriend.jsp -

-

-

-

-

-

- -

-

method=\resumeMemberList\

name=\resumememberlist-failure\/admin/admin/member/Memberresume.jsp

-

method=\listPointAction\

name=\listpointaction-success\/admin/admin/pointaction/Pointaction.jsp

name=\listpointaction-failure\/admin/admin/pointaction/Pointaction.jsp

-

type=\redirect\/admin/admin/member/addPoint.jsp

type=\redirect\/admin/admin/member/newAdmin.jsp

name=\memberlist-success\/admin/admin/member/MemberList.jsp

-

name=\addmemberpoint-success\/admin/admin/member/addPoint.jsp

name=\addmemberpoint-failure\/admin/admin/member/addPoint.jsp

name=\listpointrecord-success\/admin/admin/pointaction/listPointRecord.jsp

name=\listpointrecord-failure\/admin/admin/pointaction/listPointRecord.jsp

-

name=\addpointaction-failure\/admin/admin/pointaction/PointactionAdd.jsp

-

name=\modifypointaction-success\/admin/admin/pointaction/modifyPointAction.jsp

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

name=\modifypointaction-failure\/admin/admin/pointaction/modifyPointAction.jsp - -

-

method=\BBSList\

-

-

配置这一个文件之后可以把Spring框架和Struts2容器自动集成。使两个框架各自发挥自己的优点,发挥系统的最大性能。并且可以实现用户在启动服务器的时候就可以得到相应的数据源并且指定相应的Action和与之相对应的方法。

4.3. 4配置web.xml

配置web.xml使web应用在启动的时候就对所有的xml文件进行解析,从而实现Struts2框架与web应用的自动集成。并且对配置的过滤器和监听器进行调用。

xmlns:xsi=\http://www.w3.org/2001/XMLSchema-instance\ xsi:schemaLocation=\http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\- -

contextConfigLocation

/WEB-INF/spring/spring-service.xml,/WEB-INF/spring/spring-dao.x

ml -

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

org.springframework.web.context.ContextLoaderListener

s>

- -

index.jsp - -

struts2

org.apache.struts2.dispatcher.FilterDispatcher

-

struts2 /*

FORWARD REQUEST INCLUDE - -

hibernateFilter

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter<

/filter-class> - -

singleSession true

-

hibernateFilter /* - -

encode

com.briup.run.web.filter.EncodeFilter -

charset UTF-8

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

-

encode /*

REQUEST FORWARD INCLUDE -

authImg

com.briup.run.web.servlet.AuthImg

-

authImg

/pages/authimg -

struts-cleanup

org.apache.struts2.dispatcher.ActionContextCleanUp

-

struts-cleanup /* - -

login

com.briup.run.web.filter.LoginFilter

-

login

/pages/member/* -

login

/pages/messenger/* -

login

/pages/BBS/* -

adminlogin

com.briup.run.web.filter.AdminLonginFilter

-

adminlogin

/admin/admin/member/* -

3

基本Spring+Struts2+Hibernate的运动社区的设计与实现

adminlogin

/admin/admin/pointaction/* -

adminlogin

/admin/admin/manager/* - -

com.briup.run.web.listener.ContextListener -

com.briup.run.web.listener.AccessListener

4.4 日志设计

功能:通过把系统运行的状态信息写入日志,管理员可以清楚地看到系统当前运行的状态以及系统出现异常的原因以。这样便于管理员对系统的维护。

4.4. 1 配置日志模块

#log4j.rootLogger=DEBUG,A1,R log4j.rootLogger=INFO,A1,R

log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=bbscs7log.txt log4j.appender.R.MaxFileSize=500KB log4j.appender.R.MaxBackupIndex=10

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n #log4j.logger.org.springframework.transaction.interceptor=DEBUG

4.4. 2 日志信息

如在数据库连接异常的时候就会输出如下的日志信息用于可以很容易通过这个日志的信息知道系统的当前运行情况来维护系统。

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

图4-2 日志信息

4.5 程序设计

4.5.1 用户登陆功能设计

功能:该模块主要对用户的登陆名和密码进行验证,如果用户名和密码都正确,则进入用户的主界面;如果是新用户,则先进行注册,然后进入登陆界面;如果是已经注册的用户忘记了密码,则进入找会密码的界面,根据密码提示问题和密码提示答案找回密码,最后进入登陆界面重新进行登陆。用户登录界面如图4-2所示。

图4-3 用户登录界面

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

在登陆窗体代码中实现身份验证功能,即需要检验用户登陆的用户名和密码是否正确。如果不正确,则提示“该用户不存在,或密码不正确,请从新输入”;如果是新用户,那么进行新用户注册,如果用户忘记密码,则可以使用下面的找回密码按扭找会密码,如果正确,则进入网络跑步爱好者社区系统。

用户登陆窗体代码如下: // 用户登录

public String login() {

HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); Manager manager = null; if (role.equals(\

// 判断用户是否为自动登录用户如果是自动登录用户则从action中登录 // 如果不是就从jsp页面里面登录

MemberInfo memberInfo = new MemberInfo();

// 第一种情况用户通过 login.jsp表单中提交中的信息来登录的情况 if (request.getAttribute(\ }

if (request.getAttribute(\ } try {

memberInfo = memberService.login(loginName, passwd); if (memberInfo != null) {

// 当选中记住用户名和密码时把用户名和密码保存进入cookie中 if (this.autoLogin != null

&& this.autoLogin.trim().equals(\

Cookie cookie1 = new Cookie(\Cookie cookie2 = new Cookie(\cookie1.setMaxAge(60 * 60 * 3); cookie2.setMaxAge(60 * 60 * 3); cookie1.setPath(\

4

String userName = (String) request.getAttribute(\this.setLoginName(userName);

String password = (String) request.getAttribute(\this.setPasswd(password);

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

}

}

}

cookie2.setPath(\response.addCookie(cookie1); response.addCookie(cookie2); this.setRole(\

session.setAttribute(\// 把这次登录的时间保存,更新数据库 memberInfo.setLatestDate(new Date());

memberService.modifyMemberinfo(memberInfo);

return \

request.setAttribute(\return \

} catch (Exception e) {

} else {

try { }

return \

manager = memberService.Adminlogin(loginName, passwd); request.setAttribute(\登录成功\session.setAttribute(\return \e.printStackTrace();

request.setAttribute(\

} catch (MemberServiceException e) {

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

图4-3 运动社区首页

4.5.2 修改个人空间功能设计

功能:用户在创建自己的个性空间以后对空间的信息进行更新。用户可以修改自己的个性空间照片、跑步时间、习惯等在用户选择提交以后就把对应的信息更新到数据库里面同时同步刷新到页面里面。

修改个人空间界面如图4-3所示:

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

图4-3 修改个人空间界面

修改个性空间的主要代码如下: // 用户修改自己的个性空间 public String modifySpace() { HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); if (opinion == null || opinion.equals(\)) { request.setAttribute(\, \形容对跑步的主张不能为空!\); return \; } else if (runstar == null || runstar.equals(\)) { request.setAttribute(\, \喜欢的体育明星不能为空!\); return \; } else if (cellphone == null || cellphone.equals(\)) { request.setAttribute(\, \正在使用的手机号不能为空!\); return \; } else if (runplace == null || runplace.equals(\)) { request.setAttribute(\, \经常跑步的地点不能为空!\); return \; } MemberSpace memberSpace = (MemberSpace) session .getAttribute(\); MemberInfo memberInfo = (MemberInfo) session.getAttribute(\); memberSpace.setMemberInfo(memberInfo);

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

memberSpace.setCellPhone(cellphone); memberSpace.setOpinion(opinion); memberSpace.setRunTime(runtime); memberSpace.setRunHabit(runhabit); memberSpace.setRunStar(runstar); memberSpace.setRunPlace(runplace);

if (this.iconFileName != null) {

String path = ServletActionContext.getServletContext().getRealPath( \ + memberInfo.getNickName()); File oldPath = new File(path); if (!oldPath.exists()) { oldPath.mkdirs(); }

File imageFile = new File(oldPath, iconFileName); CopyFile(icon, imageFile);

memberSpace.setIcon(\ + memberInfo.getNickName() + \ + iconFileName); } else {

memberSpace.setIcon(memberInfo.getMemberSpace().getIcon()); }

try {

memberService.saveOrUpdateSpace(memberSpace, memberInfo .getNickName());

memberInfo.setMemberSpace(memberSpace);

request.setAttribute(\, \个性空间修改成功!\); session.setAttribute(\, memberSpace); session.setAttribute(\, memberInfo); return \; } catch (Exception e) { e.printStackTrace();

request.setAttribute(\, \个性空间修改失败!\); }

return \;

//上传二进制文件的方法

public static void CopyFile(File src, File dst) { try {

InputStream input = null; OutputStream output = null; try { input = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); output = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); byte[] Buffer = new byte[BUFFER_SIZE]; while (input.read(Buffer) > 0) {

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

}

output.write(Buffer);

} catch (IOException e) { e.printStackTrace(); } finally { if (null != input) input.close(); if (null != output) output.close(); }

} catch (Exception e) { e.printStackTrace(); }

4.5.3 发送信息功能设计

功能:用户可以给自己的好友发送短信,只需要在以下的界面中填写收件人的姓名,主题,消息内容,并提交后,就可以发送给自己的好友,并在自己的发件箱中查看给好友的邮件。发送信息的界面如图4-4所示:

图4-4 发送信息的界面

发送信息的主要代码如下:

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

// 用户发送信息 public String sendMessage() { MemberInfo member = null; MessageRecord messageRecord = new MessageRecord(); HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); String message = null; try { MemberInfo memberInfo = (MemberInfo) session .getAttribute(\); member = memberService.findMemberinfoBynickname(this.receiver); if (member == null) { request.setAttribute(\, \对不起,您输入的收信人不存在!\); } else if (this.title.length() >= 100 || this.title.length() == 0) { request.setAttribute(\, \对不起,您的标题不能超过100个字符!\); } else if (this.content.length() > 300 || this.content.length() == 0) { request.setAttribute(\, \对不起,您输入的内容不能超过300个字符!\); } else { messageRecord.setReceiver(receiver); messageRecord.setContent(content); messageRecord.setSendDate(new Date()); messageRecord.setSender(memberInfo.getNickName()); messageRecord.setTitle(title); messageRecord.setStatus(0l); messageRecord.setSenderStatus(0l); messageRecord.setReceiverStatus(0l); message = messengerService.sendMessage(messageRecord); request.setAttribute(\, message); return \; } } catch (Exception e) { e.printStackTrace(); request.setAttribute(\, message); } return \; }

4.5.4 收件箱的功能设计

}

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

功能:在收件箱中可以查看好友发送过来的短信,如果是已经查看的短信,那么该短信的状态变为已读短信;没有查看的短信的状态是未读短信;并可以删除收件箱中的短信。收件箱的界面如图4-5所示:

图4-5 收件箱的界面

查看收件箱信息的主要代码如下: // 用户收件箱信息 public String Inbox() { HttpServletRequest request = ServletActionContext.getRequest(); String currentPage = request.getParameter(\); int num = 1; int TotalPage; HttpSession session = request.getSession(); //返回当前页 if (currentPage != null) { num = Integer.parseInt(currentPage); } MemberInfo memberInfo = (MemberInfo) session.getAttribute(\); try { //返回总个数 int sum = messengerService.findReMessages(memberInfo.getNickName()); request.setAttribute(\, sum); //所有的收到的信息封装到一个集合里面 List list = messengerService.findReMessages(memberInfo .getNickName(), (num - 1) * 5, 5); request.setAttribute(\, list); request.setAttribute(\, num); //实现分页的功能

4

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

TotalPage = sum / 5; if (sum % 5 > 0) { TotalPage = TotalPage + 1; }

request.setAttribute(\, TotalPage); if (list.size() > 0) { return \; }

return \;

} catch (MessengerServiceException e) {

request.setAttribute(\, e.getMessage()); return \; }

4.5 5 查询好友的功能设计

功能:用户可以在好友速配界面中查询与自己爱好相同的系统,可以随机的查询一位好友,也可以根据多个条件查询好友(例如查询年龄范围是:20-30,性别是:男,所在省份是山东的好友),并可以给自己的好友发送短信。

查询好友的界面如图4-6所示:

图4-6 查询好友的界面

查询好友的主要代码如下所示: // 用户好友列表

public String buddyList() {

HttpServletRequest request = ServletActionContext.getRequest(); String currentPage = request.getParameter(\); int num = 1; int sum = 0;

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

int TotalPage;

if (currentPage != null) {

num = Integer.parseInt(currentPage); } else {

num = 1; }

List buddyList = new ArrayList();

MemberInfo memberInfo = (MemberInfo) request.getSession().getAttribute( \); try {

sum = friendService.getAllFriendNum(memberInfo.getNickName()); request.setAttribute(\, sum);

List list = friendService.findAllFriends(memberInfo.getNickName(), (num - 1) * 5, 5); Iterator it = list.iterator(); while (it.hasNext()) { FriendRecord record = (FriendRecord) it.next(); try { MemberInfo member = (MemberInfo) memberService .findMemberinfoBynickname(record.getFriendName()); buddyList.add(member); } catch (MemberServiceException e) { e.printStackTrace(); } }

request.setAttribute(\, buddyList); request.setAttribute(\, num); TotalPage = sum / 5; if (sum % 5 > 0) { TotalPage = TotalPage + 1; }

request.setAttribute(\, TotalPage); return \; } catch (Exception e) {

request.setAttribute(\, e.getMessage()); return \; }

4.5 6 运动论坛查询所有贴子功能设计

功能:用户可以进入论坛的时候把所有用户发表的贴子列出来。用户可以点击上面的首页就进入社区的首页,点击发表新贴就用户可以发表自己的一个新的贴子。在下面的贴子列表中用户点击作者的名字就查看作者的信息页面,点击贴子的标题就可以查看这个贴子的相对应的信息,同时还可以对相应的贴子进入评论和回复。

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

查询所有贴子的界面如图4-7 所示:

图4-7 查询贴子的界面

查询贴子的代码

// 贴子列表 public String BBSList() { HttpServletRequest request = ServletActionContext.getRequest(); String currentPage = request.getParameter(\); int num = 1; int TotalPage; if (currentPage != null) { num = Integer.parseInt(currentPage); } try { // 贴子的数量 int sum = messengerService.findAllBBSNum(); request.setAttribute(\, sum); List list = messengerService.findAllBBS((num - 1) * 5, 5); request.setAttribute(\, list); request.setAttribute(\, num); TotalPage = sum / 5; if (sum % 5 > 0) { TotalPage = TotalPage + 1; } request.setAttribute(\, TotalPage); return \; } catch (MessengerServiceException e) { request.setAttribute(\, e.getMessage()); return \; }

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

4.5 7 后台管理会员管理功能设计

功能:管理员可以查看所有用户的信息如果用户的状态为正常状态时管理员可以注销用户账号如果用户的状态为注销管理员可以恢复用户的账号。管理员可以在点击用户的积分后查看用户积分记录。此外,管理员还可以给某一个用户增加积分。

用户后台管理界面如图4-8所示:

图4-8 后台用户管理

后台用户管理页面代码如下

// 查找用户 public String findMember() { HttpServletRequest request = ServletActionContext.getRequest(); int num = 1; int TotalPage; int sum = 0; String currentPage = request.getParameter(\); if (currentPage != null) { num = Integer.parseInt(currentPage); } request.setAttribute(\, age); request.setAttribute(\, gender); request.setAttribute(\, provinceCity); try { sum = memberService.getTotalNum(age, gender, provinceCity); request.setAttribute(\, sum);

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

List list = memberService.matchFriends(age, gender, provinceCity, (num - 1) * 5, 5);

request.setAttribute(\, list); request.setAttribute(\, num); TotalPage = sum / 5; if (sum % 5 > 0) { TotalPage = TotalPage + 1; }

request.setAttribute(\, TotalPage); return \;

} catch (MemberServiceException e) { e.printStackTrace();

request.getSession().setAttribute(\, \没有找到相关会员记录!\); return \; }

4.5 8 后台管理积分动作管理功能设计

功能:管理员可以查看所有的积分动作,并且对积分动作进行修改或者删除操作。如

管事员在选定一个积分动作以后点击选择操作就可以对这个积分动作进行修改,点击删除就可以删除这个积分动作。此外管理员还可以增加一个新的积分动作。

积分动作管理如图4-9 所示:

图4-9 后台积分动作管理

后台积分动作管理代码如下

// 所有积分动作列表

public String listPointAction() { int num = 1; int TotalPage; int sum = 0;

HttpServletRequest request = ServletActionContext.getRequest(); String currentPage = request.getParameter(\);

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

if (currentPage != null) {

num = Integer.parseInt(currentPage); } try {

sum = pointService.findAllPointActionNum(); request.setAttribute(\, sum);

List list = pointService.findAllPointAction((num - 1) * 5, 5); request.setAttribute(\, list); request.setAttribute(\, num); TotalPage = sum / 5; if (sum % 5 > 0) { TotalPage = TotalPage + 1; }

request.setAttribute(\, TotalPage); return \; } catch (MemberServiceException e) { e.printStackTrace();

request.setAttribute(\, \没有找到相关记录\); }

return \;

4.6 对本社区的说明

本系统前台用Eclipse开发,后台使用Oracle作服务器,Eclipse通过Hibernate来访问后台数据库的。 4.6.1 查询数据库的说明

下面三个小节是使用Hibernate技术查询数据库的数据所使用的环节(部分实现代码),由于Hibernate使用的是面向对象的方式访问数据库,所以首先建立一个对象,然后在数据库中建立相应对象的表格,最后建立对象和表格的映射文件。下面从建立好友对象(POJO对象),创建映射文件,和查询好友三个方面进行说明。 1.建立好友对象

package com.briup.run.dao.bean; import java.io.Serializable;

public class FriendRecord implements Serializable {

private static final long serialVersionUID = -338755691492060243L; private Long id; private String selfName; private String friendName; public FriendRecord() { }

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

}

public String getFriendName() { }

public void setFriendName(String friendName) { }

public Long getId() { }

public void setId(Long id) { }

public String getSelfName() { }

public void setSelfName(String selfName) { }

this.selfName = selfName; return selfName; this.id = id; return id;

this.friendName = friendName; return friendName;

2.好友对象的映射文件

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

3.利用Hibernate与数据库的连接

public class MessengerDaoImpl extends HibernateTemplate implements

IMessengerDao {

/* 已发信息列表 */

public List findReMessages(String nickname, int start, int end)throws Exception {

Session session = this.getSession(); Query query = session

.createQuery(\

desc\

query.setString(0, nickname); query.setLong(1, 0l); query.setFirstResult(start); query.setMaxResults(end); List list = query.list(); session.flush(); session.clear(); if (list != null) { return list; } return null; } }

4.6.2 使用本社区的说明

1.本社区的使用非常简单,如果是第一次进入本社区,可以直接注册一个新的用户名(先检查新用户名是否存在),然后设置一个6-8位的密码,最后返回用户登录界面完成登录;如果是己经注册过的用户,可以直接登录;如果用户忘记了自己的密码,可以通过找回密码界面找回密码,然后进入用户登录界面完成登录。

2.进入主界面后,用户可以使用左侧的信息管理按钮,修改个人的基本信息;没有个人空间的用户可以单击左侧的个人空间管理按钮,创建个人空间;有个人空间的用户可以单击左侧的个人空间管理按钮,修改自己的个人空间信息。

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

3.用户可以随机的查找一个好友,也可以根据条件查找多个好友,己经成为好友的名字会出现在自己的好友列表中;在好友列表中,如果想删除好友,可以先把好友移动到黑名单;在黑名单中,可以彻底的删除好友,也可以把黑名单中的好友移动到好友列表中。

4.在好友列表中,可以给自己的好友发送短信,并可以管理自己的发件箱和收件箱中的短信。

5.用户可以进入运动论坛发表自己对的看法和最近的一些想法。其它用户对他的想法和看法作一个回复和评论。用户还可以查看发发贴子的作者的相关信息。

6.管理员可以进入后台对会员的信息、积分动作、管理员进行管理。管理员可以注销或恢复会员作用的账号。管理员可以给某一个表现好的用户加积分,查看会员积分及积分记录。

7.管理员可以对积分动作进行管理,可以增加一个新的积分动作,修改一个原有的积分动作或者是删除一个积分动作。

8.为了便于系统的管理减小只有一个管理员的工作压力管理员可以注册一个新的管理员账号对本系统进行管理。

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

第5章 系统测试与维护

5.1 软件测试

软件测试的目的是尽可能多的发现并排除软件中潜藏的错误,最终把一个高质量的软件系统交给用户使用[17]。

1.测试目标

(1).测试是为了发现程序中的错误而执行程序的过程。

(2).好的测试方案是极可能迄今为止尚未发现错误的测试方案。 (3).成功的测试是发现了至今为止尚未发现的错误的测试。 2.测试方法

测试的方法分为白盒法和黑盒法。 (1).黑盒法

如果已经知道了软件应该具有的功能,可以通过测试来检验是否每个功能都能正常使用,我们把它称为黑盒测试。对于软件测试而言,黑盒测试是把程序看成一个黑盒子,完全不考虑程序内部结构和处理过程。也就是说,黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明的规定正常的使用,程序是否能够适当的接收输入数据产生正确的输出信息,黑盒测试又称为功能测试。

(2).白盒法

与黑盒测试相反,白盒测试是可以把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程。这种方法按照程序内部的逻辑测试程序,检验程序中的每条通路是否都能按预定要求正确工作。白盒测试又称为结构测试。

无论怎样强调软件测试的重要性和它对软件可靠性的影响都不为过,他的根本目标是尽可能多的发现并排除软件中潜藏的错误,最终把一个高质量的软件交给用户使用。

对于开发出的干部信息管理系统来说,它并不是一个特别复杂的系统,考虑到时间问题,我采用了黑盒测试法进行测试。他只检查程序功能是否按照规格说明书的规格正常使用,程序是否能适当的接收输入数据产生正确的输出信息,并保持外部信息的(如,数据库或文件)的完整性。测试如下:

①.管理平台中用户信息的添加测试

在用户注册的界面中依次选填内容,测试结果正确无误,并显示添加成功。 ②.根据条件查询好友测试

在页面中输入查询条件“年龄从20到30”,“省份---山东”,点击查询按钮后,查到该用户信息,无误。在其它的测试中,点击查询按钮都能查到相关的信息,说明系统无误。

③.系统设置测试

5

基本Spring+Struts2+Hibernate的运动社区的设计与实现

通过登录界面让你输入用户名和密码可以登录此系统,如果用户名或密码错误,会提示你输入的用户名或密码错误,请从新输入。因为我的测试里面都是大同小异,在这里不在累赘。

3.测试结论

对以上几个功能的测试整体上符合要求,其操作流程也相当的清晰、方便、易懂。故此几项测试成功。由于时间及篇幅限制,仅就主要的几项进行黑盒测试测试过程中发现了不少的问题,通过对问题的解决我从中掌握了很多的编程经验和技巧,同时也知道自己对软件编程的很大不足并且真正体会到软件测试的重要性。

5.2 运行和维护

经过综合的测试后,本系统就可以运行了,经过运行测试本系统运行状态良好。 软件维护是软件生命周期的最后一个阶段,它处于系统投入生产性运行以后的时期中,因此不属于系统开发过程。

所谓软件维护就是在软件交付使用之后,为了改正错误或满足新的需要而修改软件的过程。我们可以通过描述软件交付使用后可能进行的四项活动,具体定义软件维护

[18]

1.改正性维护

因为软件测试不可能暴露出一个大型软件系统的所有潜在错误,所以必然会有第一

项维护活动:在任何软件的使用期间,用户必然发现程序,并且把他们遇到的问题报告给维护人员。我们把诊断和改正错误的过程称为改正性维护。

2.适应性维护

计算机科学技术的各个方面都在迅速进步,大约每36个月就有新一代的硬件出现,因此,适应性维护,也就是为了和变化的环境适当的配合而进行的修改软件的活动,是既必要又经常的维护活动。

3.完善性维护

当一个软件系统顺利的进行时,在使用软件的过程中用户往往提出增加新功能或修改已有功能的建议,还可能提出一般性修改意见。为了满足这类要求,需要进行完善性维护。这项维护活动通常占软件维护的大部分工作。

4.预防性维护

为了改进未来可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件时出现的维护活动,我们把它称为预防性维护。

上述四类软件维护活动都必须应用于整个软件配置,维护软件文档和维护软件的可执行代码是同样重要的。

6

结 论

通过这次毕业设计,学到了许多实用的知识。在大学期间偏重于理论的学习,动手的能力相对较差。经过这次毕业设计,把以前所学到的书本知识和实际应用结合了起来,对书本上的理论知识有了深层次的理解,意识到了学习计算机要多动手,多实践,理论和实践相结合,才能真正的学好计算机。

本系统的设计与实现是以Oracle作为开发工具,结合Oracle数据库完成的。在这一段时间里,查阅了大量的资料,完成了对网络跑步爱好者社区系统的开发。

根据跑步爱好者的实际需要,经过系统分析,该系统包含如下几个模块及详细功能:本系统主要包含五个模块:用户信息管理模块、短信息管理模块、好友管理模块,运动论坛模块和管理员后台管理模块。每一个模块都进行了详细的设计。使用本系统可以使运动爱好者不用在进行面对面的交流,可以直接在网上进行交流。

整个系统主题较为鲜明,版面布局合理,界面美观,内容比较充实。

毕业设计及论文的完成是一次宝贵的学习和研究的过程,让我受益匪浅,使我深刻体会到了学习的乐趣

6

注释

[注1].顾名思义,它起到的作用是将你的办公做到自动化,有基于web方式的(只要打开特定的WEB页就能工作),还有基于企业数据库方式的(有专用的软件支持),一般来说OA在企业中的应用不外乎通知行文,人事管理、财务流程、日常事务纪要和提醒等等功能。

[注2].概念模型是对真实世界中问题域内的事物的描述,不是对软件设计的描述。概念的描述包括:记号、内涵、外延,其中记号和内涵(视图)是其最具实际意义的。

[注3].Oracle9i[3]Oracle 9i 2000 年 10 月在 Oracle Open World 上发布,为 Oracle 数据库、应用服务器和开发工具引进了许多新功能。Oracle9i是业界第一个完整、简单的用于互联网的新一代智能化的、协作各种应用的软件基础架构。Oracle9i 实际上是指 Oracle9i Database, Oracle 9i Application Server 和Oracle9i Developer Suite的完整集成。随着软件逐渐开始转变为一种托管服务( hosted services),具有internet上的高伸缩性能的、智能化的、和可靠的Oracle9i 将成为高质量的电子商务服务实现的关键软件。

6

参考文献

[1](美)Cav S.Horstmann Gary Cornell著. 叶乃文等译. JAVA2核心技术[M] 机械工业出版社 2006.

[2]计磊,李里,周伟.精通J2EE-Eclipse Struts Hibernate Spring 整合应用案例[M]. 人民邮电出版社.2007

[3](美)Fabio Arciniegas. XML开发指南[M]. 清华大学出版社, 2003.

[4]吴京慧, 杜宾, 杨波编. Oracle数据库管理及应用开发教程. 清华大学出版社, 2007

[5]赵伯山 著 . Oracle 9i 中文版实用培训教程[M]. 清华大学出版社, 2003 [6]王庆育 著 .软件工程[M]. 清华大学出版社,2004

[7]吴洁明,袁山龙 著 .软件工程应用实践教程[M]. 清华大学出版社,2003 [8]李华飚 著 .精通Java中间件编程 [M]. 中国水利水电出版社,2003

[9](美) Ron Hardman, Michael McLaughlin. Oracle PL/SQL专家指南 PL/SQL解决

方案的设计与开发[M]. 清华大学出版社, 2006

[10]陈天河著 Struts,Hibernate,Spring 集成开宝典 电子工业出版社 [11]李刚编著 Struts2 权威指南基于WebWork核心的MVC开发电子工业出版社 [12](美)Rima Patel Sriganesh等编著 罗时飞译 精通EJB3.0 电子工出版社 [13]梁立新 编著 项目实践精解:基于Struts-Spring-Hibernate的Java应用开发

电子工业出版社 2006

[14] (美)约翰逊著 蒋培译. Spring框架高级编程 机械工业出版社2006

[15](美)Harvey M.Deitel等著 邱仲潘 等译 Java Web 服务高级教程[M].机械工业出

版社,2003.7

[16]元晓静 著 基于C\\S架构的软件项目实训 电子工业出版 ISBN:7121008718

6

致谢

本论文是在李文锋老师的悉心指导和热情关怀下完成的。李老师渊博的学识、严峻的治学态度及随和的为人之道给我留下了难以磨灭的印象,这将使我终身受益,同时,李老师在生活上也给了我极大的鼓励和帮助。为此,我要对他致以最衷心的感谢。

在本科学习的四年中,我与同学建立了深厚的友谊,他们在我遇到困难时无私地伸出援助之手,对他们的帮助我特别感谢。最后,对关心、支持我的亲人和老师致以最衷心的感谢。

6

附 录

附录A系统积分的说明

注册:注册成功,给此会员加50分。

推荐:当你注册时,填写推荐人,如果此推荐人存在,则给此推荐人加20分。 登陆:每次登陆加3分,在同一天中,多次登陆只算一次。 个人空间:创建个人空间加25分。

附录B会员级别的定义规则

在此社区,会员共分为5个级别: 业余爱好者:积分(0—300) 运动小将:积分(300---700) 运动健将:积分(700---1200) 专业运动员:积分(1200—1800) 顶级运动员:积分(1800—2500)

6