• 209.50 KB
  • 2022-04-22 13:37:01 发布

基于MVC设计模式的Java Web应用对网上购书系统的设计与实现毕业论文.doc

  • 46页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'基于MVC设计模式的JavaWeb应用对网上购书系统的设计与实现毕业论文目录1.绪论………………………………………………………………………………11.1课题背景…………………………………………………………………………11.1.1网上书店系统发展……………………………………………………………11.1.2网上书店系统发展现状………………………………………………………21.1.13网上书店发展的优越性……………………………………………………21.2课题目的与意义…………………………………………………………………32.MVC设计思想………………………………………………………………………42.1MVC设计思想概论………………………………………………………………42.1.1MVC中的M组件………………………………………………………………42.1.2MVC中的V组件………………………………………………………………42.1.3MVC中的C组件………………………………………………………………52.1.4MVC中各组件的关系…………………………………………………………52.2MVC设计模式特征………………………………………………………………62.2.1使用MVC设计模式的优点……………………………………………………62.2.2MVC设计模式的好处…………………………………………………………7 3.系统总体设计和系统功能概述……………………………………………………83.1.1系统设计目标…………………………………………………………………83.1.2JavaBean的任务………………………………………………………………83.1.3JavaBean的设计目标及如何被实现…………………………………………93.2系统功能概述…………………………………………………………………113.2.1用户登陆系统和用户注册系统……………………………………………113.2.2智能化的辨认功能…………………………………………………………113.2.3图书查询功能………………………………………………………………113.2.4先进的购书流程……………………………………………………………123.2.5操作过时管理功能…………………………………………………………123.2.6人性化的操作界面…………………………………………………………124.系统的详细设计和实现…………………………………………………………124.1前期准备………………………………………………………………………124.1.1JavaBean开发环境…………………………………………………………124.1.2确定书和购物车的属性……………………………………………………134.1.3事先封装好所有可能出现的误操作………………………………………154.14Http会话………………………………………………………………………174.1.5建立Session…………………………………………………………………17 4.2注册登陆系统的设计和实现…………………………………………………184.3智能化辨认功能的实现………………………………………………………234.4查询功能的实现………………………………………………………………254.5购书系统的实现………………………………………………………………275.关键技术的介绍…………………………………………………………………335.1Servlet…………………………………………………………………………335.1.1Servlet的解析和载入………………………………………………………335.1.2Servlet的初始化……………………………………………………………335.1.3Servlet的多线程和映射……………………………………………………345.1.4Servlet的卸载………………………………………………………………345.1.5Servlet的映射技术…………………………………………………………355.1.6Servlet的环境………………………………………………………………355.2JDBC技术………………………………………………………………………365.2.1JDBC工作机制………………………………………………………………365.2.2JDBCAPI………………………………………………………………………375.2.3JDBC的优点和缺点…………………………………………………………385.3JavaBean技术…………………………………………………………………395.3.1JavaBean概述………………………………………………………………395.3.2JavaBean和企业Bean的区别………………………………………………39 5.3.3JavaBean的发展……………………………………………………………395.3.4JavaBean的需求……………………………………………………………39结论…………………………………………………………………………………40谢辞…………………………………………………………………………………40参考文献……………………………………………………………………………42 1.绪论1.1课题背景1.1.1课题来源Java这门课程是大学的一门专业课,学的时候十分感兴趣,但毕竟学校里学的真正能运用到实际商业工作中的东西很少。我在实习公司的实习职务就是Java开发人员。由于公司正在帮助另外一家公司开发一个网上购物系统,所以最近在公司前辈那学到这一方面的知识比较多一点,同时感觉这样一个系统的实用性很大,所以决定以此来定我的毕业设计课题。当然,网上购物是一个很大的系统,对于毕业设计来说太大而且开发时间过长,并不可能靠我一个人在如此短的时间内完成,所以选择一个其中的分支——购书系统。对于这样的一个系统开发的时间相对来说短很多并且单独这样一个系统也可以投入商业活动来赢利了,有一定的实际意义。个人感觉定这样一个课题对于自己实习上的专业技能是一个很好的检验,可以为以后自己的工作做更好的准备,同时可以从公司同事开发的系统中借鉴不少好的东西和自己没想到的东西,同时又可以提出自己的个人想法给公司,当然还能得到同事的相关指点,十分有意义。1.2.1网上书店系统发展Internet的迅速发展正以前所未有的深度和广度影响和改善着人类生活的各个方面,越来越多的人开始意识到Internet所蕴含的经济价值的无穷商机,并积极投身于电子商务活动.实际上,电子商务是一些商业行为的电子化,例如网上书店,网上贸易,就网上书店来说,网上书店是目前应用最广,最成功的典范之一,网上书店的崛起对传统的图书流通体系产生了强烈的冲击,有效地缩短了图书流通发行环节,将广大读者,图书,出版者,发行者紧密地结合在一起,大大提高了图书流通率。1.2.2网上书店系统发展现状 西方国家网上书店概况:世界上第一家网上书店是1991年在美国联机公司AOL采购网络上建立的"阅读美国书店",目前最负胜名的是美国西雅图亚马逊图书公司的亚马逊网上书店。它创建于1995年,供书品达310余万种年顾客达500万人次,其价格优惠20-50%。金融结算制度完善,配送服务高效。实现了零库存运转。英国网上书店较著名的有Internet书店,德国的网上书店主要有图书在线网上书店。国内网上书店的概况:自从亚马逊网上书店成功后,中国的网上书店也建立起来。中国最早的网上书店是1997年在杭州新华书店诞生的,在经过年余的艰苦经营,接待了400多位访问者后,悄然引退,而进入1998年后,作为中国书业传统经营力量的新华书店,正式宣布进入网络领域,先是第九届全国书市首次开通书店网站,后来在1998年12月30日上海书城成为国内首家正规的网上书店,读者在家中可以上网完成浏览,选够,付款的全过程。1999年是网上书店迅速发展的一年,商业公司不断进入网上书店有超过几百家,有自己网站的公司有40多家,这个数目还不断增加。1.2.3网上书店的优越性网上书店在价格,时效性,品种,查询方式等方面都有优势。网上书店是一种直销方式,在到书速度和价格上都有优势,目前网上书店的到书时间在北京,上海,广州等大城市一般为1-3天,在外埠则一般3-10天到书,在价格上一般网上书店都有7.5-9折的折扣,如果是特价书折扣就更多了,网上书店的书目数据是任何订购书目都无法比拟的,亚马逊网上书店有300多万种图书,另外还有音乐系列产品和其它教育产品,刚刚成立的北京图书大厦网上书店也有16万种书目数据,“中国寻书网”目前也有50万种书籍,年度将突破100万种图书,网上书店的书目除书名,著者,价格等信息外,还有封面,内容简介,目次,评论等详细信息。同时网上书店的目录查询功能也是传统的按某种分类规则编排的图书征订目录无法比拟的,其以关键词或主题从网上检索某类文献,查准率与查全率都有一定的保障。另外还有一些书更是以网站包销或总代理的形式进行销售,这就意味着一种全新的电子商务模式的开始。1.3课题目的与意义 随着网络技术的发展,Internet已成为最具市场潜力的技术领域,使用Web技术设计的数据库应用软件,是目前Internet市场的技术中坚,各种Web应用如电子商务,网上购物等都采用这种方式实现。MVC开发模式可以分离数据访问和数据表现,让开发人员可以开发一个可伸缩性的强、便于扩展的控制器,来维护整个流程。在MVC模式产生之前,业务逻辑全部撰写在表现层JSP中,其弊端是明显的,首先不利于维护,逻辑层与表现层混杂,动辄上千行代码,其次无法复用,整个项目要进行改造时,不得不推倒重来,大大增加了成本。引入MVC模式之后,逻辑层与表现层分离开来,业务逻辑不再关心具体的显示层面,逻辑层的代码量消除了膨胀隐患,表现层也可交由其它非业务人员自由调整,最后完美整合,在层次分工上,比传统模式更加清晰,利于维护,在项目有升迁移植改造需求时,由于业务逻辑层不与表现层直接关联,故可直接使用已有的业务逻辑,大大减少了重构成本。越大的项目中MVC的作用表现的越明显。进行该系统设计时要保证该系统的扩展性,当有新的业务或现有业务规划调整时能够比较容易的实现,为此采用MVC设计模式对此应用系统进行划分,并最终以三层应用的方式进行部署。在本例中,视图(view)部分由一组JSP页面组成,例如购物页面结算页面。该部分主要提供整个网上购书系统的前段数据的显示。控制(control)部分获得用户的请求,然后根据用户的不同请求调用不同模型(model)提供的不同功能,本例中控制部分使用Servlet实现,模型(model)部分封装了系统的数据及业务规划。2.MVC设计思想2.1MVC设计思想概论MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。2.1.1MVC中的M组件 模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。2.1.2MVC中的V组件视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。2.1.3MVC中的C组件控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后,并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。2.1.4MVC中各组件的关系模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。2.2MVC设计模式特征模型-视图-控制器设计模式有几个常见特征。用户界面通常是用本身不包含任何业务逻辑的JSP文件创建的。这些页面显示MVC体系结构的视图组件。将用户界面中需要执行业务逻辑的表单和超链接提交至映射至操作Servlet的请求URI。存在此Servlet类的一个实例,它接收并且处理更改用户与应用程序交互作用的状态的所有请求。此组件表示MVC体系结构的控制器组件。 操作Servlet选择并调用一个或多个操作以执行请求的业务逻辑。操作通常通过创建或修改存储为请求或会话属性(取决于它们可用的时间)的Javabean来处理应用程序与用户交互作用的状态。此类Javabean表示MVC体系结构的模型组件。操作通常使用ServletAPI的RequestDispatcher.forward()设施将控制传递给适当的JSP文件以生成用户界面的下一个页面,而不是直接生成用户界面的下一个页面。2.2.1使用MVC设计模式的优点大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对于订单的处理都是一样,也就是说订单的处理是一致的。按MVC设计模式,一个订单模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,也易于维护。其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。  控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。 2.2.2MVC设计模式的好处将模型-视图-控制器部分应用于JavaWeb应用程序开发有几个好处:·可以在一定程度上分布开发成果,实现了在Web应用程序中的一部分的更改不需要对其它部分进行更改。负责编写业务逻辑的开发者可以独立于负责控制流的开发者工作,而Web页面设计者可以独立于这些开发者工作。·可以更容易建立工作原型。可以执行如下操作,例如:1.创建一个原型Web应用程序,它访问几个基于工作站的程序。2.更改应用程序以响应用户反馈。3.在同一平台或其它平台上实现生产级程序。除了对程序本身所进行的工作外,只需对配置文件或名称服务器内容进行调整,而不需要对其它源代码进行调整。·可以更容易地迁移旧程序,因为视图与模型和控件是分开的,并且可以根据平台和用户类别进行裁剪。·可以维护由不同位置上的不同技术组成的环境。·MVC设计具有组织结构,该结构更好地支持可伸缩性(构建更大的应用程序)并且易于修改和维护(原因是任务区分得更清楚)。3.系统总体设计和系统功能概述3.1.1系统设计目标本系统设计 的目标是提高软件的质量与生产率,最终实现软件的工业化生产。质量是软件需求方最关心的问题,用户即使不图物美价廉,也要求个货真价实。生产率是软件供应方最关心的问题,老板和员工都想用更少的时间挣更多的钱。质量与生产率之间有着内在的联系,高生产率必须以质量合格为前提。如果质量不合格,对供需双方都是坏事情。从短期效益看,追求高质量会延长软件开发时间并且增大费用,似乎降低了生产率。从长期效益看,高质量将保证软件开发的全过程更加规范流畅,大大降低了软件的维护代价,实质上是提高了生产率,同时可获得很好的信誉。质量与生产率之间不存在根本的对立,好的软件工程方法可以同时提高质量与生产率。3.1.2JavaBean的任务JavaBean的任务就是:“Writeonce,runanywhere,reuseeverywhere”,即“一次性编写,任何地方执行,任何地方重用”。这个任何实际上就是要解决困扰软件工业的日益增加的复杂性,提供一个简单的、紧凑的和优秀的问题解决方案。     1.一个开发良好的软件组件应该是一次性地编写,而不需要再重新编写代码以增强或完善功能。因此,JavaBean应该提供一个实际的方法来增强现有代码的利用率,而不再需要在原有代码上重新进行编程。除了在节约开发资源方面的意义外,一次性地编写JavaBean组件也可以在版本控制方面起到非常好的作用。开发者可以不断地对组件进行改进,而不必从头开始编写代码。这样就可以在原有基础上不断提高组件功能,而不会犯相同的错误。     2.JavaBean组件在任意地方运行是指组件可以在任何环境和平台上使用,这可以满足各种交互式平台的需求。由于JavaBean是基于Java的,所以它可以很容易地得到交互式平台的支持。JavaBean组件在任意地方执行不仅是指组件可以在不同的操作平台上运行,还包括在分布式网络环境中运行。     3.JavaBean组件在任意地方的重用说的是它能够在包括应用程序、其他组件、文档、Web站点和应用程序构造器工具的多种方案中再利用。这也许是JavaBean组件的最为重要的任务了,因为它正是JavaBean组件区别于Java程序的特点之一。Java程序的任务就是JavaBean组件所具有的前两个任务,而这第3个任务却是JavaBean组件独有的。3.1.3JavaBean的设计目标及其如何被实现现在我们来看一实现JavaBean的一些具体的主要设计目标:      1.紧凑而方便的创建和使用     JavaBean紧凑性的需求是基于JavaBean组件常常用于分布式计算环境中,这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。显然,为了适应传送的效率和速度,JavaBean组件必须是越紧凑越好。另外,为了更好地创建和使用组件,就应该使其越简单越好。通常为了提高组件的简易性和紧凑性,设计过程需要投入相对较大的功夫。     现在已有的组件软件技术通常是使用复杂的API,这常常搞得开发者在创建组件时晕头转向。因此,JavaBean组件必须不仅容易使用,而且必须便于开发。这对于组件开发者而言是至关重要的,因为这可以使得开发者不必花大量功夫在使用API进行程序设计上,从而更好地对组件进行润饰,提高组件的可观赏性。     JavaBean组件大部分是基于已有的传统Java编程的类结构上的,这对于那些已经可以熟练地使用Java语言的开发者非常有利。而且这可以使得JavaBean组件更加紧凑,因为Java语言在编程上吸收了以前的编程语言中的大量优点,已经使开发出来的程序变得相当有效率。     2.完全的可移植性     JavaBeanAPI与操作基础的独立于平台的Java系统相结合,提供了独立于平台的组件解决方案。因此,组件开发者就可以不必再为带有Javaapplet平台特有的类库而担心了。最终的结果都将是计算机界共享可重复使用的组件,并在任何支持Java的系统中无需修改地执行。     3.继承Java的强大功能     现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能,它可以使得对象在运行时彼此动态地交互作用,这样对象就可以从开发系统或其开发历史中独立出来。      对于JavaBean而言,由于它是基于Java语言的,所以它就自然地继承了这个对于组件技术而言非常重要的功能,而不再需要任何额外开销来支持它。     JavaBean继承在现有Java功能中还有一个重要的方面,就是持久性,它保存对象并获得对象的内部状态。通过Java提供的序列化(serialization)机制,持久性可以由JavaBean自动进行处理。当然,在需要的时候,开发者也可以自己建立定制的持久性方案。     4.应用程序构造器支持     JavaBean的另一个设计目标是设计环境的问题和开发者如何使用JavaBean创建应用程序。JavaBean体系结构支持指定设计环境属性和编辑机制以便于JavaBean组件的可视化编辑。这样开发者可以使用可视化应用程序构造器无缝地组装和修改JavaBean组件。就像Windows平台上的可视化开发工具VBX或OCX控件处理组件一样。通过这种方法,组件开发者可以指定在开发环境中使用和操作组件的方法。     5.分布式计算支持     支持分布式计算虽然不是JavaBean体系结构中的核心元素,但也是JavaBean中的一个主要问题。     JavaBean使得开发者可以在任何时候使用分布式计算机制,但不使用分布式计算的核心支持来给自己增加额外负担。这正是出于JavaBean组件的紧凑性考虑的,无疑分布式计算需要大量的额外开销。3.2系统功能概述3.2.1用户登陆系统和用户注册系统"登录"是我们验证用户身份的过程 ,用户只需要在登陆界面填写自己的用户名和密码就能完成登陆这一动作,系统将进行前台判断——用户名或密码栏填写是否为空判断,一旦通过前台判断系统就将转入后台处理,根据用户提供的用户名和密码查询数据库中相关信息来判断登陆是否成功,如果成功页面就跳转到购物系统的主页面同时分配一辆专门属于用户的购物车进行操作了,如果登陆失败那么还是停留在登陆界面并且给出相应的信息。当然顾客能进行成功的登陆也必须是老用户——之前已经注册过了。注册只需要用户提供用户想要的用户名和密码,只要用户名没有被占用过那么就注册成功同时页面也将跳转到购物页面同时系统分配购物车,如果不幸用户所喜欢的用户名已经抢先被他人注册了,那么就注册失败还是停留在注册页面同时给出相关信息。注意:如果用户在没有登陆的状态下进进入系统主页面那么用户只是以游客的身份只能查看商品相关信息并不能进行实质性的购买等操作。3.2.2智能化的辨认功能如果用户是以游客的身份进入系统而没有进行登陆的话,那么在系统的页面上会出现你是游客,请登陆后购买图书的信息。如果用户通过登陆系统或注册系统进入,那么系统就会“辨认”出你是谁,同时在页面上友好的显示欢迎某某(用户的用户名)信息。同时系统会根据用户的不同身份来允许用户进行在他权限内的操作。3.2.3图书查询功能在主页面中把本系统中所有的图书依次罗列开来,这样对于没有明确购买目的的顾客有一定的好处,当然很多情况下顾客只是对于众多类型的图书中的某一种感兴趣本系统提供了分类查询的功能。大多数顾客在网络购书中还是有相当的目的性的,所以本系统提供了精确查询这一功能。通过功能强大的图书搜索功能,可以迅速搜索到自己需要的图书,不管你是以注册用户的身份还是以游客的身份你都将能享受这一功能给你带来的方便。3.2.4先进的购书流程 注册用户在浏览图书的过程中只要填写入自己想要购买的数量并点击确认按钮就可以把所要购买的图书放入到自己的购物车中;此时页面会跳转到罗列清单的页面,其中包括了用户所以已经放入到购物车中的图书的书名、数量、ISBN、单价和总价等相关信息;一旦用户完成了选书过程只需要把页面中填写入自己的进一步信息再点击按钮就轻松得完成了。当然系统也提供给用户把已经选择的从购物车中删去的功能。在用户完成了操作后系统会根据用户此次购买的相关信息在数据库中生成相关信息以供工作人员完成后续的送货结帐的工作。3.2.5操作超时管理功能注册用户如果在购书过程中长时间不进行操作(这个时间是由编程人员之前既定的)那么就产生了操作超时,如果用户再进行操作那么系统就会在页面上提示操作过时的信息要求用户重新登陆。3.2.6人性化的操作界面一个网站,能否吸引顾客的经常光顾,界面操作的简单方便也显得非常重要。本系统在每一个页面上都提供了各种用户想要进行操作的按钮。例如在用户没有登陆时会在每一个页面显示让用户登陆或注册等按钮。4.系统的详细设计和实现4.1前期准备4.1.1JavaBean组件的开发环境     普通JavaBean组件是要分布在各自环境中,所以它们应该能够适应各种环境。虽然我们无法事先预知JavaBean要运行的确切环境,但以下两点是可以确定的:     1.bean必须能够在一个应用程序构造器工具中运行。     2.bean必须可以在产生的应用程序的运行环境中使用。     设计环境     第一点说明的是bean必须可以在设计环境(designenvironment)中运行。在设计环境中,bean应该提供设计信息给应用程序构造器工具并允许终端用户制定bean的外  观和行为。在传统的软件构造活动中,必须通过编译、链接之后才能看到应用程序的最终运行结果;而利用JavaBean设计的软件中,则没有这种明确的界限。使用JavaBean,就可以非常直观地设计应用程序软件,在设计过程中赋予软件生机。而且,这个过程更加容易重复开发,设计思想更加容易变成原型。     运行环境      第二点说明的是bean必须可以在运行环境(run-timeenvironment)中使用。在这个环境中,对设计信息和定制的需求并不重要。一个组件的设计环境信息和设计环境中编写的代码通常可能是非常巨大的。     因此,我们可能需要在bean的设计环境方面和运行环境方面作一个明确的区分,这样,就可能需要在运行环境中不使用bean的任何设计环境代码来配置这个bean。所以,JavaBean就必须分别支持运行环境接口的类库和设计环境接口的类库。4.1.2确定书和购物车的属性编写系统中需要的类。Java是种面向对象的软件开发语言,本系统所涉及的对象包括书和购物车,我们把系统中这两个对象的属性从现实生活中抽象出来,留住我们所需要的属性忽略我们所不需要的属性这样就编写出了一个类。以后每次要用到该对象时,只要把类进行实例化就可以了。本系统中保留了书本的四个属性——书名,ISBN,书价还有购书的数量。购物车的属性——罗列车中书本清单,增加书本,删除书本。书的类程序:publicclassBook{privateStringbookIsbn;privateStringbookName;privateStringbookPrice;privateStringbookNumber;publicBook(Stringisbn,Stringname,Stringprice,Stringnumber){this.bookIsbn=isbn;this.bookName=name;this.bookPrice=price;this.bookNumber=number;}publicStringgetBookIsbn(){returnbookIsbn;} publicvoidsetBookIsbn(StringbookIsbn){this.bookIsbn=bookIsbn;}publicStringgetBookName(){returnbookName;}publicvoidsetBookName(StringbookName){this.bookName=bookName;}publicStringgetBookPrice(){returnbookPrice;}publicvoidsetBookPrice(StringbookPrice){this.bookPrice=bookPrice;}publicStringgetBookNumber(){returnbookNumber;}publicvoidsetBookNumber(StringbookNumber){this.bookNumber=bookNumber;}}购物车类:publicclassShoppingCart{ArrayListbooklist=newArrayList();publicvoidaddBook(Booknewbook){booklist.add(newbook);}publicvoiddelBook(Stringisbn){Bookbook=null; for(inti=0;i图2用户登陆图提供两个按钮让用户提交或者修改所填写信息,设计代码:这些都放在form表单里,提交方式有两种:Get和Post,两种提交方式的区别在于以Get方式提交时在URL信息后会跟上提交的相关信息,而以Post方式提交则会隐藏,所以以Post方式提交更加安全。由于两种方式在Servlet中都有相对应的方法doGet和doPost做相应处理,所以必须必须把提交信息放在对应的Servlet中方式中处理。在对相关信息处理后,由Servlet这个控制组件决定返回给客户端不同的页面。Servlet被初始化之后,它已经可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。Servlet也可以执行ServletRequest接口和ServletResponse接口。ServletRequest接口使得Servlet有权使用客户端发出的请求。Servlet可以通过ServletInputStream对象读取请求信息。ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。首先必须拿到由客户端填写在form表单中的数据信息,我们可以用Java提供给我们的方法request.getParameter()来取得:StringuserName=request.getParameter("uName").trim();StringpassWord=request.getParameter("pWord").trim();注意:trim()方式是用来忽略前导和后导空格。 这样我们就把客户端提供的用户名和密码分别放入了userName和passWord这两个String类型的对象中,之后我们就只要对这两个对象做处理就可以了。在本系统中不允许用户名和密码为空,所以本系统在把数据做后台数据库处理前先做了一下前台处理。如果发现其中任何一项为空那么就不用做后台处理而直接返回给客户端原先的登陆页面并把相关出错信息作为HashMap中的属性Attribute值写入HashMap中。实现方法可以实现封装一个类,在类里的方法判断如果为空就写入的错误信息到对应的方法中,如果调用相关方式得到数据那么说明出错。如果通过前台验证就转为后台数据库处理,要做数据库处理必须要连接数据库,本系统在这里调用了一个已经事先封装好了的类的方法来实现,然后通过查询数据库中相应用户名的信息,无论是对应密码错误还是数据库中根本不存在此用户名服务器端都将返回给客户端登陆页面并把错误信息作为HashMap中的属性Attribute值写入HashMap中,如果通过后台验证那么就可以让用户以注册用户身份登陆到系统主页面(http://localhost:8080/Thesis/Main.jsp)同时给用户一辆专用的购物车ShoppingCart(之前要先判断用户本身是不是已经存在了购物车),本系统为了达到操作过时管理可以在此设置Session的生命周期,这个生命周期是以两次用户操作间的时间来判断,只要用户两次操作的时间间隔不超过这个设置的时间那么就不会产生超时。具体实现代码:Errorsloginerror=newErrors();//把封装了错误信息的类实例化err=loginerror.errInform(userName,passWord);if(err.get("username")!=null||err.get("password")!=null){//这看的是不是有错误信息,有就是登陆失败request.setAttribute("Error",err);request.getRequestDispatcher("/Login.jsp").forward(request,response);//用户名或密码为空,返回登陆页面}if(err.get("username")==null&&err.get("password")==null){ try{DatabaseDb=newDatabase();//把封装了连接数据库方法的类实例化ResultSetrs=Db.stmt.executeQuery("select*fromUserInfowhereusername=""+userName+""andpassword=""+passWord+""");if(rs.next()){rs.close();Db.stmt.close();//在Database这个class中没有关闭,所以在这要记得关闭HttpSessionsession=request.getSession(true);session.setMaxInactiveInterval(60*3);//设置了session过期时间为60*3秒ShoppingCartmyShoppingCart=(ShoppingCart)session.getAttribute("sessionId");if(myShoppingCart!=null){//sessionId没有过期,使用本身就留着的shoppingcart,开始购物request.getRequestDispatcher("/Main.jsp").forward(request,response);}else{//sessionId已经过期或第一登陆,使用新的shoppingcart,开始购物ShoppingCartmyNewShoppingCart=newShoppingCart();session.setAttribute("sessionId",myNewShoppingCart);session.setAttribute("userinfo",userName);//是用户名也放在hashMap里,并且要在发送下面句前面request.getRequestDispatcher("/Main.jsp").forward(request,response);}}else{rs.close();Db.stmt.close();request.setAttribute("errordatabase",err); request.getRequestDispatcher("/Login.jsp").forward(request,response);//用户名或密码错误,返回到登陆页面}}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}}}既然根据Servlet组件判断出的不同错误信息服务器端发送不同的错误信息在登陆页面,那么登陆页面肯定是一个动态dynamic的页面,而这动态的又如何在一个登陆的Jsp文件中实现?本系统在Jsp中写入了一写判断语句,根据从HashMap中的到不同的Attribute值显示不同的页面内容,这就是问题的答案。拿用户名为空错误做例子,实现代码:<%HashMaperrorNull=(HashMap)request.getAttribute("Error");if(errorNull!=null){StringusernameNull=(String)errorNull.get("username");if(usernameNull!=null){%><%=usernameNull%><% }}%>效果预览:图3未输入密码错误图图4用户的用户名或密码未通过验证图注册系统的原理和登陆为基本相同的,所不同只是在连接数据库后查询用户名如果存在对应的用户名名说明该用户名已经被占用不能再被注册,返回到注册页面(http://localhost:8080/Thesis/Register.jsp)给出相应信息。如果不存在就注册成功把相应用户名和密码要插入到数据库中。代码如下:database.stmt.execute("insertintouserInfo(username,password)values(""+Reusername+"",""+Repassword+"")");database.stmt.close();HttpSessionsession=request.getSession(true); ShoppingCartmyNewShoppingCart=newShoppingCart();session.setAttribute("sessionId",myNewShoppingCart);session.setAttribute("userinfo",Reusername);request.getRequestDispatcher("/Main.jsp").forward(request,response);图5注册已经存在的用户名错误图4.3智能化辨认功能的实现要实现辨认功能必须要有一个唯一的标识,这里用Session技术实现,因为Session有一个生命周期,且在用户登陆状态下服务器端才分配一个唯一的Session给予用户,一旦Session过期用户的权限就跟游客一样不能进行实质的购书活动,必须重新登陆,所以以Session来管理辨认这一功能是最为恰当的。一个Javaservlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。所有的JavaServlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web服务器按照JavaServletAPI定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。javax.servlet.Servlet接口定义了在Servlet的生命周期中特定时间以及特定顺序被调用的方法。同样的道理,用户如果操作过时不能进行实质性的购书活动那购物车的存在对于服务器端来说就是一个资源浪费,所以用Session来管理购物车也是最为合适的。下面来介绍用Session管理用户信息的技术实现。 Session有两个对应的属性Attribute,一个是名字name还有一个就是值value。我们可以把自己想要管理的信息取一个唯一的名字name同时把它对应的值value(就是我们想要管理的具体实物)一起写入Session中,语法:session.setAttribute(name,value)这样我们只要查看我们要管理的实物的name所对应的value就可以了。以用户信息userinfo为例子,具体实现的代码如下:在用户登陆成功后的Servlet组件中我们需要把用户信息写入Session中,本系统用userinfo作为name,那用户的注册用户名作为具体管理的实物session.setAttribute("userinfo",userName)这样就实现了写入想要管理用户信息value这个实物和和name的功能在Jsp组件中只要判断Session中userinfo的value的不同显示不同的信息就可以了:<%if(session.getAttribute("userinfo")==null){%>欢迎光临,游客!想购买你喜欢的商品请登陆或注册成我们的新用户!!!<%}else{%>欢迎光临,<%=session.getAttribute("userinfo")%>,你可以挑选你喜欢的任何商品了!!!<%}%>图6未登陆状态图图7以Gavin注册用户登陆状态图 4.4查询系统的实现查询功能应该是每一个网站所需要的功能,对于电子商务网站对于此功能更是不可或缺。本系统中这一功能对于游客也是可以使用的。首先本系统提供给用户以分类查询功能。本系统假设了四类的图书:小说,管理,旅游,卡通(每一类假设了四本图书)本系统为每一类书都写了一个Jsp,每个Jsp把每一类的书全部罗列了出来。所以只要在页面把四类书的标题列出来同时做一个超级连接就可以了。图8分类选择图书图超级连接的实现:卡通这样就完成了对于卡通这一类书的超级连接,只要在http://localhost:8080/Thesis/CartoonBooks.jsp这一页面中罗列所有卡通书即可首先本系统提供给用户以精确和模糊查询功能。本系统在每一个选购图书的页面都会提供一个查询文本框:
在所有商品中搜索图9精确查询图书图用户只要在文本框中输入自己要要查看的图书全名或关键字就可以查询到。本功能的实现以《HarryPotterBoxedSet》这一本书做为讲解用户在文本框中输入HarryPotterBoxed Set这一全名当然可以准确的查到购买此书的网页,同样本系统为了防止用户只知道书名的关键字而不知道全名这一情况给出解决办法:本文本框也是以form表单的Post方式提交到Main.Servlet组件,所以作为处理用户提交的信息的Main.Servlet中的程序代码必须用doPost方法中。本系统把每一种可能的关键字组合作为一个判断依据进行处理。HarryPotterBoxedSet的所有可能的关键字组合本人以为:Harrypotter和Harry还有就是Potter,只要在该文本框中输入这其中的一种可能组合关键字用户同样可以查询到该《HarryPotterBoxedSet》一书进行进一步的操作。所以在Main.Servlet中可以做如下判断:if(searchform.equals("HarryPotterBoxedSet")||searchform.equals("HarryPotter")||searchform.equals("Harry")||searchform.equals("Potter"))这样写代码的问题还是存在的:如果用户不小心在输入的内容前加了几个空格或最后加上了几个空格如”HarryPotter”那么该代码还是不能查询到用户想要的结果,而输入的关键字又是准确的所以这样的查询功能还是很不智能的.同时该查询中还有一个缺陷,设想用户在查询框中输入并没有严格按照”HarryPotter”这样的大小规范,例如用户在查询框中输入”HarrypoTTeR”那么用户还是查询不到想要的结果。所以针对以上问题,我做了如下处理:对于大小写规范问题:不管用户提供的查询信息的大小写是怎么样的,我都把所有在文本框中的信息转化成为小写字母然后再做处理,然后在做判断中只要把所有可能的关键字组合用全部小写规范写就解决了这一问题。而在Java中正好有这样一个处理String类型的方法:toLowerCase()对于前导空格和后导空格的问题,在Java中同样给出了解决的方法:trim()所以完整的代码:Stringsearchform=request.getParameter("searchform").trim().toLowerCase();//把从form表单中读取到的String类型的数据在作小写处理和忽略前导和后导空格后放入到//searchform这一个变量对象中 if(searchform.equals("harrypotterboxedset")||searchform.equals("harrypotter")||searchform.equals("harry")||searchform.equals("potter")){//注意这里的所有可能出现的组合必须要用小写形式request.getRequestDispatcher("/Harry_Potter_Boxed_Set.jsp").forward(request,response);//跳转到《HarryPotterBoxedSet》一书的页面}4.5购书系统的实现用户点击自己喜欢的图书页面就会跳转到该书的详细介绍页面,其中包括该书的书名、ISBN、市场价格和本网站提供的更加优惠的价格等信息,用户在这一页面就可以实现购书的具体操作。以《HarryPotterBoxedSet》一书作为该系统设计和实现的例子。要实现购书这一动作本系统设置了一定的权限,只有注册用户在登陆的状态下才有这一权限。如果用户在没有登陆状态下实行购买,系统会停留在原来的页面上同时给出要求以登陆状态购买的信息并且比较友好的出现注册和登陆的两个按钮,这两个按钮原先是不存在的,只有用户在这样的误操作状态下才会出现。图10购买图书图 图11购买失败图同时本系统要求用户必须在数量这一文本框中填入用户想购买的数量,如果没有填写同样是一次误操作。以下是这些功能实现的代码:在Servlet组件中处理:if(session.getAttribute("userinfo")==null){Errorserror=newErrors();HashMaperrtime=error.errInform("abc","wer");就可以了request.setAttribute("timeout",errtime);request.getRequestDispatcher("/Harry_Potter_Boxed_Set.jsp").forward(request,response);}else{if(request.getParameter("number")==null||request.getParameter("number").length()==0){Errorserror=newErrors();HashMaperrNull=error.errInform("abc","wer");request.setAttribute("numberformNull",errNull);request.getRequestDispatcher("/Harry_Potter_Boxed_Set.jsp").forward(request,response);在显示组件Jsp中:<%HashMaptimeout=(HashMap)request.getAttribute("timeout");//这的getAttribute的名字要和相对应的setAttribute对应 if(timeout!=null){Stringerrortimeout=(String)timeout.get("errortimeout");if(errortimeout!=null){System.out.println("没有登陆操作或session已经过期");%>
<%=errortimeout%>


<%}}HashMaperror=(HashMap)request.getAttribute("numberformNull");if(error!=null){StringerrorNull=(String)error.get("numberform");if(errorNull!=null){System.out.println("用户没有填写想购买的数量");%> 如果用户没有产生任何的误操作那么页面就会跳转到清单列表的Jsp页面,其中把用户之前的所有的放入购物车ShoppingCart中的书都罗列出来,并显示这些书的相关信息以及用户应付的总价。因为有的时候书本的价格等会随时变动那么把书本的相关信息以静态网页形式表现出来显然不是很合理并且对于数据维护人员的后期维护会带来相当麻烦。为了解决这一问题本系统把书本的相关信息从数据库中读出来,那么数据维护人员可以根据不同时间对于书本信息的改变只要在数据库中完成即可,显然会方便很多具有可行性。因为书本的ISBN号是唯一的且不会改变,所以只要把书本的ISBN号从网页中读到然后从数据库中读取书本信息中跟该ISBN号匹配的书本信息就可以实现了。ResultSetrs=database.stmt.executeQuery("select*fromCartoonbookInfowherebookisbn="C01"");ShoppingCartmyShoppingCart=(ShoppingCart)session.getAttribute("sessionId");Bookbook=newBook(null,null,null,null);while(rs.next()){book.setBookIsbn(rs.getString("bookisbn"));book.setBookName(rs.getString("bookname"));book.setBookPrice(rs.getString("bookprice"));book.setBookNumber(request.getParameter("number"));myShoppingCart.addBook(book);图12查看购物车内信息图接下去用户可以继续购物,页面上提供了这样的按钮,如果用户把自己所需要的书已经已经都放入了购物车想要完成此次购买的那么就需要提供用户更加具体的信息来完成这次定单。 图13提交购物定单图用户把相关信息提供之后点击“下一步”按狃就完成了本次购买。如何把用户的这次购买的相关信息准确的反映给工作人员完成后期的配送货呢?问题的答案就是把相关的信息作为数据库中ShoppingInfo表的数据插入,那么工作人员只要看到数据库中的信息就可以知道需要什么书送到什么地方的哪位客户那里,并且根据用户需要的运输方式及时的完成本次定单让用户满意。if(request.getParameter("transport").equals("common")){ShoppingCartmyShoppingCart=(ShoppingCart)session.getAttribute("sessionId");Book[]items=myShoppingCart.BookList();for(inti=0;i

您可能关注的文档

相关文档

最近下载