基于jsp的航空票务系统论文(含源文件)


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

摘 要
现如今的航空售票业务是一个高度依赖信息的行业。互联网信息技术的飞速发展不仅使航空售票工作者逐渐摆脱了繁重的手工劳动、提高了工作效率,而且推着航空事业向现代化管理迈进。所以航空票务系统的实现在现实生活中尤为重要。
基于JAVA的航空票务系统就是使用JAVA实现在网页上进行航空机票的交易和管理。通过本系统不仅可以进行售票工作,用户还可进行改签和退票等功能,系统的后台管理还可以对旅客情况和航班和机票的信息进行查询,并可根据不同的情况随时进行进行增加,修改,删除等工作,使售票人员能够有效的对机票进行控制和管理。极大程度的节约了成本,并为用户提供更加快捷、简便的服务。
关键词:航空票务;管理系统;JAVA
Abstract
The airline ticketing is nowadays a career highly relied on information. The rapid development of  internet information technology gradually getting the heavy missions off, improving the work efficiency and making steps towards modern management. So it is very important realize airline ticketing system in our life.
The Java-based airline ticketing system realized the airline tickets trade and management online in Web. Not only the ticket selling service can be achieved by the system, but the tickets rescheduling and canceling service. The back-stage management realized the inquire function for passenger, flight and ticket information. Add, delete and change function can also be realized in necessary, which makes tickets seller have a efficient control and management to air ticket. Saved cost in a big extent and proved users with better service.
Key Words:Air Ticketing; Management System; JAVA
目 录TOC 1-3
摘 要 I
Abstract II
1.引言 1
HYPERLINK l _Toc23362 1.1 开发背景及意义 1
HYPERLINK l _Toc18355 1.2 开发工具和环境配置 1
HYPERLINK l _Toc18353 1.2.1 开发工具 1
HYPERLINK l _Toc28984 1.2.2 环境配置 2
1.3 可行性研究 4
2.需求分析 5
HYPERLINK l _Toc8065 2.1 功能需求 5
HYPERLINK l _Toc1774 2.2 性能需求 5
3.系统设计 6
HYPERLINK l _Toc17484 3.1 数据库设计 6
HYPERLINK l _Toc18340 3.1.1 数据库表 6
HYPERLINK l _Toc28837 3.1.2 数据库的概念结构设计 6
HYPERLINK l _Toc5804 3.1.3 数据库的逻辑结构设计 8
HYPERLINK l _Toc22775 3.2 功能模块概要设计 10
HYPERLINK l _Toc16788 3.2.1 模块设计 10
HYPERLINK l _Toc20977 3.2.2 系统流程图 10
4.详细设计 11
HYPERLINK l _Toc7607 4.1 登录模块 11
HYPERLINK l _Toc18900 4.2 航班管理模块 13
HYPERLINK l _Toc32494 4.3 机票预订模块 17
HYPERLINK l _Toc17472 4.4 我的订单模块 18
HYPERLINK l _Toc21399 4.5 修改密码模块 18
HYPERLINK l _Toc8222 4.6 用户注册模块 19
HYPERLINK l _Toc16783 4.7 用户管理模块 20
5.系统测试 21
HYPERLINK l _Toc21520 5.1 系统测试的概念 21
HYPERLINK l _Toc30935 5.2 测试策略及结果 21
HYPERLINK l _Toc31293 5.2.1 功能的测试 21
HYPERLINK l _Toc15823 5.2.2 其他测试 23
6.结语 24
参考文献 25
附 录 26
致 谢 38
1.引言
1.1 开发背景及意义
随着科技的发展,人们生活水平的提高,飞机这种交通工具逐渐的得到人们的青睐,它方便了人们的出行。民航服务业的发展,也推动着各种机票经营企业的快速发展,用户需要实时的管理航班信息,能够对客户定票、退票、产生定单进行管理。
面对各种不同种类的信息,需要合理的数据库结构来保存数据信息以及有效的程序结构支持各种数据操作的执行。因此,航空票务系统的设计与实现是必须的。它不但能满足各种机票经营企业的需求,也大大方便了乘客的查询航班、购买机票、退票等活动。
管理信息系统的开发需要语言的支持,现在主流的语言有JAVA、C、IOS、Android等。这里比较适合的是JAVA语言,它是面向对象的、B/S(浏览器/服务器)结构。
面向对象的开发是将所需开发的管理信息系统要解决的问题抽象成若干对象,再研究这些对象之间的关系,构建这些对象之间的联系,最终反映在开发的管理信息系统中。B/S结构是浏览器、服务器的结构,客户之间通过浏览器就可以访问票务系统,不需要下载客户端。更加方便的为用户通过服务[1]。
本系统的开发使用的JAVA中的SERVLET和JSP技术。前台页面时动态的JSP页面,在通过SERVLET交互式地浏览和修改数据,生成动态 Web内容。整个项目使用MVC设计模式,层次结构分明便于开发和维护。
1.2 开发工具和环境配置
1.2.1 开发工具
本系统开发主要使用的开发工具是MyEclipse9.0和MySQL数据库,同时还在MyEclipse中配置了Tomcat服务器以及使用火狐浏览器进行运行测试。
1、MyEclipse:是在Eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于JAVA、JAVAEE以及移动应用的开发。MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错[2]。
2、MySQL:是一个关系型数据库管理系统 (​http:​/​​/​baike.baidu.com​/​view​/​1450387.htm http:​/​​/​baike.baidu.com​/​_blank​),其所使用的 SQL 语言是用于访问数据库 (​http:​/​​/​baike.baidu.com​/​view​/​1088.htm http:​/​​/​baike.baidu.com​/​_blank​)的最常用标准化语言。MySQL由于其体积小、速度快、总体拥有成本低,尤其是开放源码 (​http:​/​​/​baike.baidu.com​/​view​/​394804.htm http:​/​​/​baike.baidu.com​/​_blank​)这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库 (​http:​/​​/​baike.baidu.com​/​view​/​1088.htm http:​/​​/​baike.baidu.com​/​_blank​)[3]。
3、Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器 (​http:​/​​/​baike.baidu.com​/​view​/​899.htm http:​/​​/​baike.baidu.com​/​_blank​)
器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
4、火狐浏览器:可以用来运行显示系统开发编写的JSP页面,尤其是火狐下的一款插件Firebug更是方便进行查错。它集HTML查看和编辑、JavaScript控制台、网络状况监视器于一体,是开发JavaScript、CSS、HTML和 Ajax的得力助手[4]。Firebug能从各个不同的角度剖析Web页面内部的细节层面,给Web开发者带来很大的便利。
1.2.2环境配置
1、配置JDK:首先下载安装JDK软件,安装好后配置系统环境变量,右击计算机 - 属性 - 高级系统设置 - 环境变量 - ,然后就可以对环境变量进行设置。找到系统变量中的path值。如下图所示:
图1-1 环境变量配置
选中path”- 点击编辑 - 把安装JDK的路径粘贴到变量值的后面。注意,复制进去的路径一定要与前面的数据用分号隔开。
图1-2 系统变量编辑
2、配置Tomcat:首先下载Tomcat文件,我是把文件放在E盘下。然后启动MyEclipse,点击 Windows - preferences - 搜索tomcat。如下图操作:
图1-3 Tomcat配置
3、使用第三方工具连接数据库:下载、安装MySQL客户端软件Navicat for Mysql,双击打开工具 - 点击Connection”弹出如图示窗口,填写服务器的IP以及端口号、数据库的用户名和密码连接数据库。
图1-4 连接数据库
1.3 可行性研究
航空票务系统是使用JAVA语言开发,使用SERVLET和JSP技术进行实现。为了更加方便用户进行订票、退票、查询等功能,系统使用JAVAWEB技术,直接将系统发布到万维网上,用户直接通过浏览器访问该系统,不需要下载客户端。
在技术上使用MVC设计模式,将显示层、业务逻辑层以及控制层分开,结构清晰便于开发、易维护[5]。
2. 需求分析
2.1功能需求
本航空票务系统主要实现的功能有:
(1)实现不同权限的登录。主要有三种用户权限:管理员权限、登录用户、未登录用户。管理员可进行用户管理、航班管理、机票管理以及系统维护。登录用户可进行航班查询,机票查询、预定、退票改签以及个人信息管理。未登录用户能对航班和机票进行查询以及注册、登录等[6]。
(2)订票功能,能够按照顾客提供的信息提供订票服务,例如按给定的起飞城市、到达城市、起飞日期、舱位类型等订票。 
(3)航班管理,管理员能够对航班信息进行增、删、改、查。保持航班信息的更新及维护。
(4)机票管理,管理员客户操作反馈的信息,对机票信息进行增、删、改、查等操作。
(5)提供各种查询功能。例如航班时刻查询,包括起飞时间,到达时间;航班的其他基本信息查询,以及对机票的查询。 
(6)我的订单。用户登录后通过我的订单可以查看个人的订单详情,还可进行退票功能以及机票改签,并且打印改签前后机票的价格信息。 
(7)公司简介,通过公司简介可以查看公司的介绍。
用户登录进入航空票务系统的主界面,在上方有六个菜单按钮:系统主页、公司简介、航班查询、机票预订、我的订单及修改密码。各个界面简洁,操作方便,容易上手,用户可以对航班进行详细的信息查询,在机票查询中进行机票的查询和预定,在我的订单中进行机票退订和改签。
2.2性能需求
为了保证系统能够长期、安全、稳定、可靠、高效的运行,系统应该满足以下的性能需求:系统处理的准确性和及时性是系统的必要性能,系统在后期的维护下以及可扩展性,要求系统提供足够的手段进行功能的调整和扩充。
3. 系统设计
3.1 数据库设计
对于航空票务系统,它的数据库设计是通过对航空公司管理业务过程的数据流程分析和用户的基本信息以及用户的处理业务的数据分析后进行设计。可以确定岀系统中一些实体对象及以及它们之间的关系,这些实体包含各种具体信息,通过相互之间的作用形成数据的流动[7]。
3.1.1数据库表
航空票务系统中的实体对象包括航班信息表(flightinfo),用户和管理员信息表(userinfo),机票信息表(ticketinfo),订单信息表(user_ticketinfo)这些实体模型的含义如下所述。
(1)flightinfo:代表一个航班信息实体:包括航班号(id)、航空公司(airfirm)、起飞地(start)、到达地(end)、起飞时间(leaveTime)、到达时间(arriveTime)。
(2)userinfo:代表一个用户或管理员的信息实体:包括用户编号(id)、用户名(name),密码(password),性别(sex),手机号码(tel),身份证号(idcard),用户权限(level)。
(3)ticketinfo:代表每一张机票的信息实体:机票编号(id)、起飞地(start)、到达地(end)、起飞时间(leaveTime)、到达时间(arriveTime),日期(time),座位等级(seatLeval),票价(fare),discount(折扣),航班号(flight_id)、机票剩余数量(ticketNum)。
(4)user_ticketinfo:代表一个用户购买机票的信息实体:机票编号(id)、起飞地(start)、到达地(end)、起飞时间(leaveTime)、到达时间(arriveTime),日期(time),座位等级(seatLeval),票价(fare),用户名(name)、身份证号(idcard)。
3.1.2数据库的概念结构设计
概念结构设计将反映现实世界中的实体、属性和它们之间的关系,建立原始数据形式。概念结构设计的目标是产生反映系统信息需求的整体数据库概念结构[8],描述工具主要有实体图:
图3-1 航班信息实体
图3-2 用户信息实体
图3-3 机票信息实体
图3-4 订单信息实体
图3-5 ER图
3.1.3数据库的逻辑结构设计
数据库逻辑结构设计是描述数据库的组织结构、生成数据库模式。数据库模式定义以下内容:存储什么信息、数据的组织、需要的表、列的定义[9]。
本课题使用的是MySQL数据库,根据上述建立的E-R图,经设计得到如下的数据表:
(1) flightinfo(航班信息表)
航班信息表用来保存航班的信息,如图3-5所示。
(2) userinfo(用户信息表)
用户信息表用于记录用户的信息情况,如图3-6所示。
(3) ticketinfo(机票信息表)
机票信息表用来保存机票的信息,如图3-7所示。
(4) user_ticketinfo(订单信息表)
订单信息表用于记录每个用户订购机票的信息,如图3-8所示。
图3-6 flightinfo(航班信息表)
图3-7 userinfo(用户信息表)
图3-8 ticketinfo(机票信息表)
图3-9 user_ticketinfo(订单信息表)
3.2 功能模块概要设计
3.2.1模块设计
[用户登录模块] 实现了对用户使用系统的检验工作。用户又分为不同的权限,管理员登陆,用户登录和不进行登录直接进入。对不同用户进入系统所赋予的权限也不同,增加了系统的安全性。
[用户管理模块]管理员登陆的权限,对系统登录用户的查看和删除操作。
[航班管理模块]包含对航班信息的查询,所有用户都拥有的权限。对航班信息的添加、修改和删除这是系统管理员的操作权限。
[机票管理模块]包含对机票信息的查询,所有用户都拥有的权限。对机票信息的添加、修改和删除这是系统管理员的操作权限。对机票的预定这是登录用户的权限。
[我的订单模块]包含对用户订单信息的查询,并且包含对机票的退订以及改签权限,改签后会提示改签前后机票价格信息。
[修改密码模块]对于已登录用户可进行密码修改。
[登录和注册模块]这是对进入系统没有登录的用户的权限。用户点击登录按钮跳转到登陆界面。点击注册进行注册,用户注册包含对用户信息的验证。
3.2.2系统流程图
图3-10 系统走向图
4. 详细设计
本系统使用的是JAVA的SERVLET和JSP技术,所以系统的设计又分为前端JSP页面设计和后端业务逻辑处理。下面的模块设计主要从前端JSP页面和后端中的SERVLET控制层两部部分进行讲解。
4.1登录模块
登录模块进行登录用户的用户名和密码进行验证,点击快速注册”还能跳转到注册界面进行用户注册。
登录用户登录后,传递用户填写的用户名和密码进入到UserServlet中的loginStu方法进行用户身份验证,如果用户名和密码输入错误则跳转到登录页面。用户登录正确则跳转到系统主界面。实现代码如下:
/**
* 用户登录
*/
public void loginStu(HttpServletRequest request,HttpServletResponse response
throws SQLException, ServletException, IOException {
String username = request.getParameter(username);
String password = request.getParameter(password);
String sql = select * from userinfo where name=? and password=?;
Object parames[] = new Object[]{username,password};
System.out.println(username+---+password);
//一般用户登录(不需要用户名、密码)
if((username==null||username==) && (password==||password==null)){
response.sendRedirect(main1.jsp);
}else{
//管理员或用户登录
List> list = fun.login(sql,parames);
if(list!=null){
Map map = list.get(0);
if(username.equals(map.get(name))&&password.equals(map.get(password)))
{
System.out.println(登录成功~~~);
//判断是管理员还是用户登录
if(map.get(level).equals(1)){
System.out.println(管理员登录成功!!!~~~);
HttpSession session = request.getSession();
session.setAttribute(username, username);
request.getRequestDispatcher(main2.jsp).forward(request, response);
}else{
System.out.println(用户登录成功!!!~~~);
HttpSession session = request.getSession();
session.setAttribute(username, username);
session.setAttribute(psw, password);
request.getRequestDispatcher(main3.jsp).forward(request, response);
}
}else{
System.out.println(登录失败~~~~~);
response.sendRedirect(/login.html);
}
}
else{
System.out.println(list为空,用户名或密码错误!);
response.sendRedirect(login.html);
}
}
}
1、登录成功跳转到系统主界面:
图4-1 主界面
2、登录失败跳转到登录界面:
图4-2 登录界面
4.2航班管理模块
航班管理包含对航班信息系的查询、添加、修改和删除。在航班信息查询中又分为按航班号和起飞地进行查询。
航班按航班号条件查询通过调用selectByhangbanhao方法,把按查询的条件选择航班号和查询的条件值航班值作为参数传递给selectByhangbanhao方法进行查询。
图4-3 按航班号查询
/**
* 根据航班号查询
*/
public void selectByhangbanhao(HttpServletRequest request,
HttpServletResponse response) throws SQLException, ServletException, IOException {
String chaxun = request.getParameter(chaxun);
String sql = select * from flightinfo where id=?;
if(chaxun==null || chaxun==){
Object parames[] = new Object[]{chaxun};
List> list = fun.selectFlight(sql, parames);
if(list!=null){
System.out.println(根据航班号查询成功~~~);
request.setAttribute(flightList, list);
request.getRequestDispatcher(user_adminlogin/selectFlight.jsp).forward(request, response);
}
}
}
航班按起飞地条件查询通过调用selectByqifeidi方法,把按查询的条件选择起飞地和查询的条件值起飞地值作为参数传递给selectByqifeidi方法进行查询。
图4-4 按航班号查询
/**
* 根据起飞地查询
*/
public void selectByqifeidi(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException, SQLException {
request.setCharacterEncoding(utf-8);
response.setContentType(txt/html;charset=utf-8);
//转换编码格式,将前台输入数据的编码改为UTF-8;
String chaxun = request.getParameter(chaxun);
System.out.println(按照起飞地【+chaxun+】查询);
String sql = select * from flightinfo where start=?;
if(chaxun==null || chaxun==){
//查询全部记录
request.getRequestDispatcher(adminServlet?caozuo=flightSelect).forward(request, response);
}else{
Object parames[] = new Object[]{chaxun};
List> list = fun.selectFlight(sql, parames);
if(list!=null){
System.out.println(根据起飞地查询成功~~~);
request.setAttribute(flightList, list);
request.getRequestDispatcher(user_adminlogin/selectFlight.jsp).forward(request, response);
}
}
}
把添加航班的信息通过放在要跳转的URL之后传递到Servlet中,在Servlet中进行判断选择调用flightInsert方法,通过INSERT语句向数据库中插入数据,实现添加航班。
图4-5 添加航班
/**
* 航班添加
*/
public void flightInsert(HttpServletRequest request,
HttpServletResponse response) throws SQLException, ServletException, IOException {
String id = request.getParameter(id);
String start = request.getParameter(start);
String end = request.getParameter(end);
String leaveTime = request.getParameter(leaveTime);
String sql = insert into flightinfo value(?,?,?,?,?,?);
Object parames[] = new Object[]{id,airfirm,start,end,leaveTime,arriveTime};
int i = fun.insert(sql, parames);
response.sendRedirect(user_adminlogin/newWin.jsp?winValue=+winValue);
}}
图4-6 删除航班
删除航班是通过传递航班的id号,来确定这条航班记录。在调用flightDelete方法通过DELETE语句删除记录,实现航班删除。
/**
* 航班删除
*/
public void flightDelete(HttpServletRequest request,
HttpServletResponse response) throws SQLException, IOException {
String id = request.getParameter(id);
String sql = delete from flightinfo where id=?;
int i = fun.delete(sql, parames);
if(i!=-1){
System.out.println(删除航班成功~~~);
response.sendRedirect(adminServlet?caozuo=flightSelect);
}
}
图4-7 修改航班
/**
* 航班修改
*/
private void flightUpdate(HttpServletRequest request,
HttpServletResponse response) throws SQLException, IOException {
String id1 = request.getParameter(id1);
String id = request.getParameter(id);
String airfirm = request.getParameter(airfirm);
String start = request.getParameter(start);
String end = request.getParameter(end);
String leaveTime = request.getParameter(leaveTime);
String arriveTime = request.getParameter(arriveTime);
String sql = update flightinfo set id=?,airfirm=?,start=?,
end=?,leaveTime=?,arriveTime=? where id=?;
Object parames[] = new Object[]{id,airfirm,start,end,leaveTime,arriveTime,id1};
int i = fun.update(sql, parames);
response.sendRedirect(user_adminlogin/newWin.jsp?winValue=+winValue);
}
}
4.3机票预订模块
用户点击机票预订”菜单,会进入到机票预订界面。页面中会显示所以机票的信息,用户可以根据起飞地、到达地和日期,进行查询筛选出所需机票。用户点击订票”按钮完成交易。完成订票后会把机票的票数修改为原来的值减一,然后在用户订单表中插入一条记录。
图4-8 机票预订
图4-9 机票售完提示
4.4我的订单模块
我的订单是根据用户预订机票产生的订单信息,用户可以对订单进行改签”和退票”操作。改签完成后会弹出改签前后票价信息的提示。改签调用gaiQian方法,在这个方法中把原记录删除再添加一条新纪录。
图4-10 我的订单
图4-11 改签后价格提示
4.5修改密码模块
点击修改密码”菜单,会弹出窗口修改密码。用户需要输入原密码和两次新密码。通过调用updatePsw方法,在这个方法中用UPDATE语句对密码信息进行修改。
图4-12 修改用户密码
/**
* 修改密码
*/
public void updatePsw(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
String oldPsw = request.getParameter(oldPsw); //获得原密码
String newPsw = request.getParameter(newPsw); //获得新密码
HttpSession session = request.getSession();
String name = (String) session.getAttribute(username);
String sql = update userinfo set password=? where password=? and name=?;
Object parames[] = new Object[]{newPsw,oldPsw,name};
int i = fun.update(sql, parames);
response.sendRedirect(user_userlogin/newWin.jsp?);
}
4.6用户注册模块
用户注册可以在登录界面点击快速注册”进行注册或者在直接进入系统化点击菜单里的注册”按钮注册用户。实现原理就是调用zhuCe方法,把注册的信息传递到zhuCe方法,然后INSERT到数据库中。
图4-13 修改用户密码
/**
* 用户注册
*/
public void zhuCe(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
String id = request.getParameter(id);
String name = request.getParameter(name);
String password = request.getParameter(password);
String tel = request.getParameter(tel);
String idcard = request.getParameter(idcard);
String sql = insert into userinfo(id,name,password,sex,tel,idcard) value(?,?,?,?,?,?);
Object parames[] = new Object[]{id,name,password,sex,tel,idcard};
int i = fun.insert(sql, parames);
request.getRequestDispatcher(login.html).forward(request, response);
}
}
4.7用户管理模块
用户管理员登录后,可进行用户信息查询以及用户信息的删除。
图4-14 用户信息管理
/**
* 用户删除
*/
public void userDelete(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
String id = request.getParameter(id);
String sql = delete from userinfo where id=?;
Object parames[] = new Object[]{id};
int i = fun.delete(sql, parames);
if(i!=-1){
request.getRequestDispatcher(adminServlet?caozuo=userSelect).forward(request, response);
}
}
5. 系统测试
5.1系统测试的概念
软件测试不仅仅包括程序测试,而是贯穿于整个软件开发的全过程,也就是说其对象除了包括需求分析所获得的开发成果、还包括概要设计所获得的开发成果、以及包括详细设计所获得的开发成果、和包括编码实现所获得的开发成果[10]。
系统测试是针对整个产品系统进行的测试,目的是验证系统是否满足了需求规格的定义,找出与需求规格不符或与之矛盾的地方,从而提出更加完善的方案。系统测试发现问题之后要经过调试找出错误原因和位置,然后进行改正。是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。对象不仅仅包括需测试的软件 (​http:​/​​/​baike.baidu.com​/​view​/​37.htm http:​/​​/​baike.baidu.com​/​view​/​_blank​),还要包含软件所依赖的硬件、外设甚至包括某些数据、某些支持软件及其接口等
比较常见的、典型的系统测试 (​http:​/​​/​baike.baidu.com​/​view​/​170112.htm http:​/​​/​baike.baidu.com​/​view​/​_blank​)包括恢复测试、安全测试、压力测试[11]。下面对这几种测试进行一一介绍:
1)恢复测试
恢复测试作为一种系统测试,主要关注导致软件 (​http:​/​​/​baike.baidu.com​/​view​/​37.htm http:​/​​/​baike.baidu.com​/​view​/​_blank​)运行失败的各种条件,并验证其恢复过程能否正确执行。在特定情况下,系统需具备容错能力。另外,系统失效必须在规定时间段内被更正,否则将会导致严重的经济损失。
2)安全测试
安全测试用来验证系统内部的保护机制,以防止非法侵入。在安全测试中,测试人员扮演试图侵入系统的角色,采用各种办法试图突破防线。因此系统安全设计的准则是要想方设法使侵入系统所需的代价更加昂贵。
3)压力测试
压力测试是指在正常资源下使用异常的访问量、频率或数据量来执行系统。
5.2测试策略及结果
5.2.1功能的测试
概述:功能测试也称为黑盒测试,就是运行整个系统测试各模块功能与预期的功能效果对比是否相同,在测试过程中把整个程序看成一个打不开的黑盒,在完全不考虑程序内部结构和内部特性的情况下,在程序接口 (​http:​/​​/​baike.baidu.com​/​view​/​2809361.htm http:​/​​/​baike.baidu.com​/​_blank​)进行测试。就是按照开发的功能分析和各个模块的功能设计进行测试,主要针对软件界面 (​http:​/​​/​baike.baidu.com​/​view​/​43207.htm http:​/​​/​baike.baidu.com​/​_blank​)和软件功能进行测试。功能测试既是测试的重点,也是测试的难点[12]。
目标:功能测试的目标或者说过程就是分别使用有效的和无效的数据测试各
个功能模块,测试输入为有效数据时,能否得到与预期结果相符的结果,测试输
入为无效数据时,能否得到与预期相符的提示信息或者警告信息。
结果:测试各模块,结果达到目标。
下面以机票预订和我的订单功能模块的测试为例,该模块测试用例、测试结果如下:
表4-1 机票预订和我的订单功能测试用例
用例 机票预订,我的订单 测试类名称 dingPiao、ticketSelecttuiPiao、gaiQian
测试目的
测试环境 Windows7、火狐浏览器、IE浏览器、360浏览器测试环境MyEclipse9.0、MySQL数据库、
测试用例标号 测试项目 输入描述 预期结果 实际结果
1 查询机票 输入正确的机票信息 查询出对应条件的机票信息 一致
2 查询机票 点击机票预订”菜单按钮 查询出所有机票信息的记录 一致
3 查询机票 起飞地错误 结果为空 一致
4 查询机票 目的地错误 结果为空 一致
5 查询机票 日期错误 结果为空 一致
6 查询机票 所有条件为空 结果为空 一致
7 机票预订 票数为0 提示机票已卖完 一致
8 机票预订 机票有剩余 订票成功,票数减1 一致
9 机票预订 重复购买 提示机票不能重复购买 一致
10 退票 点击退票 退票成功 一致
11 退票 飞机起飞前三十分点击退票 退票失败 一致
12 改签 点击改签后选择预定的机票 改签成功 一致
13 改签 完成改签 显示改签前后机票价格 一致
14 改签 点击改签后不选择预定的机票 改签失败 一致
15 改签 点击改签后进行其他操作 改签失败 一致
16 改签 点击改签后点击退出系统按钮 退出当前系统成功,改签失败 一致
5.2.2其他测试
1、性能的测试
概述:性能的测试是为了获得系统的最大负载和最大处理能力等等数据,其主要是通过评测和评估非功能性需求来获得的,包括评测和评估系统处理速度、系统响应时间以及其他与时间相关的数据[13]。
目标:性能的测试的目标是测试在正常负荷下运行的系统的预期工作量。
结果:经过测试,得出系统平均响应时间、处理速度、最大负载等性能达到
目标。
2、压力的测试
概述:压力的测试也就是系统承受压力的测试,既有高压测试又有负载测试。
目标:压力的测试主要就是要掌握系统的安全运行性能,这就需要了解系统在长时间处理多个用户相同的且性能最坏的业务的情况下的安全运行边界条件,这就需要测试系统在给定时间内能够持续处理的最大工作量或最大负载。
结果:经过测试,系统在所需最大负荷两倍的条件下,仍能够正常运转。
5、配置的测试
概述:配置的测试主要是确认系统的使用范围,这需要测试系统在不同的软件配置中的运行情况以及在不同的硬件配置中的运行情况[14];
目标:配置的测试的目标就是测试系统在不同条件下是否能够正常运行,这就包括测试系统在所需的软件配置以及所需的硬件配置中,也就是说在正常配置下,运行是否正常。测试系统的兼容性,也就是测试在其他版本的浏览器操作或者在其他系统平台的异常情况下,系统是否兼容,也就是说系统是否能够正常运行[15]。
结果:系统在主流操作系统 Windows XP、Windows 7,火狐浏览器,IE浏览器,360浏览器以及其他操作系统和浏览器上都可以正常运行。
6.结语
经过两个月的忙碌整个毕业设计和论文已全部完成,总结这两个月的经历感觉真的学到了很多。从最开始的不知从何下手到最后的全部完成,这中间我付出了很多努力同时也收获了很多。
这次的毕业设计不仅仅是对我大学四年所学的总结,还是对我能力的一个考验。因为想要完成一个优秀的毕业设计仅依靠大学中所学习到知识是完全不够的,但我经过四年的学习也具备了自学的能力,我通过查找相关的资料书籍以及用过网络资源获取来帮助我完成毕业设计。
拿到这个毕业设计题目,首先我们从系统的需求分析入手,我们将系统要实现的功能和估计要用到的相关技术及相关技术难点进行分析。接下来就是进行系统的总体设计,首先将系统的结构进行分析,分析这个系统需要完成哪些功能,将这些功能划分为多个模块,这样在设计上我们就将软件分成一个立体的,低偶合的一个一个的小模块。我先从简单的模块开始着手编写代码,然后一点点的完成整个项目的开发。 
本次系统设计中我也遇到了很到问题,主要是缺少项目经验。有些只是可能会但是在实际项目开发中一不小心就会出错。还有在做系统时不能把以前学过的知识都综合到一起。每当遇到这样或那样的问题时,我都通过网上查阅相关资料,一些没有接触过的知识也是从头开始学起,在这个过程中让我的进步非常大通过解决这一个个难点不仅是对我知识的积累也是对我学习能力的提高,这一点对我今后的工作有很大的帮助。另外在这次做系统的过程中,我认为软件最难的是设计,设计有了,实现是很简单的,所以也为我指明了以后学习的方向。 
系统中难免有不尽人意之处,如系统的安全性能有待提高,系统的通用性也需要完善。由于本人的知识水平和能力有限,本文的疏漏和不当之处在所难免,敬请指正。我也会努力尽量完善所有编写的功能模块,完美的完成这个毕业设计,为我的大学划上一个圆满的句号。
参考文献
[1]良葛格.Java学习笔记(第一版)[M].北京:清华大学出版社,2006.
[2]孙卫琴.精通Hibernate:Java面向持久化技术详解[M].北京:电子工业出版社,2007.
[3]卢晓庆.基于Web的交通旅游订票系统的设计与实现[D].大连:大连理工大学,2004.
[4]萨师煊,王珊.数据库系统概论[M].北京:高等教育出版社,2003.
[5]张水平.数据库应用技术[M].西安:西北工业大学出版社,2005.
[6]杨小平.Visual C++项目案例导航[M].北京:科学出版社,2005.
[7]李闽溟,吴继刚.数据库系统开发实例[M].北京:人民邮电出版社,2002.
[8]郑阿奇,丁有和.Visual C++教程[M].北京:机械工业出版社,2004.
[9]蔡学镛.Java程序员的心声第2版[M].北京:电子工业出版社,2004.
[10]姜志强.Java语言程序设计[M].北京:电子工业出版社,2007.
[11]田苗苗.基于面向对象技术开发[J].面向对象研究,2004,(02):134-139.
[12]Bruce Eckel.《Thinking in Java 4》[M].American:Prentice Hall PTR,2007.
[13]A.Parasan.《marketing research》[M].American:Houghton Company,2007.
[14]Michacl Hammer.《Reengineering the Corporation》[M].American:Harper
Business,1993.
附 录
1、ADO层JDBC建立数据库的连接:
package com.nite.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
/**
* @author :刘贤龙
* @功能:JDBC
* @时间:2015.3
*/
public class Dao {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
public Dao(){
}
static{
try {
Class.forName(com.mysql.jdbc.Driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

/**
* 数据库连接
* @throws SQLException
*/
@Test
public void getConnect() throws SQLException{
String url = jdbc:mysql://localhost:3306/ticketsystem;
String user = root;
String password = liu;
con = DriverManager.getConnection(url, user, password);
if(con!=null){
System.out.println(连接数据库成功);
}else{
System.out.println(连接数据库失败);
}
}
/**
* 执行sql
* return:影响行数
* @throws SQLException
*/

public int doSql(String sql,Object parames[]) throws SQLException{
getConnect();
ps = con.prepareStatement(sql);

for(int i=0;i ps.setObject(i+1, parames[i]);
}
ps.execute();
int i = ps.getUpdateCount();
return i;
}

/**
* 获得结果集
* @throws SQLException
* return:结果集
*/
public ResultSet getRs() throws SQLException{
rs = ps.getResultSet();
return rs;
}

/**
* 关闭资源
* @throws SQLException
*/
public void getClose() throws SQLException{
if(rs!=null)
rs.close();
if(ps!=null)
ps.close();
if(con!=null)
con.close();
}
}
2、SERVICE(业务逻辑层)层处理业务逻辑:
package com.nite.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.nite.dao.Dao;
public class Function {
private Dao dao = new Dao();
/**
* 查询航班
* @param sql
* @param parames
* @return
* @throws SQLException
*/
public List> selectFlight(String sql, Object[] parames) throws SQLException {
List> list = new ArrayList>();
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
rs.last();
int i = rs.getRow();
System.out.println(结果集中有+i+条记录);
if(i>0){
rs.beforeFirst();
while(rs.next()){
String id = rs.getString(id);
String airfirm = rs.getString(2);
String start = rs.getString(3);
String end = rs.getString(4);
String leaveTime = rs.getString(5);
String arriveTime = rs.getString(6);
Map map = new HashMap();
map.put(id, id);
map.put(airfirm, airfirm);
map.put(start, start);
map.put(end, end);
map.put(leaveTime, leaveTime);
map.put(arriveTime, arriveTime);
list.add(map);
}
}else{
list=null;
}
dao.getClose();
return list;
}

/**
* 查询机票
* @throws SQLException
*/
public List> selectTicket(String sql, Object[] parames) throws SQLException {
List> list = new ArrayList>();
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
rs.last();
int i = rs.getRow();
System.out.println(结果集中有+i+条记录);
if(i>0){
rs.beforeFirst();
while(rs.next()){
String id = rs.getString(id);
String start = rs.getString(2);
String end = rs.getString(3);
String leaveTime = rs.getString(4);
String arriveTime = rs.getString(5);
String time = rs.getString(6);
String seatLevel = rs.getString(7);
String fare = rs.getString(8);
String discount = rs.getString(9);
String flight_id = rs.getString(10);
String ticketNum = rs.getString(11);

Map map = new HashMap();
map.put(id, id);
map.put(start, start);
map.put(end, end);
map.put(leaveTime, leaveTime);
map.put(arriveTime, arriveTime);
map.put(time, time);
map.put(seatLevel, seatLevel);
map.put(fare, fare);
map.put(discount, discount);
map.put(flight_id, flight_id);
map.put(ticketNum, ticketNum);
list.add(map);
}
}else{
list=null;
}
dao.getClose();
return list;
}

/**
* 添加
* @param sql
* @param parames
* @return
* @throws SQLException
*/
public int insert(String sql, Object[] parames) throws SQLException {
int i = dao.doSql(sql, parames);
System.out.println(影响行数+i);
dao.getClose();
return i;
}
/**
* 删除
* @param sql
* @param parames
* @throws SQLException
*/
public int delete(String sql, Object[] parames) throws SQLException {
int i = dao.doSql(sql, parames);
System.out.println(影响行数:+i);
dao.getClose();
return i;
}

/**
* 修改
* @param sql
* @param parames
* @throws SQLException
*/
public int update(String sql, Object[] parames) throws SQLException {
int i = dao.doSql(sql, parames);
System.out.println(影响行数:+i);
dao.getClose();
return i;
}

/**
* 登录
* @throws SQLException
*/
public List> login(String sql,Object parames[]) throws SQLException{
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
List> list = new ArrayList>();
rs.last();
int i = rs.getRow();
if(i>0){
rs.beforeFirst();
while(rs.next()){
String name = rs.getString(name);
String password = rs.getString(password);
String level = rs.getString(level);
Map map = new HashMap();
map.put(name, name);
map.put(password, password);
map.put(level, level);
list.add(map);
}
}else{
list=null;
}
return list;
}

/**
* 用户查询
* @param sql
* @param parames
* @throws SQLException
*/
public List> selectUser(String sql, Object[] parames) throws SQLException {
List> list = new ArrayList>();
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
rs.last();
int i = rs.getRow();
if(i>0){
rs.beforeFirst();
while(rs.next()){
String id = rs.getString(id);
String name = rs.getString(2);
String password = rs.getString(password);
String sex = rs.getString(4);
String tel = rs.getString(5);
String idcard = rs.getString(6);
String level = rs.getString(level);
Map map = new HashMap();
map.put(id, id);
map.put(name, name);
map.put(password, password);
map.put(sex, sex);
map.put(tel, tel);
map.put(idcard, idcard);
map.put(level, level);
list.add(map);
}
}else{
list=null;
}
return list;
}
/**
* 查询订单
* @throws SQLException
*/
public List> selectMyTicket(String sql, Object[] parames) throws SQLException {
List> list = new ArrayList>();
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
rs.last();
int i = rs.getRow();
System.out.println(结果集中有+i+条记录);
if(i>0){
rs.beforeFirst();
while(rs.next()){
String id = rs.getString(id);
String start = rs.getString(2);
String end = rs.getString(3);
String leaveTime = rs.getString(4);
String arriveTime = rs.getString(5);
String time = rs.getString(6);
String seatLevel = rs.getString(7);
String fare = rs.getString(8);
String name = rs.getString(9);
String idcard = rs.getString(10);
String flight_id = rs.getString(11);
Map map = new HashMap();
map.put(id, id);
map.put(start, start);
map.put(end, end);
map.put(leaveTime, leaveTime);
map.put(arriveTime, arriveTime);
map.put(time, time);
map.put(seatLevel, seatLevel);
map.put(fare, fare);
map.put(name, name);
map.put(idcard, idcard);
map.put(flight_id, flight_id);
list.add(map);
}
}else{
list=null;
}
return list;
}

/**
* 分页
*/
public int getJiPiao(HttpServletRequest request,
HttpServletResponse response) throws SQLException {
int allRecord= 0;//总记录数
int allPage;//总页数
int startRecord;//每页第一条记录
int nowPage = 1;
//获得总记录数
String sql = select * from ticketinfo;
Object parames[] = new Object[]{};
dao.doSql(sql, parames);
ResultSet rs = dao.getRs();
rs.last();
allRecord = rs.getRow(); //i是所有记录数
//获得总显示页数
if(allRecord%5==0){
allPage = allRecord/5;
}else{
allPage = allRecord/5+1;
}
//获得当前页
String newPage = request.getParameter(nowPage);
//获得要跳转到的页数
String bb = request.getParameter(bb);
if(bb!=null&&bb!=&&bb.matches(\d+)){
if(bb!=null&&bb!=&&(Integer.parseInt(bb)>0)&&(Integer.parseInt(bb)<=allPage)){
newPage = bb;
}
if(bb!=null&&bb!=&&(Integer.parseInt(bb)>allPage)){
newPage = String.valueOf(allPage);
}
}
//获得当前记录数
if(newPage==null || newPage==){
startRecord = 0;
}else{
nowPage = Integer.parseInt(newPage);
startRecord = (nowPage-1)*5;
}
//计算分页显示页码的开始页和结束页
int start = 0;
int end = 0;
if(allPage<5){
start = 1;
end = allPage;
}else{
start = nowPage-2;
end = nowPage+2;
if(start<1){
start = 1;
end = 5;
}
if(end>allPage){
start = allPage-4;
end = allPage;
}
}
request.setAttribute(allPage, allPage);
request.setAttribute(nowPage, nowPage);
request.setAttribute(start, start);
request.setAttribute(end, end);
return startRecord;
}
}
3、机票预订生成订单:
/**
* 订票------生产订单
*/
public void dingPiao(HttpServletRequest request,
HttpServletResponse response) throws SQLException, IOException {
String id = request.getParameter(id);
Object parames[] = new Object[]{id};
String sql = select * from ticketinfo where id=?;
List> list = fun.selectTicket(sql, parames);
Map map = list.get(0);
int ticketNum = Integer.parseInt(map.get(ticketNum));

Object parames1[] = new Object[]{ticketNum-1,id};
String sql1 = update ticketinfo set ticketNum=? where id=?;
int i = fun.update(sql1, parames1);
if(i!=-1){
//1.随机产生订单号---id
long id1 = (long)(Math.random()*100000000);
//2,获得票的信息
String start1 = map.get(start);
String end1 = map.get(end);
String leaveTime1 = map.get(leaveTime);
String arriveTime1 = map.get(arriveTime);
String time1 = map.get(time);
String seatLevel1 = map.get(seatLevel);
String fare1 = map.get(fare);
String flight_id1 = map.get(flight_id);

//2,获得订票人的名字和身份证
HttpSession session = request.getSession();
String name1 = (String) session.getAttribute(username);

String sql2 = select * from userinfo where name=?;
Object parames2[] = new Object[]{name1};
List> list2 = fun.selectUser(sql2, parames2);
Map map2 = (Map) list2.get(0);
String idcard1 = map2.get(idcard);
//3,生成订单
String sql3 = insert into user_ticketinfo value(?,?,?,?,?,?,?,?,?,?,?);
Object parames3[] = new Object[]{id1,start1,end1,leaveTime1,arriveTime1,
time1,seatLevel1,fare1,name1,idcard1,flight_id1};
fun.insert(sql3, parames3);
response.sendRedirect(user1Servlet?caozuo=ticketSelect);
}else{
System.out.println(订票失败~~~);
response.sendRedirect(user1Servlet?caozuo=ticketSelect);
}
}
3、我的订单管理用户退票:
/**
* 退票
*/
public void tuiPiao(HttpServletRequest request, HttpServletResponse response)
throws SQLException, ServletException, IOException {
//获得要退票的订单号
String id = request.getParameter(id);
Object parames[] = new Object[]{id};

//1,根据订单号找到(起飞时间,到达时间,起飞地,目的地,日期,航班号)
String sql1 = select * from user_ticketinfo where id=? ;
List> list = fun.selectMyTicket(sql1, parames);
Map map = list.get(0);
String start = map.get(start);
String end = map.get(end);
String leaveTime = map.get(leaveTime);
String arriveTime = map.get(arriveTime);
String time = map.get(time);
String flight_id = map.get(flight_id);
//2,根据订单号从我的订单中删除机票记录
String sql = delete from user_ticketinfo where id=?;
fun.delete(sql, parames);

//3,根据(起飞时间,到达时间,起飞地,目的地,日期,航班号)这些信息,
//找到机票的id和ticketNum
String sql2 = select * from ticketinfo where start=? and end=? and leaveTime=?
and arriveTime=? and time=? and flight_id=?;
Object parames2[] = new Object[]{start,end,leaveTime,arriveTime,time,flight_id};
List> list2 = fun.selectTicket(sql2, parames2);
Map map2 = list2.get(0);
String id3 = map2.get(id);
int ticketNum3 = Integer.parseInt(map2.get(ticketNum));

//3,退票结束,票数加1
String sql3 = update ticketinfo set ticketNum=? where id=?;
Object parames3[] = new Object[]{ticketNum3+1,id3};
int i1 = fun.update(sql3, parames3);
if(i1!=-1){
System.out.println(退票成功,票数加1);
request.getRequestDispatcher(user1Servlet?caozuo=myTicketSelect).forward(request, response);
}else{
System.out.println(失败~~~);
request.getRequestDispatcher(user1Servlet?caozuo=myTicketSelect).forward(request, response);
}
}
致 谢
经过这几个月来的不断努力,我终于顺利完成了此次毕业设计,这其中不仅在于自己的个人努力制作,而且还在于指导老师和同学的帮助以及那些曾经教过我课的老师。如果没有他们的培养和帮助不可能成就现在的我。我的指导老师是林老师,在这次毕业设计中,林老师不仅指导我怎样去做自己的毕业设计,而且也给我介绍了许多关于自己毕业设计方面的书籍以供参考,使自己在做毕业设计的同时,也学到了很多有用的知识。老师平时的工作很繁忙,每天都要代课还要抽出时间来指导我们应届毕业生的毕业设计,我是由衷的感谢我的老师。
在这里我还要感谢我的同学,其中我最要感谢是我的大学室友。在这四年的相处中,让我感到寝室就想家一样温馨,我们不仅学习在一起生活也在一起,我们相处真的很开心。就是这样一个好的环境才使我能够更加好的学习、成长。在毕业设计中我们遇到问题也是一起讨论,他们给了我很多建议和帮助使得自己的设计更加好。最后,我再次衷心感谢在这次设计中给予我帮助的老师和同学。
获取项目源文件,联系Q:1225467431,可指导其它毕设,课设,string>,string>,string>,string>,>,>,>,>,string>,>,string>,>,>,>,>;i++){
,string>

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

猜你喜欢

转载自blog.csdn.net/weixin_44938415/article/details/104235299