基于JSP的电影票预定网站的设计(含源文件)


获取项目源文件,联系Q:1225467431,可指导毕设,课设

摘要:为方便公众的娱乐生活,避免人们现场购买电影票时受排队之苦,本文研究B/S架构的在线电影票预定网站的设计与实现过程,从需求分析、网站设计到具体实现都遵循了网站开发的思想和数据库的设计方法。网站的设计与开发使用JSP开发工具,应用Microsoft Access管理数据库。文章详细介绍了一个电影票预订网站的分析、设计和开发全过程,分析并实现了电影票订购的基本功能。
关键词:电影票预订;JSP;数据库
1 引言
互联网以前所未有的速度发展,成为与报纸、广播、电视相比肩的第四媒体,同时正以其便捷的信息传输形式改变着人们的消费模式,利用简单、快捷、低成本的电子通信方式,买卖双方不谋面就可以进行各种商贸活动,走向商业的互联网已经成为网络经济的大势所趋。1996年前后,在美国学术界提出电子商务”(E-Buiness或E-Commerce)的概念。短短几年时间内这一概念被广泛接受。根据买方卖方的不同,电子商务市场可划分为4种类型:B2B(Business to Business)、C2C(Consumer to Consumer)、C2B(Consumer to Business) 以及 B2C(Business to Consumer)几种模式,目前占据主流的是 B2B 和 B2C 两种。B2B 主要面向企业,这种平台对性能、安全和服务要求比较高;B2C 直接面向终端的大众消费者。眼下电子商务网站正如雨后春笋般地大量涌现[1]。
正是因为国民经济快速发展,人们对生活的要求越来越高,娱乐方式越来越多样化,对服务的快捷、便利性要求也越来越高,从而他们对电影院行业的建设与管理提出了更高的要求。由于电影数量与电影种类不断增加,电影事业不断发展,中心影城的管理难度也越来越大。然而传统的售票方式存在着很多方面的不足,比如实时差、交易时间过长、运营成本高、信息不共享等[2]。为适应和推动电影行业的发展,各电影院公司和部门开始广泛采用计算机管理系统,推出网上电影票售票服务,大大减轻了订票、售票、检票、调度、票款管理等部门工作人员的劳动强度,提高了各部门的工作效率,而且能够在很大程度上减少顾客排队购票的时间和由此而带给顾客的疲劳,为广大顾客提供了更加快捷、优质、有序的服务,提高了中心影城的服务水平,也逐步树立了企业形象。
根据这种现实需要,设计制作一个影城在线售票管理系统便成为一件非常有价值的工作。应用在线售票网站对影城进行管理具有传统管理模式不可比拟的优点,它凭借其信息更新速度快、信息存储量大、安全性高、应用简便等特点为影城的管理带来了极大的方便,发挥越来越重要的作用。因此,越来越多的电影院都想利用动态电子商务的优越性来进行网上售票交易,以减少电影院工作人员大量繁琐的售票工作,避免人们赶到电影院发现票已售完的情况,缩短排队买票的时间。现如今比较成熟的电影票在线售票网站一般以数据库(如MySql、SQL Server)为基础,应用当今最为流行的网络编程语言(如JAVA、ASP语言)共同制作而成。本文也将结合现实需要,设计出一个基于JSP语言、Access数据库管理系统的在线电影票预订网站。
2 系统分析
2.1 需求分析
首先对现有系统进行分析,现有系统是信息的重要来源。分析已有系统的功能和实现,从而确定新系统的设计目标和模型。由于条件有限,调研主要是在网上进行,即通过在网上查看已有的电影票预订网站,注册成为其会员来了解该网站具备的功能。
2.1.1 用户需求
用户是上帝”,设计网站前应详细了解用户需求,这样才能避免日后因不满足用户需求而造成大量修改。电影票预订网站前台应考虑以下几方面的要求:
用户通过在线注册成为网站的用户,可以获得以下功能:电影浏览,购买电影票,查看订单,修改订单,修改个人信息,评价电影等。
(1)用户注册:只有注册为本网站的会员后才有权限浏览网页。
(2)用户登录:分为普通用户和管理员。身份验证后,普通用户进入网站前台进行信息浏览,管理员进入网站后台进行信息管理。
(3)电影浏览:用户可以一览近期影院上映电影的信息。
(4)电影票预定:在查看电影信息后,用户可以根据个人需求预定电影票,选择方位和购买数量。
(5)修改订单:用户可以查看自己的购物车,确认订单信息,发现有误时,可以删除订单。
(6)修改个人信息:用户的个人信息(如:电话、地址等)变更时,可以在网站前台修改自己的信息。
(7)给电影评价:用户可以在观看电影之后对其做出评价,以供其他网友参考电影是否具有观看价值。
2.1.2 功能性需求
功能性需求分析是指对目标软件系统在功能、行为、性能、设计约束等方面的期望。需求分析是软件设计、实现测试直至维护的主要基础,良好的需求分析可以避免或尽早提出早期的错误,从而降低软件的开发成本,改进软件的质量。需求分析的任务是通过详细调查现实世界要处理的对象,充分了解系统的工作概况,明确各种功能需求,然后在此基础上确定新系统的功能。新系统必须充分考虑今后可能的扩充和改变[3]。
本电影票预订网站后台应完成以下任务:
(1)电影信息管理:可以添加、修改新上映电影的信息,电影下档后,亦可删除原来的电影信息。
(2)订单管理:查看订单详情以确认订单或删除订单。
(3)用户管理:查看用户信息,或做删除处理,管理后台。
(4)电影评价管理:查看用户对电影评价信息,可以做删除处理。
系统对数据的安全性、完整性要求表现在:用户信息保密,只有管理员可见(可查),但不能任意修改。确保用户信息安全。此外,电影信息、用户信息必须保证其完整性,防止恶意删改。以下是系统性能需求:
(1)准确性和可靠性高。
(2)页面友好,功能齐全,且可以方便使用。
2.1.3 非功能性需求
(1)用户界面需求:简洁、易用、易懂,友好和谐的用户界面。
(2)硬件需求:Pentium以上计算机
(3)可靠性需求:保证用户在正常使用本系统时,用户的操作或误操作不会产生数据丢失。
(4)安全保密性需求:用户登录需要密码验证。
2.2 可行性分析
开发任何一个网站,都会受到时间和资源上的限制。因此,在每一个项目开发之前,都要进行可行性分析,以减少项目的开发风险,避免人力,物力和财力的浪费。可行性分析主要包括经济可行性和技术可行性等。
2.2.1 经济可行性
经济可行性,主要是针对电影院的,开发网站的成本与收益相比较。如今是信息化时代,信息化管理可以使电影票预订网站更加便捷化、快速化,这样可以为影院带来较好的工作效益和经济效益,开发出本网站可以减少影院售票人员人数,而且管理方便,各功能实现快速,数据有效的管理。这些效益和管理上的便捷远远超过了开发本网站的成本,所以在经济上具有完全的可行性。
2.2.2 技术可行性
本网站开发工具是JSP和Microsoft Access。JSP具有可视化界面,是一种面向对象的语言,简单易学而且灵活方便,Microsoft Access是一个安全、可靠的并且支持面向对象设计的数据库系统。易用性和可维护性也很好。通过学习钻研JSP和Access,电影票预订网站总体上开发难度不是太高,技术上具有完全的可行性。
3 系统设计
3.1 总体设计目标
减少影院售票人员大量繁琐的工作,方便人们提前购票。网站用户通过使用本系统,可以随时根据需要,查询上映电影信息,对电影票预订网站中的个人信息进行修改,并可以根据个人喜好提前预定电影票,避免了现场排队购票之苦,同时也减少影院在售票方面的人力和物力的投资。作为一个在线订票网站,除了要功能强大、操作简单、符合上述需求分析,还应实现其他目标,以适用于各类城市影院,具体要求如下:
(1)界面在设计上要美观、友好,操作要快捷、准确;
(2)数据存储要安全可靠;
(3)注册用户可以随时修改个人信息;
(4)对于用户输入的数据,系统要有严格的检错机制,尽可能排除人为错误;
(5)系统要最大限度的实现易维护性,运行要稳定、可靠、安全。
3.2 功能模块设计
概念模型是信息管理系统设计中较早却相当重要的一步,为了全面获取本系统的概念模型,首先需要分析整个网站的操作流程。以用户在购票体验上尽量接近一般网购方式为出发点,网站在设计上应使购票流程尽量贴近人们平时的网购习惯。因此,可以得到用户登录网站进行购票的流程图,如图3-1所示。
从网站管理员角度来看,管理员进入网站后台选择相应的功能,操作结束后,仍可以进行其他操作,或者没有操作时退出网站。网站后台管理流程如图3-2所示。
整个系统的处理流程如下:
(1)用户进入登录页面,身份验证:普通用户和管理员的权限有所不同。
(2)正常进入网站:身份核实无误后,按权限的不同,普通用户进入网站前台,管理员进入网站后台。
(3)执行各任务:根据各自需求,进行各项操作。
(4)一任务执行完毕后重新返回主页:执行任务后回到主页能够保证操作的条理性。
(5)执行完毕,退出网站:若所要执行的任务全部完成,即可退出网站。
为了最终实现目标系统,必须设计出组成这个系统的所有程序、文件以及数据库。模块是数据说明、可执行语句等程序设计对象的集合,它是单独命名的而且可通过名字来访问。模块化就是把程序化分成若干个模块,每个模块完成一个子功能,把这些模块集起来组成一个整体,可以完成指定的满足问题的要求[4]。
通过以上流程分析,可以进一步设计出电影票预订网站的总体结构模块图,分别从用户和管理员两个不同的角度去设计,如图3-3所示。
(1)用户模块:在本网站中,所有的用户在访问网站的时候均可以浏览查看电影信息、将电影加入购物车、查看购物车删除影票、给电影做出评价、修改个人基本信息。其功能结构模块图如图3-4所示。
(2)管理模块:在本网站中,管理员除了要进行相关信息的维护还有如下主要工作:定时查看电影评价信息,审查用户的评价是否具有合法性,删除恶意评价;定期对系统数据库进行备份,确保数据安全;及时更新新上映电影的信息,删除下线电影的信息等等。管理员通过后台登录网站,为确保系统的安全性,管理员后台登录会进行密码权限的检测。成功登录后,导航条上将出现电影管理”、订单管理”、用户管理”及评价管理”等按钮供管理员进行不同的系统操作。上述功能在前台不可见,属于网站的后台操作模块,因此这部分模块可定义为后台管理”,其功能结构模块图如图3-5所示。
具体任务分析如下:
① 电影管理模块的基本功能应包括添加、删除、修改电影信息等。当管理员单击其中的任何一个功能按钮时,都可以进行对网站前台显示的电影信息进行相关的操作。
② 用户管理模块的基本功能应包括网站用户基本信息查看和注销处理。其中用户基本信息查看包括用户真实姓名、手机号、电子邮箱、地址等。对于新注册的会员用户,管理员要对其注册信息进行审核。
③ 订单管理模块的基本功能应包括查看用户已下单的信息、删除订单。其中订单信息包括购买者编号、电影名称、放映厅、座位、购买订购数量等。当管理员单击查看按钮时,将显示该条订单的详细信息。
④ 评价管理模块中,只有购买过电影票的网站会员才能对电影进行评价,管理员可以查看或删除评价信息。用户评价的发言主题应与电影相关,这是管理员审核的要点,对于一些恶意评价,管理员可以选择删除。
3.3 数据库设计
3.3.1 数据流分析
数据流图是结构化系统分析的基本工具。一个数据流图确定了系统的转化过程、系统所操纵的数据或物质的收集(存储),还有过程、存储、外部世界之间的数据流或物质流[5]。
数据流图技术是可以扩充到允许实时系统的建模。数据流图是当前业务过程或新系统操作步骤的一种表示方法。数据流图可以在一个抽象的广泛范围内表示系统。在一个多步骤的活动中,高层数据流图对数据和处理部分提供一个整体的浏览,这是对包含在软件需求规格说明中的精确、详细叙述的补充。数据流图描述了软件需求规格说明中的功能需求怎样结合在一起,使用户可以执行指定的任务。从图中迅速反馈的信息有助于对所探讨的任务流的理解进行提炼加工。
电影票预订网站的第一层数据流图,如图3-6所示。本数据流图描述了电影票预订网站后台的各个模块处理过程中的数据处理的过程。用户管理主要是对用户信息的查看和删除;电影管理是添加或修改电影信息;订单管理是确认订单或删除订单;评价管理是对用户评价的查看和删除。
电影信息管理中的数据处理图是本网站的第二层数据流图,如图3-7所示。描述了在电影信息管理模块中所作操作的数据处理。主要包括对上映电影信息的添加、删除和修改操作。

用户管理数据流程图,如图3-8所示。描述了用户信息管理模块中所作操作的数据处理。主要包括对用户信息的添加和注销操作。

订单管理数据流图,如图3-9所示。描述了用户下单后,订单管理模块中所作操作的数据处理。网站管理员的主要操作包括查看订单和删除订单。
评价管理数据流图,如图3-10所示。描述了已购票用户观看电影后,对电影做出评价,网站管理员在评价管理模块中所作操作的数据处理。管理员的主要操作包括查看评价和删除评价。
3.3.2 实体E-R图
E-R图提供了表示实体(即数据对象)、属性和联系的方法,用来描述现实世界的概念模型[6]。构成E-R图的基本要素是实体、属性和联系,其表示方法为:
(1)实体型:用矩形表示,矩形框内写明实体名;
(2)属性:用椭圆形或圆角矩形表示,并用无向边将其与相应的实体连接起来;多值属性由双线连接;主属性名称下加下划线;
(3)联系:用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体连接起来,同时在无向边旁标上联系的类型。在E-R图中要明确表明1对多关系,1对1关系和多对多关系。1对1关系在两个实体连线方向写1;1对多关系在1的一方写1,多的一方写N;多对多关系则是在两个实体连线方向各写N,M。
经过分析,由上面的数据流程图可以得出以下各实体之间的E-R图,如图3-11所示。
3.3.3 逻辑结构设计
模型是软件的第一个技术表示。信息系统的建模是用模型来描述复杂的信息系统,使得系统的要求、结构和数据变得简单。设计者通过描述用户的需求获得与用户的不断交互,最终对整个系统能全面地把握。建立完整的数据模型,完成对信息系统中数据的存储和处理。
电影票预订网站比较复杂,为了建立这样一个复杂系统的模型,并满足实际对象不断发展的需求,在实际设计中应遵循下列原则:
(1)准确性:所建立的模型要求能够正确反映实际的对象,能够满足电影票预订网站工作的实际需求。
(2)完整性:指要求模型既能反映对象系统的静态特性,又能够反映其丰富的动态特性。
(3)一致性:要求建立的模型能保证从分析阶段到设计阶段的平稳过渡。
设计电影票预订网站关系模型如下:有下划线的属性为主键(primary key)
(1)展厅信息(展厅号,展厅名称,标签)
(2)用户信息(用户编号,密码,登陆次数,用户名,等级,真实姓名,性别,年龄,地址,邮箱,电话、角色)
(3)电影信息(影片号,影片名,展厅号,价格,图片,介绍,上映时间)
(4)订单信息(订单编号,购买用户名称,影片号,座位,购买数量)
(5)评价信息(评价编号,用户名称,评价内容,评价时间)
数据库逻辑结构的基本定义有:
(1)主键:在表中是唯一不可重复的值。具有索引的作用,可以用来快速查询表内数据。
(2)外键:有此表的列或列的组合和其他表的主键值或UNIQUE_KEY具有相关联的特性。此时,可以将这些列或列组合定义为外键。
(3)索引:建立索引是为了加快查询速度的有效手段。用户可以根据应用环境的需求,在基本表上建立一个或多个索引,以提供多种存取路径,加快查找速度。
(4)视图:从一个或几个基本表(或视图)导出的表,它与基本表不同,是一个虚表。
经过以上分析,本电影票预订网站的数据库主要包含以下表:
(1)user表:用来管理用户的基本信息,字段包括:用户编号、密码、性别、登陆次数、用户名、等级、真实姓名、性别、年龄、地址、邮箱、电话、角色。结构如表3-1所示。
表3-1 user表
属性名 存储代码 数据类型 是否主键 允许空值 备注
用户编号 memberID 数字 是 否 自动
密码 pwd 文本 否 否
登陆次数 LoginTimes 数字 否 是
用户名 memberName 文本 否 否
等级 rank 文本 否 是
真实姓名 truename 文本 否 是
性别 sex 文本 否 是
年龄 age 文本 否 是
地址 address 文本 否 是
邮箱 email 文本 否 是
电话 phone 文本 否 是
角色 Role 数字 否 否 0代表普通用户1代表管理员
(2)sorts表:用来记录展厅的基本信息,字段包括:展厅号、展厅名称、标签。结构如表3-2所示。
表3-2 sorts表
属性名 存储代码 数据类型 是否主键 允许空值 备注
展厅号 SortID 数字 是 否 唯一
展厅名称 SortName 文本 否 否
标签 tag 数字 否 是
(3)film表:用来管理电影的基本信息,字段包括:影片号、影片名、展厅号、价格、图片、介绍、上映时间。结构如表3-3所示。图片的格式为jpg或gif,以图片名存储。
表3-3 film表
属性名 存储代码 数据类型 是否主键 允许空值 备注
影片号 filmID 数字 是 否 唯一
影片名 filmName 文本 否 否
展厅号 SortID 数字 否 否 注意输入格式
价格 Price 数字 否 否 注意输入格式
图片 PicUrl 文本 否 否
介绍 Intro 文本 否 否
上映时间 time 文本 否 否
(4)goods表:用来管理订单基本信息,字段包括:订单编号、购买用户名称、影片号、座位、购买数量。结构如表3-4所示。
表3-4 goods表
属性名 存储代码 数据类型 是否主键 允许空值 备注
订单编号 GoodsID 数字 是 否 自动
购买用户名称 UserName 文本 否 否
影片号 filmID 数字 否 否 注意输入格式
座位 seat 文本 否 否
购买数量 BuyNumber 数字 否 否 注意输入格式
(5)assess表:用来管理评价基本信息,字段包括:评价编号、用户名称、评级内容、评价时间。结构如表3-5所示。
表3-5 assess表
属性名 存储代码 数据类型 是否主键 允许空值 备注
评价编号 assessID 数字 是 否 自动
用户名称 UserName 文本 否 否 外键
评价内容 asscontent 数字 否 否
评价时间 asstime 日期/时间 否 否 注意输入格式
3.4 系统特点
任何一个网站的设计都需要有自己的特色。从网站的需求到实现,考虑所有的可行性,总结出系统需具备以下特点:
(1)人性化设计:由于个人喜好不同,人们可能喜欢坐在影院的不同位置观看电影。所以网站提供了可选的方位,如前方、后方、左方、右方,但由系统直接分配该方位的任一座位给用户。但对于登录本网站购票次数较多的用户,他们的等级会随购票次数增加,达到一定等级后,他们成为星级用户,可以选择座位。换言之,普通用户只能选择大致方位,而星级用户可以选择具体座位。因此,会在程序中加入算法,这是本网站的一个亮点。有关算法的细节将在系统运行部分具体介绍。另外,对于团购电影票的用户(一次购买数量不小于20张),会给予优惠处理,在原影票价格的基础上打8折。
(2)页面模块化:本系统在界面设计上都采用了模块化处理思想,把很多页面共有的部分集成到一个模块,如页面的头,导航条。这样在开发时,遇到这些相似的页面部分就不需要再重新编写代码,大大提高了开发效率,节省了时间。
(3)面向对象设计:在系统中,将用户、电影、订单等都封装成相应的类,同时每个类都具有自己相应的操作类,从而再次提高了对数据库操作的安全性和程序的可扩展性。
4 系统实施
4.1 系统运行环境
由于本系统系个人单独开发,综合系统特点、开发时间等因素,采用传统的开发方式—瀑布模型开发模式。从节约成本的角度考虑,开发工具选择目前网站开发的主流工具JSP+Access 的组合。
4.1.1硬件要求
(1)CPU:P4 1.8GHz
(2)内存:256MB 以上
4.1.2开发及运行环境
(1)操作系统: Windows 2000/Windows 2003/ WindowsXP/ Windows Vista
(2)开发工具: JSP+Java
(3)数据库:Microsoft Access
(4)服务器:Tomcat 6.0
(5)浏览器:IE 6.0 以上。
4.2 系统架构设计
目前,网络应用软件的运行模式主要有两类:C/S模式和B/S模式。目前大多数应用软件系统都是Client/Server形式的两层结构,现在的软件应用系统正在向分布式的Web应用发展;内部的和外部的用户都可以访问新的和现有的应用系统,Web和Client/Server应用都可以进行同样的业务处理;不同的应用模块共享逻辑组件;通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。
C/S结构,即 Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client 端和Server 端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。C/S之间通过任意的协议通信,一般要求有特定的客户端。C/S程序注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑;由于整体性,必须整体考察,因此在处理出现的问题以及系统升级上难度较大。因为客户端需要实现绝大多数的业务逻辑和界面展示。这种架构中,作为客户端的部分需要承受很大的压力,因为显示逻辑和事务处理都包含在其中,通过与数据库的交互(通常是SQL或存储过程的实现)来达到持久化数据,以此满足实际项目的需要。
B/S结构,即 Browser/Server(浏览器/服务器)结构,是随着Internet 技术的兴起,对 C/S 结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓3-tier结构。B/S结构利用不断成熟和普及的浏览器技术实现原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。这种结构更成为当今应用软件的首选体系结构。B/S模式是靠应用层的http协议进行通信的(当然也要靠底层的好多协议支持),一般不需要特定的客户端,而是需要有统一规范的客户端,那就是浏览器。B/S架构的优点在于客户端和服务器通过Internet 进行数据交换,客户端基于统一的 Web 浏览器,减少了投资,解决了系统维护升级的问题。另外只有极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,这也就充分保护了数据的安全。B/S架构中,显示逻辑交给了Web浏览器,事务处理逻辑在放在了WebApp上,这样就避免了庞大的客户端,减少了客户端的压力[7]。
总的来说,B/S 结构具有如下优点:无需安装客户端,任何一点都可以登录访问;根据权限对网络拓扑进行统一管理;配置文件和发现信息实现集中统一管理和共享。由于系统的定位是一个网上购票系统——是一个电子商务类网站,传统的C/S(客户机/服务器)已不适应。作为 Internet 上的 Web 应用,需要的是 B/S(浏览器/服务器)架构。所以本网站采用B/S结构。
4.3 相关技术介绍
开发网站需要两种工具,即前台开发语言和后台数据库。本网站前台开发技术使用JSP,后台数据库使用Microsoft Access。JSP灵活方便,与后台的Microsoft Access数据库相结合,可以提供一个高性能的在线订票网站。
4.3.1 JSP及其特点
JSP,全称为Java Server Pages/Servlet。JSP和Servlet都是Sun公司的J2EE(Java 2 platform Enterprise Edition)应用体系中的一部分,两者一般需要放在一起被讨论。Servlet的形式和CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也类似,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务[8]。
JSP技术主要具备以下特点:
(1)将内容的产生和显式进行分离:使用JSP技术,Web开发人员可以使用HTML或者XML标志来设计和格式化最终页面。使用JSP标志或者小脚本来产生页面上的动态内容。
(2)强调可重用的群组件:绝大多数JSP页面依赖于可重用且跨平台的组件(如:JavaBean或者Enterprise JavaBean)来执行应用程序所要求的更为复杂的处理。开发人员能够共享和交换执行普通操作的组件,或者使得这些组件为更多的使用者或用户团体所使用。基于组件的方法加速了总体开发过程,并且使得各种群组织在他们现有的技能和优化结果的开发努力中得到平衡。
(3)采用标志简化页面开发:Web页面开发人员不会都是熟悉脚本语言的程序设计人员。JSP技术封装了许多功能,这些功能是在易用的、与JSP相关的XML标志中进行动态内容产生所需要的。标准的JSP标志能够存取和实例化JavaBeans组件,设定或者检索群组件属性,下载Applet,以及执行用其他方法更难于编码和耗时的功能。
目前主流的网站开发语言有JSP、ASP、PHP等等。虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSP Parser)转换成Servlet代码,然后Servlet代码被Java编译器编译成 .class 字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(Script Language)版。JSP和ASP相比,运行速度、运行开销、运行平台、扩展性、安全性、函数支持、厂商支持、对XML的支持等等, JSP的优点都是ASP无法比拟的。采用PHP的网站也有很多,如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。首先,PHP缺乏规模支持;其次,它缺乏多层结构支持。对于大负荷站点,解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。而PHP则缺乏这种支持。还有十分重要的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。目前在国内PHP与ASP应用最为广泛。而JSP由于是一种较新的技术,国内采用的较少。但在国外,JSP已经是比较流行的一种技术,尤其是电子商务类的网站,多采用JSP,比较出名的如IBM的E-Buiness,它的核心是采用JSP/Servlet的Web Sphere。它们都是通过CGI来提供支持的。
由于JSP/Servlet都是基于Java的,所以它们也具备Java语言的最大优点——平台无关性,也就是所谓的一次编写,随处运行(WORA – Write Once, Run Anywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。因此,JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。随着越来越多的的供货商将JSP支持加入到他们的产品中,用户可以使用自己所选择的服务器和工具,修改工具和服务器并不影响目前的应用。JSP技术很容易整合到多种应用体系结构中,以利用现存的工具和技巧,并且扩展到能够支持企业级的分布式应用,作为采用Java技术家族的一部分,以及J2EE的一个成员,JSP技术能够支持高度复杂的基于Web的应用。
4.3.2 JavaBean
JavaBean是一种基于Java的软件组件,JavaBean和ActiveX控件一样,可以通过封装业务逻辑建立一整套可重复利用的对象库。JSP对于在Web应用中集成JavaBean组件提供了完善的支持。这种支持不仅能缩短开发时间(可以直接利用经过测试和可信任的已有组件),避免重复开发,也为JSP应用带来了更多的可伸缩性。JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互与数据提取等。
4.3.3 Microsoft Access及其特点
Access 是微软公司推出的基于Windows的桌面关系数据库管理系统(RDBMS,即Relational Database Management System),是Office系列应用软件之一[9]。一般电脑均会安装,应用广泛。它提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象,并且提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化,为建立功能完善的数据库管理系统提供了方便,也使得普通用户不必编写代码,就可以完成大部分数据管理的任务。Access的优点具体有以下几点:
(1)存储方式单一:Access管理的对象有表、查询、窗体、报表、页、宏和模块这7种,以上对象都存放在后缀为(.mdb)的数据库文件种,便于用户的操作和管理。
(2)面向对象:Access是一个面向对象的开发工具,利用面向对象的方式将数据库系统中的各种功能对象化,将数据库管理的各种功能封装在各类对象中。它将一个应用系统当作是由一系列对象组成的,对每个对象它都定义一组方法和属性,以定义该对象的行为和特征,用户还可以按需要给对象扩展方法和属性。通过对象的方法、属性完成数据库的操作和管理,极大地简化了用户的开发工作。同时,这种基于面向对象的开发方式,使得开发应用程序更为简便。
(3)界面友好、易操作:Access是一个可视化工具,其风格与Windows完全一样,用户想要生成对象并应用,只要使用鼠标进行拖放即可,非常直观方便。系统还提供了表生成器、查询生成器、报表设计器以及数据库向导、表向导、查询向导、窗体向导、报表向导等工具,使得操作简便,容易使用和掌握。
(4)集成环境、处理多种数据信息:Access基于Windows操作系统下的集成开发环境,该环境集成了各种向导和生成器工具,极大地提高了开发人员的工作效率,使得建立数据库、创建表、设计用户界面、设计数据查询、报表打印等可以方便有序地进行。
(5)Access支持ODBC:利用Access强大的DDE(动态数据交换)和OLE(对象的联接和嵌入)特性,可以在一个数据表中嵌入位图、声音、Excel表格、Word文档,还可以建立动态的数据库报表和窗体等。Access还可以将程序应用于网络,并与网络上的动态数据相联接。利用数据库访问页对象生成HTML文件,轻松构建Internet/Intranet的应用。
4.3.4 Tomcat
Tomcat是APACHE JAKARTA软件组织的一个子项目,TOMCAT是一个JSP/SERVLET容器,它是在SUN公司的JSWDK(JAVA SERVER WEB DEVELOPMENT KIT)基础上发展起来的一个JSP和SERVLET规范的标准实现,使用TOMCAT可以体验JSP和SERVLET的最新规范。经过多年的发展,Tomcat不仅是JSP和SERVLET规范的标准实现,而且具备了很多商业JAVA SERVLET容器的特性,并被一些企业用于商业用途。
Tomcat服务器是一个免费的开放源代码的Web应用服务器。因为Tomcat技术先进、性能稳定且免费,所以深受Java程序开发者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
Tomcat是提供一个支持Servlet和JSP运行的容器。Servlet和JSP能根据实时需要,产生动态网页内容。而对于Web服务器来说,Apache仅仅支持静态网页,对于支持动态网页就会显得无能为力;Tomcat则既能为动态网页服务,同时也能为静态网页提供支持。尽管它没有通常的Web服务器快、功能也不如Web服务器丰富,但是Tomcat逐渐为支持静态内容不断扩充。大多数的Web服务器都是用底层语言编写如C语言,利用了相应平台的特征,因此用纯Java编写的Tomcat执行速度不可能与它们相提并论。
一般来说,大的站点都是将Tomcat与Apache的结合,Apache负责接受所有来自客户端的HTTP请求,然后将Servlets和JSP的请求转发给Tomcat来处理。Tomcat完成处理后,将响应传回给Apache,最后Apache将响应返回给客户端。
4.3.5 数据库连接
Access作为关系型桌面数据库管理系统,在建立中、小型的数据库管理网站中得到了广泛的应用。因此,为了建立与数据库的连接,可以通过三种方式:建立DSN、使用非DSN和OLE DB。在本网站设计过程中,通过JDBC-ODBC桥连接Access数据库[10]。
ODBC是一种访问数据库的方法,只要系统中有相应的ODBC驱动程序,任何程序就可以通过ODBC驱动程序操纵数据库。在给ODBC驱动程序传递SQL指令时,用的就是DSN来告诉它到底操作的是哪一个数据库。由此可见,DSN是应用程序和数据库之间的桥梁。要通过ODBC访问数据库,前提是必须配置好DSN。因此,一个DSN必须包含一些信息,DSN的名字就是给这座桥取的名字,当在程序中访问数据库时,给系统传的就是这个名字,而不是数据库的实际名称。所以,在操纵数据库时,系统才会知道调用哪个ODBC驱动程序来服务。
SUN的JDK中自带了用来连接ODBC数据源的JDBC驱动,写法为:
Class.forName( sun.jdbc.odbc.JdbcOdbcDriver );
Connection cn = DriverManager.getConnection( jdbc:odbc:数据源名, 用户名”, 口令 );
 JDBC-ODBC 桥是一个JDBC 驱动程序,对ODBC 而言, 它像是通用的应用程序,桥为所有适用于ODBC 的数据库实现JDBC。它作为sun.jdbc.odbc 包实现,其中包含一个用来访问ODBC 的本地库。由于ODBC 被广泛地使用,所以桥的优点是让JDBC 能够访问几乎所有的数据库。桥支持ODBC 2.X,这也是当前大多数据ODBC 驱动程序支持的版本。桥驱动程序为Java 应用程序提供了一种把JDBC 调用映射为ODBC 调用的方法。因此,需要在客户端机器上安装ODBC 驱动。JDBC-ODBC 桥在JDBC API 和ODBC API之间提供了一个桥梁,这个桥把标准的JDBC 调用翻译成对应的ODBC 调用,然后通过ODBC 库把它们发送到ODBC 数据源。
JDBC- ODBC (Open Database Connectivity,ODBC) 桥驱动程序由Sun 与Merant公司联合开发,主要功能是把JDBC API调用转换成ODBC API 调用,然后ODBC API调用针对供应商的ODBC 驱动程序来访问数据库, 即利用JDBC- ODBC 桥通过ODBC来存储数据源,如图4-1所示。
桥作为包sun.jdbc.odbc 与JDK 一起自动安装,无需特殊配置。Java2SDK 类库中包含了用于JDBC-ODBC桥接驱动程序的类, 因此不再需要安装任何附加包就可以使用。但是客户机需要通过生成数据源名(Data Source Names , DSN)来配置ODBC 管理器。DSN 是一个把数据库、驱动程序、一些可选的设置连接起来的命名配置。
5 系统实现与运行
根据需求分析及系统设计情况,结合JSP、Access的特点开发出了电影票预定网站,在进行编码测试之后,网站实现了上面分析的基本功能。在满足运行环境的条件下,对系统主要功能的实现及运行界面介绍如下。
5.1 登录页面的实现
登录页面命名为Login,其运行效果图如图5-1所示。
图5-1 登录页面运行效果图
登录页面的主要功能是验证用户是否合法,它包含登录和注册两个子模块。在用户输入完用户名和密码之后,程序会将用户名和密码与数据库中的数据进行比对,如果用户名与密码错误,或与用户身份不符,系统会给予提示,要求重新登录。普通用户与管理员的权限不同,user表中,Role属性值为0的是普通用户;Role属性值为1的是管理员。普通用户进入的是网站前台页面,而管理员进入的是网站后台页面。如果还不是网站用户,需要先注册。登录页面在主页面之前弹出,以确保程序安全性。新用户注册页面命名为register,如图5-2所示。
用户名的长度必须在1~20位之间,密码长度应大于6位。为确保订票人身份的真实性,加强票务订购管理,注册时要求必须填写个人真实电话和地址。如果用户信息输入完整、正确且符合要求,系统会将用户信息存入到数据库中,否则提示错误信息并要求用户重新输入。
5.2 前台页面的实现
网站前台页面需要简洁明了,外观大方,突出重点,体现出易操作性。用户可以根据自己的需求,通过菜单来使用各项功能,让用户可以更加快速,简单地进行操作。网站首页在设计上应尽量简洁且能够突出重点,网站的整体风格应该能够让消费者产生愉悦的心情。因此在网站前台页面的设计上采用了色彩较为欢快的色彩风格。该页面上放置了查看电影信息”、购物车管理”、给电影评价”和修改个人信息”四个模块,这样用户在进入网站时就能根据自己的需要选择自己感兴趣的模块。如果不需要进行操作或切换用户,直接单击退出”即可。为方便用户浏览上映电影的信息,在他们进入前台页面时时默认显示的为电影信息”页面。
网站前台页面命名为shop,其运行效果图如图5-3所示。
图5-2 用户注册页面运行效果图
图5-3 网站前台页面
将电影添加到购物车是购票网站前台的核心功能。网站中的购物车模仿现实中的购物车,存放用户选择的电影,用户可以根据自己的需求增加、清除购物车中的电影票。综上分析,在实现时采用 SESSION 标识 ID 将当前的用户和购物车之间关联起来。在用户表中,设置了等级”(rank)这个属性,它用于判断用户的级别。凡是在本网站购票成功一次,用户等级便加1。当用户等级小于5时,属于网站的普通用户,普通用户预定电影票不能选择具体座位,只能根据个人喜好选择大体方位,如前排、中间或后排,若预定两张以上电影票可以选择座位是否连续,具体座位由系统根据个人喜好自动分配。当用户等级大于或等于5时,属于网站的星级用户,星级用户在预定电影票时便可以选择具体座位,但对于系统已经分配好的座位,星级用户是不可选的。这种座位分配方法是由顺序算法得到的,如果普通用户喜欢前排的座位,那么系统从第一排A1开始分配,遇到已经分配好的座位,系统会自动跳过,不会进行二次分配。如果用户需要连续座位,系统也会按照顺序分配连续的位置,若没有满足条件的位置剩余,系统会提示分配失败。系统分配座位的具体算法分析如下:
public String getSeats(String qh,int num,boolean cont)
(1)参数 String qh 表示前后排喜好的选择,可选值”front”,”middle”,”back”,分别指前排、中间、后排。
(2)参数 int num 表示订购的票的张数,取正整数。
(3)参数 boolean cont表示是否要求订购连续的座位,true 表示要求连续,false表示不要求连续。
座位用整形数组seatTable[5][10]来表示,数组共5行10列,取值1表示该行被预订,取值0表示未被预订,订购的座位号用字符串数组rs[num]来表示,共num个元素,取值为订购的座位号,如A10”。
以用户选择前排座位为例,若订购票得数量大于等于2且要求座位不连续时,从头开始遍历,碰到空座位生成座位字符串后填入到rs数组里。若rs数组满则分配成功,若遍历到最后rs数组未被填满则分配失败。算法描述如下:
if(qh.equals(front))
{
int j=0;
for(int i=0; i<50 && j {
if(this.seatTable[i/10][i%10]= =0) // 该座位未被使用
{ // 得到当前的行
int i_row=i/10+A; // 将行转化为字母,如第一行转化为A
char c=(char)i_row;
rs[j]=Character.toString(c); // 将行字符串填入rs
int i_col=i%10+1; // 得到当前的列
rs[j]+=Integer.toString(i_col); // 将列字符串填入rs
j++; //rs的索引值加一
}
}
if(j!=num) //分配失败
return 分配失败,请重新设定条件!;
}
若订购票得数量大于等于2且要求座位连续时,从头开始遍历,beg记录第一个空座位,初值为0,last记录还需要分配的连续座位数,初值为num。每当遇到空座位时,last减1,last为0时表示分配成功,分配以beg-1为结束的连续num个座位。每当遇到已被售出的座位时,last重置为num,beg置为下一位置。遍历到表尾尚未分配成功则表示分配失败。算法描述如下:
int beg=0;int last=num;
if(qh.equals(front))
{ //未分配成功且未遍历完则继续遍历
while(beg<50&&last!=0)
{
if(this.seatTable[beg/10][beg%10]==0) //遇到空座位
last--;
else //遇到被售出的座位
last=num;
beg++;
}
if(beg==50) //分配失败
return 分配失败,请重新设定条件!;
else //分配成功,此时beg指向被分配的座位的下一个位置
{ //分配索引值从beg-num开始到beg-1的所有座位
for(int i=beg-num,j=0;i {
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
}
}
购物车功能实现的效果图如图5-4和图5-5所示,分为普通用户和星级用户购物车。红色标记出的表示已经分配好的座位。普通用户在团购电影票(一次购买数量不小于20)时会给予价格优惠,在原价的基础上打八折,即为原价的80%。
图5-4 普通用户购物车运行效果图
图5-5 星级用户购物车运行效果图
5.3 后台页面的实现
网站后台管理页面命名为manage,其运行效果图如图5-6所示。
图5-6 网站后台页面
网站后台管理页面也要体现出易操作性,使管理员的工作更加快捷方便,更要给人以稳重之感,所以选择沉稳的蓝色色调。该页面上放置了电影管理”、订单管理”和用户管理”和评价管理”四个模块,这样管理员在进入网站时就能根据自己的需要选择相应的模块。如果不需要进行操作或切换用户,直接单击退出”即可。由于 HTTP 的无连接状态,在每个页面都要开启 SESSION 来判断用户的登录状态及对应的操作权限(前台页面也是如此),因此从后台登录开始到管理员注销离开,在此期间每个页面都要验证 SESSION,判断用户操作合法性。另外,为方便管理员随时添加新上映的电影,在管理员进入后台时默认显示的页面为电影信息”页面。
(1)电影管理:主要为管理员提供添加电影信息、修改电影信息、删除电影信息等基本操作,当管理员单击添加新电影”按钮时,弹出添加电影”页面,此页面需要管理员输入电影的名称、放映厅、上映时间、价格、简介等基本信息,当管理员输入完毕单击提交”按钮,在判断数据的完整性、合法性之后将数据存入数据库,否则将弹出出错信息和相应的修改提示,如图5-7所示。修改电影信息”的操作与添加新电影”的操作相似,此处不再赘述。
(2)订单管理:订单管理为后台的核心管理功能,此处为管理员提供了订单查询和删除的功能。单击订单管理”按钮后可进入订单详细信息页面,若单击后面的删除”按钮,即将选中的订单删除。
(3)用户管理:当管理员单击用户管理”按钮后,将弹出用户信息表”(为方便管理员查看,以英文字母顺序排序)。管理员可以根据用户注册名的首字母对新注册的用户进行审核。当管理员发现某些会员的信息不合法时可以删除该用户,被删除的用户将无法再次进行相应的购票活动。
(4)评价管理:对于用户的评价,管理员可以进行查看和删除的操作。当单击评价管理”按钮时,处理程序将向数据库提交搜索请求,搜索所有的评价,以表格形式显示在默认页面,并以时间降序排列,这样管理员可以单击某条评价进行对应的操作。假如当前网站并无用户评价,那么在默认页面将提示电影暂无用户留评价”。
图5-7 添加电影页面运行效果图
6 结论
本网站以JSP语言作为开发工具,采用 Microsoft Access进行数据库设计,建立了一个电影票预定网站,通过后台信息发布管理实现了电影信息的展示,实现了该网站的基本功能。文章从需求分析、系统设计和系统实施各方面对整个系统进行了详细分析。现国内对于用户购买电影票的方式仍主要停留在现场购票的模式上,但非现场购票也越来越流行。该网站的成功开发,能够免除人们的排队之苦,提前预定紧俏座位。
由于时间有限,网站在设计上并没有在提高用户体验效果上作出过多的考虑,因此,本网站在用户体验上存在一定的缺陷。比如即将上映的电影信息在网站上暂时并不可见,对于电影的介绍也没有特别完善,仅仅只是以订票为主。在订票成功之后,支付方式和派票方式还未给予考虑。由于本网站为个人开发,因此在数据库的选择上使用了Access,存在一定的限制,只能对轻量级的数据进行处理。综上所述,本网站有待进一步扩展完善。
参考文献
[1]明日科技.《JSP程序开发范例宝典》.人民邮电出版社.2007.32-35
[2]汪孝宜,刘中兵.《JSP数据库开发实例精粹》.电子工业出版社.2005.44-45
[3]林巧民.《JSP动态网站开发实用教程》.清华大学出版社.2009.23-26
[4]萨师煊,王珊.《数据库系统概论》(第三版).高等教育出版社.2000.52-58
[5] Cabestan, JeanPierre .The outline of the database system[M]college education publishing company.2002.103-106
[6] David Finkelstein .The principle and appliance of the database[M]Tsinghua University publishing company.2007.47-48
[7]Yasar Becerikli , B. Koray Celik.Fuzzy control of inverted pendulum and concept of stability using Java application Mathematical and Computer Modelling[J].Directory of Open Access Journals, July 2007. 24-37
[8]B. Kurniawan. JavaServer Faces Programming. NewYork: McGraw-Hill, 2003.203-207
[9]张银鹤,冉小旻.《JSP完全学习手册》.清华大学出版社.2008.39-41
[10] Johnston, Alastair Iain The introduction of JSP dynamic webpage application[M]science publishing company.2000.45
致 谢
转眼间,四年的大学生活即将结束。毕业论文成为了我在大学做的最后一件学术上的事情。我怀着满腔的热忱将其完成,期盼它能给大学生活画上一个完美的句号。
Design of Movie Ticket Booking Website Based on JSP
Sun Xiaoyan
Dept. Information Engineering, Nanjing University of Information Science & Technology, 210044
ABSTRACT
To facilitate the publics entertainment life, prevent people from suffering pains of queuing when buying movie tickets, this disseration introduces the process of designing and implementing online movie ticket booking website of B/S structure, from needs analysis, site design to the specific implementations of ideas,following the website development and database design methods. The design of the website uses JSP development tools and application of Microsoft Access database management system. This disseration details the whole process of a movie ticket booking website analysis, design and development, it analyzes and implements the basic functions of booking tickets.
Key words: Movie Ticket Booking; JSP; Database
附录 主要功能代码
LoginBean.java:
package Login;
import java.sql.*;
import Execute.Execute_DB;
public class LoginBean extends Execute_DB
{
private String memberName=null; //会员姓名
private String pwd=null; //密码
private int LoginTimes=-1; //登录次数
private int rank=-1;
private static String strDBDriver=sun.jdbc.odbc.JdbcOdbcDriver; //JDBC驱动
private static String strDBUrl=jdbc:odbc:VIP; //数据源
private Connection conn=null; //连接
private ResultSet rs=null;
private int SysRole; //结果集

public LoginBean(){
//加载JDBC-ODBC驱动
try{
Class.forName(strDBDriver);
}catch(java.lang.ClassNotFoundException e){
//捕获异常
System.err.println(LoginBean():+e.getMessage());
}
}
//获得登录次数
public int getLoginTimes(){
String strSql=null;
try{
conn=DriverManager.getConnection(strDBUrl);
Statement stmt=conn.createStatement();
strSql=Select LoginTimes from user where memberName=+memberName+and pwd=+pwd+;
rs=stmt.executeQuery(strSql);
while(rs.next()){
//登录次数
LoginTimes=rs.getInt(LoginTimes);

}
//如果是合法会员则将其登录次数加1
if(LoginTimes!=-1){
strSql=Update user set LoginTimes=+(LoginTimes+1)+ where memberName=+memberName+;
stmt.executeUpdate(strSql);
}
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
//捕获异常
System.err.println(LoginBean.getLoginTimes():+e.getMessage());
}
return LoginTimes;
}
//获得等级
public int getRank(){
String strSql=null;
try{
conn=DriverManager.getConnection(strDBUrl);
Statement stmt=conn.createStatement();
strSql=Select rank from user where memberName=+memberName+;
rs=stmt.executeQuery(strSql);
while(rs.next()){
//登录次数
rank=rs.getInt(rank);
}
//如果是合法会员则将其登录次数加1
rs.close();
stmt.close();
conn.close();
}catch(SQLException e){
//捕获异常
System.err.println(LoginBean.getRank():+e.getMessage());
}
return rank;
}
public int addRank()
{
int rank=this.getRank();
rank++;
String str=update user set rank=+rank+ where memberName=+memberName+;
super.exeSql(str);
return rank;
}
//设置memberID属性
public void setmemberName(String name){
this.memberName=name;
}
//设置pwd属性
public void setpwd(String password){
this.pwd=password;
}
//获得会员的姓名,用于显示欢迎信息
public String getmemberName(){
return memberName;
}
public void setSysRole(int SysRole)
{
this.SysRole = SysRole;
}
//获取类成员变量SysRole的值
public int getSysRole()
{
return this.SysRole;
}
public boolean user_valid()
{
String strSql=select Role from user where memberName= +memberName + and pwd=+ pwd + and Role=+ SysRole ;

try
{
conn=DriverManager.getConnection(strDBUrl);
Statement a=conn.createStatement();
ResultSet rs1 = a.executeQuery(strSql);
if (rs1.next())
{
return true;
}
else
{
return false;
}
}
catch(Exception ex)
{
return false;
}
}
}
film.java:
package Execute;
import java.util.*;
import java.sql.*;
import java.text.*;
public class film extends Execute_DB
{
//定义类成员变量
private long filmID;
private String filmName;
private float Price;
private String PicUrl;
private long SortID;
private String Intro;
private String time;
private String strSql;
private int[][] seatTable;

//初始化类成员变量
public film()
{
this.filmID=0;
this.filmName=;
this.SortID=0;
this.Price=0;
this.PicUrl = 0.jpg;
this.Intro = ;
this.time = ;
this.strSql=;
seatTable=new int[5][];
for(int i=0;i<5;i++)
{
seatTable[i]=new int[10];
for(int j=0;j<10;j++)
{
seatTable[i][j]=0;
}
}
}
//向film数据表中添加一条新记录
public boolean add_film()
{
this.strSql=insert into film (filmName,Price,SortID,PicUrl,Intro,ReleaseTime)values( + this.filmName + , + this.Price + , + this.SortID + , + this.PicUrl + , + this.Intro + , + this.time + );
boolean isAdd = super.exeSql(this.strSql);
return isAdd;
}
//修改类成员变量filmID对应的电影信息
public boolean modify_info()
{
this.strSql=update film set ;
this.strSql=this.strSql + filmName= + + this.filmName + ,;
this.strSql=this.strSql + Price= + + this.Price + ,;
this.strSql=this.strSql + SortID= + + this.SortID + ,;
this.strSql=this.strSql + Intro= + + this.Intro + ,;
this.strSql=this.strSql + ReleaseTime= + + this.time + ,;
this.strSql=this.strSql + picUrl= + + this.PicUrl + ;
this.strSql=this.strSql + where filmID= + this.filmID;
boolean isUpdate = super.exeSql(this.strSql);
return isUpdate;
}
//删除类DeletefilmID中对应的电影信息
public boolean delete_film(String DeletefilmID)
{
this.strSql=delete from film where filmID in (;
this.strSql=this.strSql + DeletefilmID + );

boolean isDelete = super.exeSql(this.strSql);
return isDelete;
}
//获取类成员变量filmID对应的电影信息
public boolean init()
{
this.strSql=select * from film where filmID=+ this.filmID;

try
{
ResultSet rs = super.exeSqlQuery(this.strSql);
if (rs.next())
{
this.filmID=rs.getLong(filmID);
this.filmName=rs.getString(filmName);
this.PicUrl=rs.getString(PicUrl);
this.Price=rs.getFloat(Price);
this.SortID=rs.getLong(SortID);
this.Intro=rs.getString(Intro);
this.time=rs.getString(ReleaseTime);
}
else
{
//return false;
}
}
catch(Exception ex)
{
//return false;
}

return this.initialSeatTable();
}
//获取所有普通电影信息,返回一个ResultSet类型对象
public ResultSet show_film()
{
this.strSql=select * from film;
ResultSet rs = null;
try
{
rs = super.exeSqlQuery(this.strSql);
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
return rs;
}
public boolean initialSeatTable()
{
this.strSql=select seat from goods where filmID=+ this.filmID;
String seat;
try
{
ResultSet rs = super.exeSqlQuery(this.strSql);
while (rs.next())
{
seat=rs.getString(seat);
char[] chs=seat.toCharArray();
char ch=chs[0];
int row=ch-A;
String subseat=seat.substring(1);
int col=Integer.parseInt(subseat)-1;
this.seatTable[row][col]=1;
}
return true;
}
catch(Exception ex)
{
return false;
}
}
public String getSeats(String qh,String zy ,int num,boolean cont)
{
String[] rs=new String[num];
if(cont)
{
int beg=0;int last=num;
if(qh.equals(front))
{
while(beg<50&&last!=0)
{
if(this.seatTable[beg/10][beg%10]==0)
{
last--;
}
else
{
last=num;
}
beg++;
}
if(beg==50)
{
return 分配失败,请重新设定条件!;
}
else
{
for(int i=beg-num,j=0;i {
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
}
}
}
if(qh.equals(middle))
{
beg=-1;
int half=num/2;
int first=24-half;
int temp;
for(int i=0;;i++)
{
if((temp=first-i)>=0)
{
boolean tempb=true;
for(int j=0;j {
tempb=tempb&&(this.seatTable[(temp+j)/10][(temp+j)%10]==0);
}
if(tempb)
{
beg=temp;
break;
}
}
if((temp=first+i)<=50-num)
{
boolean tempb=true;
for(int j=0;j {
tempb=tempb&&(this.seatTable[(temp+j)/10][(temp+j%10)]==0);
}
if(tempb)
{
beg=temp;
break;
}
}
}
if(beg==-1)
{
return 分配失败,请重新设定条件!;
}
else
{
for(int k=beg,j=0;k {
int i_row=k/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=k%10+1;
rs[j]+=Integer.toString(i_col);
}
}
}
if(qh.equals(back))
{
beg=49;
while(beg>=0&&last!=0)
{
if(this.seatTable[beg/10][beg%10]==0)
{
last--;
}
else
{
last=num;
}
beg--;
}
if(beg==0)
{
return 分配失败,请重新设定条件!;
}
else
{
for(int i=beg+1,j=0;i {
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
}
}
}
}
else
{
if(qh.equals(front))
{
int j=0;
for(int i=0;i<50&&j {
if(this.seatTable[i/10][i%10]==0)
{
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
j++;
}
}
if(j!=num)
{
return 分配失败,请重新设定条件!;
}
}
if(qh.equals(middle))
{
int j=0;
for(int i=24,k=25;j {
if(i>=0)
{
if(this.seatTable[i/10][i%10]==0)
{
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
j++;
}
}
if(k<50)
{
if(this.seatTable[k/10][k%10]==0)
{
int i_row=k/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=k%10+1;
rs[j]+=Integer.toString(i_col);
j++;
}
}
}
if(j!=num)
{
return 分配失败,请重新设定条件!;
}
}
if(qh.equals(back))
{
int j=0;
for(int i=49;i>=0&&j {
if(this.seatTable[i/10][i%10]==0)
{
int i_row=i/10+A;
char c=(char)i_row;
rs[j]=Character.toString(c);
int i_col=i%10+1;
rs[j]+=Integer.toString(i_col);
j++;
}
}
if(j!=num)
{
return 分配失败,请重新设定条件!;
}
}
}
String seats=;
for(int i=0;i {
seats+=rs[i];
if(i!=num-1)
{
seats+=,;
}
}
return seats;
}
public void setfilmID(long filmID)
{
this.filmID = filmID;
}
public long getfilmID()
{
return this.filmID;
}
public void setfilmName(String filmName)
{
this.filmName = filmName;
}
public String getfilmName()
{
return this.filmName;
}
//设置类成员变量Price的值
public void setPrice(float Price)
{
this.Price = Price;
}
//获取类成员变量Price的值
public float getPrice()
{
return this.Price;
}
//设置类成员变量SortID的值
public void setSortID(long SortID)
{
this.SortID = SortID;
}
//获取类成员变量SortID的值
public long getSortID()
{
return this.SortID;
}
//设置类成员变量PicUrl的值
public void setPicUrl(String PicUrl)
{
this.PicUrl = PicUrl;
}
//获取类成员变量PicUrl的值
public String getPicUrl()
{
return this.PicUrl;
}
//设置类成员变量Intro的值
public void setIntro(String Intro)
{
this.Intro = Intro;
}
//获取类成员变量Intro的值
public String getIntro()
{
return this.Intro;
}
//设置类成员变量time的值
public void settime(String time)
{
this.time = time;
}
//获取类成员变量time的值
public String gettime()
{
return this.time;
}
//获取类成员变量getseatTable的值
public int[][] getseatTable()
{
return this.seatTable;
}
}
add_goods_form.jsp:
<%@ page contentType=text/html; charset=gb2312 language=java%>


<%
//判断当前访问用户是否是登录用户,只有登录用户才能进行该项操作
int i_SysRole = -1;
try
{
i_SysRole = (Integer) session.getAttribute(SysRole);
}
catch(Exception e)
{}
if(i_SysRole != 0)
{
out.println(

您无权进行该项操作

);
out.println(

);
return;
}
//获取索引号
String s_filmID = request.getParameter(filmID);
long l_filmID = 0;
try
{
l_filmID = Long.parseLong(s_filmID);
}
catch(NumberFormatException ex)
{
out.println(

非法操作

);
out.println(

);
return;
}
//获取电影信息
film.setfilmID(l_filmID);
if(!film.init())
{
out.println(

该信息不存在

);
out.println(

);
return;
}
//获取电影的类别信息
sorts.setSortID(film.getSortID());
sorts.init();
String strPage = request.getParameter(showPage);
int[][] seatTable=film.getseatTable();
%>








 





















 

您要订购的电影信息如下
【电影名称】    <%=film.getfilmName()%>
【放映厅】    <%=sorts.getSortName()%>
【上映时间】    <%=film.gettime()%>
【价格】    <%=film.getPrice()%>(RMB)

座位分布表(红色表示已售出):








<%
String[][] bkc;
bkc=new String[2][];
bkc[0]=new String[]{#ffffff,#ff0000};
bkc[1]=new String[]{#cccccc,#ff0000};
for (int i=0;i<5;i++)
{
int temp=seatTable[0][i];
out.print( );
}
%>

<%
for (int i=5;i<10;i++)
{
int temp=seatTable[0][i];
out.print( );
}
%>


<%
String[] strs=new String[]{B,C,D,E};
for(int j=1;j<5;j++)
{
int row=j%2;
out.println();
for (int i=0;i<10;i++)
{
int temp=seatTable[j][i];
out.print();
}
out.println();
}
%>




 

Screen

  out.print(bkc[0][temp]);
out.print(>

);
out.print(A);
out.print(i+1);
out.println(

        out.print(bkc[0][temp]);
out.print(>

);
out.print(A);
out.print(i+1);
out.println(

 
out.print(bkc[row][temp]);
out.print(>

);
out.print(strs[j-1]);
out.print(i+1);
out.println(

Exit   Exit


<%
int rank=(Integer)session.getAttribute(Rank);
if(rank>=5)
{
%>
请选择座位号:
<% for(int i=0;i<5;i++) { for(int j=0;j<10;j++) { if(seatTable[i][j]==0) { int row=i+A; char c=(char)row; String str=Character.toString(c); str+=Integer.toString(j+1); out.println(+str+); } } } %>

>
>

<%
}
%>
<%
if(rank<5)
{
out.print();
out.print(个人喜好选择:
);
out.print(前后喜好: 前排);
out.print( 中间);
out.print( 后排
);
out.print(连续座位 是 );
out.print(否
);
%>
>
>
<%
out.print(请输入您要购买的电影票数量:);
out.print(
);
}
%>
<%
String choosedSeat=;
if(session.getAttribute(choosedseat)!=null)
{
choosedSeat=(String)session.getAttribute(choosedseat);
}
out.println(需要购买的电影票:);
%>
 


网 站 前 台
电影浏览、购票
修改购物车
给电影评价
修改个人信息
用 户 登 录
结 束 退 出
继续操作
图3-1 前台管理流程图


是否网站用户
注册新用户


后 台 登 录
电 影 管 理
订 单 管 理
用 户 管 理
评 价 管 理
管理员
结 束 退 出
继续操作
图3-2 后台管理流程图


重新验证
图3-3 系统总体结构图
退出系统
身份验证
进入系统后台
修 改 个 人 信 息
电 影 管 理
订 单 管 理
用 户 管 理
查 看 电 影 信 息
购 物 车 管 理
给 电 影 评 价
评 价 管 理
进入系统前台
用户登录
电 影 信 息
购物车信息
电 影 评 价
个 人 信 息
浏览上映电影信息
图3-4 电影票预订网站前台功能模块图
将电影加入购物车
查 看 购 物 车
删除已订购影票
给电影做出评价
确认个人信息
修改个人信息
添加上映电影信息
电影票预订网站后台
电影信息管理
 用户管理
电影评价管理
 订单管理
查看网站用户信息
注销网站用户
删除下线电影信息
 确认订单
 删除订单
查看评价
删除评价
图3-5 电影票预订网站后台功能模块图
网站首页
电影信息管理
电影评价管理
订单管理
用户管理
评价信息
电影信息
用户信息
订单信息
图3-6 电影票预订网站第一层数据流图
网站首页
删除处理
添加处理
修改处理
删除电影信息
添加新电影
修改电影信息
电影基本信息
图3-7 电影信息管理模块数据流图
网站首页
添加处理
注销处理
查询处理
注销用户信息
用户信息
图3-8 用户管理模块数据流图
网站首页
购买用户
信息
查看订单
信息
查询处理
查看订单
信息
删除处理
图3-9 订单管理模块数据流图
网站首页
查询处理
删除处理
评价信息
图3-10 评价管理模块数据流图
用 户
订 单
电影
订购
电话
真实姓名
邮箱
性别
登陆次数
展厅号
介绍
图片率
影片号
影片名
价格
购买数量
购买用户名称
角色
年龄
用户名
展 厅
展厅名称
标签
m
n
n
上映时间
等级
地址
用户编号
密码
订单编号
影片号
座位
图3-11 网站E-R图
放映
1
n
写入
评 价
1
n
评价编号
评价内容
评价时间
用户名称
JAVA应用程序
JDBC—ODBC桥
ODBC层
JDBC
API
ODBC
API
数据库
图4-1 JDBC-ODBC应用模式
PAGE
获取项目源文件,联系Q:1225467431,可指导其它毕设,课设;i++)
;i--)
;i--,k++)
;i++)
+num+1;i++,j++)
+num;k++,j++)
;j++)
;j++)
;i++,j++)
;i++,j++)
;>

发布了8 篇原创文章 · 获赞 0 · 访问量 361

猜你喜欢

转载自blog.csdn.net/weixin_44938415/article/details/104235305
今日推荐