商场商品销售管理系统
摘要: 随着网络技术在人们生活中的深入,它对人们的生活带来了越来越大的便利,相应人们各个
方面对它的依赖也越来越大,对于现在的社会,人们是不能离开网络了。相应的商场的管理也应该
借助于网络技术,这样要以节约大量的人力、物力资源,更重要的是能够准确、快速的反应整个商
场的进货、销售情况,进而反应商场的需求,让决策者能够做出适应市场,能够获得共更多赢利的
决策。基于这些方面的好外,本系统就运应而生。对于网络的应用,现在主流有.NET 和 JAVA 两种
平台,本系统使用的是 JAVA 平台完成,采用 B/S 模式,使用浏览器作客户端。对于 JAVA 平台又
有很多的技术支持,对于本系统具体说是一个 J2EE 项目,其中用使用了开源构架 Struts、Hibernate,
以组件式开发,用工厂对各个组件进行管理,降低各个组件之间的耦合度。
关键词:J2EE;持久层;DAO;业务逻辑;表现;组件;耦合;工厂
Sales management system for shopping malls
Abstract:With the network technology in people's lives in depth,it brought people's lives more and more
convenience and various aspects of people it has become increasingly dependent on. So, for now, in our
society, people can not leave the network. The appropriate management of shopping malls should also be
through the use of network technology, this should save a lot of manpower, material resources and, more
importantly, to accurate and rapid response of the stock throughout the shopping mall, sales, and then
respond to the demand for shopping malls, so that decision-makers able to adapt to the market, able to
obtain a total of more profitable decision-making. Based on these good things, the system should be on the
delivery of Health. For network applications, there is now mainstream. NET and JAVA two platforms, the
use of the system is completed JAVA platform, the use of B / S mode,and the use of the client browser.
JAVA platform for a lot of technical support, specifically for the system is a J2EE project, which uses the
open source framework using Struts, Hibernate, a component-based development, with the factory
management of the various components and lower the various components Coupling between.
Key words: J2EE perdure service logic discreteness coupling factory
目录
摘要...................................................................................................................................................................I
关键词...............................................................................................................................................................I
Abstract .............................................................................................................................................................I
Key words .........................................................................................................................................................I
绪论 ..................................................................................................................................................................1
本系统研究的意义......................................................................................................................................1
本系统的目的、内容、要求......................................................................................................................1
目的................................................................................................................................................1
内容................................................................................................................................................1
要求................................................................................................................................................1
1 开发环境与技术的介绍 ...............................................................................................................................1
发环境....................................................................................................................................................1
、硬件环境 .....................................................................................................................................1
、软件环境 .....................................................................................................................................1
、环境配置 .....................................................................................................................................1
、所用技术的介绍.................................................................................................................................2
、java ..............................................................................................................................................2
、Struts............................................................................................................................................2
、Hibernate .....................................................................................................................................3
、Jsp................................................................................................................................................3
、Tomcat.........................................................................................................................................4
2.需求分析 .......................................................................................................................................................4
、可行性分析.........................................................................................................................................4
、 市场分析 ...................................................................................................................................4
、 政策分析 ...................................................................................................................................4
、 竞争实力分析 ...........................................................................................................................4
、技术可行性分析 .........................................................................................................................4
、 时间和资源可行性分析 ...........................................................................................................5
、 知识产权分析 ...........................................................................................................................5
、理解需求.............................................................................................................................................5
3.概要设计 .......................................................................................................................................................5
、系统总体设计.....................................................................................................................................5
、项目需求 .....................................................................................................................................5
、系统实体 E-R 图 ........................................................................................................................5
、模块初步分析.....................................................................................................................................6
、商品信息管理模块 .....................................................................................................................6
、客户信息管理模块 .....................................................................................................................6
、商品进货管理模块 .....................................................................................................................6
、商品销售管理模块 .....................................................................................................................6
、数据分析模块 .............................................................................................................................6
、业务流程图.........................................................................................................................................6
4.详细设计 .......................................................................................................................................................7
、数据库设计.........................................................................................................................................7
、数据库表结构 .............................................................................................................................7
、用 hibernate 实现持久层 ............................................................................................................9
、DAO 组件设计 .................................................................................................................................12
、.........................................................................................................................12
、 .....................................................................................................................一三
、 ...................................................................................................................一三
、 .............................................................................................................................14
、...........................................................................................................................14
、 .......................................................................................................................一五
、 ........................................................................................................................一五
、业务逻辑组件设计.......................................................................................................................一五
、 ................................................................................................................16
、.............................................................................................................16
、 .............................................................................................................16
、...............................................................................................................17
、 .................................................................................................................17
、 ...........................................................................................................17
、 ...............................................................................................................17
、模块设计.......................................................................................................................................一八
、管理员管理模块 ...................................................................................................................一八
、商品信息管理模块 ...................................................................................................................19
、会员信息管理模块 ...................................................................................................................20
、商品进货管理模块 ...................................................................................................................21
、商品销售管理模块 ...................................................................................................................22
、系统架构详细设计...........................................................................................................................23
、系统架构说明 ...........................................................................................................................23
、DAO 层实现和事务控制 .........................................................................................................24
、使用配置文件解耦 ...................................................................................................................25
、使用工厂管理组件 ...................................................................................................................25
、实现 Web 层逻辑 .....................................................................................................................28
5、系统测试 ..................................................................................................................................................28
、举例测试...........................................................................................................................................29
、测试管理员登录功能 ...............................................................................................................29
、测试项目...........................................................................................................................................31
、单元测试 ...................................................................................................................................31
、集成测试 ...................................................................................................................................32
、系统测试 ...................................................................................................................................33
绪论
本系统研究的意义
本系统是面向超市内部工作人员的,管理整个超市商品的进口与销售信息进行监控,能够方便
地得出某个季度的商品销售情况,反应市场动态。研究它使我们的能够更好地把握市场,了解市场,
把握市场规律,进而是我们能够更好地利用市场的自动调节机制,在这商场经济强烈竞争下枪得先
机。
本系统的目的、内容、要求
目的
管理整个超市商品的进口与销售信息进行监控,能够方便地得出某个季度的商品销售情况,反
应市场动态。本系统能够节约大量人力、物力资源,能够及时反应市场需求动态,也就使超市老板
能够更快速把握市场,获得尽可能多的收益。
内容
本系统是基于 B/S 的一个 JAVAWEB 系统,它是一个商场商品销售管理方面的系统,是面向内
部工作人员而设计的。它能对市场商品的进、销、存进行全面管理,各种操作都会有记录备案。对
商品实现完全监控,对各个时期内的商品情况进行统计查询等。
要求
能够准确地对商品进化、销售、保存等操作进行数据的保存,能够进行对数据的统计与输出。
达到所谓的完全跟踪控制。
1 开发环境与技术的介绍
开发环境
、硬件环境
CPU:Inter core 双核
内存:DDR3 2G
硬盘:希捷 250G 7500 转
、软件环境
操作系统:WindowsXP SP3
IDE 环境:MyEclipse
应用服务器:Tomcat
数据库:
JDK:
、环境配置
JDK 的环境配置:以安装路径 C:\ _02 为例说明
我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:
JAVA_HOME=C:\_02
CLASSPATH=.;C:\_02\lib\;C:\ _02\lib\;C:\ _02\bin;
path=C:\_02\bin;
Tomcat 的环境配置:以安装路径 C:\ Apache Software Foundation\Tomcat 为例进行说明
变量名:CATALINA_BASE
变量值:C:\Apache Software Foundation\Tomcat ;
变量名:CATALINA_HOME
变量值:C:\Apache Software Foundation\Tomcat ;
点击确定后在 classpath 中加入%CATALINA_HOME%\common\lib\;
在 path 中加入%CATALINA_HOME%\lib;
个人建议从网上下载包含源代码的 Tomecat 包。
、所用技术的介绍
本系统采用 B/S 模式开发及运用,是轻量级 J2EE 应用,因此主要运用的技术是 java,还有传
统 J2EE 应用框架 struts 和 hibernate,以及 javaWeb 的一些技术 JSP、HTML、XML 等。下面就对主
要的进行介绍。
、Java
Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言(以下简称 Java 语言)
和 Java 平台的总称。Java 是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中
立的,可移植的,性能优异、多线程的动态语言。2009 年 04 月 20 日,oracle(甲骨文)收购 sun,
java 因此并归甲骨文公司。
Java 平台由 Java 虚拟机(Java Virtual Machine)和 Java 应用编程接口(Application Programming
Interface、简称 API)构成。Java 应用编程接口为 Java 应用提供了一个独立于操作系统的 标准接口,
可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个 Java 平台之后,Java 应用程序就可
运行。现在 Java 平台已经嵌入了几乎所有 的操作系统。这样 Java 程序可以只编译一次,就可以在
各种系统中运行。Java 应用编程接口已经从 版发展到 版。目前常用的 Java 平台基 于
,最近版本为 。
Java 分为三个体系 JavaSE(Java2 Platform Standard Edition,java 平台标准版),JavaEE(Java 2
Platform,Enterprise Edition,java 平台企业版),JavaME(Java 2 Platform Micro Edition,java 平台微型
版)。本系统属于 JavaEE 体系。
、Struts
Struts 是 Apache 软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta 项目中的一个子
项目,并在 2004 年 3 月成为 ASF 的顶级项目。它通过采用 Java Servlet/JSP 技术,实现了基于 Java
EE Web 应用的 Model-View-Controller〔MVC〕设计模式的应用框架〔Web Framework〕,是 MVC
经典设计模式中的一个经典产品。
在 Java EE 的 Web 应用发展的初期,除了使用 Servlet 技术以外,普遍是在 JavaServer Pages
(JSP)的源代码中,采用 HTML 与 Java 代码混合的方式进行开发。因为这两种方式不可避免的
要把表现与业务逻辑代码混合在一起,都给前期开发与后期维护带来巨大的复杂度。为了摆脱上述
的约束与局限,把业务逻辑代码从表现层中清晰的分离出来,2000 年,Craig McClanahan 采用了 MVC
的设计模式开发 Struts。后来该框架产品一度被认为是最广泛、最流行 JAVA 的 WEB 应用框架。
2006 年,WebWork 与 Struts 这两个优秀的 Java EE Web 框架(Web Framework〕的团体,决定合
作共同开发一个新的,整合了 WebWork 与 Struts 优点,并且更加优雅、扩展性更强的框架,命名
为 “Struts 2”,原 Struts 的 版本产品称为“Struts 1”。本系统使用的仍然是 struts1。
在 Struts 中,已经由一个名为 ActionServlet 的 Servlet 充当 控制器(Controller)的角色,根据描述
模型、视图、控制器对应关系的 的配置文件,转发视图(View)的请求,组装响
应数据模型(Model)。在 MVC 的 模型(Model)部分,经常划分为两个主要子系统(系统的内
部数据状态与改变数据状态的逻辑动作),这两个概念子系统分别具体对应 Struts 里的 ActionForm
与 Action 两个需要继承实现超类。在这里,Struts 可以与各种标准的数据访问技术结合在一起,包
括 Enterprise Java Beans(EJB), JDBC 与 JNDI。在 Struts 的视图(View) 端,除了使用标准的
JavaServer Pages(JSP)以外,还提供了大量的标签库使用,同时也可以与其他表现层组件技术(产
品)进行整合,比如 Velocity Templates,XSLT 等。通过应用 Struts 的框架,最终用户可以把大
部分的关注点放在自己的业务逻辑(Action)与 映射关系的配置文件()中。
、Hibernate
Hibernate 是一个开放源代码的对象关系映射(Object/Relection Mapping)框架,它对 JDBC 进行了
非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维 来操纵数据库。
Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序使用,也可以在
Servlet/JSP 的 Web 应用中使用,最具革命 意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取
代 CMP,完成数据持久化的重任。
Hibernate 的核心接口一共有 5 个,分别为:Session、SessionFactory、Transaction、Query 和 Configuration。
这 5 个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够
进行事务控制。
、Jsp
JSP(Java Server Pages)是由 Sun Microsystems 公司倡导、许多公司参与一起建立的一种动态网页
技术标准。JSP 技术有点类似 ASP 技术,它是在传统的网页 HTML 文件(*.htm,*.html)中插入 Java 程
序段(Scriptlet)和 JSP 标记(tag),从而形成 JSP 文件(*.jsp)。
用 JSP 开发的 Web 应用是跨平台的,即能在 Linux 下运行,也能在其他操作系统上运行。
JSP 技术使用 Java 编程语言编写类 XML 的 tags 和 scriptlets,来封装产生动 态网页的处理逻辑。
网页还能通过 tags 和 scriptlets 访问存在于服务端的资源的应用逻辑。JSP 将网页逻辑与网页设计和
显示分离,支持可重用的 基于组件的设计,使基于 Web 的应用程序的开发变得迅速和容易。
Web 服务器在遇到访问 JSP 网页的请求时,首先执行其中的程序段,然后将执行结果连同 JSP
文件中的 HTML 代码一起返回给客户。插入的 Java 程序段可以操作数据库、重新定向网页等,以实
现建立动态网页所需要的功能。
JSP 与 Java Servlet 一样,是在服务器端执行的,通常返回该客户端的就是一个 HTML 文本,因
此客户端只要有浏览器就能浏览。
JSP 的 规范的最后版本是 1999 年 9 月推出的,12 月又推出了 规范。目前较新的是
规范, 规范的征求意见稿也已出台。
JSP 页面由 HTML 代码和嵌入其中的 Java 代码所组成。服务器在页面被客户端请求以后对这
些 Java 代码进行处理,然后将生成的 HTML 页面返回给客户端的浏览器。Java Servlet 是 JSP 的技
术基础,而且大型的 Web 应用程序的开发需要 Java Servlet 和 JSP 配合才能完成。JSP 具备了 Java
技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
自 JSP 推出后,众多大公司都支持 JSP 技术的服务器,如 IBM、Oracle、Bea 公司等,所以 JSP 迅速
成为商业应用的服务器端语言。
、Tomcat
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,目前最新版本是 .一八(截止到
2008-08-27)。
Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,
由 Apache、Sun 和其他一些公司及个人共同开发而成。由于有了 Sun 的参与和支持,最新的 Servlet
和 JSP 规范总是能在 Tomcat 中得到体现,Tomcat 5 支持最新的 Servlet 和 JSP 规范。因为
Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱并得到了部分软件开发商的
认可,成为目前比较流行的 Web 应用服务器。
Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡
与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序
员都可以更改它或在其中加入新的功能。
Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普
遍使用,是开发和调试 JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配
置好 Apache 服务器,可利用它响应对 HTML 页面的访问请求。实际上 Tomcat 部分是 Apache 服
务器的扩展,但它是独立运行的,所以当你运行 tomcat 时,它实际上作为一个与 Apache 独立的进
程单独运行的。
这里的诀窍是,当配置正确时,Apache 为 HTML 页面服务,而 Tomcat 实际上运行 JSP 页面和 Servlet。
另外,Tomcat 和 IIS、Apache 等 Web 服务器一样,具有处理 HTML 页面的功能,另外它还是一个
Servlet 和 JSP 容器,独立的 Servlet 容器是 Tomcat 的默认模式。不过,Tomcat 处理静态 HTML 的
能力不如 Apache 服务器。
2.需求分析
、可行性分析
、 市场分析
随着商场经济的快速发展,对市场信息的把握以及快速的、精确的处理各种事务的能力就越来
越显得重要,就要这种形势下,商场商品销售管理系统就运行而生,市场前景很好。
、 政策分析
我们做的这个系统是用于毕业设计,没有触及法律法规,因此,政策上是一定可行的。相应还
有指导老师的帮助。
、 竞争实力分析
对于用于毕业设计而言,并不存在竞争现象。
、技术可行性分析
所有需要用到的技术都是 J2EE 方向的常用技术,对于我们而言,大多数技术都已学过,因此,
在技术方面我们没有多大障碍,这是可行的。
、 时间和资源可行性分析
我们毕业设计共有半个学期的时间,从本系统的需求分析、概要设计、编码和测试都有充足的
时间,这也是有由进度表所表现出来的。对于我们的设计,不管是硬件还是软件资源除了一台电脑
外,其它都是一些网上可下载的免费软件。因此这一点上也是可行的。
、 知识产权分析
本系统现定于只用于毕业设计用,不用于商业动作,而且完全是自己所创造,所以不存在知识
产权问题。
、理解需求
本系统是面向超市内部工作人员的,管理整个超市商品的进口与销售信息进行监控,能够方便
地得出某个季度的商品销售情况,反应市场动态。本系统能够节约大量人力、物力资源,能够及时
反应市场需求动态,也就使超市老板能够更快速把握市场,获得尽可能多的收益。
超级管理员(经理)对一般管理员(收银员)进行添加、删除及基本信息的修改,也就是说,超级
管理员有一般管理员的功能外还有对一般管理员进行管理的功能。
当超市进了一批货物后,由一般管理员对货物进行往系统里录入这批货物的一些相关信息。当顾客
购买一些商品,由一般管理员进行修改系统的商品销售信息,一般管理员就负责商品信息的录入与
维护。当一定时间过去了,超级管理员会对这段时间内商品的销售情况进行一个归总,也就生成报
表反应销售、利润等,根据这个结果制定下一步计划。
3.概要设计
、系统总体设计
总体设计是对整个项目的总体概述,这里的总体设计主要是从项目实际需求和实体 E-R 图入手。
、项目需求
需求号 需求名
1 超级管理员修改自己的密码及添加一般管理员
2 一般管理员登录,修改自己的信息
3 商品类型管理,商品类型的新增,删除和修改
4 商品管理:商品的新增,删除和修改
5 供应商管理:供应商的新增,删除和修改
6 进货的管理:对所进的货物进行添加及各种类型数据的修改
7 销售的管理:对所出售的货物进行添加及各种类型数据的修改
8 查看商品、会员、供应商、进货及销售的详细情况
9 对一定时间期内的进货及销售情况进行总合,算出在这期间的利润等
数据(相当于报表)
、系统实体 E-R 图
系统实体 E-R 图是对整个系统中的实体以及实体之间的关系进行说明,根据上面的需求分析,
本系统中有 7 个实体,分别是:provide(商品供应商), goods(商品), type(商品类型), admin
(管理员), user(会员), sell(销售明细), stock(进化明细)。
以下是本系统的实体 E-R 图:
、模块初步分析
根据项目的需求,把本系统画分成以下五个模块:
商品信息管理模块
客户信息管理模块
商品进货管理模块
商品销售管理模块
数据分析模块
、商品信息管理模块
商品信息管理模块主要是对商场中的商品的增加、删除、修改、查询等功能的管理,负责商品
的日常的进销存。
、客户信息管理模块
客户信息管理模块也就是对商场会员的管理和维护,增加、删除、修改、查询等功能。
、商品进货管理模块
商品进货管理模块是对商场进货信息的管理和维护,主要是增加、删除、修改、查询等功能 。
、商品销售管理模块
管理模块是对商场商品销售的管理和维护,主要是增加、删除、修改、查询等功能。
、数据分析模块
数据分析模块是对商场的商品、会员、供应商等的信息集中进行分析,得出一些有用的数据的
功能。
、业务流程图
这个系统业务流程图是对商场的业务流程作一个整体的描述。
goods
user sell
provide type
[n:1] [1:n]
[n:1]
admin
stock provide
[1:n]
4.详细设计
、数据库设计
根据系统实体 E-R 图设计,本系统主要用到 7 张表:管理员表:admin,用户信息表 user, 商品
表 goods, 商品类别表 type, 供应商表 provide,进货明细表 stock,销售明细表 sell。
、数据库表结构
admin(管理员表)
字段名 类型 长度 允许为空 备注
admin_id int 10 no 管理员编号,主键(自增)
admin_name String 50 no 管理员姓名
admin_password string 50 no 管理员密码(MD5 加密)
admin_flag boolean 1 no 标示管理员级别(true 为超级管
理员,false 为一般管理员)
一般管理
员
进货
信息
是否是新商品 否
更新商品
信息
是否是新商品
类型
是
添加新商
品类型信
息
是否是新供应
商
是
添加新供
应商信息
添加进货
信息
销售
信息
录入
进货
信息
录入
销售
信息
更新商品
信息
更新商品
销售信息
会员
信息
录入
会员
信息
添加新会
员信息
是否是新会员
是
超级管理
员
管理员
信息
录入管
理员信
息
添加管理
员信息
商品类
型信息
录入商品
类型信息
添加新商
品信息
是
查询信
息
录入查
询条件
信息
执行查询
DB
user(用户表)
字段名 类型 长度 允许为空 备注
user_id string 20 no 用户编号,主键
user_name String 50 no 用户名
user_email string 50 no E_mail
user_tel string 50 no 电话
user_address string 50 no 地址
user_regTime date no 注册时间
user_postcode string 50 no 邮政编码
goods(商品表)
字段名 类型 长度 允许为空 备注
goods_id string 20 no 商品编号,主键
type_id string 20 no 类型编号(对应 PK:type 表的 type_id)
goods_name string 50 no 商品名
goods_price double 10 no 价格
goods_discount double 10 no 折扣
goods_amount int 10 no 总数量
goods_date date no 最近上架时间
goods_remain int 10 no 剩余数量
goods_nominate boolean no 是否推荐商品(默认不是)
goods_picture string 50 no 图片(只存图片 URL,默认为
image/)
goods_desc string(text) yes 对商品的描述信息
goods_typeName string 50 no 商品类型名
type(商品类型表)
字段名 类型 长度 允许为空 备注
type_id string 20 no 类型编号,主键
type_name string 50 no 类型名
type_highLevelId int 10 Yes 上级类型编号(对应 PK:type 表的
type_id)
说明:本系统对商品类型最多分为两级,最高级的 type_highLevelId 属性为空,比如“衣服”这一种类
型就没有上一级
provide(供应商表)
字段名 类型 长度 允许为空 备注
provide_id string 20 no 供应商编号,主键
provide _name String 50 no 供应商名
provide _email string 50 no E_mail
provide _tel string 50 no 电话
provide _address string 50 no 地址
provide _postcode string 50 no 邮政编码
provide _desc string 50 no 对供应商的描述
stock(进货明细表)
字段名 类型 长度 允许为空 备注
id String 20 no 主键
stock_id string 20 no 进货编号(以当天时间+000001,依次自增,如:
20080808000003 就是北京奥运会那天的第三
张定单)
goods_id string 20 no 品编号(对应 FK:goods 表的 goods_id)
provide_id string 20 no 供应编号(对应 FK:provide 表的 provide_id)
stock_price double 10 no 进货价格
stock_amount int 10 no 进货的数量
stock_time Date no 进货时间
sell(销售明细表)
字段名 类型 长度 允许为空 备注
id string 20 no 主键
sell_id string 20 no 定单编号(以当天时间+000001,依次自增,
如:20080808000003 就是北京奥运会那天
的第三张定单)
goods_id string 20 no 商品编号(对应 FK:goods 表的 goods_id)
user_id String 50 no 用户编号(对应 FK:user 表的 user_id)
sell _amount int 10 no 定单数量
sell _date Date no 定单时间
、用 hibernate 实现持久层
、创建数据库
本系统数据库名字使用 goods,因此创建数据库就打开 MySQL Connand Line Client,输入密码
登陆成功后,在命令行中输入创建数据库语句:create database goods;后回车就完成了。如图:
、配置文件
要完成使用 hibernate,必须对 hibernate 进行一些基本配置,这个文件是一个 XML 文件:
。这个文件配置了所用数据库的驱动,连接数据库服务的 URL,连接数据库的用户
名、密码,指定连接池(本系统使用 c3po),连接数据库所作用的方言,数据库映射文件等。下以
就是本系统的此配置文件:
<?xml version='' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD
"
<!-- Generated by MyEclipse Hibernate Tools.-->
<hibernate-configuration>
<session-factory>
<property name="">root</property>
<property name="">
jdbc:mysql://localhost/goods
</property>
<property name="dialect">
</property>
<property name="">
mysql driver
</property>
<property name="_class">
</property>
<property name="">mysql</property>
<property name="">update</property>
<property name="show_sql">true</property>
<!-- c3p0 数据库连接池 -->
<property name="_size">20</property>
<property name="_size">5</property>
<property name="">一八 00</property>
<property name="_statements">50</property>
<!-- PO 数据库映射文件. -->
<mapping resource="" />
<mapping resource="" />
<mapping resource="" />
<mapping resource="" />
<mapping resource="" />
<mapping resource="" />
<mapping resource="" />
</session-factory>
</hibernate-configuration>
、映射文件
本系统采用 hibernate 实现持久层访问,hibernate 持久层访问需要使用 POJO(Plain Old Java
Objects)和数据库映射文件。根据系统实体 E-R 图可以得出本系统有 7 个持久化类:Admin、
Goods、User、Sell、Stock、Provide、Type。这里以 Admin 举例,其 POJO 如下:
package ;
public class Admin {
private int admin_id;
private String admin_name;
private String admin_password;
private boolean admin_flag;
public int getAdmin_id() {
return admin_id;
}
public void setAdmin_id(int admin_id) {
_id = admin_id;
}
public String getAdmin_name() {
return admin_name;
}
public void setAdmin_name(String admin_name) {
_name = admin_name;
}
public String getAdmin_password() {
return admin_password;
}
public void setAdmin_password(String admin_password) {
_password = admin_password;
}
public boolean getAdmin_flag() {
return admin_flag;
}
public void setAdmin_flag(boolean admin_flag) {
_flag = admin_flag;
}
}
根据 POJO 编写每一个持久化类的映射文件,映射文件就完成持久化类与数据库之间的联系,业务
逻辑类操作这些持久化类也就操作了数据库。映射文件配置了此持久化类与数据库表之间的对应关
系,及表的主键、外键等。Admin 这个持久化类对应的映射文件 如下:
<?xml version="" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD
" >
<hibernate-mapping package="">
<class name="Admin" table="admin">
<id name="admin_id" >
<generator class="native"/>
</id>
<property name="admin_flag"/>
<property name="admin_name"/>
<property name="admin_password"/>
</class>
</hibernate-mapping>
、生成数据表
以上的配置都完成后,就可以往数据库导入数据表。运行带 main()方法的类
就要把表导入数据库了。 如下:
public class ExportDB {
public static void main(String[] args) {
Configuration conf = new Configuration().configure();
SchemaExport export = new SchemaExport(conf);
(true, true);
}
}
在此要说明 Configuration conf = new Configuration().configure();这句是读取配置文件,默认是
。
、DAO 组件设计
DAO 模式是一种基本的 J2EE 设计模式,DAO 模式的关键在于系统提供了一层 DAO 组件,所
有的 DAO 组件都封装在这层,DAO 可以向下访问数据库,所有数据表基本的 CRUD 操作都通过
DAO 组件来完成,业务逻辑组件则依赖于 DAO 组件来实现系统业务逻辑需求。
针对数据库设计细节,结合 UML 统一建模语言设计 DAO 组件中的类,这些类提供对数据库的原子
操作,让所有的对数据表的操作封装在 DAO 层。这样做使得业务逻辑组件无须关心数据访问的实现,
而是专注于业务逻辑的实现。主要的 DAO 组件类有 ,,
,,,,。
、
类是提供对数据库表 admin 的各种数据库逻辑操作功能:
Admin login(Session session,String name,String password) 根据管理员名和密码加载管理员,查询数据
库
void createAdmin(Session session,Admin admin) 创建一个管理员,更新数据库
void updateAdmin(Session session, String password, int id) 更新管理员密码,更新数据库
void deleteAdmin(Session session,int id) 删除一个管理员,更新数据库
List<Admin> getAdmin(Session session) 查询所有管理员,查询数据库
UML 图如下:
、
类是提供对数据库表 goods 的各种数据库逻辑操作功能:
void saveGoods(Session session,Goods goods) 保存一种商品,更新数据库
List<Goods> getGoods(Session session,String type,int beginPage,int listPage) 分页查询商品某类型的所
有商品,查询数据库
Goods getGoods(Session session,String id),以 id 查询一种商品,查询数据库
void updateGoods(Session session,Goods goods) 更新商品,更新数据库
void updateAmount(Session session,String id,int total,int remain) 更新商品的数量,更新数据库
UML 图如下:
、
类是提供对数据库表 provide 的各种数据库逻辑操作功能:
void createProvide(Session session,Provide provide),创建一个供应商,更新数据库
void deleteProvide(Session session,String id),根据 ID 删除一个供应商,查询数据库
void updateProvide(Session session,Provide provide),更新供应商,更新数据库
Provide getProvide(Session session,String id),以 ID 应商,查询数据库
List<Provide> getProvide(Session session,int beginPage,int listPage) 分页查询供应商,查询数据库
UML 图如下:
+login(in session : Session, in name : string, in password : string) : Admin
+crateAdmin(in session : Session, in admin : Admin)
+updateAdmin(in session : Session, in password : string, in id : int)
+deleteAdmin(in session : Session, in id : int)
+getAdmin(in session : Session) : Admin
AdminImpl
+saveGoods(in session : Session, in goods : Goods)
+getGoods(in session : Session, in type : string, in beginPage : int, in listPage : int) : Goods
+getGoods(in session : Session, in id : string) : Goods
+updateGoods(in session : Session, in goods : Goods)
+updateAmount(in session : Session, in id : string, in total : int, in remain : int)
GoodsImpl
+createProvide(in session : Session, in provide : Provide)
+deleteProvide(in session : Session, in id : string)
+updateProvide(in session : Session, in provide : Provide)
+getProvide(in session : Session, in beginPage : int, in pageList : int) : Provide
ProvideImpl
、
类是提供对数据库表 sell 的各种数据库逻辑操作功能:
void createSell(Session session,Sell sell) 新建销售记录,更新数据库
void updateSell(Session session,Sell sell) 更新销售记录,更新数据库
void deleteSell(Session session,String id) 删除一条销售记录,更新数据库
Sell getSell(Session session,String id); 查询一条销售记录,查询数据库
List<Sell> getSell(Session session,int beginPage,int listPage) 分页查询销售记录,查询数据库
List<Sell> getSell(Session session,int beginPage ,int listPage,String user_id,boolean falg) 分页显示某个用
户的消费情况,查询数据库
List<Sell> getSell(Session session,int beginPage ,int listPage,String sell_id) 分页显示某种商品销售情况,
查询数据库
UML 图如下:
、
类是提供对数据库表 stock 的各种数据库逻辑操作功能:
void createStock(Session session,Stock stock) 新建一条进货记录,更新数据库
void updateStock(Session session,Stock stock) 更新一条进货记录,更新数据库
void deleteStock(Session session,String id) 删除一条进货记录,更新数据库
Stock getStock(Session session,String id) 查询一条进货记录,查询数据库
List<Stock> getStock(Session session,int beginPage,int listPage) 分页查询进货记录,查询数据库
UML 图如下:
、
类是提供对数据库表 type 的各种数据库逻辑操作功能:
Type getType(Session session, String id) 根据 ID 查询商品类型,查询数据库
List<Type> getType(Session session, String highLevelId)查询某种大类商品的所有类型,查询数据库
List<Type> getType(Session session, int beginPage, int listPage ,String highLevelId) 分页查询某种大类
商品的所有类型,查询数据库
void updateType(Session session, Type type) 更新某种商品类型,更新数据库
+createSell(in session : Session, in sell : Sell)
+updateSell(in session : Session, in sell : Sell)
+deleteSell(in session : Session, in id : string)
+getSell(in session : Session, in id : string) : Sell
+getSell(in session : Session, in beginPage : int, in pageList : int) : Sell
+getSell(in session : Session, in beginPage : int, in pageList : int, in sell_id : string) : Sell
+getSell(in session : Session, in benginPage : int, in pageList : int, in user_id : string, in flag : bool) : Sell
+createStock(in session : Session, in stock : Stock)
+updateStock(in session : Session, in stock : Stock)
+deleteStock(in session : Session, in id : string)
+getStock(in session : Session, in id : string) : Stock
+getStock(in session : Stock, in beginPage : int, in pageList : int) : Stock
+getStock(in session : Session, in beginPage : int, in pageList : int, in provide_id : string) : Stock
+getStock(in session : Session, in beginPage : int, in pageList : int, in stock_id : string, in flag : bool) : Stock
+getStock(in session : Session, in beginPage : int, in pageList : int, in goods_id : int, in flag1 : bool, in flag2 : bool) : Stock
StockImpl
void createType(Session session,Type type) 新建一种商品类型,更新数据库
UML 图如下:
、
类是提供对数据库表 user 的各种数据库逻辑操作功能:
void createUser(Session session,User user) 创建一个用户,更新数据库
void deleteUser(Session session,String id) 根据 id 删除用户,更新数据库
void updateUser(Session session,User user) 更新用户,更新数据库
List<User> getUser(Session session,int beginPage,int listPage) 分页查询用户,查询数据库
UML 图如下:
、业务逻辑组件设计
系统的业务逻辑组件负责实现系统业务逻辑需求。一般而言,一个业务逻辑对应一个业务逻辑
方法。由于前面已实现了所有的 DAO 组件,因而,所有的业务逻辑组件只关心业务逻辑的实现,无
须关心持久层的访问。
由于业务逻辑组件方法都是对 DAO 组件方法的正面封装,通常多个 DAO 组件方法被封装成一
个业务逻辑方法。一般一个模块对应一个业务逻辑组件,每一个业务逻辑方法对应用于响应一个请
求。本系统的业务逻辑类有: , , ,
, , ,
、
类是对用户实体进行的业务逻辑操作,其中用到的 DAO 组件是 ,
和实体 Bean:。其业务逻辑方法如下:
void createUser(String user_name, String user_email, String user_tel,String user_address, Date
user_gegTime, String user_postcode); 创建一个用户
void deleteUser(String id); 根据 ID 删除用户
void updateUser(String user_id,String user_name, String user_email, String user_tel,String user_address,
Date user_gegTime, String user_postcode); 更新用户信息
Collection<User> getUser(int page); 根据分页,列出所有用户
User getUser(String id); 根据 ID 返回一个用户
+getType(in session : Session, in beginPage : int, in pageList : int, in highLevelId : int) : Type
+getType(in session : Session, in id : string) : Type
+getType(in session : Session, in highLevelId : string) : Type
+updateType(in session : Session, in type : Type)
+createType(in session : Session, in type : Type)
TypeImpl
+createUser(in session : Session, in user : User)
+deleteUser(in session : Session, in id : string)
+updateUser(in session : Session, in user : User)
+getUser(in session : Session, in beginPage : int, in pageList : int) : User
UserImp
、
类是对管理员实体进行的业务逻辑操作,其中用到的 DAO 组件是
,和实体 Bean 是 。其业务逻辑方法如下:
boolean login(String name,String password); 管理员登录
boolean createAdmin( String admin_name,String admin_password,boolean flag); 创建一个用户
void updatePassword(String password , int id); 修改密码
void deleteAdmin(int id); 根据 ID 删除管理员(超级管理员的功能)
Collection<Admin> getAdmin();返回所有管理员
、
类是对商品实体进行的业务逻辑操作,其中用到的 DAO 组件是
,和实体 Bean 是 。其业务逻辑方法如下:
void saveGoods(String goods_name, float goods_price,intgoods_amount, Date goods_time, int
goods_remain,String goods_picture, String goods_typeName, String goods_desc,String stock, String type,
String sell, String provide); 保存一种商品
Collection getGoods(int page,String type_id); 分页查询商品某类型的所有商品
Goods getGoods(String id); 以 id 查询一种商品
void updateGoods(String goods_id,String goods_name, float goods_price,int goods_amount, Date
goods_time, int goods_remain,String goods_picture, String goods_typeName, String goods_desc,String
stock, String type, String sell, String provide); 根据 ID 更新商品
void updateAmount(String id, int total, int remain); 更新商品的总数量和货架上剩下的商品数
、
类是对商品实体进行的业务逻辑操作,其中用到的 DAO 组件是 ,
和实体 Bean 是 。其业务逻辑方法如下:
void createStock(String stock_id, String provide_id, String goods_id,float stock_price, Date stock_time);
新建一条进货记录
void updateStock(String id, String stock_id, String provide_id,String goods_id, float stock_price, Date
stock_time); 更新一条进货记录
void deleteStock(String id); 删除一条进货记录
Stock getStock(String id); 查询一条进货记录
Collection getStock(int page); 分页查询进货记录
Collection getStock(int page, String provide_id); 分页查询从某个供应商的进货信息
Collection getStock(int page, String stock_id, boolean flag); 分页查询某张进货单的信息
Collection getStock(int page, String goods_id, boolean flag1, boolean flag2); 分页查询从某种商品的进货
信息
、
类是对商品实体进行的业务逻辑操作,其中用到的 DAO 组件是 ,
和实体 Bean 是 。其业务逻辑方法如下:
void createSell(String sell_id, String goods_id,int sell_amount, Date sell_time, String user_id); 新建销售
记录
void updateSell(String id, String sell_id, String goods_id,int sell_amount, Date sell_time, String user_id);
更新销售记录
void deleteSell(String id); 删除一条销售记录
Sell getSell(String id); 查询一条销售记录
Collection getSell(int page, String sell_id);分页显示某种商品销售情况
Collection getSell(int page, String user_id, boolean falg); 分页显示某个用户的消费情况
Collection getSell(int page, String sell_id, boolean falg1, boolean falg2);分页查询某张销售单的情况
Collection getSell(int page);分页查询销售记录
、
类是对商品实体进行的业务逻辑操作,其中用到的 DAO 组件是
,和实体 Bean 是 。其业务逻辑方法如下:
void createProvide(String provide_name, Stringprovide_email,String provide_tel, String
provide_address,String provide_postcode, String provide_desc); 创建一个供应商
void deleteProvide(String id); 根据 ID 删除一个供应商
void updateProvide(String provide_id, String provide_name,String provide_email, String provide_tel,
String provide_address,String provide_postcode, String provide_desc); 更新供应商
Provide getProvide(String id); 查询供应商
Collection getProvide(int page); 分页查询供应商
、
类是对商品实体进行的业务逻辑操作,其中用到的 DAO 组件是 ,
和实体 Bean 是 。其业务逻辑方法如下:
Type getType(String id); 根据 ID 查询商品类型
Collection getType(int page, String highLevelId); 分页查询某种大类商品的所有类型
Collection getType(String highLevelId, String str); 查询某种大类商品的所有类型
void updateType(String type_id, String type_name, String type_highLevelId,int total); 更新某种商品类型
void createType(String type_name, String type_highLevelId, int total); 新建一种商品类型
、模块设计
根据系统概述与业务逻辑的叙述,可以确定商场销售管理系统的模块有:商品信息管理模块、
客户信息管理模块、商品进货管理模块、商品销售管理模块、数据报表模块。下面对这些模块分别
进行概述。
、管理员管理模块
管理员管理模块主要是对管理员的管理,提供的业务逻辑功能有:
管理员登录
添加管理员
删除管理员
修改管理员信息
可以根据这些功能设计页面,而页面主要是 MVC 模式中的视图(View)功能。主要用到的 JavaBean
有:
管理员信息 Bean()封装管理员的所有属性信息。
管理员业务逻辑 Bean()封装了所有对管理员的业务逻辑操作。
管理员模块系统流程图如下:
、商品信息管理模块
商品信息管理模块主要是提供对日常商品的管理和维护的业务逻辑功能有:
增加商品
删除商品
修改商品
查询商品
可以根据这些功能设计页面,而页面主要是 MVC 模式中的视图(View)功能。主要用到的 JavaBean
有:
1、商品信息 Bean() 封装了商品信息表 goods 的所有属性信息。
2、商品信息业务逻辑 Bean()封装了对商品的业务逻辑操作。
商品管理模块系统流程图如下:
管理员管理
登录
输入管理员名
和密码
输入是否正确
对
登录成功
添加管理员
超级管理员登
录
是否是超级管
理员
错
是
输入添加的管
理员信息
输入是否正确
是
添加成功
否
错
删除管理员
超级管理员登
录
是否是超级管
理员
是
删除相应管理
员
删除是否成功
是
添加成功
否
否
修改管理员
信息
管理员登录
输入修改信息
输入是否正确
是
否
修改信息
删除是否成功
是
否
修改成功
、会员信息管理模块
会员信息管理模块是对商场会员的管理和维护,提供的业务逻辑功能有:
增加会员
删除会员
修改会员
查询会员
可以根据这些功能设计页面,而页面主要是 MVC 模式中的视图(View)功能。主要用到的 JavaBean
有:
1、会员信息 Bean() 封装了会员信息 user 表的所有属性信息。
2、会员信息业务逻辑 Bean()封装了对会员的业务逻辑操作。
会员信息管理模块系统流程图如下:
商品管理
商品查询 新增商品 修改商品 删除商品
输入信息/执行
SQL查询
输出查询结果
输入商品信息
输入合理与否
商品存盘成功否
新增商品成功
修改商品信息
修改存盘成功否
修改商品成功
查看商品信息
确认删除商品
删除成功否
删除商品成
功
否
否
是
否
是
是
否
否
是
、商品进货管理模块
商品进货管理模块是对商场进货信息的管理和维护,提供的业务逻辑功能有:
添加商品进货信息
删除商品进货信息
修改商品进货信息
查询商品进货信息
可以根据这些功能设计页面,而页面主要是 MVC 模式中的视图(View)功能。主要用到的 JavaBean
有:
1、进货信息 Bean()封装了进货信息的所有属性信息。
2、进货信息业务逻辑 Bean() 封装了进货信息的业务逻辑操作。
进货信息管理模块系统流程图如下:
会员信息管理
添加会员
输入添加会员
的信息
输入是否合
理
是
添加成功
否
删除会员
加载须删除的
会员
删除是否成
功
是
删除成功
否
修改会员
输入须修改的
会员信息
输入是否合
理
是
否
修改会员信息
修改是否成
功
是
修改成功
否
查询会员
输入信息/执行
SQL语句
输出执行结果
、商品销售管理模块
管理模块是对商场商品销售的管理和维护,提供的业务逻辑功能有:
添加商品销售信息
删除商品销售信息
修改商品销售信息
查询商品销售信息
可以根据这些功能设计页面,而页面主要是 MVC 模式中的视图(View)功能。主要用到的 JavaBean
有:
1、销售信息 Bean()封装了进货信息的所有属性信息。
2、销售信息业务逻辑 Bean() 封装了销售信息的业务逻辑操作。
销售信息管理模块系统流程图如下:
商品进货信息
管理
添加进货信息
输入进货信息
输入是否合
理
是
添加成功
否
删除进货信息
加载须删除的
信息
删除是否成
功
是
删除成功
否
修改进货信息
修改进货信息
修改是否成
功
是
否
修改成功
修改进货信息
输入信息/执行
SQL语句
输出执行结果
、系统架构详细设计
本系统属于轻量级 J2EE 项目,虽然没有引入 Spring,但结构层次依然清晰。中间层由 MVC 控
制器、业务逻辑组件、DAO 组件三层组成。系统通过 DAO 组件进行持久层访问;而用户的请求只
负责与 MVC 控制器层交互;业务逻辑组件则与向上与控制器交互,向下与 DAO 组件交互。
、系统架构说明
本系统的分层模型如下:
商品销售管
理
添加商品销售
信息
修改
商品销售信息
删除
商品销售信息
查询
商品销售信息
输入商品信息
输入是否合理
是
添加成功
否
加载须删除的
商品信息
删除是否成功
是
删除成功
否
修改商品信息
修改是否成功
是
添加成功
否
输入信息/执行
SQL查询
输出查询结果
表现层
表现层读取
配置文件,默
.
xml 读取配
置文件,默认
是
.
xml 读取配
置文件,默认
是
.
xml 读取配
置文件,默认
是
.
xml
MVC 模式的控制器层
业务逻辑组件
层
显示
提供业务逻辑
服务
DAO 组件层
提供数据访问服务
数据持久层
提供持久化支
持
本系统遵循以上分层模型,各层之间的组件经松耦合的方式组织在一起,各组件之间面向接口编程,
而不是面向实现类编程,从而提供了更好的解耦方式。但是因为本系统没有引入 Spring 框架,所以
我们必须实现自己的工厂,让这此工厂来管理系统中的 DAO 组件、业务逻辑组件等。本系统包含了
二个工厂,一个 DAO 工厂和一个业务逻辑工厂。
层与层之间耦合提高到接口层次,例如业务逻辑组件并不与 DAO 组件的实现耦合在一起,而是
通过 DAO 工厂来获得 DAO 组件的实例业务逻辑组件。获取 DAO 组件的顺序图如下:
在本系统中其实不仅是业务逻辑组件并不与 DAO 组件之间的耦合是这样,表现层中,struts 的控制
器与业务逻辑组件之间也是这样耦合的,因为业务逻辑组件也同样是在由工厂管理的,对此这里对
struts 的控制器与业务逻辑组件之间的耦合就不多缀余。
、DAO 层实现和事务控制
本系统采用 hibernate 官方提供的一个 HibernateSessionFactory 类,这个类维护一个
SessionFactory 实例,其中使用了单态模式,从而保证系统中只会产生一个 SessionFactory 的实例。
由于 Session 是线程不同步,但本系统中对于 Session 使用了 ThreadLocal 类修饰,使得对于每一个
线程都只能获得一个当前线程独一无二的 Session,这样也就解决了线程下线程间腐蚀的问题。
一般而言,事物逻辑应该在业务逻辑方法中进行控制,而 hibernate Transaction 是一个持久层 API。
但如果不借助其它代理,业务逻辑必然出现 Hibernate Transaction。要出现 Hibernate Transaction 就必
须使用 Session 打开 Transaction。在这种事务策略下,本系统就业务逻辑组件中通过
HibernateSessionFactory 获得 Session,然后打开 Transaction,就是开始了事务。开始事务后,业务逻
辑组件将 Session 传入 DAO 组件,借助 DAO 组件的原子操作完成对持久层的操作。业务逻辑组件、
DAO 组件和 HibernateSessionFactory 之间的顺序图如下:
业务逻辑组
件
DAO 工厂 DAO 组件
调用 getDao()方
法
返回 DAO 实例
创建或直接返回该实
例
提供 DAO 实例
由此可见,HibernateSessionFactory 负责维护 Session 的创建和关闭,业务逻辑组件主要与
HibernateSessionFactory 类耦合。
、使用配置文件解耦
本系统为了各个层次之间的解耦,在 struts 的控制器与业务逻辑组件之间和业务逻辑组件与
DAO 组件之间都用的工厂对下层进行管理。在这两个工厂的实现都是读取配置文件来对组件进行管
理。例如使用配置文件来管理 DAO 组件,每次需要增加 DAO 组件只需要在配置文件中增加一行即
可。采用这种方式是为了更好保证更好的可扩展性,当系统须要增加更多的 DAO 组件时,无须修
改 DAO 工厂的代码。下面以管理 DAO 组件为例,下面就是 DAO 组件的配置文件
()的代码如下:
<?xml version="" encoding="UTF-8"?>
<!--Dao 组件件配置文件 -->
<context>
<dao id="adminDao" class="" />
<dao id="goodsDao" class="" />
<dao id="provideDao" class="" />
<dao id="sellDao" class="" />
<dao id="typeDao" class="" />
<dao id="userDao" class="" />
<dao id="stockDao" class="" />
</context>
DAO 工厂负责解析 AO 组件的配置文件,根据 DAO 组件的实现类来创建 DAO 组件。在程序
中获得了 DAO 组件实现类的字符串后,右以通过反射来生成 DAO 组件的实例。
、使用工厂管理组件
这里仍然用管理 DAO 组件为例进行说明。DAO 工厂并不清楚系统中有多少了 DAO 组件,如
果 DAO 工厂类与 DAO 实现硬编码方式耦合在一起,如果系统需要增加一个 DAO 组件,则 DAO 工
厂类也必须悠其代码。为了更好的扩展性,DAO 工厂自行解析 XML 文件,根据配置文件来决定如
何创建 DAO 实例。
业务逻辑组
件
HibernateSe
ssionFactory
DAO 组件
调用 getSession()方法
返回 Session 实
例
传入 Session 对象,开始持久化操作
返回持久化操作的结果
本应用中解析 XML 文件采用了 DOM4J 的解析器,关于 DOM4J 在这里并不是重点,也就不再
多作介绍。用 DOM4J 解析 XML 文档,首先要获取 XML 文档的文件位置。本应用是通过一个
Listener(监听器)来创建 DAO 工厂, XML 文档文件的位置也就由这个 Listener 获取并传入到这
个工厂类中。Listener 代码如下:
public class FactoryLoaderListener implements ServletContextListener {
DaoFactory df = null;
ServiceFactory sf = null;
Session session = null;
//此方法在系统初始化时进行调用
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
try{
session = ();
}catch(Exception e){
();
("初始化 session 工厂出错。。。");
}
try{
String realPath = ().getRealPath("/WEB-INF/");
(realPath);
df = ();
}catch(Exception ex){
();
("初始化 DAO 工厂出错。。");
}
try{
String realPath = ().getRealPath("/WEB-INF/");
(realPath);
sf = ();
}catch(Exception ex){
();
("初始化业务逻辑工厂出错。。");
}
}
// 此方法在系统关闭时进行调用
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
df = null;
sf = null;
session = null;
}
}
下面是 DAO 工厂类的代码:
public class DaoFactory {
//Dao 实例的缓冲池
private Map<String , Object> daoMap = new HashMap<String , Object>();
//Dao 工厂实例,采用单态模式
private static DaoFactory daoFactoy;
private static String realPath;
private DaoFactory() throws Exception{
//用 Dom4j 来解析 文件
String path=().getResource("/").getPath()+ "";
//(path+"********************");
//String path = "E:\\program\\hibernate\\goods\\src";
Document doc = new SAXReader().read(new File(realPath + "\\"));
//获取根元素
Element root = ();
//遍历所有 Dao
List el = ();
for(Iterator it = (); ();){
Element em = (Element)();
String id = ("id");
// (id);
String name = ("class");
//用反射创建一个实例
Class instance = (name);
Object obj = ();
//放入缓存池
(id, obj);
}
}
public static DaoFactory getInstance() throws Exception{
if(daoFactoy == null){
daoFactoy = new DaoFactory();
}
return daoFactoy;
}
public Object getDao(String id){
return (id);
}
public static void setRealPath(String realPath){
= realPath;
}
}
在这种结构下,DAO 工厂是一个单态模式的类,因此系统中只有一个 DAO 工厂实例,DAO 工厂负
责维护 DAO 实例,DAO 工厂保证缓冲池中每个 DAO 组件只有一个 DAO 实例。
、实现 Web 层逻辑
此处的 Web 层包含了系统的控制器层和 JSP 表现层,其中 JSP 层的责任有两个:收集用户数据
和显示系统外理结果。而控制器的责任只有一个:表现层 JSP 和业务逻辑层之间的桥梁。控制器实
现很简单,解析 ActionForm 中的请求参数,然后调用业务逻辑方法。
以下是 JSP 页面和业务逻辑工厂以及业务逻辑组件的调用顺序图:
通过这个图可以清楚了解到系统的控制器同样面向业务逻辑组件的接口编程,并不与业务逻辑组件
的实现类耦合,控制器直接依赖业务逻辑组件工厂和业务逻辑组件接口。只要系统中的业务逻辑组
件接口没有改变,业务逻辑工厂类没有发生改变,控制器代码就无须改变。控制器、业务逻辑组件
工厂、业务逻辑的依赖类图如下:
5、系统测试
是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说
明书中指定功能的有效方法。
系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统
设计。
JSP
页面
ActionS
ervlet
Action AppF
actory
AppSe
rvice
发送
请求
显示
结果
转发
请求
返回
处理
结果
调用
getApp()
方法
返回业务逻辑
组件
调用业务逻辑方法
返回一个业务逻辑执行结果
控制器<<接口>>
业务逻辑组件接口1
<<接口>>
业务逻辑组件接口2
业务逻辑组件工厂业务逻辑组件实现类1 业务逻辑组件实现类2
创建实例 创建实例
、举例测试
、测试管理员登录功能
在本系统中管理员登录分为两种角色:一般管理员和超级管理员。超级管理员比一般管理员的
权限要大一些,可以添加、删除管理员。
在服务器的浏览器地址栏输入 xlocalhost:8080/goods 出现以下界面:
输入超级管理员:用户名是:“bruce”,密码是:“123”。转向管理页面为:
xlocalhost:8080/goods
从上面这个页面可以看出,超级管理员有添加管理员和查看管理员的功能。所以超级管理员登录测
试成功。
在上面那个登录页面输入一般管理员角色:用户名:“a” ,密码也是:“a”。转向管理页面为:
从上面这个页面可以看出,这个管理页面没有添加管理员和查看管理员的功能。正好说明一般管理
员没有这个权限。测试成功。
、测试项目
、单元测试
单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确
的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数
的行为。
单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功
能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行
为和我们期望的一致。
本系统的单元测试都是写一个 main()方法进行调用我需要测试的类。这里以 DAO 组件工厂为例进行
说明。DAO 组件工厂是为了降低本系统的模块之间的耦合度,用来管理 DAO 组件用的。因此,我
就在 这个文件中写了一个用于测试此工厂是否管理成功的 main()方法,还进行了控
制台打印显示。代码如下:
public static void main(String[] args){
try {
DaoFactory f = ();
GoodsDao d = (GoodsImpl)("goodsDao");
(()+"%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
} catch (Exception e) {
();
}
}
、集成测试
集成测试,也叫组装测试或联合测试。在单元测试的基础上,将所有模块按照设计要求(如根
据结构图〕组装成为子系统或系统,进行集成测试。实践表明,一些模 块虽然能够单独地工作,但
并不能保证连接起来也能正常的工作。程序在某些局部反映不出来的问题,在全局上很可能暴露出
来,影响功能的实现。
本系统的集成测试以客户信息管理模块与商品信息管理模块进行集成测试说明。
首先还是用超级管理员:用户名是:“bruce”,密码是:“123”,进行登录,转向管理页面为:
点击添加一张进货单,进入“供应商选择”页面,点击“选择”进入选择供应商:张三,进入以下页面
添加所要供应的商品:
点击添加商品,随意添加几种商品后的页面为如下所示:
点击提交就完成了对某个供应商提交商品信息的录入。
这个集成测试是集成了客户信息管理模块的供应商管理与商品信息管理模块商品入库管理,并且测
试完全成功。也就说明集成测试成功。
2025 年 10 月 11 日星期六 15:08:29
:0815:08: 时 8 分 3 时 8 分 29
秒 Oct. 11, 2511 October 20253:08:29 PM15:08:29