Java项目开发(航空管理系统)

主要内容:

1.此项目所需的准备事项

1.1 数据库的准备

通过试题给出的sql语句,按照试题要求在navicat中新建一个名为session1的数据库,如何新建查询贴入建表语句,并且运行这些语句,待建表语句运行完成,就完成了本次实训中的数据库准备。
建好的表如下图所示:
在这里插入图片描述
图1-1 创建好的表格

1.2 项目创建

进入eclipse后,点击File,new一个Dynamic Web Project项目,根据题目的要求,将此项目命名为SunshineAirlines
在这里插入图片描述

图1-2 创建好的项目

1.2.1 JAR包

1.2.1.1 JAR包的概念

Jar全称为Java Archive File,是Java的一种文档格式,类似于我们平时所见的.rar .zip后缀的文件形式,Jar包中提供了一系列可执行方法的入口。

1.2.1.2 如何导入JAR包

将试题中给的JAR包复制粘贴到,项目下的WebContent下的WEB-INF下的lib文件夹中。如图。
在这里插入图片描述

图1-3 JAR包的存放位置

1.3 Eclipse中tomcat服务器的运行配置

如图,先找到Project选项,然后点击Properties,通过搜索找到Targeted Runtimes,然后new一个tomcat,找到合适的版本后点击finish。然后如图3-4在server里面找到这个类似超链接的,点击之后,选择合适的版本,再点击finish,

在这里插入图片描述

图1-4 tomcat配置过程
在这里插入图片描述

图1-5 tomcat配置过程
在这里插入图片描述

图1-6 tomcat配置过程
在这里插入图片描述

图1-7 tomcat配置过程
在这里插入图片描述

图1-8 tomcat配置过程

1.4此项目的五层结构的作用

1.4.1Servlet层

servlet是浏览器与服务器交互的工具,通过servlet层可以拿到浏览器提供的数据信息,然后传递给服务器进行一系列的处理。

1.4.2Service层

Service层又叫业务层,把一系列的操作联系起来,相当于是用于将几种操作封装起来。

1.4.3 Dao层

Dao层又叫数据访问层,对应比较基础的操作,具体用于处理对某个表或者某个实体的增删改查。

1.4.4 Pojo层

Pojo层类似于JavaBean,用于把数据封装起来,把业务的应用逻辑和显示逻辑分离开,降低了开发的复杂程度。

1.4.4 Mysqlhelper层

Mysqlhelper其实就是项目运行的准备工作,例如,通过Mysqlhelper层来建立与数据库的连接,以及定义方便后续操作过程中,数据的增删改查的方法。

1.4.5 helper层的实现

1.4.5.1 通过JDBC与数据库建立连接

首先我们需要准备与数据库建立连接的参数,第一个是与数据库建立连接的url,用于注册驱动的driver,userName和password分别表示,数据库所属连接的名称以及其连接密码。
在这里插入图片描述

图1-9 初始化工作
在static{}静态代码块中注册驱动,这样能保证驱动顺利的注册完成,而不会因为程序的某些异常导致驱动注册失败,因为静态代码块是在类的创建时就被运行的。注册完成之后通过DriverManager和之前准备好的连接参数来获取与目标数据库的连接。
在这里插入图片描述

图 1-10 注册驱动,建立连接

1.4.5.2对数据库中的元素进行增删改处理
1.4.5.2.1 三个初始化的对象
1.4.5.2.1.1 Connection

Connection与数据库建立连接,Connection对象也叫做数据库连接对象,负责与数据库建立连接,这是对数据库中元素进行增删改查操作的最基本的一步。

1.4.5.2.1.2 PreparedStatement

PreparedStatement,是SQL语句的预编译对象,主要用来存放预编译的sql语句,PreparedStatement对象允许数据库预编译SQL语句,这样在项目运行的过程中可以节约时间,并且提高了代码的可读性。

1.4.5.2.1.3 ResultSet

ResultSet主要用于接受数据库返回的数据集。
在这里插入图片描述

图1-11 初始化

1.4.5.3查询操作

在这里插入图片描述

图1-12 用于查询操作的整体代码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

图1-13 用于确保函数最基本结构的对象
由于本次项目中,HashMap的“键-值”的形式比较符合数据库中的列名与值得对应关系,所以利用HashMap来存储这些从数据库中获取到得数据,由于List是一个接口,无法被实例化,所以通过ArrayList得方法,将这些获取到的数据,用类似数组存储得方法,将其一个一个得存放在ArrayList这个集合中。
由于存放得是HashMap<String,Object>类型的数据,所以ArrayList在初始化时也要带上这个类型。
用于查询的函数是List< HashMap<String,Object>>类型的函数,所以要给函数一个对应类型的返回值,才能确保最基础的函数结构不报错。
在这里插入图片描述

图1-14 数据库的连接以及sql语句的预处理
通过getConnection()函数与数据库建立连接, 然后通过Connection对象内置的prepareStatement内置方法将sql语句存放在pstmt这个预处理对象中。
在这里插入图片描述

图1-15 数据的归类
通过遍历para(数据库传回来的参数),如果是String类型的参数就将其在预处理对象中以String类型的形式存储在第i+1个 ? 号下;如果是Integer类型的参数就将其在预处理对象中以Int类型存储在第i+1个 ? 号下。(这里由于i是从0开始计数,而?则是从1开始计数,所以所放的?号的位置就是i+1这个?号)
在这里插入图片描述

图1-16 数据的处理以及存储
首先通过preparedStatement对象中的内置方法executeQuery来处理pstmt中存放的sql语句处理完的结果放到结果集ResultSet中,然后通过ResultSet的内置方法getMetaDate来获取到关于ResultSet对象的列的类型和属性信息;然后新建一个ArrayList来存储所要放的数据,columnNum就是rs中列的个数,也就是下面进行数据处理时循环的次数。其中getColumnLabel返回的是列标题,这样能有效的防止sql语句中给列取别名从而导致获取不到数据的错误;
从rsmd中获取列标题,从rs中获取数据,这样就形成了“键-值”的形式并存储在一个HashMap中,再通过list.add()来将这个“键-值”形式的数据存放在ArrayList集合中。

1.4.5.4增删改操作在这里插入图片描述

图1-17 增删改操作整体代码
对于建立连接和对预处理对象的处理和查询操作一样,只不过这里运用了executeUpdate()这个pstmt的内置方法,来更新数据库中的内容。

1.4.5.5剩余资源的释放

在这里插入图片描述

图1-18 剩余资源释放函数代码
资源的释放遵循先开后关的原则即:
ResultSet->PreparedStatement->Connection 依次关闭
2.用户登录接口
2.1 Servlet层实现
在servlet层新建一个UserLoginServlet,并将WebServlet中的值改为/login(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图2-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图2-2 Servlet层的功能实现代码
图2-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email和password两个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图2-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果密码错误或者邮箱不存在需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述

图2-3 序列化显示

2.2 Service层实现

在这里插入图片描述

图2-4 判断邮箱是否存在
判断邮箱是否存在这个方法的主要的作用就是:方便在登录失败时判断错误的原因。
在这里插入图片描述

图2-5 实现登录的方法
先初始化一个result结果集,其中默认是登录失败(fail),若登录成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集,然后再根据题目所要求的在loginInfo(即题目要求打印的数据的集合)中添加题目所需要的数据。
由于题目要求输出出错的原因,所以结合图2-4的判断邮箱是否存在的方法的返回值,就可以判断错误原因到底是密码错误还是邮箱不存在。

2.3 Dao层实现

在这里插入图片描述

图2-6 判断邮箱是否存在
在users表中寻找是否存在service层传输过来的email数据。
在这里插入图片描述

图2-7 判断邮箱和密码是否匹配
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现判断service层传入的数据(email和password)是否在users表中存在。
由于返回的是HashMap类型的数据而且ArrayList默认将第一个数据放在自己下标为0的空间内,所以只需要取list的第一个节点中的“键值对”类型(即所需数据)。

3.用户查询接口

3.1 Servlet层实现

在servlet层新建一个GetUserListServlet,并将WebServlet中的值改为/login(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图3-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图3-2 Servlet层的功能实现代码
图3-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是roleId、startPage和pageSize三个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图3-3所示)。由于API中的测试数据中request,以及服务端发送给客户端的response的内容中没有出现中文字符,所以不需要进行转码处理。
在这里插入图片描述

图3-3 序列化显示

3.2 Service层实现

在这里插入图片描述

图3-4 实现查询用户的方法
先初始化一个result结果集,其中默认是查询成功(success),即使失败只用显示空白数据,由于根据题目要求可以知道,RoleId=0时是默认值,执行不带RoleId的查询,如果RoleId不为0则进行带RoleId的查询,然后通过向Dao层传输数据并拿到相应的返回集。

3.3 Dao层实现

3.3.1不带RoleId的查询
在这里插入图片描述

图3-5 通过模糊查询获取用户列表
在users表中寻找是否存在service层传输过来的email数据。
在这里插入图片描述

图3-6 通过模糊查询获取用户列表
3.3.2带RoleId的查询
在这里插入图片描述

图3-7 通过模糊查询获取用户列表
在这里插入图片描述

图3-8 通过模糊查询获取用户列表
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现判断service层传入的数据(三种查询方式)是否有存在与users表中。
由于返回的是HashMap类型的数据而且ArrayList默认将第一个数据放在自己下标为0的空间内,所以只需要取list的第一个节点中的“键值对”类型(即所需数据)。

4.用户增加接口

4.1 Servlet层实现

在servlet层新建一个AddUserServlet,并将WebServlet中的值改为/addUser(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图4-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图4-2 Servlet层的功能实现代码
图4-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email、firstName、lastName、dateOfBirth、photo、phone、address、gender、password和roleId十个数据),其中对于password的处理,根据题目要求,首先取到@这个字符前面的字符串(split(“@”)[0]),如果字符串的长度高于6位则只取前六位(substring(0,6)),如果低于6位就直接全部取用,由于数据过多,如果全都在方法体中定义的话代码利用率太低,所以通过一个HashMap来存放比较适合,然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图4-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果要添加的邮箱已经存在了需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述

图4-3 序列化显示

4.2 Service层实现

在这里插入图片描述

图4-4 查询邮箱是否在users表中存在
在这里插入图片描述

图4-5 service层用户增加的方法
先初始化一个result结果集,其中默认是增加失败(fail),若users表中没有当前要添加的邮箱就表示添加成功,则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集。
由于题目要求输出出错的原因,所以结合图3-4的判断邮箱是否存在的方法的返回值,就可以判断错误原因到底是密码错误还是邮箱不存在。

4.3 Dao层实现

在这里插入图片描述

图4-6 判断邮箱是否已经存在
在users表中寻找是否存在service层传输过来的email数据。
在这里插入图片描述

图4-7 用户增加方法
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现将service层传入的数据HashMap类型(即email、firstName、lastName、dateOfBirth、photo、phone、address、gender、password和roleId这十个数据)增加到users表中。

5.获取用户信息(根据用户id)接口

5.1 Servlet层实现

在servlet层新建一个GetUserInfoServlet,并将WebServlet中的值改为/getUserInfo(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图5-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图5-2 Servlet层的功能实现代码
图5-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是userId这个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图5-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果用户信息不存在需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述

图5-3 序列化显示

5.2 Service层实现在这里插入图片描述

图5-4 查询用户信息方法
先初始化一个result结果集,其中默认是登录失败(fail),若登录成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集。由于题目要求输出出错的原因,所以通过判断查询users表中数据返回的数据值是否为空,就可以判断错误原因是用户信息不存在。

5.3 Dao层实现

在这里插入图片描述

图5-5 通过Id查询
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现判断service层传入的数据(userId)是否在users表中存在。由于返回的是HashMap类型的数据而且ArrayList默认将第一个数据放在自己下标为0的空间内,所以只需要取list的第一个节点中的“键值对”类型(即所需数据),如果未查询到(即查询结果为空,list中没有值)则直接返回null。

6.用户更新接口

6.1 Servlet层实现

在servlet层新建一个UpdateUserServlet,并将WebServlet中的值改为/updateUser(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图6-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图6-2 Servlet层的功能实现代码
图6-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据和用户增加接口类似(这里获取的是email、firstName、lastName、dateOfBirth、photo、phone、address、gender、userId和roleId十个数据),然后再由servlet层通过HashMap的方式交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图6-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果更新用户接口失败则需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述

图6-3 序列化显示

6.2 Service层实现

在这里插入图片描述

图6-4 判断邮箱是否已经存在
在这里插入图片描述

图6-5 判断用户信息是否存在
判断邮箱是否存在这个方法的主要的作用就是:如果要更新的用户都不存在,就不可能完成更新。
在这里插入图片描述

图6-6 实现用户信息更新的方法
先初始化一个result结果集,其中默认是更新失败(fail),若更新成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集,然后再根据题目所要求的在loginInfo(即题目要求打印的数据的集合)中添加题目所需要的数据。由于题目要求输出出错的原因,首先通过图6-5判断用户信息是否存在,如果不存在就直接输出fail,否则程序继续运行,然后程序结合图6-4的判断邮箱是否存在的方法的返回值来判断,如果返回值为true则表示要更改的邮箱已经存在,更改失败,否则就表示能顺利完成更改。

6.3 Dao层实现

在这里插入图片描述

图6-6 判断要更新的邮箱是否重复
在users表中寻找是否存在service层传输过来的email数据。
在这里插入图片描述

图6-7 用户更新方法
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现通过service层传入的数据(email、firstName、lastName、dateOfBirth、photo、phone、address、gender、userId和roleId),将更新完成后的数据填入。

7.城市查询接口

7.1 Servlet层实现

在servlet层新建一个GetCityNamesServlet,并将WebServlet中的值改为/getCityNames(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图7-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图7-2 Servlet层的功能实现代码
图7-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email和password两个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图7-3所示)。由于API中的测试数据中request的内容和服务器给流量发送的response中没有均出现中文字符,所以不需要进行转码处理。
在这里插入图片描述

图7-3 序列化显示

7.2 Service层实现

在这里插入图片描述

图7-4 实现城市查询的方法
先初始化一个result结果集,其中默认是查询成功(success),然后通过向Dao层传输数据并拿到相应的返回集。

7.3 Dao层实现

在这里插入图片描述

图7-5 判断邮箱和密码是否匹配
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现直接获取到city这张表中的所有内容。

8.航班状态查询(根据出发日期)

8.1 Servlet层实现

在servlet层新建一个GetFlightStatusServlet,并将WebServlet中的值改为/getFlightStatus(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图8-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图8-2 Servlet层的功能实现代码
图8-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是startDate、endDate、startPage和pageSize四个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图9-3所示)。由于API中的测试数据中request的内容和服务器给浏览器返回的response数据中均没有出现中文字符,所以不需要进行转码处理。
在这里插入图片描述

图8-3 序列化显示

8.2 Service层实现

在这里插入图片描述

图8-4 实现登录的方法
先初始化一个result结果集,其中默认是登录失败(fail),若登录成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集,然后再根据题目所要求的获取page和list两种类型的数据,添加到结果集中。

8.3 Dao层实现

在这里插入图片描述

图8-5 获取航班总数
通过日期的限制,来统计符合当前所需日期的航班总数。
在这里插入图片描述

图8-6 航班状态查询
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现根据题目要求,通过表的连接,来获取到题目中所需要的数据,这里题目要求的是通过时间获取,后面的(startPage-1)*pageSize表示的当前页面所在的页号,pageSize表示的是当前页面所能装的数据,通过limit就能获得每页所需要展示的数据。

9.航班计划查询(管理员)接口

9.1 Servlet层实现

在servlet层新建一个GetScheduleServlet,并将WebServlet中的值改为/login(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图9-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图9-2 Servlet层的功能实现代码
图9-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是startDate、endDate、from City、toCity四个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图9-3所示)。由于API中的测试数据中request的内容和服务器发送给浏览器的response中均没有出现中文字符,所以不需要进行转码处理。
在这里插入图片描述

图9-3 序列化显示

9.2 Service层实现在这里插入图片描述

图9-4 实现航班计划查询的方法
先初始化一个result结果集,其中默认是登录失败(fail),若登录成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集。

9.3 Dao层实现

在这里插入图片描述

图9-5实现航班计划查询的方法
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现通过多表的连接,来达到获取到所有题目中所要得到的数据的作用。

10.机票售出详情(根据航班计划id)接口

10.1 Servlet层实现

在servlet层新建一个GetScheduleDetailServlet,并将WebServlet中的值改为/getScheduleDetail(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图10-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图10-2 Servlet层的功能实现代码
图10-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email和password两个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图10-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果航班计划不存在需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述
在这里插入图片描述

图10-3 序列化显示

10.2 Service层实现

在这里插入图片描述

图10-4 查询机票售出详情
先初始化一个result结果集,其中默认是查询失败(fail),在查询该航班信息是否存在之后,若查询成功则将Flag的值转换为success,然后通过向Dao层传输数据并拿到相应的返回集,其中题目要求显示的是包含ScheduleInfo、TicketInfo、SelectedSeat和SeatLayout都包含在数据中,所以通过一个共同的map来存储这些数据,然后再将这个map设置为结果集的date。

10.3 Dao层实现

在users表中寻找是否存在service层传输过来的email数据。
在这里插入图片描述

图10-5 ScheduleInfo一栏的信息获取
在这里插入图片描述

图10-6 TicketInfo一栏的信息获取
在这里插入图片描述

图10-7 SelectedSeat一栏的信息获取
在这里插入图片描述

图10-8 SeatLayout一栏的信息获取
Dao层的实现最主要的点是SQL语句,通过如图10-5到10-8所示的sql语句,可以实现获取到题目中所需要的四个数据。

11.航班计划状态修改接改

11.1 Servlet层实现

在servlet层新建一个UpdateScheduleServlet,并将WebServlet中的值改为/updateSchedule(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图11-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图11-2 Servlet层的功能实现代码
图11-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email和password两个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(序列化效果如图11-3所示)。由于API中的测试数据中request的内容中没有出现中文字符,所以不需要进行转码处理。但是response响应中,如果航班计划不存在需要用中文来提示,所以需要对发送的response进行数据的转码(转为UTF-8格式),防止浏览器不能识别出中文字符而导致的不能正常显示。
在这里插入图片描述

图11-3 序列化显示

11.2 Service层实现在这里插入图片描述

图11-4 实现航班状态更新的方法
先初始化一个result结果集,其中默认是更新失败(fail)。首先判断航班计划是否存在,即scheduleInfo是否为空,若为空则直接设置错误信息然后将其返回,若不为空则通过向Dao层传输数据并在数据库中更新数据,若更新返回的值大于0则表示更新成功, 若更新成功,则将Flag的值转换为success。

11.3 Dao层实现

在这里插入图片描述

图11-5 判断航班信息是否存在
方便后续打印更新失败的原因(航班计划不存在)。
在这里插入图片描述

图11-6 航班状态更新
Dao层的实现最主要的点是SQL语句,通过如图所示的sql语句,可以实现将service层传入的数据(将当前scheduleId下航班的status更改为service传入的status)更新到schedule表中。

12. 航班计划查询(员工)接口

12.1 Servlet层实现

在servlet层新建一个GetSearchFlightServlet,并将WebServlet中的值改为/getSearchFlight(如下图),以保证使用API文档中的URL时不会出错
在这里插入图片描述

图12-1 WebServlet值的更改
然后在doGet方法体中,完成利用servlet层得到浏览器中的数据,并把这些数据向service层传输,以此保证service层值的需求。
在这里插入图片描述

图12-2 Servlet层的功能实现代码
图12-2中,实现的是客户端通过request.getParameter()方法从request中拿到浏览器中传到客户端的数据(这里获取的是email和password两个数据),然后再由servlet层交由service层处理,得到处理的集合后,然后通过toJSONString()这个静态的方法来将结果集序列化(Non-stop和1-stop的序列化效果分别如图12-3和12-4所示)。由于API中的测试数据中request的内容和服务器发送给浏览器的response中均没有出现中文字符,所以不需要进行转码处理。
在这里插入图片描述
图12-3 Non-Stop序列化显示

在这里插入图片描述
图12-4 1-Stop序列化显示

12.2 Service层实现

在这里插入图片描述

图12-5 对不同的飞行类型进行分类处理
通过flightType这个数据可以知道飞行的类型,如果为Non-stop即无中转类型的就只计算一趟航班,如果为1-stop即有中转的类型就计算两趟航班(第一趟航班和转乘的航班),如果为All则表示1-stop类型和Non-stop类型都显示,只需要将两种类型的数据都获取到,再放到一个ArrayList中进行数据的传输即可。
在这里插入图片描述

图12-6 获取Non-stop的方法
Service层为业务层,在这一层,我们要解决的主要问题就是余票的计算,以及将余票的数量和飞行的类型都增加到结果集中。首先通过表中sql语句的计算得到已卖的机票数量,然后再通过cabinTypeId的不同(即不同舱位)的总票数进行获取,最后用总票数减去已售的票数,就得到了我们要求的余票的数量,由于这里的飞行类型是Non-stop即无中转类型,所以只需要计算一趟航班的余票数,由于在Non-stop处理时,sql语句中已经有了AllCount(航班的总数),DelayCount(延误了的航班数),以及NotDelay(未延误的航班数),所以这里不需要对这三个数据进行处理,直接通过sql语句来完成显示就行了。
在这里插入图片描述

图12-7 获取1-stop的方法
与Non-stop类型类似,只不过1-stop类型变成了计算两趟航班的余票数,但是,由于sql语句中并未处理AllCount(航班的总数),DelayCount(延误了的航班数),以及NotDelay(未延误的航班数)这三个参数,所以需要在业务层进行处理,首先通过dao层的findDelayInfoList方法来获取到这三个参数,然后再通过不同的FlightNumber(即)将两趟航班区分开来设置者三个参数的值,以此来满足题目所需的所有数据。

12.3 Dao层实现

在这里插入图片描述

图12-8 获取Non-stop
如service层所说,在Non-stop中需要进行三个参数(AllCount,DelayCount,NotDelay)的计算,
其中TIMESEAMPDIFF(unit,datetime_expr1,datetime_expr2)是将datetime_expr1和datetime_expr2中的时间进行减法运算,unit表示单位,这里这样处理
(TIMESTAMPDIFF(MINUTE,DATE_ADD(Schedule.Date,INTERVAL Route.FlightTime MINUTE),FlightStatus.ActualArrivalTime) >15)的原因是为了给飞机的降落和起飞预留一个时间,防止因为飞机降落和起飞的时间的影响而导致飞机显示延误,同时也需要对题目所要求的其他数据进行显示。在处理PreArrivalTime(预计到达时间)时,由于表中没有直接给出这个数据,所以需要综合起飞时间和飞行时间来进行计算。其中用于计算的DATE_ADD(date,INTERVAL expr unit)方法时,是将date位置和expr位置的两个时间进行相加计算,其中unit是单位。
在这里插入图片描述

图12-9 获取1-stop
1-stop的处理逻辑和Non-stop的相同,只不过需要显示两趟航班的数据,用S1和S2进行区分。
在这里插入图片描述

图12-10 获取service层所说的三个参数的方法
这里三个参数的处理方法和Non-stop中处理这三个参数的方法相同。三个参数(AllCount,DelayCount,NotDelay)的计算,
其中TIMESEAMPDIFF(unit,datetime_expr1,datetime_expr2)是将datetime_expr1和datetime_expr2中的时间进行减法运算,unit表示单位,这里这样处理
(TIMESTAMPDIFF(MINUTE,DATE_ADD(Schedule.Date,INTERVAL Route.FlightTime MINUTE),FlightStatus.ActualArrivalTime) >15)的原因是为了给飞机的降落和起飞预留一个时间,防止因为飞机降落和起飞的时间的影响而导致飞机显示延误。

参考文章

[1] IT__learning.JDBC 详解
[2] ZaynFox. JavaWeb三层架构的理解/三层架构的优缺点/三层架构与MVC的区别
[3] Chary Liu. POJO和JavaBean的区别
[4]第三女神程忆难.Tomcat服务器下载、安装、配置环境变量教程(超详细)

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
# OOP(机试) 本程序总结文章:http://blog.qiji.tech/?p=10344 - - - ## 程序基本要求 一、项目名称: Air Infomation Programming 基于控制台的航班信息程序,简称AIP 二、具体要求如下: (1)显示航班信息程序主菜单,如图-1所示,包括: * 1)列出所有航班 * 2)按起飞时间查询 * 3)按目的地查询 * 4)删除航班 * 5)更新航班 * 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 * 航班信息实体类(AirInfo) * 航班编号(id) * 航班号(flight_number) * 目的地(destination) * 起飞日期(flight_date) * 航班信息管理类AirInfoManager类 * 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 1. 创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 1. 创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询的方法、按目的地查询的方法、删除航班的方法、更新航班的方法、退出程序的方法。 2. 创建TestAirInfo类,启动和运行程序。 3. 航班的信息用ArrayList(或数组)保存。 4. 要求代码规范,命名正确。 - - -

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小白W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值