基于MVC设计模式对网上购书系统的设计与实现

更新时间:2024-05-04 23:29:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

火龙果?整理 uml.org.cn 目录

1.绪论 ??????????????????????????????1 1.1课题背景????????????????????????????1 1.1.1 网上书店系统发展???????????????????????1 1.1.2 网上书店系统发展现状?????????????????????2 1.1.13 网上书店发展的优越性 ????????????????????2 1.2 课题目的与意义?????????????????????????3 2.MVC设计思想???????????????????????????4 2.1 MVC设计思想概论????????????????????????4 2.1.1 MVC中的M组件????????????????????????4 2.1.2 MVC中的V组件????????????????????????4 2.1.3 MVC中的C组件????????????????????????5 2.1.4 MVC中各组件的关系??????????????????????5 2.2 MVC设计模式特征????????????????????????6 2.2.1 使用MVC设计模式的优点????????????????????6 2.2.2 MVC设计模式的好处 ??????????????????????7 3.系统总体设计和系统功能概述????????????????????8 3.1.1 系统设计目标?????????????????????????8

火龙果?整理 uml.org.cn 3.1.2 JavaBean的任务????????????????????????8 3.1.3 JavaBean的设计目标及如何被实现????????????????9 3.2 系统功能概述 ?????????????????????????11 3.2.1 用户登陆系统和用户注册系统 ?????????????????11 3.2.2 智能化的辨认功能 ??????????????????????11 3.2.3 图书查询功能 ????????????????????????11 3.2.4先进的购书流程 ???????????????????????12 3.2.5 操作过时管理功能 ??????????????????????12 3.2.6 人性化的操作界面 ??????????????????????12 4.系统的详细设计和实现 ??????????????????????12 4.1 前期准备 ???????????????????????????12 4.1.1 JavaBean开发环境 ??????????????????????12 4.1.2 确定书和购物车的属性 ????????????????????13 4.1.3 事先封装好所有可能出现的误操作 ???????????????15 4.14 Http会话???????????????????????????17 4.1.5建立Session ?????????????????????????17 4.2 注册登陆系统的设计和实现 ???????????????????18 4.3 智能化辨认功能的实现 ?????????????????????23 4.4 查询功能的实现 ????????????????????????25

火龙果?整理 uml.org.cn 4.5 购书系统的实现 ????????????????????????27 5.关键技术的介绍 ?????????????????????????33 5.1 Servlet????????????????????????????33 5.1.1 Servlet的解析和载入?????????????????????33 5.1.2 Servlet的初始化???????????????????????33 5.1.3 Servlet的多线程和映射????????????????????34 5.1.4 Servlet的卸载????????????????????????34 5.1.5 Servlet的映射技术??????????????????????35 5.1.6 Servlet的环境????????????????????????35 5.2 JDBC技术 ???????????????????????????36 5.2.1 JDBC工作机制 ????????????????????????36 5.2.2 JDBC API???????????????????????????37 5.2.3 JDBC的优点和缺点 ??????????????????????38 5.3 JavaBean技术 ?????????????????????????39 5.3.1 JavaBean概述 ????????????????????????39 5.3.2 JavaBean和企业Bean的区别??????????????????39 5.3.3 JavaBean的发展 ???????????????????????39 5.3.4 JavaBean的需求 ???????????????????????39 结论 ???????????????????????????????40

火龙果?整理 uml.org.cn 谢辞???????????????????????????????40 参考文献?????????????????????????????42

火龙果?整理 uml.org.cn 基于MVC设计模式的Java Web应用

——对网上购书系统的设计与实现

摘要 随着网络技术的发展,Internet已成为最具市场潜力的技术领域,使用Web技术设计的数据库应用软件,是目前Internet市场的技术中坚,各种Web应用如电子商务,网上购物等都采用这种方式实现。MVC开发模式可以分离数据访问和数据表现,让开发人员可以开发一个可伸缩性强的、便于扩展的控制器,来维护整个流程。本文采用JSP、Servlet、JavaBean和JDBC等一些JAVA WEB相关技术实现了一个简单的网上购书系统,该系统通用性强,经过简单的修改就可以应用于更广泛的网上购物系统,具有一定的推广价值。 关键词 MVC;JSP;Servlet; JDBC; JavaBean

1.绪论

1.1课题背景

1.1.1课题来源

Java这门课程是大学的一门专业课,学的时候十分感兴趣,但毕竟学校里学的真正能运用到实际商业工作中的东西很少。我在实习公司的实习职务就是Java开发人员。由于公司正在帮助另外一家公司开发一个网上购物系统,所以最近在公司前辈那学到这一方面的知识比较多一点,同时感觉这样一个系统的实用性很大,所以决定以此来定我的毕业设计课题。当然,网上购物是一个很大的系统,对于毕业设计来说太大而且开发时间过长,并不可能靠我一个人在如此短的时间内完成,所以选择一个其中的分支——购书系统。对于这样的一个系统开发的时间相对来说短很多并且单独这样一个系统也可以投入商业活动来赢利了,有一定的实际意义。个人感觉定这样一个课题对于自己实习上的专业技能是一个很好的检验,可以为以后自己的工作做更好的准备,同时可以从公司同事开发的系统中借鉴不少好的东西和自己没想到的东西,同时又可以提出自己的个人想法给公司,当然还能得到同事的相关指点,十分有意义。 1.2.1网上书店系统发展

Internet 的迅速发展正以前所未有的深度和广度影响和改善着人类生活的各个方面,越来越多的人开始意识到Internet所蕴含的经济价值的无穷商机,并

火龙果?整理 uml.org.cn 积极投身于电子商务活动.实际上,电子商务是一些商业行为的电子化,例如网上书店,网上贸易,就网上书店来说,网上书店是目前应用最广,最成功的典范之一,网上书店的崛起对传统的图书流通体系产生了强烈的冲击,有效地缩短了图书流通发行环节,将广大读者,图书,出版者,发行者紧密地结合在一起,大大提高了图书流通率。

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万种图书,网上书店的书目除书名,著者,价格等信息外,还有封面,内容简介,目次,评论

火龙果?整理 uml.org.cn 等详细信息。同时网上书店的目录查询功能也是传统的按某种分类规则编排的图书征订目录无法比拟的,其以关键词或主题从网上检索某类文献,查准率与查全率都有一定的保障。另外还有一些书更是以网站包销或总代理的形式进行销售,这就意味着一种全新的电子商务模式的开始。

1.3课题目的与意义

随着网络技术的发展,Internet已成为最具市场潜力的技术领域,使用Web技术设计的数据库应用软件,是目前Internet市场的技术中坚,各种Web应用如电子商务,网上购物等都采用这种方式实现。MVC开发模式可以分离数据访问和数据表现,让开发人员可以开发一个可伸缩性的强、便于扩展的控制器,来维护整个流程。

在MVC模式产生之前,业务逻辑全部撰写在表现层JSP中,其弊端是明显的,首先不利于维护,逻辑层与表现层混杂,动辄上千行代码,其次无法复用,整个项目要进行改造时,不得不推倒重来,大大增加了成本。引入MVC模式之后,逻辑层与表现层分离开来,业务逻辑不再关心具体的显示层面,逻辑层的代码量消除了膨胀隐患,表现层也可交由其它非业务人员自由调整,最后完美整合,在层次分工上,比传统模式更加清晰,利于维护,在项目有升迁移植改造需求时,由于业务逻辑层不与表现层直接关联,故可直接使用已有的业务逻辑,大大减少了重构成本。越大的项目中MVC的作用表现的越明显。

进行该系统设计时要保证该系统的扩展性,当有新的业务或现有业务规划调整时能够比较容易的实现,为此采用MVC设计模式对此应用系统进行划分,并最终以三层应用的方式进行部署。在本例中,视图(view)部分由一组JSP页面组成,例如购物页面结算页面。该部分主要提供整个网上购书系统的前段数据的显示。控制(control)部分获得用户的请求,然后根据用户的不同请求调用不同模型(model)提供的不同功能,本例中控制部分使用Servlet实现,模型(model)部分封装了系统的数据及业务规划。

2.MVC设计思想

火龙果?整理 uml.org.cn 2.1 MVC设计思想概论

MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。 2.1.1 MVC中的M组件

模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。 2.1.2 MVC中的V组件

视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。

火龙果?整理 uml.org.cn 业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。 2.1.3 MVC中的C组件

控制(Controller)可以理解为从用户接收请求,将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。

2.1.4 MVC中各组件的关系

模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示。

火龙果?整理 uml.org.cn 2.2 MVC设计模式特征

模型-视图-控制器设计模式有几个常见特征。用户界面通常是用本身不包含任何业务逻辑的 JSP 文件创建的。这些页面显示 MVC 体系结构的视图组件。

将用户界面中需要执行业务逻辑的表单和超链接提交至映射至操作Servlet的请求 URI。存在此Servlet 类的一个实例,它接收并且处理更改用户与应用程序交互作用的状态的所有请求。此组件表示 MVC 体系结构的控制器组件。

操作 Servlet 选择并调用一个或多个操作以执行请求的业务逻辑。操作通常通过创建或修改存储为请求或会话属性(取决于它们可用的时间)的 Javabean 来处理应用程序与用户交互作用的状态。此类 Java bean 表示 MVC 体系结构的模型组件。操作通常使用Servlet API 的 RequestDispatcher.forward() 设施将控制传递给适当的 JSP 文件以生成用户界面的下一个页面,而不是直接生成用户界面的下一个页面。

2.2.1使用MVC设计模式的优点

大部分用过程语言比如ASP、PHP开发出来的Web应用,初始的开发模板就是混合层的数据编程。例如,直接向数据库发送请求并用HTML显示,开发速度往往比较快,但由于数据页面的分离不是很直接,因而很难体现出业务模型的样子或者模型的重用性。产品设计弹性力度很小,很难满足用户的变化性需求。MVC要求对应用分层,虽然要花费额外的工作,但产品的结构清晰,产品的应用通过模型可以得到更好地体现。

首先,最重要的是应该有多个视图对应一个模型的能力。在目前用户需求的快速变化下,可能有多种方式访问应用的要求。例如,订单模型可能有本系统的订单,也有网上订单,或者其他系统的订单,但对于订单的处理都是一样,也就是说订单的处理是一致的。按MVC设计模式,一个订单模型以及多个视图即可解决问题。这样减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,

火龙果?整理 uml.org.cn 也易于维护。 其次,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。

再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个应用的业务流程或者业务规则的改变只需改动MVC的模型层。 控制层的概念也很有效,由于它把不同的模型和不同的视图组合在一起完成不同的请求,因此,控制层可以说是包含了用户请求权限的概念。

最后,它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化产生管理程序代码。 2.2.2 MVC 设计模式的好处

将模型-视图-控制器部分应用于 Java Web 应用程序开发有几个好处:

?

可以在一定程度上分布开发成果,实现了在 Web 应用程序中的一部分的更改不需要对其它部分进行更改。负责编写业务逻辑的开发者可以独立于负责控制流的开发者工作,而 Web 页面设计者可以独立于这些开发者工作。

?

可以更容易建立工作原型。可以执行如下操作,例如:

1. 创建一个原型 Web 应用程序,它访问几个基于工作站的程序。 2. 更改应用程序以响应用户反馈。

3. 在同一平台或其它平台上实现生产级程序。

除了对程序本身所进行的工作外,只需对配置文件或名称服务器内容进行调整,而不需要对其它源代码进行调整。

?

可以更容易地迁移旧程序,因为视图与模型和控件是分开的,并且可以根据平台和用户类别进行裁剪。

? ?

可以维护由不同位置上的不同技术组成的环境。

MVC 设计具有组织结构,该结构更好地支持可伸缩性(构建更大的应用程序)并且易于修改和维护(原因是任务区分得更清楚)。

火龙果?整理 uml.org.cn

3.系统总体设计和系统功能概述

3.1.1 系统设计目标

本系统设计的目标是提高软件的质量与生产率,最终实现软件的工业化生产。质量是软件需求方最关心的问题,用户即使不图物美价廉,也要求个货真价实。生产率是软件供应方最关心的问题,老板和员工都想用更少的时间挣更多的钱。质量与生产率之间有着内在的联系,高生产率必须以质量合格为前提。如果质量不合格,对供需双方都是坏事情。从短期效益看,追求高质量会延长软件开发时间并且增大费用,似乎降低了生产率。从长期效益看,高质量将保证软件开发的全过程更加规范流畅,大大降低了软件的维护代价,实质上是提高了生产率,同时可获得很好的信誉。质量与生产率之间不存在根本的对立,好的软件工程方法可以同时提高质量与生产率。 3.1.2 JavaBean的任务

JavaBean的任务就是: “Write once, run anywhere, reuse everywhere”,即“一次性编写,任何地方执行,任何地方重用”。这个任何实际上就是要解决困扰软件工业的日益增加的复杂性,提供一个简单的、紧凑的和优秀的问题解决方案。

1. 一个开发良好的软件组件应该是一次性地编写,而不需要再重新编写代码以增强或完善功能。因此,JavaBean应该提供一个实际的方法来增强现有代码的利用率,而不再需要在原有代码上重新进行编程。除了在节约开发资源方面的意义外,一次性地编写JavaBean组件也可以在版本控制方面起到非常好的作用。开发者可以不断地对组件进行改进,而不必从头开始编写代码。这样就可以在原有基础上不断提高组件功能,而不会犯相同的错误。

2. JavaBean组件在任意地方运行是指组件可以在任何环境和平台上使用,这可以满足各种交互式平台的需求。由于JavaBean是基于Java的,所以它

火龙果?整理 uml.org.cn 可以很容易地得到交互式平台的支持。JavaBean组件在任意地方执行不仅是指组件可以在不同的操作平台上运行,还包括在分布式网络环境中运行。 3.JavaBean组件在任意地方的重用说的是它能够在包括应用程序、其他组件、文档、Web站点和应用程序构造器工具的多种方案中再利用。这也许是JavaBean组件的最为重要的任务了,因为它正是JavaBean组件区别于Java程序的特点之一。Java程序的任务就是JavaBean组件所具有的前两个任务,而这第3个任务却是JavaBean组件独有的。 3.1.3 JavaBean的设计目标及其如何被实现

现在我们来看一实现JavaBean的一些具体的主要设计目标: 1.紧凑而方便的创建和使用

JavaBean紧凑性的需求是基于JavaBean组件常常用于分布式计算环境中,这使得JavaBean组件常常需要在有限的带宽连接环境下进行传输。显然,为了适应传送的效率和速度,JavaBean组件必须是越紧凑越好。另外,为了更好地创建和使用组件,就应该使其越简单越好。通常为了提高组件的简易性和紧凑性,设计过程需要投入相对较大的功夫。

现在已有的组件软件技术通常是使用复杂的API,这常常搞得开发者在创建组件时晕头转向。因此,JavaBean组件必须不仅容易使用,而且必须便于开发。这对于组件开发者而言是至关重要的,因为这可以使得开发者不必花大量功夫在使用API进行程序设计上,从而更好地对组件进行润饰,提高组件的可观赏性。

JavaBean组件大部分是基于已有的传统Java编程的类结构上的,这对于那些已经可以熟练地使用Java语言的开发者非常有利。而且这可以使得JavaBean组件更加紧凑,因为Java语言在编程上吸收了以前的编程语言中的大量优点,已经使开发出来的程序变得相当有效率。 2.完全的可移植性

火龙果?整理 uml.org.cn JavaBean API与操作基础的独立于平台的Java系统相结合,提供了独立于平台的组件解决方案。因此,组件开发者就可以不必再为带有Java applet平台特有的类库而担心了。最终的结果都将是计算机界共享可重复使用的组件,并在任何支持Java的系统中无需修改地执行。 3.继承Java的强大功能

现有的Java结构已经提供了多种易于应用于组件的功能。其中一个比较重要的是Java本身的内置类发现功能,它可以使得对象在运行时彼此动态地交互作用,这样对象就可以从开发系统或其开发历史中独立出来。

对于JavaBean而言,由于它是基于Java语言的,所以它就自然地继承了这个对于组件技术而言非常重要的功能,而不再需要任何额外开销来支持它。 JavaBean继承在现有Java功能中还有一个重要的方面,就是持久性,它保存对象并获得对象的内部状态。通过Java提供的序列化(serialization)机制,持久性可以由JavaBean自动进行处理。当然,在需要的时候,开发者也可以自己建立定制的持久性方案。 4.应用程序构造器支持

JavaBean的另一个设计目标是设计环境的问题和开发者如何使用JavaBean创建应用程序。JavaBean体系结构支持指定设计环境属性和编辑机制以便于JavaBean组件的可视化编辑。这样开发者可以使用可视化应用程序构造器无缝地组装和修改JavaBean组件。就像Windows平台上的可视化开发工具VBX或OCX控件处理组件一样。通过这种方法,组件开发者可以指定在开发环境中使用和操作组件的方法。 5.分布式计算支持

支持分布式计算虽然不是JavaBean体系结构中的核心元素,但也是JavaBean中的一个主要问题。

火龙果?整理 uml.org.cn JavaBean使得开发者可以在任何时候使用分布式计算机制,但不使用分布式计算的核心支持来给自己增加额外负担。这正是出于JavaBean组件的紧凑性考虑的,无疑分布式计算需要大量的额外开销。

3.2系统功能概述

3.2.1 用户登陆系统和用户注册系统

\登录\是我们验证用户身份的过程,用户只需要在登陆界面填写自己的用户名和密码就能完成登陆这一动作,系统将进行前台判断——用户名或密码栏填写是否为空判断,一旦通过前台判断系统就将转入后台处理,根据用户提供的用户名和密码查询数据库中相关信息来判断登陆是否成功,如果成功页面就跳转到购物系统的主页面同时分配一辆专门属于用户的购物车进行操作了,如果登陆失败那么还是停留在登陆界面并且给出相应的信息。

当然顾客能进行成功的登陆也必须是老用户——之前已经注册过了。注册只需要用户提供用户想要的用户名和密码,只要用户名没有被占用过那么就注册成功同时页面也将跳转到购物页面同时系统分配购物车,如果不幸用户所喜欢的用户名已经抢先被他人注册了,那么就注册失败还是停留在注册页面同时给出相关信息。

注意:如果用户在没有登陆的状态下进进入系统主页面那么用户只是以游客的身份只能查看商品相关信息并不能进行实质性的购买等操作。 3.2.2 智能化的辨认功能

如果用户是以游客的身份进入系统而没有进行登陆的话,那么在系统的页面上会出现你是游客,请登陆后购买图书的信息。如果用户通过登陆系统或注册系统进入,那么系统就会“辨认”出你是谁,同时在页面上友好的显示欢迎某某(用户的用户名)信息。同时系统会根据用户的不同身份来允许用户进行在他权限内的操作。

3.2.3 图书查询功能

在主页面中把本系统中所有的图书依次罗列开来,这样对于没有明确购买目的的顾客有一定的好处,当然很多情况下顾客只是对于众多类型的图书中的某一

火龙果?整理 uml.org.cn 确的查询\

//error.put(\你必须选择一种运输方式\ }

4.1.3 HTTP会话

HTTP是一个没有状态的协议。要建立一个有效的Web服务应用,你必须能够识别一个连续的来自远端的客户机的唯一的请求。随着时间的过去,发展了许多会话跟踪的技术,但是使用起来都比较麻烦。

Java Servlet API提供了一个简单的接口,通过这个接口,Servlet引擎可以有效地跟踪用户的会话。 4.1.4建立Session

因为HTTP是一个请求-响应协议,一个会话在客户机加入之前会被认为是一个新的会话。加入的意思是返回会话跟踪信息到服务器中,指出会话已被建立。在客户端加入之前,我们不能判断下一个客户端请求是目前会话的一部分。 在下面的情况下,Session会被认为是新的Session。

客户端的Session在此之前还不知道

端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie 作为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一个Session对象。当Session终止时,服务器会释放Session对象以及所有绑定在Session上的对象。

绑定对象到Session中

如果有助于你处理应用的数据需求,你也许需要绑定对象到Session中,你可以通过一个唯一的名字绑定任何的对象到Session中,这时,你需要使用HttpSession对象。任何绑定到Session上的对象都可以被处理同一会话的Servlet调用。

有些对象可能需要你知道什么时候会被放置到Session中或从Session中移开。

return error;

火龙果?整理 uml.org.cn 你可以通过使用HttpSessionBindingListener接口获得这些信息。当你的应用存储数据到Session中,或从Session中清除数据,Servlet都会通过HttpSessionBindingListener检查什么类被绑定或被取消绑定。这个接口的方法会通报被绑定或被取消绑定的对象。

4.2注册登陆系统的设计和实现

在登陆页面(http://localhost:8080/Thesis/Login.jsp)提供两个文本框让用户填写自己所想要的用户名和密码,设计代码:

图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

火龙果?整理 uml.org.cn 对象读取请求信息。

ServletResponse接口允许Servlet建立响应头和状态代码。通过执行这个接口,Servlet有权使用ServletOutputStream类来向客户端返回数据。

首先必须拿到由客户端填写在form表单中的数据信息,我们可以用Java提供给我们的方法request.getParameter()来取得:

String userName = request.getParameter(\String passWord = request.getParameter(\

注意:trim()方式是用来忽略前导和后导空格。

这样我们就把客户端提供的用户名和密码分别放入了userName和passWord这两个String类型的对象中,之后我们就只要对这两个对象做处理就可以了。 在本系统中不允许用户名和密码为空,所以本系统在把数据做后台数据库处理前先做了一下前台处理。

如果发现其中任何一项为空那么就不用做后台处理而直接返回给客户端原先的登陆页面并把相关出错信息作为HashMap中的属性Attribute值写入HashMap中。实现方法可以实现封装一个类,在类里的方法判断如果为空就写入的错误信息到对应的方法中,如果调用相关方式得到数据那么说明出错。 如果通过前台验证就转为后台数据库处理,要做数据库处理必须要连接数据库,本系统在这里调用了一个已经事先封装好了的类的方法来实现,然后通过查询数据库中相应用户名的信息,无论是对应密码错误还是数据库中根本不存在此用户名服务器端都将返回给客户端登陆页面并把错误信息作为HashMap中的属性Attribute值写入HashMap中,如果通过后台验证那么就可以让用户以注册用户身份登陆到系统主页面(http://localhost:8080/Thesis/Main.jsp)同时给用户一辆专用的购物车ShoppingCart(之前要先判断用户本身是不是已经存在了购物车),本系统为了达到操作过时管理可以在此设置Session的生命周期,这个生命周期是以两次用户操作间的时间来判断,只要用户两次操作的时间间隔不超过这个设置的时间那么就不会产生超时。具体实现代码:

Errors loginerror = new Errors(); //把封装了错误信息的类实例化 err = loginerror.errInform(userName, passWord);

if( err.get(\

火龙果?整理 uml.org.cn //这看的是不是有错误信息,有就是登陆失败 request.setAttribute(\

request.getRequestDispatcher(\response);

//用户名或密码为空,返回登陆页面 }

if( err.get(\try{

Database Db = new Database();//把封装了连接数据库方法的类实例化 ResultSet rs = Db.stmt.executeQuery( %username='\if(rs.next()){ rs.close(); Db.stmt.close();

//在Database这个class中没有关闭,所以在这要记得关闭 HttpSession session = request.getSession(true); session.setMaxInactiveInterval(60*3); //设置了session过期时间为60*3秒 ShoppingCart myShoppingCart =

(ShoppingCart)session.getAttribute(\if(myShoppingCart != null){

//sessionId没有过期,使用本身就留着的shoppingcart,开始购物

request.getRequestDispatcher(\}else{

//sessionId已经过期或第一登陆,使用新的shoppingcart,开始购物 ShoppingCart myNewShoppingCart = new ShoppingCart(); session.setAttribute(\session.setAttribute(\//是用户名也放在hashMap里,并且要在发送下面句前面

火龙果?整理 uml.org.cn request.getRequestDispatcher(\} } else{ rs.close(); Db.stmt.close();

request.setAttribute(\

request.getRequestDispatcher(\response);

//用户名或密码错误,返回到登陆页面 }

}catch(ClassNotFoundException e){ e.printStackTrace(); }catch(SQLException e){ e.printStackTrace(); } } }

既然根据Servlet组件判断出的不同错误信息服务器端发送不同的错误信息在登陆页面,那么登陆页面肯定是一个动态dynamic的页面,而这动态的又如何在一个登陆的Jsp文件中实现?

本系统在Jsp中写入了一写判断语句,根据从HashMap中的到不同的Attribute值显示不同的页面内容,这就是问题的答案。拿用户名为空错误做例子,实现代码: <%

HashMap errorNull = (HashMap)request.getAttribute(\ if(errorNull != null){

String usernameNull = (String)errorNull.get(\

火龙果?整理 uml.org.cn if(usernameNull != null){ %>

<%=usernameNull%> <% } } %>

效果预览:

图3 未输入密码错误图

图4 用户的用户名或密码未通过验证图

注册系统的原理和登陆为基本相同的,所不同只是在连接数据库后查询用户名如果存在对应的用户名名说明该用户名已经被占用不能再被注册,返回到注册

火龙果?整理 uml.org.cn 页面(http://localhost:8080/Thesis/Register.jsp)给出相应信息。如果不存在就注册成功把相应用户名和密码要插入到数据库中。代码如下: database.stmt.execute(

\('\database.stmt.close();

HttpSession session = request.getSession(true); ShoppingCart myNewShoppingCart = new ShoppingCart(); session.setAttribute(\session.setAttribute(\

request.getRequestDispatcher(\

图5 注册已经存在的用户名错误图

4.3智能化辨认功能的实现

要实现辨认功能必须要有一个唯一的标识,这里用Session技术实现,因为Session有一个生命周期,且在用户登陆状态下服务器端才分配一个唯一的Session给予用户,一旦Session过期用户的权限就跟游客一样不能进行实质的购书活动,必须重新登陆,所以以Session来管理辨认这一功能是最为恰当的。

一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet如何被载入并被初始化,如何接收请求并作出对请求的响应,如何被从服务中清除。Servlet的生命周期被javax.servlet.Servlet这个接口所定义。

所有的Java Servlet都会直接地或间接地执行javax.servlet.Servlet接口,这样它才能在一个Servlet引擎中运行。Servlet引擎是Web 服务器按照Java Servlet API定制的扩展。Servlet引擎提供网络服务,能够理解MIME请求,并提供一个运行Servlet的容器。

火龙果?整理 uml.org.cn 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(\

这样就实现了写入想要管理用户信息value这个实物和和name的功能在Jsp组件中只要判断Session中userinfo的value的不同显示不同的信息就可以了: <%

if( session.getAttribute(\ %>

!想购买你喜欢的商品请登陆或注册成我们的新用户!!!

<% }else{ %>

color=\,你可以挑选你喜欢的任何商品了!!!

<%

火龙果?整理 uml.org.cn

} %>

图6 未登陆状态图

图7 以Gavin注册用户登陆状态图

4.4查询系统的实现

查询功能应该是每一个网站所需要的功能,对于电子商务网站对于此功能更是不可或缺。本系统中这一功能对于游客也是可以使用的。 首先本系统提供给用户以分类查询功能。

本系统假设了四类的图书:小说,管理,旅游,卡通(每一类假设了四本图书)

本系统为每一类书都写了一个Jsp,每个Jsp把每一类的书全部罗列了出来。所以只要在页面把四类书的标题列出来同时做一个超级连接就可以了。

图8 分类选择图书图

超级连接的实现:

卡通

这样就完成了对于卡通这一类书的超级连接,只要在http://localhost:8080/Thesis/CartoonBooks.jsp这一页面中罗列所有卡通书即可

首先本系统提供给用户以精确和模糊查询功能。

本系统在每一个选购图书的页面都会提供一个查询文本框:

action='http://localhost:8080/Thesis/servlet/Main'>

在所有商品中搜索

火龙果?整理 uml.org.cn align='center' name='searchform'>

图9 精确查询图书图

用户只要在文本框中输入自己要要查看的图书全名或关键字就可以查询到。 本功能的实现以《Harry Potter Boxed Set》这一本书做为讲解

用户在文本框中输入Harry Potter Boxed Set这一全名当然可以准确的查到购买此书的网页,同样本系统为了防止用户只知道书名的关键字而不知道全名这一情况给出解决办法:

本文本框也是以form表单的Post方式提交到Main.Servlet组件,所以作为处理用户提交的信息的Main.Servlet中的程序代码必须用doPost方法中。本系统把每一种可能的关键字组合作为一个判断依据进行处理。Harry Potter Boxed Set的所有可能的关键字组合本人以为:

Harry potter和Harry还有就是Potter,只要在该文本框中输入这其中的一种可能组合关键字用户同样可以查询到该《Harry Potter Boxed Set》一书进行进一步的操作。

所以在Main.Servlet中可以做如下判断: if(searchform.equals(\

Potter

Boxed

Set\

||

searchform.equals(\Potter\|| searchform.equals(\|| searchform.equals(\

这样写代码的问题还是存在的:如果用户不小心在输入的内容前加了几个空格或最后加上了几个空格如” Harry Potter ”那么该代码还是不能查询到用户想要的结果,而输入的关键字又是准确的所以这样的查询功能还是很不智能的. 同时该查询中还有一个缺陷,设想用户在查询框中输入并没有严格按照”Harry Potter”这样的大小规范,例如用户在查询框中输入”Harry poTTeR”那么用户还是查询不到想要的结果。

所以针对以上问题,我做了如下处理:

对于大小写规范问题:不管用户提供的查询信息的大小写是怎么样的,我都把所有在文本框中的信息转化成为小写字母然后再做处理,然后在做判断中只要把所

火龙果?整理 uml.org.cn 有可能的关键字组合用全部小写规范写就解决了这一问题。而在Java中正好有这样一个处理String类型的方法: toLowerCase()对于前导空格和后导空格的问题,在Java中同样给出了解决的方法:trim() 所以完整的代码: String searchform =

request.getParameter(https://www.bwwdw.com/plus/\

//把从form表单中读取到的String类型的数据在作小写处理和忽略前导和后导空格后放入到//searchform这一个变量对象中

if(searchform.equals(https://www.bwwdw.com/plus/\

searchform.equals(https://www.bwwdw.com/plus/\searchform.equals(https://www.bwwdw.com/plus/\

//注意这里的所有可能出现的组合必须要用小写形式

request.getRequestDispatcher(https://www.bwwdw.com/plus/\

rd(request, response);

//跳转到《Harry Potter Boxed Set》一书的页面 }

4.5 购书系统的实现

用户点击自己喜欢的图书页面就会跳转到该书的详细介绍页面,其中包括该书的书名、ISBN、市场价格和本网站提供的更加优惠的价格等信息,用户在这一页面就可以实现购书的具体操作。以《Harry Potter Boxed Set》一书作为该系统设计和实现的例子。

要实现购书这一动作本系统设置了一定的权限,只有注册用户在登陆的状态下才有这一权限。如果用户在没有登陆状态下实行购买,系统会停留在原来的页面上同时给出要求以登陆状态购买的信息并且比较友好的出现注册和登陆的两个按钮,这两个按钮原先是不存在的,只有用户在这样的误操作状态下才会出现。

火龙果?整理 uml.org.cn

图10 购买图书图

图11 购买失败图

同时本系统要求用户必须在数量这一文本框中填入用户想购买的数量,如果没有填写同样是一次误操作。以下是这些功能实现的代码: 在Servlet组件中处理:

if(session.getAttribute(https://www.bwwdw.com/plus/\Errors error = new Errors();

HashMap errtime = error.errInform(https://www.bwwdw.com/plus/\就可以了 request.setAttribute(https://www.bwwdw.com/plus/\

request.getRequestDispatcher(https://www.bwwdw.com/plus/\

rd(request, response);

}else{

if(request.getParameter(https://www.bwwdw.com/plus/\

request.getParameter(https://www.bwwdw.com/plus/\

火龙果?整理 uml.org.cn Errors error = new Errors();

HashMap errNull = error.errInform(https://www.bwwdw.com/plus/\

request.setAttribute(https://www.bwwdw.com/plus/\

request.getRequestDispatcher(https://www.bwwdw.com/plus/\

rd(request, response); 在显示组件Jsp中: <%

HashMap timeout = (HashMap)request.getAttribute(https://www.bwwdw.com/plus/\这的getAttribute的名字要和相对应的setAttribute对应 if(timeout != null){

String errortimeout = (String)timeout.get(https://www.bwwdw.com/plus/\ if( errortimeout != null){

System.out.println(https://www.bwwdw.com/plus/\没有登陆操作或session已经过期https://www.bwwdw.com/plus/\ %>

HashMap error = (HashMap)request.getAttribute(https://www.bwwdw.com/plus/\if(error != null){

String errorNull = (String)error.get(https://www.bwwdw.com/plus/\

火龙果?整理 uml.org.cn if( errorNull != null){

System.out.println(https://www.bwwdw.com/plus/\用户没有填写想购买的数量https://www.bwwdw.com/plus/\ %>

如果用户没有产生任何的误操作那么页面就会跳转到清单列表的Jsp页面,其中把用户之前的所有的放入购物车ShoppingCart中的书都罗列出来,并显示这些书的相关信息以及用户应付的总价。因为有的时候书本的价格等会随时变动那么把书本的相关信息以静态网页形式表现出来显然不是很合理并且对于数据维护人员的后期维护会带来相当麻烦。为了解决这一问题本系统把书本的相关信息从数据库中读出来,那么数据维护人员可以根据不同时间对于书本信息的改变只要在数据库中完成即可,显然会方便很多具有可行性。因为书本的ISBN号是唯一的且不会改变,所以只要把书本的ISBN号从网页中读到然后从数据库中读取书本信息中跟该ISBN号匹配的书本信息就可以实现了。

ResultSet rs = database.stmt.executeQuery(https://www.bwwdw.com/plus/\* from CartoonbookInfo where bookisbn='C01' https://www.bwwdw.com/plus/\ShoppingCart

myShoppingCart

=

(ShoppingCart)

session.getAttribute(https://www.bwwdw.com/plus/\

Book book =new Book(null, null, null, null); while(rs.next()){

book.setBookIsbn(rs.getString(https://www.bwwdw.com/plus/\book.setBookName(rs.getString(https://www.bwwdw.com/plus/\book.setBookPrice(rs.getString(https://www.bwwdw.com/plus/\

book.setBookNumber(request.getParameter(https://www.bwwdw.com/plus/\myShoppingCart.addBook(book);

火龙果?整理 uml.org.cn

图12 查看购物车内信息图

接下去用户可以继续购物,页面上提供了这样的按钮,如果用户把自己所需要的书已经已经都放入了购物车想要完成此次购买的那么就需要提供用户更加具体的信息来完成这次定单。

图13 提交购物定单图

用户把相关信息提供之后点击“下一步”按狃就完成了本次购买。 如何把用户的这次购买的相关信息准确的反映给工作人员完成后期的配送货呢?问题的答案就是把相关的信息作为数据库中ShoppingInfo表的数据插入,那么工作人员只要看到数据库中的信息就可以知道需要什么书送到什么地方的哪位客户那里,并且根据用户需要的运输方式及时的完成本次定单让用户满意。 if(request.getParameter(https://www.bwwdw.com/plus/\ShoppingCart myShoppingCart =

(ShoppingCart)session.getAttribute(https://www.bwwdw.com/plus/\Book[] items = myShoppingCart.BookList(); for (int i = 0; i < items.length; i++){

database.stmt.execute(https://www.bwwdw.com/plus/\

(userName, userAddress, userTelephone, transport, bookName, bookPrice, bookIsbn, bookNumber) values ('https://www.bwwdw.com/plus/\

火龙果?整理 uml.org.cn '\

'\平邮',

'\'\

} } else

if(request.getParameter(\

ShoppingCart myShoppingCart =

(ShoppingCart)session.getAttribute(\

Book[] items = myShoppingCart.BookList(); for (int i = 0; i < items.length; i++){

database.stmt.execute(\

(userName, userAddress, userTelephone, transport, bookName, bookPrice, bookIsbn, bookNumber) values ('\'\

'\快递',

'\'\ } }

else if(request.getParameter(\

ShoppingCart myShoppingCart =

(ShoppingCart)session.getAttribute(\

Book[] items = myShoppingCart.BookList();

for (int i = 0; i < items.length; i++){

database.stmt.execute(\

userAddress, userTelephone, transport, bookName, bookPrice, bookIsbn,

火龙果?整理 uml.org.cn bookNumber) values ('\'\

'\特快',

'\'\

}

同时在完成一次购物后必须把用户的Session给清空,这样就不会把本次的消费和下一次的消费混在一起也避免了服务器端资源的无故浪费。

5. 关键技术介绍

5.1 Servlet

JavaTM servlets是一个不受平台约束的Java小程序,它可以被用来通过多种方法扩充一个Web服务器的功能。你可以把Servlet理解成Server上的applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。 Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过servlet引擎运行在Web服务器中,以执行请求和响应,请求、响应的典型范例是HTTP协议。

客户端程序,可以是一个Web浏览器,或者是非其他的可以连接上Internet的程序,它会访问Web服务器并发出请求。这个请求被运行在Web服务器上的Servlet引擎处理,并返回响应到Servlet。Servlet通过HTTP将这个响应转发到客户端。

在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。

5.1.1 Servlet的解析和载入

Servlet引擎解析并载入一个Servlet,这个过程可以发生在引擎启动时,需要一个Servlet去响应请求时,以及在此之间的任何时候。

Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。 5.1.2 Servlet的初始化

火龙果?整理 uml.org.cn Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化,在这一过程中,你可以读取一些固定存储的数据、初始化JDBC的连接以及建立与其他资源的连接。

在初始化过程中,javax.servlet.Servlet接口的init()方法提供了Servlet的初始化信息。这样,Servlet可以对自己进行配置。

init()方法获得了一个Servlet配置对象(ServletConfig)。这个对象在Servlet引擎中执行,并允许Servlet通过它获处相关参数。这个对象使得Servlet能够访问ServletContext对象。 5.1.3多线程和映射

在多线程的环境下,Servlet必须能处理许多同时发生的请求。例外的情况是这个Servlet执行了SingleThreadModel接口,如果是那样的话,Servlet只能同时处理一个请求。

Servlet依照Servlet引擎的映射来响应客户端的请求。一个映射对包括一个Servlet实例以及一个Servlet返回数据的URL,例如:HelloServlet with /hello/index.html。

然而,一个映射可能是由一个URL和许多Servlet实例组成,例如:一个分布式的Servlet引擎可能运行在不止一个的服务器中,这样的话,每一个服务器中都可能有一个Servlet实例,以平衡进程的载入。作为一个Servlet的开发者,你不能假定一个Servlet只有一个实例。

5.1.4 Servlet的卸载

Servlet引擎并不必需保证一个Servlet在任何时候或在服务开启的任何时候都被载入。Servlet引擎可以自由的在任何时候使用或清除一个Servlet。因此,我们不能依赖一个类或实例来存储重要的信息。

当Servlet引擎决定卸载一个Servlet时(例如,如果这个引擎被关闭或者需要让资源),这个引擎必须允许Servlet释放正在使用的资源并存储有关资料。为了完成以上工作,引擎会调用Servlet的destroy()方法。

在卸载一个Servlet之前,Servlet引擎必须等待所有的service()方法完成或超时结束(Servlet引擎会对超时作出定义)。当一个Servlet被卸载时,引擎将不

火龙果?整理 uml.org.cn 能给Servlet发送任何请求。引擎必须释放Servlet并完成无用存储单元的收集。

5.1.5 Servlet映射技术

作为一个Servlet引擎的开发者,你必须对于如何映射客户端的请求到Servlet有大量的适应性。这份说明文档不规定映射如何发生。但是,你必须能够自由地运用下面的所有技术:映射一个Servlet到一个URL

例如,你可以指定一个特殊的Servlet它仅被来自/feedback/index.html的请求调用。

映射一个Servlet到以一个指定的目录名开始的所有URL

例如,你可以映射一个Servlet到/catalog,这样来自/catalog/、 /catalog/garden和/catalog/housewares/index.html的请求都会被映射到这个Servlet。但是来自/catalogtwo 或/catalog.html的请求没被映射。

映射一个Servlet到所有以一个特定的字段结尾的所有URL

例如,你可以映射一个来自于所有以in.thtml结尾的请求到一个特定的Servlet。

映射一个Servlet到一个特殊的URL /servlet/servlet_name。

例如,如果你建立了一个名叫listattributes的Servlet,你可以通过使用/servlet/listattributes来访问这个Servlet。

通过类名调用Servlet

例如,如果Servlet引擎接收了来自/servlet/com.foo.servlet.MailServlet的请求,Servlet引擎会载入这个com.foo.servlet.MailServlet类,建立实例,并通过这个Servlet来处理请求。

5.1.6 Servlet环境

ServletContext接口定义了一个Servlet环境对象,这个对象定义了一个在Servlet引擎上的Servlet的视图。通过使用这个对象,Servlet可以记录事件、得到资源并得到来自Servlet引擎的类(例如RequestDispatcher对象)。一个Servlet只能运行在一个Servlet环境中,但是不同的Servlet可以在Servlet引擎上有不同的视图。

火龙果?整理 uml.org.cn 如果Servlet引擎支持虚拟主机,每个虚拟主机有一个Servlet环境。一个Servlet环境不能在虚拟主机之间共享。

Servlet引擎能够允许一个Servlet环境有它自己的活动范围。

例如,一个Servlet环境是属于bank应用的,它将被映射到/bank目录下。在这种情况下,一个对getContext方法的调用会返回/bank的Servlet环境。

5.2 JDBC技术

JDBC是Java的开发者——Sun的Javasoft公司制定的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝联接的技术。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。ODBC(OpenData Base Connectivity),称为开放式数据库互联技术,是由Microsoft公司倡导并得到业界普遍响应的一门数据库连接技术,如果读者有使用ODBC编程的经验,就会发现JDBC与ODBC很类似。 5.2.1 JDBC的工作机制

如果用户是从事软件领域工作的,不可能没有听说过SQL(Structure Query Language:结构化查询语言),它是一种标准化的关系型数据库访问语言。在SQL看来,数据库就是表的集合,其中包含了行和列。SQL标准虽然也还处在不断变革之中(任何一门标准如果已一成不变了,那只能说明这门学科已经停止发展了),但其基本内容相对稳定。JDBC定义了Java语言同SQL数据之间的程序设计接口。

JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下四个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。

JavaSoft公司开发了JDBC API,JDBC API是一个标准统一的SQL数据存取接口。 JDBC在Internet中的作用与ODBC在Windows系列中的作用类似。它为Java程序提供了一个统一缝地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。

本文来源:https://www.bwwdw.com/article/1xdg.html

Top