摘 要
随着网络技术的发展,Internet变成了一种处理日常事务的交互式的环境。互联网上开展各种服务已经成为许多企业和部门的急切需求。Web的普遍使用从根本上改变了人们的生活方式、工作方式,也改变了企业的经营方式和服务方式。人们可以足不出户办理各种事情。网上购物也受到越来越多的人的青睐,而团购更是为消费者、商家以及网站管理者三方都带来了益处。
美嘉网站的系统功能:前台包括用户注册登录,今日团购,往期团购,购物车,论坛,广告等。后台包括用户管理,权限管理,商品管理,订单管理,发布公告,发送邮件,统计等内容。本文首先对系统需求分析做了详细介绍,然后对系统的概要设计进行了阐述,并重点介绍了美嘉网站的功能模块的具体设计和实现。
本系统是用MySQL5.1数据库、Java语言和MyEclipse9.0平台编写实现的。使用SSH2框架整合,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。系统不仅拥有友好方便的前台操作界面,也有稳定的后台支持。作为一种该研究方向的探索,系统旨在提供一个可以操作、功能完全、特色突出的费用审批系统。
关键词:团购网站;JAVA;MyEclipse9.0;MySQL5.1
ABSTRACT
With the development of the network technology,the Internet has become an interactive environment to hand daily affairs. Many enterprises and departments are in great needs of carrying out various services on the Internet.The widespread of Web fundamentally changes people’s style of living and workiing as well as the way of processing business and service in the enterprises. Peolpe can deal with a variety of things at home. Nowadays shopping online has been more and more popular, especially group purchase,which brings benefits for consumers,businesses and the website manager.
The foreground views of website Meijia includes: users registering and logining, today merchandise,previous merchandise, shopcart, forum, advertisement etc. The background functions of website Meijia includes: users management, priviledge management, merchandise management,order management,announce management, sending E-mail and making statistics .etc.In this report, we firstly make a detailed introduction of the system requirements analysis.Then the sysytem design is described while at last we take a lot of space to explain the function module and how to design and implementation.
The system uses MySQL5.1 database ,java language and MyEclipse9.0 to achieve.It not only has a convenient and friendly front interface,but also consist a stable background support. As an exploration of the research,the system is designed to provide an operable,fully functional and distinctive group purchase system.
Key words:group puechase system;JAVA;MyEclipse9.0;MySQL5.1
目 录
前 言 1
第一章 绪论 2
1.1 选题背景 2
1.2 团购网发展 3
1.3 团购网意义 3
第二章 系统分析 5
2.1 系统需求分析 5
2.2 系统开发工具 6
2.2.1 MyEclipse9.0 6
2.2.2 MySQL5.1 6
第三章 系统概要设计 8
3.1系统功能结构设计 8
3.2系统业务流程设计 9
3.3数据库设计 11
3.3.1数据库概念设计 11
3.3.2数据库逻辑设计 19
3.4数据库连接方法 22
第四章 系统详细设计与实现 23
4.1团购网前台 23
4.1.1用户注册模块 23
4.1.2用户登录模块 25
4.1.3首页商品列表及详情 28
4.1.4商品检索 30
4.1.5购物车及订单模块 31
4.1.6个人中心 33
4.1.7火热论坛模块 35
4.2后台功能模块 38
4.2.1系统登录模块 38
4.2.2主页面 40
4.2.3用户管理模块 41
4.2.3.1权限控制 41
4.2.3.2个人信息 44
4.2.3.3普通用户 46
4.2.3.4管理员 49
4.2.3商品管理模块 53
4.2.4订单管理模块 54
4.2.5发布公告模块 57
4.2.6邮件管理模块 58
4.2.7广告管理模块 61
4.2.8统计模块 62
第五章 系统测试及运行维护 64
5.1系统测试 64
5.1.1测试过程 64
5.1.2测试目的 64
5.1.3测试方法和工具 65
5.2系统运行 65
5.3系统维护 66
结 论 67
参考文献 68
附 录 文献翻译 69
Ⅰ 英文原文 69
Ⅱ 中文译文 73
谢 辞 77
前 言
随着Internet的发展,网络信息已经进入到了人们的日常生活当中,现在社会人们的生活、学习和工作将越来越依赖于数字技术的发展,越来越数字化、网络化、电子化、虚拟化。在线购物也随着网络的发展日益和人们的生活、工作贴近。电子商城将成为21世纪网络发展的主流,网上购物将成为一种购物时尚。团购网站作为新兴的网上购物方式,更是受到越来越多人的青睐,今后必然成为主流的购物方式。
团购的形式降低了消费者的交易成本,保证质量和服务的前提下,获得合理的低价格。对于商家来说,团购带来了大规模的客户,使得商品销售的途径区域更加广泛。同时,网站本身也能获得相当可观的收益。所以,开发一个安全、高效、可靠并具有特色的团购网站具有很高的可行性,也是非常必要的。
第一章 绪论
1.1 选题背景
随着网络的发展,电子商城将成为21世纪网络发展的主流,网上购物将成为一种购物时尚。目前国内企业纷纷加入到阿里巴巴等一系列大型电子商务网站中,通过网路进行交易已经成为未来商品交易的重要组成部分。企业在建立宣传网络的同时,也逐步扩大了企业自身的网络销售渠道,建立起自己的电子商城网站,完成了从“企业到企业”到“企业到个人”同时进行网络交易的过度,大大的提高了企业的生产效益。随着硬件技术、网络技术及网上交易法规的日趋完善,电子商城将成为企业销售经营的主要渠道。
在如今这个信息时代,网络信息已经进入到了人们的日常生活当中,在线购物也随着网络的发展日益和人们的生活、工作贴近。可以说,网上购物已经成为人们生活的一部分。网上购物具有传统的购物无法比拟的一些优势,如经营成本、地域限制和时间限制少,市场扩张潜力极大等等。目前网上购物正以惊人的速度增长,而其中,团购网站作为新兴的网上购物方式,更是受到越来越多人的青睐,今后必然成为主流的购物方式。厂家也可以利用组织团购来扩大销量、提高知名度等等。可以说,团购网站建立了合作伙伴与团购消费者间的购销平台,实现了二者的双赢。
电子商城是在互联网开放的网络环境下,基于浏览器应用方式,实现消费者网上购物和在线电子支付的一种新型的商业运营模式。对于电子商城这种大数据流量的网络管理系统,除了满足使用方便、操作简单、界面人性化等需求外,还需满足经济、实用、安全、高效、稳定等需求。
团购网站在经济上有以下几个突出的优势:
1.开发成本相对较低,可以通过多种方式盈利。如商品直销、活动回扣、广告服务、售会员卡等。
2.团购网给商家带来实实在在的利益,使商家拥有大规模的客户,资金投入相对较少,回收较快。销售时间不受限制,可以时时刻刻营业。销售地点不受限制,销售区域遍布全国,小商店也可做大生意。这样的销售模式,使商家更愿意与团购网站合作。
3.对于消费者来说,团购能够带来实惠,人们在不断的消费、购物,那么团购就不会停止。
1.2 团购网发展
团购2.0起源于美国,它并不是一个纯粹的电子商务网站,而是由电子商务、web2.0、互联网广告以及线下模式的结合体。虽然其目前的表现形式是团购,但它与传统的团购有明显的区别:
网站每天只提供一件商品,简单明了。
第二、所团商品是精选自有特色,且能够提供优品、优质、优价的商家,消费者从中获得的利益是不言而喻的。
第三、网站除了团购商品外,对参与商家具有很强的广告宣传效益,具有很强的口碑宣传效益。
团购3.0指一种以用户需求为导向的团购模式。相对于以美国团购网站Groupon为代表的商家主导的团购2.0模式,团购3.0的特点在于以满足用户的需求为目的,以用户呼唤,呼唤聚集,商家发现商机组团为手段。其代表网站有爱呼唤团购网,团购导航网预备团等。
在国网络团购目前已在上海、北京、广州等大型城市流行起来,并逐渐发展成为一种新型的消费模式。城市团购网正是顺应时代发展的要求,结合中国电子商务的实际所搭建网络团购平台,为广大商家和业主提供最专业的团购服务。
现阶段团购网站的发展呈现迅猛发展的态势,国内出现了各种的团购网站,接近3000多家,虽然竞争激烈,但是也显示出来了这个行业的发展前景,这些网站在大的方面上比较相似,但是也给人民的生活带来了比较大的便利,所以团购网的发展前景还是很乐观的.
1.3 团购网意义
1.超低价格折扣
大家团结起来,发挥人多力量大的优势,促使商家薄利多销。这样以来我们整体的成交量比商家单一的传统店面的成交量要大的多,对于商家来说降低了销售成 本,实际上利润并没有减少。
2.节省时间
会员可随心所欲的选择想要购买的产品,参加团购,快捷、简单,省去了四处奔波的艰辛和讨价还价的尴尬。
3.质量有保证
保证参加团购的产品质量,同时人多的优势迫使商家提供有品质保证的产品,确保所有参加团购的业主都能够买到高品质的产品。
4.“团购”优化企业优势的平台
如果针对“团购网”来说人是团购的“海洋”,那么企业就是承载的一个“船”。那么团购网就应该注重与企业的合作,结合企业发展的阶段性服务企业。
(1)企业会员开发渠道的拓展:团购可以有效的推动企业的会员渠道,加快企业在会员心中的影响性;
(2)企业的客户开发载体:团购网同样可以以企业为基点,为企业培养大客户,为自己积累消费的群体的集群和忠诚度累积。
(3)企业营销计划的合作:针对企业营销计划,有效的结合企业销售周期,对待制品进行促销,这样可以结合企业的实际问题。
5、桥梁作用的突出
“团购网”相当于是在匹配临界吻合消费者与企业的需求作用。那么对于客户的细分也尤为重要。那么怎样的嫁接企业与消费者呢?
(1)专业化:产生了以市场划分性“团购网”。比如“建材网”、“家居网”等等;
(2)信用体系:“团购网”要建立长期的信用体系,针对消费者的信用可以有效的分析对于企业的忠诚度。企业建立信用体系可以有效为消费者提供消费保障。
第二章 系统分析
系统分析就是在团购网开发的生命周期中系统分析阶段的各项活动和方法。它的主要目标是在系统规划所定的某个开发项目范围内明确系统开发的目标和用户的信息需求,提出系统的逻辑方案。系统分析在整个系统开发过程中,是要解决“做什么”的问题,把要解决哪些问题、要满足用户哪些具体的信息需求调查、分析清楚,从逻辑上或从功能需求上提出系统的方案,即“逻辑模型”。
2.1 系统需求分析
电子商城是在互联网开放的网络环境下,基于浏览器应用方式,实现消费者网上购物和在线电子支付的一种新型的商业运营模式。对于电子商城这种大数据流量的网络管理系统,除了满足使用方便、操作简单、界面人性化等需求外,还需满足经济、实用、安全、高效、稳定等需求。电子商城的系统目标如下:
前台:
1.界面设计美好,符合人性化要求,操作简单,信息查询方便、准确。
2.注册新用户,用户登录后,可查看修改个人信息,查询订单、消费情况以及个人积分。
3.今日团购。展示网站今日团购信息,随时更新。
4.根据商品类别查询相关团购信息。
5.广告。网站根据商品销售情况及商家信誉度推荐并展示部分商品。
6.往期团购。显示本站往期举办的团购项目列表,点击图片查看详细信息。
7.购物车。方便用户购买多件商品,一次结算。
8.地图显示。对于某些商品显示商店地址,方便用户消费。
9.邮件订阅。用户订阅本站每天团购信息,方便用户对感兴趣的团购项目及时下单购买。
10.讨论区。用户与用户之间,用户与网站之间的交流沟通,便于用户讨论遇到的问题。
11.介绍团购购买流程以及相关问题解答。
12.系统运行稳定、高效、安全可靠。
后台:
1.界面设计美好,符合人性化要求,操作简单,信息查询方便、准确,数据存储安全可靠。
2.用户管理。添加、查询、删除相关用户信息、设置权限等。
3.邮件管理。配置邮件发送所需参数:邮箱地址、密码、SMTP。
4.订单管理。对于用户提交的订单,根据情况进行阶段性处理。
5.支付管理。配置支付宝、商户编号、密钥等信息。
6.团购管理。添加、删除、修改每日发布的团购项目。
7.会员管理。查看会员购买情况,判断是否返还奖金等。
8.统计。统计季度、年度销售情况,便于帮助领导者做出相关决策。
9.系统运行稳定、高效、安全可靠。
2.2 系统开发工具
2.2.1 MyEclipse9.0
本系统是采用MyEclipse9.0为平台开发实现的。
MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和J2EE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。
Myeclipse是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。
在结构上,MyEclipse的特征可以被分为7类:J2EE模型、WEB开发工具、EJB开发工具、 应用程序服务器的连接器、 J2EE项目部署服务、据库服务、Eclipse整合帮助,于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。
简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错[4]。
2.2.2 MySQL5.1
本系统采用MySQL5.1作为数据库。
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
MySQL拥有如下特点:
1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
2.支持AIX、FreeBSd、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
3.为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
4.支持多线程,充分利用CPU资源。
5.优化的SQL查询算法,有效地提高查询速度。
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_Jis等都可以用作数据表名和数据列名。
7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
8.提供用于管理、检查、优化数据库操作的管理工具。
9.可以处理拥有上千万条记录的大型数据库。
第三章 系统概要设计
系统概要设计阶段的主要任务是将需求分析阶段所总结出来的反映了用户需求的系统逻辑模型转换成可以实施的物理模型,主要解决如何去做的问题。确定系统的整体框架,是最终系统的蓝图。
3.1系统功能结构设计
电子商务团购网站包括前台和后台,其中前台与用户进行交换,可以划分为以下功能模块:团购信息、个人中心、购物车、订单管理、论坛管理以及相关服务。这些模块相辅相成,为用户提供全面的服务。
前台功能模块结构,如图3-1所示。
图3-1 系统前台功能结构图
所有用户无需登录即可访问网站,未登录用户可以浏览团购商品列表,查看商品详情,进入论坛查看主题回复,但只有登录的用户才可以访问个人中心,查看修改个人信息,生成订单购买商品以及发布主题和进行回复。这样的模块和权限设置比较合理,能够满足图购物的需求[13]。
根据团购网后台的特点,可以将其分为登录注销、用户管理、商品管理、订单管理、发布公告、邮件管理、支付管理,论坛管理以及统计功能10个部分,其中各个部分及其包括的具体功能模块,如图3-2所示。
图3-2系统后台模块图
后台设置一超级管理员,超级管理员可以添加新管理员并为其分配账户密码,设置部分权限,拥有相应权限的管理员可以进行详细的查看,添加,删除和更新等后台管理操作。
3.2系统业务流程设计
网站的目的是为了更好的开展业务,为了写好网站,首先要明确业务流程,为了更加清晰的表达系统的业务功能模块,下面给出团购网的业务流程图,清晰的表现出网站实现的整个业务流程。
面向用户的系统前台流程图,如图3-3所示。
图3-3 面向用户的系统前台流程图
面向管理员的系统后台业务流程,如图3-4所示。
图3-4面向管理员的系统后台流程图
3.3数据库设计
3.3.1数据库概念设计
概念模型是数据库系统的核心和基础。由于各个机器上实现的DBMS软件都是基于某种数据模型的,但是在具体机器上实现的模型都有许多严格的限制。而现实应用环境是复杂多变的,如果把现实世界中的事物直接转换为机器中的对象,就非常不方便。因此,人们研究把现实世界中的事物抽象为不依赖与具体机器的信息结构,又接近人们的思维,并具有丰富语义的概念模型,然后再把概念模型转换为具体的机器上DBMS支持的数据模型。概念模型的描述工具通常是使用E-R模型图。该模型不依赖于具体的硬件环境和DBMS。
概念结构是对现实世界的一种抽象。所谓抽象是对实际的人,物,事和概念进行人为处理,抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念精确的加以描述,这些概念组成了某种模型。通过概念设计得到的概念模型是从现实世界的角度对所要解决的问题的描述,不依赖于具体的硬件环境和DBMS。
根据系统功能结构和业务流程的分析,设计出数据库的概念模型。其中实体包括管理员、用户、商品、订单、订单类型、商家、广告、论坛大类、论坛模块、论坛主题、论坛回复等共14个。下面分别介绍几个关键实体的E-R图[8]。
管理员信息实体用于后台管理,由超级管理员添加,包括管理员编号、管理员登陆账号、管理员登陆密码、管理员姓名、管理员电话、管理员邮箱以及管理员权限,其中用户密码用于管理员登录,权限是最终于的属性,决定了管理员后台可以进行哪些操作,如图3-5所示。
图3-5管理员实体
用户实体用了存储注册用户的信息,包括用户编号、用户名、密码、是否邮件订阅、邮箱、积分等信息 ,如图3-6所示。
图3-6用户实体
商品实体为团购网的核心实体,存储团购商品的必要属性,如商品编号、商品名称、原价、现价等,还包括介绍商品的,包含外键商家编号,如图3-7所示。
图3-7商品实体
商家实体记录发布团购项目的商家,包括商家编号、商家名称、商家电话、商家地址,商品通过外键指向商家,如图3-8所示。
图3-8商家实体
订单实体为用户团购商品的凭证,包括用户编号、商品编号、购买数量、购买时间和配送地址等重要数据,如图3-9所示。
图3-9订单实体
商品和订单的联系集,联系集的引入是为了解决商品和订单多对多的关系,通过联系集可以转化为两个一对多的关系,如图3-10所示。
图3-10订单商品联系集
订单状态实体存储订单可能的状态,包括订单状态编号和状态名称,订单表通过通过外键指向订单状态,查询获得某一订单的状态,如图3-11所示。
图3-11订单状态
下面是论坛部分的实体,包括论坛大类,论坛模块,论坛主题和论坛回复4个实体,他们通过外键关系形成由上到下的层次关系,环环相扣,共同支撑论坛模块实现其基本功能,如图3-12所示。
图3-12论坛大类
论坛模块属于论坛大类,每个大类有部分模块,通过外键关联,模块包括模块编号,模块名称,所属大类,版主名称等信息,如图3-13所示。
图3-13论坛模块
论坛主题属于某一模块,是由注册用户发布的,包括主题编号,模块编号,用户编号,主题名,内容和发布时间,如图3-14所示。
图3-14论坛主题
论坛回复属于某一主题,是由注册用户对某一主题发表的回复,包括回复编号,主题编号,用户编号,回复内容和回复时间,如图3-15所示。
图3-15论坛回复
公告表存储当前公告,用于在前台显示网站最新动态,后台可以对公告进行编辑。公告表包括公告编号,公告内容和发布时间,如图3-16所示。
图3-16公告实体
广告表存储前台显示的广告,丰富页面的同时有能为网站创作出额外的收入。广告表包括广告编号,广告题目,广告图片,广告链接,广告位置,如图3-17所示。
图3-17广告实体
访问量实体存储每天的访问量,通过用户首次访问页面计数器加一获得访问量,将每天的访问量记录在该数据表中,访问量表包括编号,日期和访问量,如图3-18所示。
图3-18访问量实体
图3-19清晰的表达了各个数据库之间的关系,反映了系统各个实体之间的关系。
图3-19 数据实体关系图
3.3.2数据库逻辑设计
根据数据库的概念设计,进一步得到数据库的逻辑结构,如表3-1至表3-14所示[2]。
1.管理员列表
表3-1 administrator
字段名 数据类型 是否为空 主外键约束 默认值 描述
adminid int(4) No 主键 管理员编号
adminname int(4) No NULL 管理员账户
adminpwd varchar(50) No NULL 管理员密码
email varchar(50) Yes NULL 邮箱
telephone varchar(50) Yes NULL 电话
realname varchar(50) No NULL 真实姓名
privilege varchar(50) No NULL 管理员权限
用户表
表3-2 user
字段名 数据类型 是否为空 主外键约束 默认值 描述
uid int(4) No 主键 用户编号
unname varchar(50) No NULL 用户名
upwd varchar(50) No NULL 用户密码
email varchar(50) No NULL 邮箱
city varchar(50) No NULL 城市
uscore int(4) No NULL 积分
isbooked int(4) No NULL 邮件服务
registetime datetime No NULL 注册时间
2.商品表
表3-3 product
字段名 数据类型 是否为空 主外键约束 默认值 描述
pid int(4) No 主键 商品编号
pnname varchar(50) No NULL 商品名
ptype int(4) No 外键 NULL 商品类型
pquantity int(4) No NULL 数量
oprice float No NULL 原价
cprice float No NULL 现价
starttime datetime No Null 开始时间
deadline datetime No NULL 团购时间
pnum int(4) No NULL 最大数量
lnum int(4) No NULL 最小数量
sid int(4) No 外键 NULL 商家编号
showimg varchar(50) No Null 列表图片
image1 varchar(50) Yes Null 详情图片1
image2 varchar(50) Yes Null 详情图片2
image3 varchar(50) Yes Null 详情图片3
image4 varchar(50) Yes Null 详情图片4
description1 text Yes Null 详情描述1
description2 text Yes Null 详情描述2
description3 text Yes Null 详情描述3
3.商家表
表3-4 saler
字段名 数据类型 是否为空 主外键约束 默认值 描述
sid int(4) No Yes 商家编号
sname varchar(50) No NULL 商家名称
stelt varchar(50) No NULL 商家电话
saddress varchar(50) No NULL 商家地址
4.订单表
表3-5 orders
字段名 数据类型 是否为空 主外键约束 默认值 描述
oid int(4) No 主键 订单编号
uid int(4) No 外键 NULL 用户编号
stateid int(4) No 外键 NULL 状态编号
onum int(4) No NULL 购买数量
uaddress varchar(50) No NULL 配送地址
udate datetime No NULL 购买时间
number varchar(50) No NULL 订单号
5.订单状态类型
表3-6 orderstate
字段名 数据类型 是否为空 主外键约束 默认值 描述
stateid int(4) No 主键 状态编号
statename varchar(50) No NULL 状态名
6.订单和商品联系集
表3-7 oder_product
字段名 数据类型 是否为空 主外键约束 默认值 描述
opid int(4) No 主键 联系集编号
oid int(4) No 外键 NULL 订单编号
pid int(4) No 外键 NULL 商家编号
subnum int(4) No NULL 购买数量
subprice float No NULL 购买价格
7.论坛大类
表3-8 diszone
字段名 数据类型 是否为空 主外键约束 默认值 描述
dzid int(4) No 主键 类型编号
dzname varchar(50) No NULL 类型名称
8.论坛模块
表3-9 dismodule
字段名 数据类型 是否为空 主外键约束 默认值 描述
mid int(4) No 主键 模块编号
dzid int(4) No 外键 NULL 大类编号
mname varchar(50) No NULL 模块名
host varchar(50) No NULL 版主名
9.论坛主题
表3-10 distheme
字段名 数据类型 是否为空 主外键约束 默认值 描述
thid int(4) No 主键 主题编号
uid int(4) No 外键 NULL 用户编号
mid int(4) No 外键 NULL 模块编号
theme text No NULL 主题
thcontent text No NULL 内容
thtime datetime No NULL 发布时间
10.论坛回复
表3-11 disre
字段名 数据类型 是否为空 主外键约束 默认值 描述
reid int(4) No 主键 回复编号
uid int(4) No 外键 NULL 用户编号
thid int(4) No 外键 NULL 主题编号
recontent text No NULL 内容
retime datetime No NULL 回复时间
11.广告表
表3-12 advertisement
字段名 数据类型 是否为空 主外键约束 默认值 描述
aid int(4) No 主键 广告编号
atitle varchar(50) No NULL 广告标题
aimg varchar(50) No NULL 广告图片
alink varchar(50) No NULL 广告链接
apos int(4) No NULL 广告位置
12.公告表
表3-13 notice
字段名 数据类型 是否为空 主外键约束 默认值 描述
nid int(4) No Yes 公告编号
content varchar(50) No NULL 公告内容
time datetime No NULL 发布时间
13.访问量表
表3-14 accesnum
字段名 数据类型 是否为空 主外键约束 默认值 描述
anid int(4) No Yes 访问量编号
adate datetime No NULL 日期
anum int(4) No NULL 访问量
3.4数据库连接方法
本系统开发的数据库连接采用hibernate框架,hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象思维来操作数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具有革命意义的是,hibernate可以应用EJB的J2EE框架中取代CMP,完成数据库持久化的重任。
第四章 系统详细设计与实现
系统详细设计的任务是在系统总体设计的指导下,对系统各组成部分进行细致具体的物理设计,使系统总体设计阶段所作的各种决定具体化。在信息系统详细设计阶段,主要完成如下工作:代码设计,人机界面设计,输入输出设计等。
4.1团购网前台
网站首页部分展示 如图4-1所示。
图4-1
4.1.1用户注册模块
系统注册模块是团购网的基本模块之一,用户通过注册获得有效的用户名密码,同时注册提供的信息是用户参与团购业务将要用到的,同时也使得网站根据用户提交的信息为其定制服务。系统登注册面,如图4-2所示。
图4-2 用户注册界面
用户需要按提示要求填写有效的信息,如果填写信息不符合要求会提示错误,同时注册按钮无法点击,只有全部信息合法并且同意美嘉协议才可以点击注册,如图4-3所示。
图4-3 注册信息错误提示
注册表单提交后进入添加用户的action,若操作成功则跳转到主页,默认用刚注册的用户登录。
关键代码:
String fileExt =
picFileName.substring(picFileName.indexOf(“.”));
// 获取上传文件的相对目录路径
String uploadPath =
ServletActionContext.getServletContext().getRealPath(“/portrait”);
// 将待上传的文件进行封装
String pname = System.nanoTime()+fileExt;
File savedFile = new File(uploadPath+“/”+pname);
// 文件上传
pic.renameTo(savedFile);
user.setPortrait(pname);
this.userBiz.addUsers(user);
online.add(user.getUname()); // 将登录者姓名添加到在线列表中
ac.getApplication().put(“online”, online); // 刷新在线列表
ac.getSession().put(“uname”, user.getUname());
ac.getSession().put(“user”,user);
ac.getSession().put(“cart”, new Cart());
return “reg”;
4.1.2用户登录模块
用户通过该模块登录,登录后的用户才能享受网站提供的更多服务,比如论坛留言,生成订单等。用户按确认之后表单提交到后台处理,后台从数据库取值,检查用户名密码匹配与否,如果匹配则成功登录主界面并且将用户的信息储存到服务器的临时变量(session)中,如果不匹配则给出提示叫用户继续返回用户登录页面从新输入用户名和密码。如图4-4所示。
图4-4 用户登录验证(失败)
本系统考虑到系统的安全性。采用了单用户登录验证,在一个用户登录到登出的时间内,这个账号不能再次登录。此功能是通过在线列表实现的。将已经登录的用户放入一个集合中。如果这个集合中有某个账号的名字说明该账号已经在线,不可以再次登录,用户登出的时候在线列表会自动移除该用户的账号。
在登录成功后系统将该用户的登录信息储存到服务器中,为系统的其他功能服务,减少数据库查询次数,有效的提高了系统效率。
关键代码:
ActionContext ac = ActionContext.getContext();
String rand = (String) ac.getSession().get(“rand”);
if(rand.equalsIgnoreCase(validate)){
List online = (List) ac.getApplication().get(“online”);
if(online == null){
online = new ArrayList();
}
// 若在线列表中已经存在登录者的姓名
if(online.contains(user.getUname())){
// 添加报错代码
ac.put(“msg”, 2);
// 错误页面跳转
return “LoginFail”;
}
else{
boolean correct = false;
List lst = this.userBiz.findAll();
for (Users u:lst){
if (u.getUname().equals(user.getUname()) && u.getUpwd().equals(user.getUpwd())){
correct = true;
ac.getSession().put(“user”,u);
break;
}
}
if(correct){
// 验证成功
online.add(user.getUname());// 将登录者姓名添加到在线列表中
ac.getApplication().put(“online”, online); // 刷新在线列表
// 传递参数
ac.getSession().put(“uname”, user.getUname());
ac.getSession().put(“cart”, new Cart());
return “LoginOK”;
}
else{
// 添加报错代码
ac.put(“msg”, 3);
// 错误页面跳转
return “LoginFail”;
}
}
}
else {
// 添加报错代码
ac.put(“msg”, 1);
// 错误页面跳转
return “LoginFail”;
}
4.1.3首页商品列表及详情
用户进入网站以及登录成功后系统自动跳转到主页面,本系统主页面直接显示商品,提供菜单选择供用户选择所需服务,商品列表显示商品名称,图片,团购剩余时间,价格,当前状态等信息,提供商品基本的信息,如图4-5所示。
图4-5 商品列表界面
点击商品列表可以进入商品详情页面,提供更全面的商品介绍,包括多张商品图片和描述,还可能包括视频等信息,如图4-6所示。
图4-6 商品详情界面
商品列表页面是通过查询商品表,取当前时间已经开始并未结束的商品,存放在List中并放入session,在category.jsp页面读取session并循环输出结果,其中倒计时比较复杂,需要使用hidden类型的标签获得session数据然后传染javascript,进行处理再显示在页面上。
详情页是查询商品表中指定行的数据,点击某一件商品传人商品编号,将查到的结果传到detail.jsp页面,将查询的结果显示。
关键代码
public String findAll()throws Exception{
String strHQL = “from Product p where timestampdiff(second,?,p.starttime)<0 and timestampdiff(second,?,p.deadline)>0”;
Date cd = new Date();
Timestamp d = new Timestamp(cd.getYear(),cd.getMonth(),cd.getDate(),cd.getHours(),cd.getMinutes(),cd.getSeconds(),0);
Object[] params = new Object[]{d,d};
PageBean pageBean = productBiz.findByPage(strHQL, params, currentPage, 10);
System.out.println(pageBean.getData().size());
ActionContext ac = ActionContext.getContext();
ac.getSession().put(“pageBean”, pageBean);
ac.getSession().put(“csize”, pageBean.getData().size());
return “ok”;
}
public String findById()throws Exception{
Product idPro = this.productBiz.findById(productid);
ActionContext ac = ActionContext.getContext();
ac.put(“idPro”, idPro);
return “findok”;
}
4.1.4商品检索
进入首页后默认显示的是全部商品,商品列表上部是检索按钮,可以查询显示满足条件的商品,可以使用户根据自己的需要显示符合条件的数据,如图4-7所示。
图4-7 商品检索按钮
图4-8 无满足条件的商品
商品检索功能是通过点击按钮想action传递参数,在查询语句中加入where子句,接收页面传递来的参数,将查询的结果传递到页面实现的,如图4-8所示。
关键代码
public String findByType()throws Exception{
String strHQL = “from Product p where p.ptype=?”;
Object[] params = new Object[]{type};
PageBean pageBean = productBiz.findByPage(strHQL, params, currentPage, 10);
ActionContext ac = ActionContext.getContext();
ac.getSession().put(“pageBean”, pageBean);
ac.getSession().put(“csize”, pageBean.getData().size());
return “ok”;
}
4.1.5购物车及订单模块
购物车是电子商务网站中的经典模型,它允许用户将看中的商品暂时放在一起,记录该用户的操作,但并不实际操作数据库,用户还可以继续购物添加购物车,可以更改购物车中商品数量,清除商品甚至清空购物车,每个登录的用户拥有一个购物车,当用户决定购买后可以直接将购物车中的商品生产订单,为用户的购物提供方便,如图4-9和4-10所示。
图4-9 登录的用户拥有购物车
图4-10 添加商品到购物车
通过点击生成订单按钮可直接将购物车中商品生成订单,用户填写要求的信息后点击确认即订单提交成功,可以通过个人中心查看自己的订单,如图4-11所示。
图4-11 生成订单
购物车采用了LinkedHashMap实现,其中每个条目是自定义的CartItem类型,包括放入购物车的每项商品的必要属性,如商品类型,购买数量,价格等信息。放入session级别中,与登录用户对应。
关键代码
private Map<Integer, CartItem> items = new
LinkedHashMap<Integer, CartItem>();
//核心方法1:向购物车添加商品
public synchronized void add(CartItem cartItem){
//判断:购物车中是否有了带添加的商品
if(items.containsKey(cartItem.getProduct().getPid())){
//已经存在商品,修改购物车的商品数量
CartItem item = items.get(cartItem.getProduct().getPid());
//1 subQuangtity属性加1
item.setSubQuantity(item.getSubQuantity()+1);
}else{
//不存在,添加到购物车
this.items.put(cartItem.getProduct().getPid(), cartItem);
}
4.1.6个人中心
登录的用户可以进入个人中心,查看个人信息,修改个人信息,查看订单,未登录的用户无法进入,只有登录后才显示个人中心按钮。如图4-12和4-13所示。
图4-12 未登录状态
图4-12 登录状态
图4-13 修改个人信息
图4-14 查看订单
个人中心的目的是使用户查询自己的信息,并在允许的范围内作修改,显示个人信息是读取用户登录时放入session中的user变量,修改个人信息是对当前登录的用户数据项做更新操作,订单是通过读取订单和商品联系集,通过外键找到商品信息[9],如图4-14所示。
关键代码
public String update() throws Exception{
if(picFileName != null){
// 获取上传文件的后缀名
String fileExt = picFileName.substring(picFileName.indexOf(“.”));
// 获取上传文件的相对目录路径
String uploadPath = ServletActionContext.getServletContext().getRealPath(“/portrait”);
// 将待上传的文件进行封装
String pname = System.nanoTime()+fileExt;
File savedFile = new File(uploadPath+“/”+pname);
// 文件上传
pic.renameTo(savedFile);
user.setPortrait(pname);
}
this.userBiz.updateUser(this.user);
ActionContext ac = ActionContext.getContext();
ac.getSession().put("user", user);
return "update";
}
4.1.7火热论坛模块
在团购网中加入论坛模块,可以时用户在团购中逛逛论坛,提供用户交流讨论的平台,论坛的引入可以吸引用户的来访,增加网站商品的浏览机会,进而能促进商品销售量,在本模块的设计中把论坛划分为不同的讨论区,用户可以在讨论区发表相应的主题,用户可以针对每一个主题进行回复,用户之间交流可以方便进行,如图4-15和4-16所示。
图4-15 论坛首页
图4-16模块的主题列表
图4-17 发表帖子
图4-18 主题回复页
论坛模块分为讨论区,模块,主题和回复,模块属于大的讨论区,主题属于模块,回复属于主题,主题和回复又有指向用户的外键,论坛功能模块的难点就在于涉及到的表较多,外键关系复杂,实现中需要理清楚表之间的关系,处理好数据库约束才行,如图4-17和4-18所示。
关键代码
//分页显示指定模块下的主题列表
public String byPage() throws Exception{
ActionContext ac = ActionContext.getContext();
int dismod = (Integer)ac.getSession().get(“moduleid”);
String strHQL = “from Distheme d where d.dismodule.mid=? order by d.thid desc”;
Object[] params = new Object[]{dismod};
PageBean pageBean = this.disthemeBiz.findByPage(strHQL,params,currentPage, 10);
ac.getSession().put("themePage", pageBean);
return SUCCESS;
}
//发表新主题,添加数据库,处理与模块的外键关系
public String addTheme() throws Exception{
ActionContext ac = ActionContext.getContext();
Dismodule dismodule = (Dismodule) ac.getSession().get(“dismodule”);
Users user = (Users) ac.getSession().get(“user”);
distheme.setDismodule(dismodule);
distheme.setUsers(user);
distheme.setThtime(new Timestamp(System.currentTimeMillis()));
this.disthemeBiz.add(distheme);
System.out.println(“111111”);
return byPage();
}
4.2后台功能模块
4.2.1系统登录模块
系统登录模块是输入后台网址后,首先运行显示的页面。登录时要进行四层验证,用户名、密码、验证码非空验证,验证码正确的验证,单一用户登录验证以及数据库验证(验证用户名密码是否匹配)。同时,进行身份验证,将用户的信息存储到session中以便使用。系统登录界面,如图4-19所示。
图4-19 用户登录界面
系统工作流程如下,用户输入用户名密码以及验证码,在jsp页面进行验证是否输入正确,若不正确系统进行提示,提示界面,如图4-20所示(在此只举一例)。
图4-20 单点登录验证
所有信息输入正确,数据库验证通过,且是单点登录,用户可成功进入主页面,同时将用户的信息存储到服务器临时变量(session)中。
具体流程为:点击“登录”后,首先在AdminLogin.jsp页面验证输入是否为空,通过后将AdminLogin.jsp页面的表单提交给AdminAction中的check动作处理,action获取表单数据后,首先获取验证码,验证是否与生成的验证码匹配。然后进行单点登录验证,用户登录时,检验在线列表中是否存在该用户,若存在,提示该用户已经登录,若不存在,将用户名存入在线列表。之后进行数据库验证,如果数据库中有相匹配的用户名和密码,用户可登录,否则登录失败。
4.2.2主页面
用户登录成功后系统自动跳转到主页面,本系统主页面由三部分组成,页面头部的卡片选项,左边菜单列表以及右边的详细信息显示部分。卡片选项使用js脚本编写,并在css中规定了显示格式。在default.jsp页面中引用,使用卡片可以将后台管理的各项类别嵌套更加合理化。点击卡片可以使下面的子内容联动,子内容使用了iframe框架,iframe将页面分为左右两个部分,由左侧菜单,和右侧详细信息部分组成。使用卡片与iframe的功效类似,利于多个框架的嵌套,同时在实现上也更加容易,每个页面都可独立开发,互不干扰。主界面,如图4-21所示。
图4-21 用户登录主界面
卡片选项与左侧菜单:
卡片选项中的内容为总类别,考虑到分类较多较详细,使用了卡片选项进行总类别的划分。左侧菜单由两级菜单组成,一级菜单为总类别下的子类,二级菜单为具体菜单。这样设计的好处是用户可以根据类别快速的进行操作,使得界面简洁,友好。点击不同卡片选项,菜单与相关页面进行联动,通过点击左侧一级菜单可以控制二级菜单的显示和隐藏,拥有更好的用户体验[7]。
卡片选项,如图4-22所示。
图4-22 卡片选项
左侧菜单,如图4-23所示。
图4-23 左侧导航菜单
4.2.3用户管理模块
用户管理模块分为超级管理员与管理员两个不同身份的管理模块,通过权限控制来实现。超级管理员拥有所有权限,而管理员只拥有超级管理员赋予的权限。通过权限控制可以更好地进行后台管理。
4.2.3.1权限控制
权限控制分为两个模块,一是卡片选项中总类的控制,一是菜单选项中子类的控制。
1.卡片选项中的权限控制
根据用户身份的不同,进入主页面后会有不同的显示,体现在卡片选项以及左侧菜单上。用户进入系统时,利用jsp页面判断用户身份,如果是超级管理员,所有卡片都显示,若不是,只显示该管理员拥有的权限的卡片。超级管理员能够管理管理员,对其进行增删改查操作,而管理员不能,所以左侧菜单不能显示管理员的相关操作。
图4-24显示了超级管理员的权限卡片。
图4-24 超级管理员卡片选项
图4-25与4-26显示了拥有不同权限的管理员的权限卡片
图4-25 管理员卡片选项
图4-26 管理员卡片选项
由于首页需要显示个人信息详情,默认所有管理员具有“用户管理”的权限。
用户权限以字符串的形式存储在数据库中,提取时进行字符串拆分即可。此部分内容在jsp页面中实现。
关键代码如下:
var pri = document.getElementById(“pri”).value;
var pris = pri.split(“,”);
for(var i=0; i<pris.length;i++){
if(pris[i] == “统计”){
document.getElementById(“p2”).style.display=“block”;
continue;
}
if(pris[i] == “广告管理”){
document.getElementById(“p4”).style.display=“block”;
continue;
}
if(pris[i] == “邮件管理”){
document.getElementById(“p5”).style.display=“block”;
continue;
}
if(pris[i] == “发布公告”){
document.getElementById(“p6”).style.display=“block”;
continue;
}
if(pris[i] == “订单管理”){
document.getElementById(“p7”).style.display=“block”;
continue;
}
if(pris[i] == “商品管理”){
document.getElementById(“p8”).style.display=“block”;
continue;
}
if(pris[i] == “用户管理”){
document.getElementById(“p9”).style.display=“block”;
continue;
}
}
2.菜单选项中的权限控制
超级管理员拥有所有权限,能够管理管理员,而管理员不能随意修改其他管理员的信息。所以对于普通管理员,左侧菜单中的“管理员”选项菜单不能展开,当普通管理员点击时,系统提示其不具有该权限。只有超级管理员才能够展开该菜单,进行相应管理。
权限页面,如图4-27和4-28所示。
图4-27 超级管理员
图4-28 普通管理员
这一部分的实现主要在jsp页面进行控制,系统默认只有用户名为superadmin的管理员才拥有该权限。而其他管理员不具有。
4.2.3.2个人信息
个人信息的管理比较简单,进入主页时首先显示个人信息详情,管理员可以对自己的信息进行修改。
1.个人信息详情
用户进入系统后,首页显示欢迎页面,提示用户系统当前时间,并将用户的基本信息显示在页面上。此部分主要使用了用户登录时存储在session中的信息。登录时将用户信息封装到admin对象中,以便显示时获取信息。
2.修改个人信息
用户可对个人信息进行修改,点击左侧菜单的“修改个人信息”选项,可进入个人信息的编辑页面。编辑页面对各项信息进行验证,如果验证通过才可提交信息,否则不能点击“保存”按钮。用户没有修改自身权限的权利,所以在此页面没有修改权限的功能。
修改个人信息页面,如图4-29所示。
图4-29 个人信息详情
修改后,页面跳转到个人信息详情页面,可看到管理员的姓名被修改,
如图4-30所示。
图4-30 修改后的个人信息详情
进入修改信息页面时,首先调用AdminAction中的preUpdate动作获取用户信息,之后再跳转到修改信息的页面。保证在该页面正确显示管理员的相关信息。修改时,在jsp验证内容是否符合要求,如不符合要求,不能提交表单。验证通过后,提交表单时,调用updatePer动作进行更新,之后再调用refresh函数,保证回到个人信息页面后,该页面也被更新。
关键代码如下:
public String preUpdate() throws Exception{
Administrator admin = this.adminBiz.findById(this.admin.getAdminid());
ActionContext ac = ActionContext.getContext();
ac.put(“admin”, admin);
return “findok”;
}
public String updatePer() throws Exception{
this.adminBiz.updateAdmin(this.admin);
return refresh();
}
public String refresh() throws Exception{
ActionContext ac = ActionContext.getContext();
Administrator admin = (Administrator) ac.getSession().get(“admin”);
admin = this.adminBiz.findById(admin.getAdminid());
ac.getSession().put(“admin”, admin);
return “ok”;
}
4.2.3.3普通用户
普通用户模块中,管理员可以删除、查询用户,并可以查看用户的详细信息。
- 用户信息列表
用户信息列表显示了所有注册了美嘉的用户的基本信息。在列表中能够删除某一用户,或批量删除多个用户。可根据用户名进行查询,还可点击用户名进入用户信息详情页面。用户信息列表[11],如图4-31所示。
图4-31 用户信息列表
列表的实现用了byPage分页函数。在框架的最底层实现了findByPage的函数,通过层层调用,在action中查找到得用户信息存入session即可。
2. 删除用户
点击“操作”中的“删除”链接,系统进行提示是否删除该数据,点击确定后该条数据被删除,点击取消则保留数据页面,如图4-32所示。
图4-32 删除提示信息
删除用户时,获取用户id,根据用户id删除数据库中的相关数据。由于用户表与其他表相关联,所以删除是级联删除。
- 批量删除
批量删除与单个删除大同小异,若没有选中任何选项,系统提示选择要删除的数据,选中后提示是否删除这些数据。确定后数据被删除。网页头部有提示信息,提示现有数据的条数,删除后数据减少,提示信息随之变化。
删除后的列表,如图4-33所示。
图4-33 删除后的列表
批量删除与删除相同,首先获取要删除的用户id,然后根据id号进行循环删除。
关键代码如下:
public String bulkDel() throws Exception{
for (int uid : chkUid){
this.userBiz.delUser(uid);
}
return byPage();
}
4. 查询
在文本框中输入用户名可进行模糊查询。查询有助于管理员快速找到需要的用户的相关信息。查询到得结果仍然已列表形式显示,并且在提示信息处提示查询到得数据条数页面,如图4-34所示。
图4-34 输入“test”后查询到得数据
查询调用了action中findByName函数。主要是HQL语句的编写问题。
关键代码如下:
public String findByName() throws Exception{
String strHQL = “from Users u where u.uname like ?”;
Object[] params = new Object[]{“%”+this.user.getUname()+“%”};
PageBean userPage = this.userBiz.findByPage(strHQL, params, currentPage, 10);
ActionContext ac = ActionContext.getContext();
ac.getSession().put(“userPage”, userPage);
return “searchok”;
}
5. 详细信息显示
点击用户名,进入该用户的详细信息页面。根据用户注册时填写的信息进行显示页面,如图4-35所示。
图4-35 用户信息详情
显示该用户的信息调用UserAction中的detail函数,根据得到的用户id,获取该用户的所有信息,封装到user对象中,跳转到detail页面进行显示。
关键代码如下:
public String detail() throws Exception{
Users user = this.userBiz.findById(this.user.getUid());
ActionContext ac = ActionContext.getContext();
ac.put(“user”, user);
return “ok”;
}
4.2.3.4管理员
管理员的功能模块具有增删改查各项功能。具体实现与普通用户类似,在此只列出不同功能的实现,相同功能部分不再赘述。
1.管理员列表
如图4-36所示。
图4-36 用户信息详情
2.删除管理员
删除后的列表,如图4-37所示。
图4-37 删除一条数据后的列表
3.查询
输入用户名进行模糊查询,例如,输入“mi”可查出所有用户名中含有“mi”
的用户。查询结果,如图4-38所示。
图4-38 未选中任何数据
4.编辑管理员
点击“编辑”链接可进入编辑页面对管理员的信息进行修改。系统默认所有
管理员都具有“用户管理”的权限,因此在编辑管理员的页面中并没有“用户管理”的复选框,以避免错误勾选使得用户不具有此权限。这样的设计使管理更加方便,避免错误产生。进入页面后“保存”按钮不可用,当所有信息通过验证才可以保存数据。若不需要修改数据直接返回即可[3]。
修改信息后页面,如图4-39和4-40所示。
图4-39 修改数据后
图4-40 修改后列表数据
编辑管理员的实现与修改个人信息的实现相类似,只是管理员中多加了权限。需要读取权限并进行字符串组合。关键代码如下:
public String update() throws Exception{
for (int i = 0; i < privileges.length; i++) {
privilege += privileges[i]+“,”;
}
privilege = “用户管理,” + privilege;
privilege = privilege.substring(0, privilege.length()-1);
admin.setPrivilege(privilege);
this.adminBiz.updateAdmin(this.admin);
return byPage();
}
5.添加管理员
超级管理员点击左侧菜单管理员下的添加管理员子菜单,可进入添加管理员
的页面。输入相关信息后,页面进行表单验证,若有不符合要求的数据,“添加”按钮不可用。当所有数据通过验证后,才可提交表单。
验证后的表单,如图4-41所示。
图4-41 验证后的表单
列表中增加的数据记录,如图4-42所示。
图4-42 列表中增加记录
添加管理员时也需要获取权限并进行字符串组合,然后重载admin对象的权
限值,以字符串的形式存入数据库。
关键代码如下:
public String add() throws Exception{
for (int i = 0; i < privileges.length; i++) {
privilege += privileges[i]+“,”;
System.out.println(privilege);
}
privilege = privilege.substring(0, privilege.length()-1);
admin.setPrivilege(privilege);
this.adminBiz.addAdmin(admin);
return byPage();
}
4.2.3商品管理模块
商品管理模块包括新增商品、商品查询与删除等内容。
1.商品列表
列表中显示了商品的部分信息,如图4-43所示。
图4-43 商品列表
2.删除
删除部分与管理员的删除功能相同,不再赘述。
3.查询
商品可按照团购时间范围查询,也可按照商品类别查询,也可同时查询。查
询后可显示查询结果的列表。
查询筛选条件,如图4-44所示。
图4-44 查询筛选条件
查询团购时间为2011-8-1到2011-10-1,类型为生活娱乐的多条件查询结果,如图4-45所示。
图4-45 查询筛选条件
当用户根据自己的需要选择查询条件并且提交后,首先要将时间转化为该类型。而数据库中的商品类型是以整数形式存储的,将其转化为int类型。对每个控件进行非空判断,并根据不同的条件产生不同HQL语句以及传递参数,然后利用语句以及传入参数向数据库作条件查询。从而实现多条件筛选查询,如图4-46所示。
4.新增团购
图4-46 新增团购
4.2.4订单管理模块
订单管理模块包括订单的删除、查询以及查看等功能。
1.订单列表
订单列表,如图4-47所示。
图4-47 订单列表
2.删除
删除部分与管理员的删除相同,不再赘述
3.查询
订单可按照订单号进行模糊查询,也可按照订单状态进行查询,也可按两个
条件同时查询。
编号含有202,状态为“待审批”的订单查询结果,如图4-48所示。
图4-48 查询结果
4.查看订单信息
点击订单编号,可进入该订单的详细情况页面。该页面显示了订单状态,该
订单下的商品信息和购买人的相关信息以及配送信息等。
订单信息页面,如图4-49所示。
图4-49 订单信息
订单信息的查看用到了多表查询,点击订单编号时,调用OrdersAction中的find函数,根据订单id获得该订单的信息。再通过联系集获得该订单id下的所有商品列表。将订单以及该订单下的商品列表放入session中,传入jsp页面。
关键代码如下:
public String find() throws Exception{
Orders order = this.ordersBiz.findById(this.orders.getOid());
ActionContext ac = ActionContext.getContext();
String strHQL=“from OrderProduct as op where op.orders.oid=?”;
Object[] params = new Object[]{orders.getOid()};
List lstop = this.opBiz.findByHQL(strHQL, params);
ac.getSession().put(“lstop”, lstop);
ac.put(“order”, order);
return “ok”;
}
4.2.5发布公告模块
公告管理中包含公告的删除以及发布。因为公告是及时性的,每次获取数据库中的最新信息,所以此部分只设置了删除公告以及发布公告的功能。
1.公告列表
公告列表,如图4-50所示。
图4-50 公告列表
2.删除公告
删除某一公告后公告列表,如图4-51所示。
图4-51 删除公告后列表显示
3.发布公告
点击左侧菜单中发布公告子菜单,进入发布公告页面。在编辑框中进行公告
编辑,可改变文字大小,字体,格式等,还可插入表情图片以及视频等内容。发布公告页面,如图4-52所示。发布后列表中数据,如图4-53所示。
图4-52 公告发布
图4-53 发布后列表中数据显示
发布公告的页面使用了QQ编辑器插件,是页面更加美观,人性化,也使发
布的公告更加多元化,而不只是单一的文字信息。点击发布公告时,调用action中的add函数,同时获取系统当前时间,以便在列表中显示。
关键代码如下:
public String add() throws Exception{
// 获取服务器中的当前时间
Timestamp time = new Timestamp(new Date().getTime());
// 将时间设置到自动封装的Announce中
this.announce.setTime(time);
// 调用业务逻辑方法完成添加功能
this.announceBiz.addAnnounce(this.announce);
return byPage();
}
4.2.6邮件管理模块
邮件管理比较简单,只需向订阅邮件的用户发送邮件即可。因此此模块中只包含配置和发送邮件的功能。
1.邮件配置
点击卡片选项中的邮件管理,直接进入发送邮件的页面。在此页面可进行邮
件配置,配置smtp服务器、端口号以及发件人的信息。
配置信息部分页面,如图4-54所示。
图4-54 配置信息
2.邮件发送
输入标题与内容后即可进行邮件的发送。考虑到每次发送信息内容相同,在
页面中添加了提示信息。使用户每次发送邮件时只需复制内容而不用再去编写邮件内容,减少了用户的操作。降低错误发生的可能性同时方便用户操作。
发送邮件页面,如图4-55所示。
图4-55 发送邮件
收到的邮件,如图4-56所示。
图4-56 收到的邮件内容
发送邮件时调用了EmailAction中默认执行的execute函数。该函数使用
javaemail的相关内容实现了邮件发送的功能。首先需要设置邮件服务器的属性。还需要经过授权,获取发件人的用户名和密码,进行校验,通过验证后才能成功发送邮件。查询数据库中已经订阅邮件的用户,获取这些用户的邮件地址。将这些地址循环加载。设置发送内容为html格式,使得收件人能够成功获取团购信息地址。获取标题和内容后可发送邮件。
关键代码如下:
public String execute() {
Properties props = new Properties();
props.put(“mail.smtp.host”, hostName); //设置发送邮件的邮件服务器的属性
props.put(“mail.smtp.auth”, “true”); // 需要经过授权
// 用刚刚设置好的props对象构建一个session
Session session = Session.getDefaultInstance(props);
session.setDebug(true);
MimeMessage message = new MimeMessage(session);
try { // 加载发件人地址
String emails=“”;
String strHQL = “from Users u where u.isbooked=?”;
Object[] params = new Object[]{1};
List lstUser = this.userBiz.findByHQL(strHQL, params);
for(Users user: lstUser){
emails += user.getUemail();
emails += “,”;
}
String [] email = emails.split(“,”);
for (int i = 0; i < email.length; i++) {
message.setFrom(new InternetAddress(username));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(email[i])); // 加载发件人地址
}
message.setSubject(title); // 加载标题
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
BodyPart contentPart = new MimeBodyPart();// 设置邮件的文本内容
contentPart.setContent(textHtml, “text/html; charset=utf-8”);
multipart.addBodyPart(contentPart);
message.setContent(multipart);
message.saveChanges();
Transport transport = session.getTransport(“smtp”);
transport.connect(hostName,username,password);//连接服务器的邮箱
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (Exception e) {
e.printStackTrace();
} return SUCCESS;
}
4.2.7广告管理模块
后台广告管理模块可以查看广告列表,编辑广告,系统设置了6个广告位,广告内容包括标题,广告图片和点击广告后的连接地址,编辑广告即设置这几项属性,设置好的广告即可在前台显示,如图4-57所示。
图4-57 前台广告显示
广告模块使用广告表,对该表进行查询操作和更新操作,表中固定有6条数据,分别对应于6个广告位。
关键代码
public String find() throws Exception{
List lstadv = this.advBiz.findAll();
ActionContext ac = ActionContext.getContext();
ac.getSession().put(“lstadv”, lstadv);
return “findok”;
}
public String update() throws Exception{
// 获取上传文件的后缀名
String fileExt = picFileName.substring(picFileName.indexOf(“.”));
// 获取上传文件的相对目录路径
String uploadPath = ServletActionContext.getServletContext().getRealPath(“/advertisement”);
// 将待上传的文件进行封装
String aname = System.nanoTime()+fileExt;
File savedFile = new File(uploadPath+“/”+aname);
List lstadv = this.advBiz.findAll();
ActionContext ac = ActionContext.getContext();
ac.getSession().put(“lstadv”, lstadv);
return “updateok”;
}
4.2.8统计模块
统计模块对网站相关的数据进行收集处理,并通过表格和图表的形式显示。
首先是销售量的统计,此统计的数据来源是根据商品的销售时间、商品的类型和商品销量,查询某个月里某中商品类型的总销售量,列出表格并用饼状图来显示,如图4-58所示。
图4-58 商品销售统计
接下来是访问量统计,访问量统计是根据用户访问主页来计算的,首次到来分配一个session变量,访问量增加1,后续的刷新和跳转回首页便不再记录访问量,访问量按天来计,每天到24点后插入新的一个数据项,前一天的访问量确定,这样的统计方式比较客观合理,能反映出用户对网站的关注程度,为后天管理者提供有价值的数据,如图4-59所示。
图4-59访问量统计
最后是新注册人数统计,数据来源是用户表的注册时间,按天计算,查询用户表,获得每天有多少新用户注册,用表格显示并生成折线图,如图4-60所示。
图4-60注册人数统计
关键代码:
String strHQL = “from Accessnum as an where an.adate = ?”;
Date d = new Date();
Date stored = new Date(d.getYear(),d.getMonth(),d.getDate(),0,0,0);
Object[] params = new Object[]{stored};
List lstan = this.accessnumBiz.findByHQL(strHQL, params);
System.out.println(lstan);
if (lstan.size() == 0){
ac.getApplication().put(“count”,0);
Accessnum acn = new Accessnum();
acn.setAdate(stored);
acn.setAccnum(acnum);
this.accessnumBiz.add(acn);
}
acn.setAdate(stored);
acn.setAccnum(acnum);
this.accessnumBiz.update(acn);
}
return "ok";
第五章 系统测试及运行维护
5.1系统测试
系统测试是将需测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素及环境结合在一起测试。在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。系统测试的目的在于通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。执行测试用例后,需要跟踪故障,以确保开发的产品适合需求。
5.1.1测试过程
测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试及发版测试。
开始是单元测试,是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
接下来是集成测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。
确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全、正确。有效性测试是在模拟的环境下,运用黑盒测试的方法,验证被测软件是否满足需求规格说明书列出的需求。任务是验证软件的功能和性能及其他特性是否与用户的要求一致。对软件的功能和性能要求在软件需求规格说明书中已经明确规定,它包含的信息就是软件确认测试的基础。
系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。
5.1.2测试目的
- 通过与系统的需求定义作比较,发现软件与系统定义不符合或与之矛盾的地方。
- 不仅是为了找出错误.通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进。
- 这种分析也能帮助测试人员设计出有针对性的测试方法,改善测试的效率和有效性。
- 没有发现错误的测试也是有价值的,完整的测试是评定软件质量的一种方法。
5.1.3测试方法和工具
本系统采用如下方法进行测试:
- 单元测试:由于本系统采用JAVA面向对象分层开发的思想进行编写,系统由许多不同功能的类组成,为了确保每一个类都有效,再每个类编写完成后,都会编写一个main方法作为入口测试该类是否有效。
- 输入代表测试用例:当每一个功能完成后,编写几个具有代表性的测试用例,从前台开始输入,完成后查看数据库内数据是否正确。保证功能的正确性。
- 后台打印相关数据:在系统测试出错误的时候,可以把相关重要的数据和方法用后台打印的方法打印出来,通过打印出的数据进行分析从而找出漏洞所在。后台打印的好处是简单易行,工作量比较小。
- 借助编译工具的辅助功能:可以在测试中使用MyEclipse的DeBug 功能设置程序断点,跟踪程序找出错误所在,这样测试的好处是可以准确的跟踪程序走向,从整个程序运行的流程上一步一步找出问题所在。
测试工具:MyEclipse,通过编译工具MyEclipse的debug功能有效的跟踪代码,找出出错原因。
5.2系统运行
本系统为JAVA编写的B/S结构的WEB项目,运行步骤如下。
1.运行windows操作系统。
2.由于本系统是由JAVA编写所以需要安装JDK1.6JAVA虚拟机器,安装方法为:运行JDK1.6安装文件,选择路径进行安装。
3.运行tomcat安装文件,选择安装路径,选择第2步已经安装好的JRE路径,进行tomcat的安装。
4.部署程序至tomcat。
5.安装MySQL数据库,导入表结构的SQL脚本,启动数据库实例服务。
6.启动tomcat。
7.打开浏览器并且输入如下网址。
http://localhost:8080/xuanyuan/jsp/category.jsp进入前台
http://localhost:8080/xuanyuan/jsp/adminLogin.jsp进入后台
系统需也要一些日常管理:包括日志的查看,服务器的维护等。
5.3系统维护
团购网站作为一个电子商务平台,对于安全性有很高的要求,比如在支付功能上,订单的管理上,都需要保证安全。系统维护的任务是改正软件系统在使用过程中发现的隐含错误,扩充在使用过程中用户提出的新的功能及性能要求,其目的是维护软件系统的"正常运作"。这阶段的文档是软件问题报告和软件修改报告,它记录发现软件错误的情况以及修改软件的过程。
系统维护在系统开发的整个生命周期中有举足轻重的作用,系统维护经常遇到的很多问题。系统维护中的绝大部分问题源于系统分析和设计阶段,初期考虑的不完善导致后期修改的困难,成本增加,而编码本身造成的错误相对较低。从实际情况来看,绝大多数系统在设计和开发时并没有很好地考虑将来可能的修改,如有些模块不够独立,牵一发而动全身。对于项目的良好管理显得尤为重要,如果整个队伍能够使用统一的框架平台,采用一致的命名规则,可以是开发出来的产品更容易别队伍其他成员所理解,也能避免编码上的冲突。系统维护不同于系统开发,开发时很有新鲜感,工作充满挑战性,然而可能由于管理和工作中的疏漏留下潜在的问题,在后续测试中会逐渐暴露出来,这就需要及时的进行系统维护,相比于开发,系统维护更是系统开发工作的常态,它占据了系统开发周期的大部分时间,必须予以重视。
结 论
最近在全国各地和互联网上都纷纷兴起了团购热潮,互联网上也出现了许多的团购网。许多企业集团网上开设销售网站,也联合一些团购网组织消费者团购。随着计算机技术和互联网技术的飞速发展,面对着先进消费思想和消费方式所带来的巨大冲击,越来越多的消费者尝试着改变现有的消费模式来实现更便利前卫的消费,互联网创业者也察觉到了这种新的需要。团购网站正在以前所未有的速度被人们所认知,所认同和使用。然而,一个完整的WEB项目否能够成功地开发运行,投入使用,绝不仅仅是一个单纯的技术问题,而很大程度上取决于对系统功能的分析与设计。
本项目开发实现了名为“美嘉“的团购网站,本文介绍了他的总体结构和功能,建立了系统的逻辑模型和物理模型。网站架构分为后台管理和前台,后台系统划分为费用管理模块,申请项目管理模块,用户管理模块,订单管理模块,财务统计模块及内部邮箱模块。讨论了这些模块的功能以及相互之间的联系。系统功能符合网站运营需求,能够通过增删改操作数据库以及各种条件下的查询数据完成所有的业务需求,以方便管理者对网站业务的管理和了解。前台包含了美观友好的用户界面,可以让用户轻松获取当前活跃的团购产品,了解剩余时间,以及通过完善的购物车功能进行购买。
本系统是运用MySQL5.1数据库,JAVA程序语言和MyEclipse9.0平台开发实现的,运用了Struts、Hibernate和Spring框架开发实现,深度体现了用这几个框架的优势。相比于用纯粹JSP实现的WEB项目,这个项目受益于三个成熟的框架,安全性和可维护性
参考文献
[1] 徐会生,何启伟,康爱媛.深入浅出Ext JS [M]. 人民邮电出版社,2009.
[2] 刘英华,程景云,程海蓉.统一建模方法UML及其在房地产信息管理中的应用[J]. 计算机辅助工程,2001(3):48~52.
[3] 李刚,轻量级J2EE企业应用实践—Structs+Spring+Hibernate整合开发[M]. 电子工业出版社,2010.
[4] 埃克尔[美],陈昊鹏译.Java编程思想(第四版)[M].机械工业出版社,2007.
[5] 徐翔斌.用JSTL简化Java Web开发[J].电脑编程技巧与维护, 2007(12),49~56页.
[6] 董梁,刘艳.JAVA高级编程(第二版).清华大学出版社,2006.
[7] 朱清新.计算机算法设计与分析导论.人民大学出版社,2008.
[8] Abraham Silberschatz and Henry F.Korth and S.Sudarshan[英],杨冬青,马秀丽,唐世渭译.数据库系统概念 [M].机械工业出版社,2008.
[9] 杨洋等.DIV+CSS网站布局实录 [M].科学出版社,2009.8.
[10] 叶青.完全手册HTML+CSS+JavaScript实用详解 [M].电子工业出版社,2009.
[11] html专讲 [OL] http://www.wrclub.net/.
[12] 林信良.Spring技术手册 [M]. 电子工业出版社,2009.
[13] 李刚.Struts2.0权威指南 [M].电子工业出版社 http://www.crazyit.org,2009.
[14] 孙卫琴.精通Hibernate:java对象持久化技术详解[M].2006.
[15] 刘中兵.开发者推及:java web主流框架整合开发 [M]. 电子工业出版社,2008.
[16] 周爱民.javascript语言精髓与编成实践 [M]. 电子工业出版社,2008.
附 录 文献翻译
Ⅰ 英文原文
The Mechanism Of SSH and JSP
To comprehend the JSP how unite the technical advantage that above various speak of, come to carry out various result easily, the customer must understand the differentiation of" the module develops for the web page of the center" and" the page develops for the web page of the center" first.
The SSJS and ASP are all in several year ago to release, the network of that time is still very young, no one knows to still have in addition to making all business, data and the expression logic enter the original web page entirely heap what better solve the method .This kind of model that take page as the center studies and gets the very fast development easily .However, along with change of time, the people know that this kind of method is unwell in set up large, the Web that can upgrade applies the procedure .The expression logic write in the script environment was lock in the page, only passing to shear to slice and glue to stick then can drive heavy use .Express the logic to usually mix together with business and the data logics, when this makes be the procedure member to try to change an external appearance that applies the procedure but do not want to break with its lilied business logic, apply the procedure of maintenance be like to walk the similar difficulty on the eggshell .In fact in the business enterprise, heavy use the application of the module already through very mature, no one would like to rewrite those logics for their applied procedure.HTML and sketch the designer handed over to the implement work of their design the Web plait the one who write, make they have to double work- Usually is the handicraft plait to write, because have no fit tool and can carry the script and the HTML contents knot to the server to put together .Chine but speech, apply the complexity of the procedure along with the Web to promote continuously, the development method that take page as the center limits sex to become to get up obviously.
At the same time, the people always at look for the better method of build up the Web application procedure, the module spreads in customer’s machine/ server the realm .JavaBeans and ActiveX were published the company to expand to apply the procedure developer for Java and Windows to use to come to develop the complicated procedure quickly by" the fast application procedure
development"( RAD) tool .These techniques make the expert in the some realm be able to write the module for the perpendicular application plait in the skill area, but the developer can go fetch the usage directly but need not control the expertise of this realm.
Be a kind of take module as the central development terrace, the JSP appeared .It with the JavaBeans and Enterprise JavaBeans( EJB) module includes the model of the business and the data logic for foundation, provide a great deal of label and a script terraces to use to come to show in the HTML page from the contents of JavaBeans creation or send a present in return .Because of the property that regards the module as the center of the JSP, it can drive Java and not the developer of Java uses equally .Not the developer of Java can pass the JSP label( Tags) to use the JavaBeans that the deluxe developer of Java establish .The developer of Java not only can establish and use the JavaBeans, but also can use the language of Java to come to control more accurately in the JSP page according to the expression logic of the first floor JavaBeans.
See now how JSP is handle claim of HTTP .In basic claim model, a claim directly was send to JSP page in .The code of JSP controls to carry on hour of the logic processing and module of JavaBeans’ hand over with each other, and the manifestation result in dynamic state boringly, mixing with the HTML page of the static state HTML code .The Beans can be JavaBeans or module of EJBS .Moreover, the more complicated claim model can see make from is request other JSP pages of the page call sign or Java Servlets .
The engine of JSP wants to chase the code of Java that the label of JSP, code of Java in the JSP page even all converts into the big piece together with the static state HTML contents actually .These codes piece was organized the Java Servlet that customer can not see to go to by the engine of JSP, then the Servlet edits and translate them automatically byte code of Java .Thus, the visitant that is the website requests a JSP page, under the condition of it is not knowing, an already born, the Servlet actual full general that prepared to edit and translate completes all works, very concealment but again and efficiently .The Servlet is to edit and translate of, so the code of JSP in the web page does not need when the every time requests that page is explain .The engine of JSP need to be edit and translate after Servlet the code end is modify only once, then this Servlet that edited and translate can be carry out .The in view of the fact JSP engine auto is born to edit and translate the Servlet also, need not procedure member begins to edit and translate the code, so the JSP can bring vivid sex that
function and fast developments need that you are efficiently.
Compared with the traditional CGI, the JSP has the equal advantage .First , on the speed, the traditional procedure of CGI needs to use the standard importation of the system to output the equipments to carry out the dynamic state web page born, but the JSP is direct is mutually the connection with server .And say for the CGI, each interview needs to add to add a progress to handle, the progress build up and destroy by burning constantly and will be a not small burden for calculator of be the server of Web .The next in order, the JSP is specialized to develop but design for the Web of, its purpose is for building up according to the Web applied procedure, included the norm and the tool of a the whole set .Use the technique of JSP can combine a lot of JSP pages to become a Web application procedure very expediently.
Ⅱ 中文译文
I.SSH2
SSH2即Struts2+Hibernate+Spring
Struts2负责Web层
Hibernate负责与数据库交互
Spring负责注入组件、Web层与数据库交互层衔接及事务处理
Struts 2是Struts的下一代产品。是在 struts 和WebWork的技术基础上进行了合并,全新的Struts 2框架。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
Struts2框架的大概处理流程如下:
1、加载类(FilterDispatcher)
2、读取配置(struts配置文件中的Action)
3、派发请求(客户端发送请求)
4、调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action )
5、启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证)
6、处理业务(回调Action的execute()方法)
7、返回响应(通过execute方法将信息返回到FilterDispatcher)
8、查找响应(FilterDispatcher根据配置查找响应的是什么信息如:SUCCESS、ERROER,将跳转到哪个jsp页面)
9、响应用户(jsp—>客户浏览器端显示)
10、struts2标签库(相比struts1的标签库,struts2是大大加强了,对数据的操作功能很强大)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器。
轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务,它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
II.JSP
JSP简介
JSP(JavaServer 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的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。
JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
JSP技术的强势
(1)一次编写,到处运行。在这一点上Java比PHP更出色,除了系统之外,代码不用做任何更改。
(2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP/PHP的局限性是显而易见的。
(3)强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数台服务器,Java显示了一个巨大的生命力。
(4)多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺
利的运行于多种平台之下。
JSP技术的弱势
(1) 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。
(2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。
JSP六种内置对象:
request, response, out, session, application, config, pagecontext, page, exception.
一.request对象:
该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,即使用该对象可以获取用户提交信息。
二.response对象:
对客户的请求做出动态的响应,向客户端发送数据。
三.session对象
1.什么是session:session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办法知道这是同一个客户,这就需要session对象。
2.session对象的ID:当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到该服务器时,服务器为该客户再创建一个新的session对象。
四.aplication对象
1.什么是application:
服务器启动后就产生了这个application对象,当客户再所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。但是与session不同的是,所有客户的application对象都是同一个,即所有客户
共享这个内置的application对象。
2.application对象常用方法:
(1)public void setAttribute(String key,Object obj): 将参数Object指定的对象obj添加到application对象中,并为添加的对象指定一个索引关键字。
(2)public Object getAttribute(String key): 获取application对象中含有关键字的对象。
五.out对象
out对象是一个输出流,用来向客户端输出数据。out对象用于各种数据的输出。
六.Cookie
1.什么是Cookie:
Cookie是Web服务器保存在用户硬盘上的一段文本。Cookie允许一个Web站点在用户的电脑上保存信息并且随后再取回它。
举例来说,一个Web站点可能会为每一个访问者产生一个唯一的ID,然后以Cookie文件的形式保存在每个用户的机器上。
如果您使用IE浏览器访问Web,您会看到所有保存在您的硬盘上的Cookie。它们最常存放的地方是:c:\windows\cookies(在Window2000中则是C:\Documents and Settings\您的用户名\Cookies )
Cookie是以“关键字key=值value“的格式来保存纪录的.
2.创建一个Cookie对象,调用Cookie对象的构造函数可以创建Cookie。Cookie对象的构造函数有两个字符串参数:Cookie名字和Cookie值。
Cookie c=new Cookie(“username”,”john”);
3. JSP中如果要将封装好的Cookie对象传送到客户端,使用response的addCookie()方法。
格式:response.addCookie©
4.读取保存到客户端的Cookie,使用request对象的getCookies()方法,执行时将所有客户端传来的Cookie对象以数组的形式排列,如果要取出符合需要的Cookie对象,就需要循环比较数组内每个对象的关键字。
谢 辞
经过这些天的努力,《基于SSH2框架整合技术的电子商务支撑平台—美嘉团购网的设计和实现》编码以及文档撰写顺利完成。这个过程中个人能力得到了显著的提高。
首先,我要感谢我的导师尹飞老师。老师平时工作认真负责,尹老师多次从忙碌的日常教学工作中抽出时间来到督促我,为毕设的顺利进行投入了不少的精力。
最后,我要感谢中国地质大学(武汉),感谢远程与继续教育学院,感谢所有帮助过我的老师和同学们。我会努力进取,不断提高和完善自己,不辜负你们对我的期望。