欢迎添加微信互相交流学习哦!
项目源码:https://gitee.com/oklongmm/biye
摘 要
自改革开放以来,我国的人民生活水平有了极大地提高,近三十年来,人民的需求已由简单的物质需求,上升到物质和精神的双重需求。旅游也成为了一项人民生活的重要活动。本次毕业设计是应用了JSP+MySQL技术,采用了JSP+JavaBean+Servlet框架进行开发的小型旅游网站,并将开发的过程汇总在文章中,本文主要阐述了这次开发小型旅游网站的主要流程,介绍了软件开发的背景,介绍了在这次开发中所使用的技术及其主要特点,分析了软件的技术可行性及社会可行性,对软件的功能需求进行了分析,列出了网站中应该实现的各种功能,对软件详细开发的过程以及在开发中遇到的问题和解决方法进行了叙述,对网站的一些主要功能的实现步骤进行了详解。系统采用MVC模式的Model2框架进行开发,使用该框架的优点是提高了系统开发的效率,同时也可满足本网站对于系统的使用、拓展以及维护方面的要求。
关键词:JSP;旅游;MySQL
ABSTRACT
Since the Reform and opening up, China's people's living standards have greatly improved, nearly three decades, the needs of people by simple material needs, rising to double the material and spiritual needs. Tourism has become one of the important activities of living. The graduation project is the application of JSP + MySQL technology, using a JSP + JavaBean + Servlet framework for the development of small tourism website and the development process are summarized in the article, this paper describes the development of the main flow of small tourism website , introduced the software development background, describes the technology used in the development of its main features, the software analyzes the technical feasibility and social viability of the functional requirements of the software are analyzed, the site lists should implement the various functions of the software development process in detail as well as the problems encountered in the development and solutions for the narrative, some of the major features of the site conducted a detailed implementation steps. System uses the MVC pattern Model2 framework for the development, the use of the advantages of this framework is to improve the efficiency of system development, but also to meet the system's use of this web site, expanding, and maintenance requirements.
KeyWords:JSP;Travel;MySQL
目 录
第一章 引 言 - 1 -
1.1 研究背景与意义 - 1 -
1.2 本文的主要工作和内容安排 - 2 -
第二章 相关技术介绍 - 3 -
2.1 网站设计相关技术概述 - 3 -
2.2 Web应用程序的体系结构 - 3 -
2.3 MVC设计模式概述 - 4 -
2.4 JavaScript脚本语言概述 - 5 -
2.5 数据库技术概述 - 7 -
2.6 开发环境 - 8 -
第三章 网站的需求分析和总体设计 - 9 -
3.1 系统功能需求 - 9 -
3.2 系统的可行性分析 - 10 -
3.2.1 社会可行性 - 10 -
3.2.2 经济上的可行性 - 10 -
3.2.3 技术上的可行性 - 10 -
3.3 小型旅游网站系统的模块划分 - 11 -
3.4 小型旅游网站的数据流图 - 12 -
3.5 数据库设计 - 14 -
3.3.1 实体属性及实体联系图 - 14 -
3.3.2 创建数据库 - 18 -
第四章 小型旅游网站的详细设计 - 23 -
4.1 系统基本类概述 - 23 -
4.2 系统主要模块的详细设计 - 25 -
4.2.1 用户注册模块的详细设计 - 25 -
4.2.2 用户登录模块的详细设计 - 29 -
4.2.3 预约模块的详细设计 - 31 -
4.3 系统其它模块的详细设计 - 34 -
第五章 小型旅游网站系统测试 - 37 -
5.1 网站测试的系统环境及平台配置 - 37 -
5.2 主页的功能实现测试 - 37 -
5.3 注册模块的测试 - 38 -
5.4 登录模块的测试 - 39 -
5.5 预约模块的测试 - 40 -
5.6 系统中其它模块的测试 - 41 -
第六章 总结 - 42 -
参考文献 - 44 -
致 谢 - 45 -
第一章 引 言
1.1 研究背景与意义
自第三次科技革命至今,我们已经经历了半个世纪之久。在此期间,随着计算机的问世,我们便时刻享受着它带给我们的数之不尽的便利。转眼之间,我们也已迈入二十一世纪的第二个十年,在这科技发展呈指数增长的多年之中,有一项新的科技,也已经深深融入到我们的生活之中,成为我们生活密不可分的部分之一。这项技术,便是伴随着计算机而兴起的,影响人类生活的十大科技发明之中的一个——互联网(Internet)。
最早的internet起源于20世纪60年代末、70年代初。1969年美国国防部创建的第一个分组交换网ARPANET,它最初并不是一个互联的网络,但它已经将美国国防部的若干台分布在不同地方的电脑主机相互连通,实现了信息的共享。从那时起直至二十世纪80年代,这期间有许多科研人员不断研发这一技术,如多种网络互连技术,这样的互连网络就成为了Internet的雏形。1983年,TCP/IP协议成为ARPNET上的标准协议,这样,所有使用TCP/IP协议的计算机都能利用互联网相互通信,自此,Internet——互联网便正式诞生。在这十年间,它已成为涵盖世界各地的网络系统。此后,Internet仍然在不多发展,不断进化,从最初的纯文本服务,经过不断改进和完善,逐渐发展成为一种全新的Internet服务,它可以在网络上传送图片、文本、影像、声音等多媒体数据,成为了一种主从、分布式的网络服务系统,这就是WWW——“万维网”。成为了我们如今看到的网站形式,通过Internet成为一个实时的,多媒体的信息传播渠道。以电脑为载体,范围覆盖全球各地,没有国界,不分人种,时时刻刻地提供服务[7]。
随着人民生活水平日益提高,人民需求已从基本的物质需求,逐渐增加精神需求,如艺术需求,以及对世界上其他优美的地方的追求,对世界上其他地区的人文景观,风土人情,自然风光的好奇。都是当今人类生活所不可或缺的一部分。纵观互联网的发展,电子商务的兴起,使得传统商业模式发生了天翻地覆的变化,而旅游业也随着科技的发展,从以前的实体旅行社,逐渐发展成为一个拥有在线系统的,可以满足更多用户需求同时也可减少更多人力开支的在线旅游网站。小型旅游网站就是一个为用户提供信息的在线旅行社,用户可以在网站中浏览景点信息,景点周边的酒店、宾馆信息,浏览网站中提供的旅游线路,如果是注册会员还可预订各条旅游线路。整个网站相当于一家旅行社,以组织旅行团旅游,收取旅行线路费用,介绍景点周边酒店和宾馆信息,收取广告费为主要盈利模式。所有操作都可以由用户在客户端浏览器中完成,而服务器端程序会按用户的要求来完成对系统数据的操作,并将结果传给Web服务器,再由Web服务器处理成HTML文件后发送到客户端浏览器。这就是所谓的B/S结构应用系统,B/S结构即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。
与此小型旅游网站的需求相结合,该网站使用B/S结构,主要实现在服务器端进行旅游景点的展示,旅游景点周边的食宿信息展示,旅游网站推出的旅游路线线的展示,路线详细信息的查询、预订等功能。
1.2 本文的主要工作和内容安排
本文研究的主要内容是基于Java Web的JSP+JavaBean+Servlet框架进行开发的小型旅游网站,通过网站在旅游景点及旅游信息的发布,以及对这些信息进行随时的展示和预订。本文的主要工作如下:
第1章 综述了小型旅游网站研究背景及意义,及论文的主要结构和重点内容。
第2章 对系统开发中采用的相关技术进行了简单的介绍。
第3章 对小型旅游网站进行了简单的需求分析,对各个功能模块进行了简单的分析与划分,同时对系统整体的设计和数据库设计给出了设计方案。
第4章 给出了小型旅游网站的详细设计过程以及对设计中遇到的个问题给出了解决发方案。
第5章 给出了系统的测试方案以及对测试结果的分析。
第6章 对目前所完成的工作进行了总结。
第二章 相关技术介绍
2.1 网站设计相关技术概述
本小型旅游网站采用JSP+MySQL技术,运用了CSS+DIV技术进行静态页面设计。使用了JavaScript技术对部分页面进行设计,作为客户端页面的脚本语言,同时还使用Ajax技术,对部分页面实现了特殊效果。以JDBC为桥梁,采用面向对象的方式,对数据库进行了操作。在各个页面的跳转,以及页面内部需要进行动态操作的位置,使用了Servlet技术,同时,对所需显示的信息,采用EL表达式语言和JSTL标签进行显示。通过这些技术与方法,从而组成整个网站。
2.2 Web应用程序的体系结构
Web应用程序,使用的是以HTTP为核心的通信协议,应用程序服务器使用多层结构,从上而下依次为用户界面层、表示逻辑层、业务层、数据访问层和数据层,如图2.1所示[1]。
图2.1 多层结构的Web应用程序
Web应用程序所特有的是页面设计,设计Web应用程序时一定要考虑的问题是网络和服务器之间的负载平衡问题,因为Web应用程序交换数据的方式为通过广域网交换,减少并平衡网络和服务器之间的负载成为了运行的重要因素;某些信息不能通过查看页面源代码而泄漏,通过URL实现页面的访问,所以必须检查每个页面合法性,保证每个合法的用户才能访问,否则尽管非法用户不知道用户名和口令,但只要知道某些页面的URL,就可以跳过身份验证直接访问;在传统的GUI设计中,可以调整界面元素的属性,使得用户不能使用某些功能,而在Web的界面设计中,只能动态地创建页面,使某些菜单或按钮变灰来达到同样的目的,所以Web界面设计要比传统的GUI设计复杂[8]。
B/S(Brower/Server)即浏览器/服务器结构。使用这种结构,省去开发用户界面的过程,直接使用Web浏览器(如IE,Chrome),向服务器端发送各种请求,然后服务器端进行处理,之后将处理结果返回浏览器端。利用不断成熟和普及的浏览器技术,代替复杂软件的强大功能,节约了开发成本[3]。
相比于C/S结构,B/S结构也有着许多优点。首先,在开发和维护的开销方面,B/S结构都明显低于C/S结构。B/S结构则只需要将服务器端的软件进行升级,然后浏览器端的用户只需重新登入系统,即可体验升级后的软件。其次,在客户端的负载方面,B/S结构所需的客户端负载也明显小于C/S结构,C/S结构的客户端要进行与用户交互的工作,还要进行通过网络向服务器发送请求对服务器端进行处理的工作;这就会给客户端的软件开发和维护的工作带来不便。而B/S结构客户端只需发送服务请求,将大部分工作都交由服务器端,就省去了开发和维护客户端应用程序的工作。然而,B/S结构的的特点也带出了一个问题,将更多的工作转移到服务器端进行,会造成服务器端运行数据负荷较重,一旦发生问题,如服务器崩溃,自然灾害等破坏,会对服务器端造成影响,同时也会对程序运行造成不小的影响,因此,服务器端需要经常性的维护,备份数据库,以保证应用程序的正常运行;最后,在安全性方面的考虑,B/S结构的软件,因为使用人数多,而且使用浏览器就可进行操作,用户人员较多而且人员复杂,相对C/S结构安全性就会低一些,这就需要建立用户数据库,对不同的用户进行管理,以提高系统安全性[15]。
综上所述,B/S结构相对于C/S结构具有更多的优势,而且结合此次开发的系统特点,本系统使用B/S结构进行开发。
2.3 MVC设计模式概述
MVC(Model-View-Control),它是模型-视图-控制器的缩写,该设计模式是存在于服务器表达层的一种模型,用于改变应用之间的耦合;它是一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中[9]。
模型-视图-控制器(MVC)是Xerox PARC在二十世纪八十年代为编程语言Smalltalk-80发明的一种软件设计模式,后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式,受到越来越多的使用ColdFusion和PHP的开发者的欢迎[2]。
图2.2 MVC设计模式
MVC 由三部分组成: 模型( Model)、视图(View)、控制器( Controller), 每个部分负责不同的功能。Model负责对业务数据/ 信息的处理,包括存取、加工、综合等,它提供应用业务逻辑, 所有操作均在模型中完成,是程序执行的关键部分;View是指用户界面, 即为面向用户的数据表示,数据进行处理后的结果通过视图来显示;Controller 管理用户与视图之间的交互, 负责View和Model之间的流程控制, 将用户界面的操作映射到具体的 Model, 完成具体的业务逻辑,通过 Model 处理完的业务数据反应到View上[10]。
使用MVC很有好处,多个视图共享一个模型,返回的数据未进行格式化, 所以同样的构件能被不同界面使用,当需要多种方式访问应用程序,MVC用一个模型就能处理;模型是自包含的,且与控制器和视图相分离,改变应用程序的数据层和业务规则很容易,MVC的应用程序的三部分相互独立,其中一个被改变不会影响其它两个,所以依据这种设计思想就能构造良好的松耦合的构件[11]。
2.4 JavaScript脚本语言概述
JavaScript是一种基于对象和事件驱动并具有安全性能的解释型脚本语言,在Web应用中得到了非常广泛的应用。它不需要进行编译,直接嵌入在HTTP页面中,把静态页面转变成支持用户交互的动态页面。
图2.3 JavaScript组成
JavaScript适用于静态或动态网页,是一种被广泛使用的客户端脚本语言。它具有解释性、基于对象、事件驱动、安全性和跨平台等特点;它是一种采用小程序段的方式实现编程的脚本语言,也是解释性语言,提供了一个开发过程,同时,它也是一种基于对象的语言,在脚本环境中可以应用自己创建的对象与脚本的相互作用实现许多功能;JavaScript可以无需经过服务器端程序直接对客户端的输入做出响应,它不允许访问本地硬盘,不能将数据写入到服务器上,并且不允许对网络文档进行修改和删除,只能实现信息浏览或动态交互,具有安全性;JavaScript依赖于浏览器本身,只要浏览器支持JavaScript,JavaScript的程序代码就可以正确执行[3]。
随着Web2.0概念的普及,网站开发追求更人性化、更美观的页面效果。 Ajax是Asynchronous JavaScript and XML的缩写,它是几项技术按一定方式的组合, 包括使用 XHTML和CSS标准化呈现,使用 DOM 实现动态显示和交互,使用XML和XSLT进行数据交换与处理,使用XMLHttpRequest进行异步数据读取,最后用JavaScript绑定和处理所有数据,其中XMLHttpRequest,Javascript和DOM是Ajax技术的核心[13]。
Ajax引擎的主要技术:XMLHttpRequest在IE中是XMLHttp组件的一个对象, 实现为 ActiveX对象。它直接与服务器上的数据进行交互,这样就很容易实现不需要重新下载而获取所需要的数据的功能。为了安全, XMLHttpRequest对象请求的所有资源都必须与调用的脚本在同一域里,非IE浏览器基本上是创建自己的继承XML 的代理类, 把它实现为一个本地JavaScript对象。DOM是文件的结构描述的文档对象模型,它是个W3C规范,独立于平台和语言,定义了表示和修改文档所需要的对象以及这些对象的行为和属性和它们之间的关系。DOM 提供了标准的HTML和XML对象集,有标准的接口来访问并操作这些对象集。DOM有一组HTML和 XML的API,脚本语言和页面进行交互。W3CDOM提供的属性和方法可以轻松遍历XML结构,获得数据。开始时JavaScript和DOM很好地结合在一起,后来各自发展。在Ajax技术中,JavaScript是XMLHttpRequest和DOM交互的桥梁。它是一种描述语言,被嵌入HTML的文件中。JavaScript应用最多的就是表单验证,也可利用XMLHttpRequest和数据库联系起来[14]。
JavaScript是一种现阶段在Web页面中非常流行的脚本语言,可以说当今任何网站的页面中都有JavaScript的存在,它可以应用在不同种类的Web页面中,如JSP、PHP、ASP等。随着Ajax技术的日趋成熟,进入主流开发的市场,JavaScript的实现功能也更加丰富多彩。
2.5 数据库技术概述
JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,用过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序 与数据库系统之间架起了一座桥梁。
JDBC(Java Data Base Connectivity)是Java程序操作数据库的API,也是Java程序与数据库相互交互的一门技术。JDBC是Java操作数据库的规范,由一组用Java语言编写的类和接口组成,它对数据库的操作提供了基本方法,但对于数据库的细节操作由数据库厂商进行实现。使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。Java程序与数据库相互交互的示意图如图2.4所示。
图2.4 Java程序与数据库交互
通过图2.4可以看出,JDBC在Java程序与数据库之间起到了一个桥梁的作用,有了JDBC就可以方便地与各种数据库进行交互,不必为某一个特定的数据库制定专门的访问程序,因此JDBC对Java程序员而言,是一套标准的操作数据库的API;而对于数据库厂商而言,又是一套标准的模型接口[3]。
Java应用程序是通过JDBC API向JDBC Driver Manager发出请求指定要装载的JDBC 驱动程序和连接的数据库的具体类型与实例。Driver Manager会根据这些要求装载合适的 JDBC 驱动程序代码, 并要求其负责连接指定的数据库实例。以后, Java应用程序与数据库实例之间的一切交互, 就由驱动程序转换为数据库实例DBMS所能理解的命令, 再将数据库返回的结果转换为Java 程序能识别的数据。供应用程序进一步处理。Java应用程序也可以直接同具体的数据库驱动程序直接交互[12]。
MySQL是关联数据库管理系统,它将数据保存在不同的表中,增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。因为体积小、速度快、总体拥有成本低,一般中小型网站的开发都选择MySQL作为网站数据库。MySQL数据库有如下特点:使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性;支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统;为多种编程语言提供了API,包括C、C++、Java、Perl、PHP、Eiffel、Ruby和Tcl等;支持多线程,可以充分利用CPU资源;使用优化的SQL查询算法,提高了查询速度;既能够作为单独的应用程序,也能够嵌入到其他的软件中;提供多语言支持,常见的编码都可以用作数据表名和数据列名;提供TCP/IP、ODBC和JDBC等多种数据库连接途径;提供用于管理、检查、优化数据库操作的管理工具,支持大型的数据库,可以处理大型数据库,支持多种存储引擎[4]。
在这次的网站开发中,系统中全部的与数据库连接,包括读取、显示数据,录入数据等模块,均由JDBC完成,可以说JDBC技术是贯穿整个网站开发阶段所不可或缺的技术之一。
2.6 开发环境
本次设计采用了以下开发环境:
(1)数据库:采用MySQL数据库。
(2)服务器:服务器采用Tomcat服务器,版本为Tomcat7.0.37。
(3)虚拟机:本系统使用的虚拟机为JDK,版本是jdk1.7.0_17。
(4)开发工具:开发工具为My Eclipse10。
(5)操作系统:为Windows 7。
第三章 网站的需求分析和总体设计
需求分析师软件定义时期的最后一个阶段,它的任务是确定系统必须完成哪些工作,对目标系统提出完整、准确、清晰、具体的要求[6]。
3.1 系统功能需求
本网站是以展示旅游信息、旅游线路、景区图片和景点周边酒店、宾馆信息等功能为核心的小型旅游网站。通过联系景区周边的饭馆和酒店,提供旅游景区居住、餐饮等信息,为其做广告,给用户带来方便的同时也为本网站创造利益的网站。
他的主要功能如下:
(1)旅游景点浏览,用户在网站中可以查看旅游景区的景点介绍信息,可以浏览已经录入数据库的国内与国外的景点信息。
(2)旅游景点详细信息,在旅游景点浏览时,用户可以点击旅游景点名称,然后进入到浏览该景点详细信息的页面,如地址、价格、详细介绍、联系电话等,同时,还可以点击周边食宿,浏览到该景点的周边的食宿信息,酒店和宾馆等信息,也可点击酒店查看详细信息。
(3)旅游路线浏览,用户在网站中可以查看旅游路线的路线信息,用户可以浏览已经录入数据库的国内与国外的旅游路线信息。
(4)旅游路线详细信息,在旅游路线浏览时,用户可以点击旅游线路标题,然后进入到浏览该旅游路线详细信息的页面,如路线详细介绍、价格、主要景点等。
(5)旅游路线预约,在用户浏览旅游路线的详细信息时,可以选择预约该条线路,可以选择数据库中所选择路线所拥有的旅行团,然后选择预约,随后输入自己的身份识别信息,即可完成预约。
(6)用户可以分别查询国内的景点或国外的景点。同样,也可以分别查询国内的旅游线路或国外的旅游线路。在主页选择国内、国外的景点或路线,然后跳转至相应的浏览路线,进行显示。
(7)酒店浏览页面,与景点和路线浏览页面类似,用户也可浏览酒店的列表。
(8)酒店详细信息,选择酒店列表中的某一个酒店,用户可以浏览到该酒店的详细信息,如价格,地址等。
(9)友情链接,使用户方便的到达相关站点。
3.2 系统的可行性分析
3.2.1 社会可行性
随着改革开放以来,国家的经济飞速发展,人民生活水平的不断提高,人民的生活需求已不再仅仅停留在基本的物质需求上,而是已经升华至物质和精神的双重需求。到世界各地旅行,去领略世界其他地方的自然风光、人文景观,是对人生活的一个良好的熏陶。旅游,这一满足精神需求的重要途径,则是当今与人类密不可分的一项重要活动。而旅游业更是随着社会发展而兴起的又一项重要产业。将旅游业与互联网相结合,得益于电子商务的不断成熟,同时各大旅行社在互联网中开办自己的在线旅行社,则可以使更多人选择自己的旅行社,通过建设旅游网站来对外宣传和推广业务无疑是首选的经营策略。
3.2.2 经济上的可行性
以旅行社的角度出发,本网站为小型旅游网站,可作为一个旅行社的在线业务平台,通过在线用户预约各条旅游线路来收取费用,同时还为在景区周边的各个酒店、宾馆等企业做广告,收取广告费,同时与食宿餐饮等企业合作,将每个旅行团的食宿与各企业挂钩,实现盈利。所以,在经济上是可行的。
3.2.3 技术上的可行性
本系统采用B/S模式,即浏览器/服务器模式,在这种模式下无需安装客户端,只需计算机能够连接到因特网即可进行操作。
项目开发工具采用MyEclipse,MyEclipse是企业级工作平台,用它可以在数据库和JavaEE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的JavaEE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML,Struts, CSS,Javascript,SQL,及Hibernate等。采用JSP开发技术,JSP技术具备了Java技术的简单易用、完全的面向对象、具有平台无关性且安全可靠、面向因特网的所有特点,同时还具备了多系统平台支持的特点,让本网站基本上可以在所有平台上的任意环境中开发、部署及扩展,及大地扩大了浏览人群。
网站的数据库系统采用MySQL数据库系统,MySQL数据库系统具有跨平台、可移植性强的优点,并为多种编程语言提供了API,支持多线程,充分利用CPU资源,有效地提高查询速度,提供TCP/IP、ODBC和JDBC等多种数据库连接途径,同时它又是一款开源的数据库系统,并且是免费的,对于这次开发网站有着极大的好处。
3.3 小型旅游网站系统的模块划分
通过对系统进行详细的需求分析,获得了一个最优的设计方案,将系统划分为若干功能子模块。为了方便后期的设计与编程工作,在划分系统功能模块时尽量注重模块的独立性,努力做到高内聚,低耦合。功能模块划分是系统设计的前提与基础,通过对小型旅游网站需求的分析,可以对系统模块进行如下划分。本系统的功能模块图如图3.1所示。
图3.1 系统功能模块图
各个模块的详细介绍如下:
(1)用户注册模块。用户进入注册页面后,将输入用户名、密码、邮箱等信息,用户名必须唯一且由数字和字母组成,在输入用户名后,系统会使用Ajax无刷新的对用户名进行判断,其是否已存在,同时会对所有已输入的信息进行判断,所输入的数据是否合法,如邮箱格式,密码长度。为了防止恶意注册,在提交注册之前需输入在页面中显示的使用随机生成的彩色图形验证码。
(2)用户登录模块。使用已注册的用户名登入系统,再登陆界面输入用户名及密码,为了防止恶意登录和暴力破解,在确认登录前需输入在页面中显示的使用随机生成的彩色图形验证码。虽然不进行登录仍可浏览网站中大部分信息,但网站中的关键信息,即旅游预约功能无法使用。
(3)景点浏览模块。点击进入景点浏览页面后,系统将会根据数据库中已有的景点展示到页面中,用户可以点击某一景点,然后将进入显示该景点的详细信息页面。同时,用户还可在主页中,选择浏览国内景点或国外景点,系统将会根据数据库中景点的地域标识展示用户所需的景点列表。
(4)景点详细信息。在景点浏览页面,点击所要详细了解的景点后,将会进入景点详细信息页面,在该页面中,系统将显示景点的详细信息,如景点简介,景点价格,景点地址,景点联系电话等,使用户详细了解到景点的信息。同时,用户还可点击该页面中的周边食宿连接,将会进入该景点的周边食宿页面,在该页面中,将会显示景点周边的酒店和宾馆信息,供用户浏览,用户也可点击某个食宿设施,然后可以了解到该设施的详细信息。
(5)路线浏览模块。点击进入路线浏览页面后,系统将会根据数据库中已有的路线展示到页面中,用户可以点击某一路线,然后将进入显示该路线的详细信息页面。同时,用户还可在主页中,选择浏览国内路线或国际路线,系统将会根据数据库中路线的地域标识展示用户所需的路线列表。
(6)路线详细信息。在路线浏览页面,点击所要了解的路线后,将会进入路线详细信息页面,在该页面中,系统将显示路线的详细信息,如路线简介,线路所耗时长,线路价格以及线路中的主要景点等信息。用户选择路线途经的某个景点,将会详细显示景点的介绍。同时,如果用户对这条线路感兴趣,还可预订该条线路的旅行团,但只有已登录的用户才可预订线路,未注册的用户将无法预订该条线路,会提示用户只有在登录后才可预订线路。
(7)酒店浏览模块。点击进入酒店浏览页面后,系统将会根据数据库中已有的酒店展示到页面中,用户可以点击某一酒店,然后将进入显示该酒店的详细信息页面。
(8)预约模块。在路线详细信息页面,已登录的注册用户可以预订某条线路,点击预约按钮,将会跳转至预约页面,用户可选择不同出发时间的旅行团,然后输入预约者的信息进行登记,然后提交方可完成预约。
3.4 小型旅游网站的数据流图
数据流图是结构化的用于分析系统的工具,它可以表达系统中数据的各种逻辑结构,如数据流向,存储结构,逻辑处理等,对于分析系统的结构有着很大的帮助。
在该小型旅游网站中,有几个重要模块拥有较为复杂的逻辑结构,如注册模块,登录模块,预约模块。将几个重要模块构建数据流图,对接下来的网站建设有较大帮助。
注册模块是网站中一个较为重要模块,因为网站的核心功能——预约,必须是注册用户才可使用,所以完善注册模块非常重要。将注册模块的逻辑结构细化,得到如图3.2的注册模块数据流图。
图3.2 注册模块数据流图
登录模块负责用户登录,只有已登录的注册用户才可进行网站预约,所以将登录模块的建设进行完善,对网站的建设起到至关重要的作用。将登录模块的逻辑结构细化,得到如图3.3的登录模块数据流图。
图3.3 登录模块数据流图
预约模块是整个网站中最为重要的模块,它是整个网站中的业务流程的根本所在。在该模块中,系统首先对使用者的身份信息进行验证,如果是已登录者,则可以进行预约,否则将会提示用户先进行登录,然后才可预约。将登录模块的逻辑结构细化,得到如图3.4的预约模块数据流图。
图3.4 预约模块数据流图
三个重要模块:注册模块、登录模块以及预约模块。以及若干个小型模块组成了网站的整体构成,小型模块,如景点浏览及详细信息浏览,路线浏览及路线详细信息浏览,酒店浏览及酒店信息浏览,这些模块是负责展示信息及与三个重要模块之间相互联系的枢纽,同时这几个模块的实现方式也是大同小异,均为用户点击后在数据库中进行搜索,然后获得所需数据的形式。
3.5 数据库设计
为了满足以上功能,需要建立若干数据库以满足用户需求。下面将详细介绍该系统中有的实体以及该系统所需的数据库。
3.3.1 实体属性及实体联系图
在该系统中,根据该系统所需的主要功能,有以下实体:
(1)会员信息,在会员信息实体中有以下属性:用户ID,用户名,密码,电子邮箱,注册时间。如图3.5所示。
图3.5 会员实体属性图
(2)景点信息,在景点信息实体中有以下属性:景点ID,景点名称,景点简介,价格,地址,联系电话。如图3.6所示。
图3.6 景点实体属性图
(3)旅游线路,在旅游线路实体中有以下属性:线路ID,线路标题,线路简介,路线时长,路线价格,主要景点。如图3.7所示。
图3.7 旅游线路实体属性图
(4)旅行团,在旅行团实体中有以下属性:旅行团ID,出发时间,联系电话,选择的旅游线路。如图3.8所示。
图3.8 旅行团实体属性图
(5)游客,在游客实体中有以下属性:游客ID,游客身份证号,姓名,性别,电话,选择的旅行团。如图3.9所示。
图3.9 游客实体属性图
(6)酒店,在酒店实体中有以下属性:酒店ID,酒店名称,平均价格,酒店简介,地址,电话。如图3.10所示。
图3.10 酒店实体属性图
(7)宾馆,在宾馆实体中有以下属性:宾馆ID,宾馆名称,平均价格,宾馆简介,地址,电话。如图3.11所示。
图3.11 宾馆实体属性图
由这7个实体之间所组成的实体联系图如下:
图3.12 小型旅游网站的实体联系图
由上图可知这若干个实体的联系较多,存在着3个1:N联系:会员与游客、游客与旅行团、旅行团和旅游线路。3个M:N联系:旅游线路与景点、景点与酒店、景点与宾馆。
3.3.2 创建数据库
在数据库中建表时,根据ER模型与建表规则,对各个实体实现建表。对于1:N联系,在游客表中加入登记者ID和参加的旅行团外键;在旅行团表中加入选择的旅游线路外键;对于M:N联系,将旅游线路和景点的关系之间进行单独建表,将景点和酒店的关系之间进行单独建表,将景点和宾馆的关系之间进行单独建表。
按如上方法,在数据库中共建立总计10个表,这10个表分别是:user表、tourist表、tourgroup表、tourroute表、scenicspot表、restaurant表、hotel表这七个实体表,以及负责说明实体间M:N的联系,减少实体表之间的冗余,三个实体之间的关系表,旅展示游线路和景点之间的关系的spotofroute表、展示旅游线路和景点之间的关系的restaurantofspot表和展示景点和宾馆之间的关系的hotelofspot表。这10个表的介绍如下。
User表用于存放系统所有注册用户的详细信息,包含用户名、密码、注册时间、用户的email地址等内容,结构如表3.1所示。表中UserID为主键并被设置为自增,这样当插入一条记录且id字段的数据为空(null)时,新记录的id值将由系统自动给出,且给出的值将是表中曾经存在的最大的id值加1(若是一张新表,则从1开始)。这样可以保证整个表中的id字段在其数据类型允许的范围之内没有重复的值。注册时间设置为自动填充,默认值为now(),这样将会让数据库系统对用户的创建时间进行自动记录。这样,UserID以及用户的注册时间在用户注册时不由用户填充,是由数据库自动生成,使得用户在使用注册功能是更加方便,更加人性化。
表3.1 user表
列名 数据类型 数据长度 非空 说明 备注
UserID INT 是 用户ID 主键
UserName VARCHAR 20 是 用户名
Password VARCHAR 20 是 密码
Email VARCHAR 45 是 用户邮箱
UserTime TIMESTAMP 是 注册时间
Tourist表用于存放用户进行登记的游客信息,包含游客ID、身份证号、姓名、性别、联系电话、登记者的ID、参加的旅行团ID等内容,如表3.2所示。其中TouristID为自动填充的自增整型数据。登记者的ID为外键,对应user表中的UserID,参加的旅行团ID为外键,对应tourgroup表中的TourgroupID。
表3.2 tourist表
列名 数据类型 数据长度 非空 说明 备注
TouristID INT 是 游客ID 主键
UserID INT 是 登记者ID 外键
TourgroupID INT 是 旅行团ID 外键
IDNumber VARCHAR 20 是 身份证号
TouristName VARCHAR 45 是 游客姓名
TouristGender VARCHAR 3 是 游客性别
TouristPhone VARCHAR 15 否 游客电话
Tourgroup表用于存放开设的旅行团信息,包含旅行团ID、出发时间、导游名字、导游电话以及选择的旅游线路ID等信息,如表3.3所示。其中TourgroupID为主键,是自动填充的自增整型数据。选择的旅游线路ID为外键,对应tourroute表中的TourrouteID。Tourgroup代表的是旅行团实体,该实体与旅游线路实体为N:1联系,与游客实体为1:N联系,在tourgroup表中插入外键TourrouteID,使之与tourroute表产生关系,在日后对tourroute表进行处理时,如删除数据,同时就会对tourgroup表中的相应数据进行删除。
表3.3 tourgroup表
列名 数据类型 数据长度 非空 说明 备注
TourgroupID INT 是 旅行团ID 主键
TourgroupTime DATETIME 是 出发时间
TourgroupName VARCHAR 20 是 导游姓名
TourgroupPhone VARCHAR 20 是 导游电话
TourrouteID INT 是 旅游线路ID 外键
Tourroute表用于存放开设的旅游线路信息,包含线路ID、路线信息、路线标题、路线时长、路线价格以及区分路线地域等信息,如表3.4所示。其中TourrouteID为主键,它是自动填充的自增整型数据,这意味着该表中的每一个旅游线路的ID均为唯一值,为接下来的操作奠定基础,在接下来的开发中将会使用到TourrouteID进行操作,如预约、浏览路线详细信息等。TourroutePlace为识别旅游线路为国际线路或国内线路的标识,目的是区分旅游线路的地域特性,在网页中以地域方式查询时,可以跟别查出。当该值等于0时,该条线路为国内线路,当该值等于1时,该条线路为国际线路。
表3.4 tourroute表
列名 数据类型 数据长度 非空 说明 备注
TourrouteID INT 是 线路ID 主键
TourrouteInformation VARCHAR 200 是 线路简介
TourrouteTime INT 是 路线时长
TourroutePrice DOUBLE 是 路线价格
TourrouteTitle VARCHAR 45 是 线路标题
TourroutePlace INT 是 地域标识
Scenicspot表用于存放在网站中已登记的旅游景点信息,包含景点ID、景点名称、景点简介、景点价格、景点地址、景点电话、景区图片以及景点地域标识等信息,如表3.5所示。其中ScenicspotID为主键,是自动填充的自增整型数据。ScenicsspotPlace为识别景点为国内景点或国际景点的标识,当该值等于0时,该景点为国内的景点,当该值等于1时,该景点为国外的景点。ScenicspotPicture为景区图片,保存图片的地址,然后进行展示。
表3.5 scenicspot表
列名 数据类型 数据长度 非空 说明 备注
ScenicspotID INT 是 景点ID 主键
ScenicspotName VARCHAR 45 是 景点名称
ScenicspotPrice DOUBLE 否 景点价格
ScenicspotAddress VARCHAR 100 否 景点地址
ScenicspotPhone VARCHAR 20 否 联系电话
ScenicspotInformation VARCHAR 200 否 景点简介
ScenicspotPicture VARCHAR 45 否 景区图片
ScenicspotPlace INT 是 地域标识
Spotofroute表用于存放已登记的景点和开设的路线之间的关系信息,因为景点和旅游线路是M:N联系,旅游线路是由数据库中的旅游景点组成,所以将它们之间的关系单独建表,这样做的好处是消除了冗余,同时也方便了对该数据库中的表的数据的操作。表中包含线路ID,景点ID以及景点在该条线路中的位置,如表3.6所示。其中TourrouteID和ScenicspotID共为该表的主键,而两键又是外键,TourrouteID对应tourroute表中的TourrouteID,ScenicspotID对应scenicspot表中的ScenicspotID。
表3.6 spotofroute表
列名 数据类型 数据长度 非空 说明 备注
TourrouteID INT 是 线路ID 主键、外键
ScenicspotID INT 是 景点ID 主键、外键
SpotInRoute INT 是 景点在线路的位置
Restaurant表用于存放已登记的酒店信息,其中包含酒店ID、酒店名称、酒店价格、酒店简介、地址以及电话等内容,如表3.7所示。其中RestaurantID为主键,是自动填充的自增整型数据。
表3.7 restaurant表
列名 数据类型 数据长度 非空 说明 备注
RestaurantID INT 是 酒店ID 主键
RestaurantName VARCHAR 45 是 酒店名称
RestaurantPrice DOUBLE 否 酒店价格
RestaurantAddress VARCHAR 100 否 地址
RestaurantPhone VARCHAR 20 否 联系电话
RestaurantInformation VARCHAR 200 否 酒店简介
Restaurantofspot表用于存放已登记的景点和已登记的酒店之间的关系信息,即景点周边酒店信息。因为景点和酒店之间是M:N联系,所以将其单独建表。表中包含景点ID、酒店ID以及相对位置等信息,如表3.8所示。其中ScenicspotID和RestaurantID共为该表的主键而又同为外键,ScenicspotID对应scenicspot表中的ScenicspotID,RestaurantID对应restaurant表中的RestaurantID。RestaurantAtSpot为酒店相对于景点的位置。
表3.8 restaurantofspot表
列名 数据类型 数据长度 非空 说明 备注
ScenicspotID INT 是 景点ID 主键、外键
RestaurantID INT 是 酒店ID 主键、外键
RestaurantAtSpot VARCHAR 100 是 相对位置
Hotel表用于存放已登记的宾馆信息,其中包含宾馆ID、宾馆名称、宾馆价格、宾馆简介、地址以及电话等内容,如表3.9所示。其中HotelID为主键,是自动填充的自增整型数据。该表中的数据大致与restaurant表中的数据相似,故在此不再重复进行介绍。
表3.9 hotel表
列名 数据类型 数据长度 非空 说明 备注
HotelID INT 是 宾馆ID 主键
HotelName VARCHAR 45 是 宾馆名称
HotelPrice DOUBLE 否 宾馆价格
HotelAddress VARCHAR 100 否 地址
HotelPhone VARCHAR 20 否 联系电话
HotelInformation VARCHAR 200 否 宾馆简介
Hotelofspot表用于存放已登记的景点和已登记的宾馆之间的关系信息,即景点周边宾馆信息。因为景点和宾馆之间是M:N联系,所以将其单独建表。表中包含景点ID、宾馆ID以及相对位置等信息,如表3.10所示。其中ScenicspotID和HotelID共为该表的主键而又同为外键,ScenicspotID对应scenicspot表中的ScenicspotID,HotelID对应hotel表中的HotelID。HotelAtSpot为酒店相对于景点的位置。
列名 数据类型 数据长度 非空 说明 备注
ScenicspotID INT 是 景点ID 主键、外键
HotelID INT 是 宾馆ID 主键、外键
HotelAtSpot VARCHAR 100 是 相对位置
表3.10 hotelofspot表
第四章 小型旅游网站的详细设计
目前小型旅游网站已实现了系统所需的全部主要功能,如注册和登录功能、浏览景点列表、浏览景点详细信息、浏览旅游线路列表、浏览旅游线路详细信息、浏览酒店列表、浏览酒店详细信息以及旅游线路预约等功能。非注册用户可以使用除旅游线路预约功能以外的其它功能,注册用户可以使用全部功能。
4.1 系统基本类概述
将整个系统中的类分成三大类,第一大类为实体类,第二大类为业务类,第三大类为接口类。除了这三个大类以外,还有负责加载数据库驱动的Util类,以及负责实现所需特效的Ajax类。
通过对小型旅游网站的需求进行分析,可以得出结论,将实体共分成九个实体类,User:系统注册的用户。Tourist:登记的游客信息。Hotel:宾馆。Restaurant:酒店。RouteInfo:路线详细信息。ScenicSpot:景点。SpotOfRoute:景点与线路的关系。TourGroup:旅游团。TourRoute:旅游线路。如图4.1所示。
图4.1 系统的实体类
每个类中定义了不同的私有成员变量,还定义了为了其他类读取这些类中成员变量的get()和set()方法。这些类将会成为承载数据库中各表的数据的载体,然后将会对其进行处理。这九个实体类被统一放在entity实体包中。
业务类是负责处理用户请求的,以逻辑运算为主要功能的类,它是三大类中最为主要的类,完成实现网页中大部分功能的动态展示、处理等工作,这些就是JSP网页中重要的Servlet。这其中有负责登录和注册的ActionServlet类、负责显示主页的Index类、负责预约功能的OrderService类、负责显示注册码的CheckCodeServlet类以及其它如显示网页中各种信息或接受各种处理请求的Servlet类。如图4.2所示,这些类被统一放在web包中。
图4.2 系统中的业务类
业务类的功能很强大,同时业务类中的每个类功能也不尽相同,但主要的结构为与调用接口类中的方法,为各个实体类赋值,或者为接受用户在网页中的请求,为用户的请求进行各种处理。
接口类是用来访问数据库的类,是业务类和实体类连接数据库的桥梁,整个网站与数据库之间的交互,均是通过接口类来实现的。接口类中有负责与数据库中各个表进行交互的类。如连接数据库中user表的UserDAO,连接数据库中tourist表的OrderDAO,负责读取主页上的信息,连接数据库中多个表的IndexDAO等都位于该接口类中。如图4.3所示。
图4.3 系统中的接口类
接口类只负责进行数据库的读取和写入等方法,而加载数据库的驱动等方法,则保存在Util类中,接口类调用Util类进行加载数据库驱动,然后执行相应的方法。这些类被统一放在dao包中。
实体类、业务类、接口类,这三大类成为负责系统健康运行的主要类,其它类辅助这三大类正常运行,满足用户的需求,完成用户和网站的各种交互。
4.2 系统主要模块的详细设计
4.2.1 用户注册模块的详细设计
注册模块负责处理用户申请成为注册用户的工作,用户需要输入自己的用户名,密码,邮箱等数据录入到数据库中的user表。同时,在填写注册表单时,还需输入密码的重复密码,防止用户密码输入错误,还需输入网页中自动生成的验证码,以防止有不法分子恶意注册破坏网站的正常运行。注册页面为register.jsp,如图4.4所示。在输入用户名之后,系统会调用JavaScript中的Ajax,采用异步的方式联建数据库,对用户所输入的用户名进行判定,判断该用户名在数据库中是否存在。当用户输入的所有注册信息全部合法时,即可调用ActionServlet.java中的register.do方法,将用户输入的数据写入到数据库中相应的表,并且跳转到登陆页面login.jsp进行登录。如果用户输入的信息不合法系统将会在界面中进行提示,并且会在服务器端进行验证,并返回错误信息。
图4.4 注册页面
在系统中的Ajax技术主要就应用于异步连接数据库进行判断用户名是否重复以及判断验证码两方面。下面就详细介绍下Ajax技术对用户名是否存在进行判定的过程。
首先要初始化XMLHttpRequest对象,因为IE核心与非IE核心的浏览器对初始化对象的方法不同,所以要根据不同情况进行跨浏览器的初始化过程。图4.5即为初始化对象的代码。
图4.5 XMLHttpRequest对象初始化
这段代码为使用Ajax技术的初始化通用代码,位于本项目的js文件夹中,项目中的任何使用到Ajax技术的JavaScript执行时都会首先调用初始化对象,然后再执行相应的逻辑运算。
在初始化XMLHttpRequest对象后,要在运行时向服务器发送请求,如异步方式发送GET或POST方式的请求,然后就可在浏览器与服务器之间进入到连接状态,同时要通过XMLHttpRequest对象的onreadystatechange属性指定一个回调函数,该回调函数的作用是负责处理服务器响应,这就是在向服务器发送请求之后的下一步。
在处理服务器响应的过程中,回调函数起着重要的作用。首先回调函数要判断服务器的请求状态,确定服务器端的请求已完成,接着要根据服务器的HTTP状态码,来判断服务器对请求的响应是否成功,当经过判断发现服务器的响应成功时,就会获取服务器的响应反馈给客户端浏览器。这样就完成一次异步与服务器进行交互的过程。
以注册模块中的判断用户名为例,该处理为处理字符串响应,过程较为简单,如图4.6即为JavaScript中的回调函数的具体代码。
图4.6 JavaScript回调函数详细代码
图4.7 JavaScript获取输入的用户名
首先将用户在页面的用户名文本框中输入的数据获得,定义该值为userName,如图4.7,然后判断浏览器是否为IE核心,选择不同的初始化方法,接下来将会向服务器端发送请求,调用特定的服务器端业务类,如图4.8所示。
图4.8 向服务器端发送请求以及获得服务器端响应
在服务器端,系统将会在获得发送请求后进行一套复杂的处理,执行UserNameCheck的业务类。首先服务器会创建UserDAO接口类的对象dao,然后调用该接口类与数据库进行交互,获得查询结果,如图4.9所示。
图4.9 服务器端进行查询并获得查询结果
在获得了查询结果之后,服务器对查询结果进行判定,如果用户名为空值,即为用户没输入用户名,将提示用户输入用户名,如果在数据库中查到该用户名,即为用户名已存在,将提示用户该用户名已存在,如果从浏览器端获得的用户名既不为空有没有在数据库中查询出,则该用户名可用,将会提示用户该用户名可用。相应的判定代码如图4.10所示。
图4.10 判断用户名合法性的代码
当注册页面中的各种信息判定均合法后,系统就会调用register.do业务类对数据进行录入处理,首先服务器端获得浏览器端表单内的主要数据,相应代码如图4.11所示。
图4.11 服务器端获得表单内各类数据
在获得数据后,服务器端就会进行服务器端判定,这是为了防止不法分子在关闭JavaScript的情况下进行恶意注册,系统会判断用户名、密码、重复密码、邮箱以及验证码的合法性。在判定合法之后,服务器端就会调用user的接口类UserDAO对注册信息进行录入,如图4.12所示。
图4.12 服务器端进行数据录入
录入完成后,业务类会将用户的页面重定向至登陆页面进行登录,而注册模块的全部流程则已结束,注册完成。
4.2.2 用户登录模块的详细设计
登录模块负责处理用户进行登录请求的工作,用户在登陆页面中进行登录,需要输入用户名和密码,还输入为了防止不法分子恶意登录和暴力破解而设置的,由系统随机生成的验证码。登陆页面为login.jsp,如图4.13所示。
图4.13 登录页面
当用户输入用户名,密码和验证码之后点击提交按钮,系统将会调用ActionServlet中的login.do方法,首先验证用户输入的注册码与系统随机生成的验证码是否一致,如果不一致将返回错误信息,回到登陆页面,如果一致将会获取用户输入的用户名和密码,并与数据库中的user表中的数据进行匹配,如果没有搜索到相同的数据,则不能登录,返回到登陆页面并提示错误信息,如果发现用户名和密码均相同且相互对应时,则可以进行登录,登录的用户名保存为session对象并跳转至主页。
下面将详细介绍注册模块的工作流程。首先用户进入到登陆页面后,会有一个登录表单供用户填写。当填写完毕后,系统服务器端的业务类就会获取用户填写的表单信息,为了保护系统以及用户信息的安全性,该表单采用POST的方法发送数据。Login表单代码如图4.14所示。
图4.14 登录页面代码
服务器端收到浏览器发送的请求之后,业务类将获取表单中的数据,然后将会调用接口类与数据库之间进行交互。详细代码如图4.15表示。
图4.15 获取表单并与接口类连接数据库
将表单通过接口类连接数据库,执行相应的数据库语句,查询数据库表中是否有所查询的数据,即查询该用户是否存在以及查询该用户名及密码是否正确。详细代码如图4.16所示。
图4.16 登录模块接口类主要代码
服务器端通过接口类获得查询结果之后,将会根据查询结果判断是否允许用户进行登录,首先判断验证码是否正确,若不正确将返回登录页面并提示错误信息。若正确将判断查询结果,若未查询出结果,证明该用户不存在或密码错误,返回到登陆页面并提示错误信息,若查询出结果,证明该用户存在切密码正确,登陆成功,并且将用户名设为session对象,为其它业务所用。主要代码如图4.17所示。
图4.17 登录模块业务类主要代码
而后系统将会跳转至主页,表示整个登录过程结束,登陆完成。
4.2.3 预约模块的详细设计
预约模块是负责处理用户浏览旅游线路后的预约工作,是网站中最重要的业务。当用户在浏览路线详细信息时,系统会先判定浏览者是否已经登录,如果浏览者没有登录,该页面将会提示用户登录而没有预约按钮,如果该浏览者已登录,则可以进行预约,然后会跳转至预约页面order.jsp,如图4.18所示。
图4.18 预约页面
在预约页面中,系统会根据数据库中拥有的旅行团显示全部的出发时间,然后用户可以选择自己中意的出发时间,输入自己的游客信息,然后进行提交。系统就会将用户的信息录入到数据库中即可完成整个预约流程。
下面将详细介绍预约模块的工作流程。在静态页面的建设方面,首先要区分用户是否已经登录,当用户位于阅览旅游路线详细信息页面时,如果用户未登录,页面内将不会显示预约按钮,而会显示提示用户登录的信息,只有当用户已登录,即之前在登录过程中创建的session对象中的用户名存在,才会在页面中显示预约按钮。我使用JSTL标签中的
图4.19 在页面中对用户登录状态的判定
已登录的用户点击“预订该线路”按钮后,就会执行转入预约的业务类,同时附带id信息来确定用户将要预约的线路是哪一条,然后就会转入到预约页面。执行跳转的业务类的代码如图4.20所示。
图4.20 转入预约页面的业务类
在该业务类中,会根据附带的id信息,通过接口类OrderDAO,查询数据库中的表,获得所需的信息,即属于该id的旅游路线所开设的旅行团,然后再附带着旅行团的信息,跳转至order.jsp页面,登记预约信息。接口类OrderDAO的主要代码如图4.21所示。
图4.21 接口类OrderDAO主要代码
业务类携带着所需的信息跳转至order.jsp页面后,用户即可登记信息,进行预约。在预约表单中,用户将要进行选择的出发时间,是根据之前所预约的路线开设的旅行团而显示的动态的信息,在这里我使用JSTL标签中的
第五章 小型旅游网站系统测试
在整个系统编写完成,开始实际应用之前,还需对网站中的各个功能进行测试,这是在实际开发中所不可或缺的一个环节,它是保证软件质量的一个重要保证,目的是为了可以找出系统中的某些与需求不相符的部分,或者检查出一些在开发过程中为发现的错误与缺陷,确保系统在实际投入使用时可以健康的运行,成为一款合格的软件。
测试分为白盒测试和黑盒测试。白盒测试是按照程序内部的逻辑测试程序,检测程序中的主要执行通路是否都能按预定要求正确工作,白盒测试又成为结构测试。黑盒测试是在程序接口进行的测试,它只检查程序功能是否能按照规格说明书的规定正常使用,程序是否能使当地接受输入数据并产生正确的输出信息,程序运行过程中能否保持外部信息的完整性,黑盒测试又称为功能测试[6]。本次测试为白盒测试。
此次测试,我以一个用户的角度,对整个网站系统的各个模块都进行了测试,在此列出部分模块的测试结果。
5.1 网站测试的系统环境及平台配置
在对本网站进行测试之前,首先介绍本次测试所使用的系统环境:本机的操作系统为Windows7,使用的虚拟机为JDK1.7.0_17,使用的应用服务器为Tomcat-7.0.37,使用的浏览器为谷歌公司出品的Chrome浏览器。
在进行测试之前,还需要对系统的环境变量进行配置,设置好系统的环境变量,如JAVA_HOME,TOMCAT_HOME等环境变量,然后在Tomcat服务器目录中设置好该网站的目录,如图5.1所示。
图5.1 设置本项目的目录
5.2 主页的功能实现测试
在将测试的平台配置完成后,首先,在浏览器中输入本网站网址:http://localhost:8080/traveling/Index 登录到主页,对主页的业务类,以及业务类的处理结果进行检测,得到的结果如图5.2所示。
图5.2 登录到主页
经测试,主页中的各个动态信息展示模块均可正常显示信息,主页中的各个连接按钮均可连接至相应页面同时还可执行正确的业务类,主页的检测通过。
5.3 注册模块的测试
以一个正常用户为例,在登录到本网站后,会进行用户注册,点击主页上的注册按钮,跳转至注册页面,进行注册。在此,我首先输入非法信息进行检测,先输入数据库中已有的用户名,检测Ajax技术对用户名的异步检测是否实现,实验结果如图5.3所示。
图5.3 输入已存在的用户名
在输入了一个数据库中已存在的用户名之后,页面马上显示出“用户名已存在!”的信息,证明对用户名的异步检测已经成功实现。在此之后进行下一步检测,对表单中其它验证信息的功能进行检测,在此次实验中,均输入非法信息,检查系统的判断功能是否正确,实验结果如图5.4所示。
图5.4 均输入非法的注册信息
表单中各个文本框,系统均可检测出非法的注册信息,证明系统的判断功能均编写通过。随后,又进行了服务器端认证,成功将表单进行拦截,跳回到注册页面。最后,进行了正确信息填写的实验,系统业务类成功实现功能,跳转至设定好的登录页面,而经检查,数据库中也已通过接口类,成功记录了相应的注册用户信息。经试验证明,本系统注册模块的设计已完成。
5.4 登录模块的测试
用户进入网站后,会进入登录页面进行登录,在登录之前主页的显示如图5.5所示。而在登录前的状态,路线信息详解页面所显示的内容如图5.6所示。
图5.5 登录之前的主页状态 图5.6登录前旅游线路的显示
可以看出,显示的信息为你好,欢迎光临的字样,而在路线信息详解的页面,显示的信息为您还未登录,请先登录的字样,证明系统验证用户是否登录的状态为未登录。
现在进入登录页面,准备进行登录,在登录页面中,准备输入信息进行登录。首先,输入错误的登录信息进行登录,显示的结果如图5.7所示。
图5.7登录页面输入错误提示信息
系统返回至登录页面,并且提示错误信息,证明表单验证错误部分设计成功,接下来将输入正确信息,检测输入正确信息时系统运行情况。实验结果如图5.8所示。
图5.8 输入正确的登录信息后的主页状态
系统跳转至主页,并且在登录状态部分显示为XXX你好,欢迎光临的字样,与设计的过程一致,证明登录模块设计成功,现在再转到旅游线路详解页面,查看该页面显示的情况,实验结果如图5.9所示。
图5.9 登陆后旅游路线页面的显示
此时的路线详解页面显示预订线路按钮,证明登录功能的设计成功,以及系统在该页面对登录状态的判定成功。经试验证明,登录模块的设计成功。
5.5 预约模块的测试
因为在之前登录测试中以经成功登录,现在将在路线详解页面继续进行预约模块的测试。点击路线详解页面中的预订该路线按钮,转入填写预约游客信息的页面。预约页面如图5.10所示。
图5.10 预约页面
从图中可以看出,在选择出发时间菜单选项中已出现了两个可选项,即之前所选的旅游路线拥有的旅行团出发时间,这和数据库中存储的数据一致,证明预约模块中的该业务类编写正确。然后开始输入游客信息,姓名、身份证号、性别、联系电话等信息,提交后的结果如图5.11所示。
图5.11 提交预约信息后
提示预约成功,经检查,数据库中也已成功录入了预约者的信息。经试验证明,预约模块设计成功。
5.6 系统中其它模块的测试
系统中的其它模块如显示信息模块,均在之前对主要模块的测试中一并测试结束,剩余的模块均可以正常运行,结果也全部正确。因其他模块的业务较为简单,故不全部叙述。
经各种直接或间接测试,网站中的各个功能已基本完成,均可以实现所需的功能,但因为能力有限,故不能进一步美化,但内部结构已经设计完成。故整个网站的大致设计已经宣告完成。