基于java最短路径算法公交查询系统的设计与实现

基于J2EE的公交查询系统的设计与实现

1 引言

1.1 选题背景

20多年来,我国经济得到了持续、快速、稳定、健康地发展。经济的快速增长,带动了汽车工业的蓬勃发展,并使交通状况显著改善。据统计,中国公路通车总里程已达130余万公里,其中高速公路约1.5万公里。居民收入普遍提高,到2000年年底,人均GDP已超过800美元,沿海地区已达2000-3000美元。按国际发展惯例,当人均GDP超出1000美元,汽车消费市场就将进入快速增长期。我国城市人口约有2亿,略低于美国人口。东部沿海地区大部分居民已经具备了汽车消费实力。据中国消费者协会2000年对20个大城市调查显示,有32%的消费准备在未来5年内购买家用轿车,其中30.6%的无车消费者已经有驾驶执照。随着个人信贷制度的启动和日渐完善,家庭轿车的快速增长势头必将开掘出巨大的中国汽车市场。

城市经济发展,城市规模越来越大,相应的城市公交系统也越来越庞大。许多新建小区大量出现,公交线路也日渐增多,给人们的出行带来了极大便利,但是由于城市规模的不断发展,给人们选择出行乘车线路造成了一定的困难。即使一个在城市生活多年的人,给他任意两个地点,要他说出这两个地点之间的乘车方案,他往往也是很难说出来的。但是如果给他一张交通地图之后,他可以很快地找出图上的任意两点之间的乘车方案,所找出的方案即使不是最优的,也是一条可供参考的备选方案。但是这样的查询效率是相当低的,所以需要提供一个高效的查询系统,才是问题更本所在。而基于J2EE的公交查询系统,就是利用B/S结构开发出来的查询系统,它通过利用数据结构当中的最短路径算法,可以查出任意两个地点之间最短的乘车方案。它不仅可以用于公交公司管理系统中,也可以单独作为公交管理系统的一个模块存在,并可以制作成公交信息系统查询网,放置于城市的主要场所。这样不仅可以体现出一个城市的智能公交系统的水平,更显示出城市的数字化,信息化水平。

目前,我国众多大城市普遍存在交通拥挤,延误人们平时上班时间。甚至影响了城市旅游业经济的可持续发展。所以为了切实的改善公交车内拥挤状况,适当增加发车次数以缩短乘客等车时间,但是能够准确为人们提供最短的乘车线路才是得到解决的最好办法,这样大大的缩短了人们的乘车时间。

本项目研究的基于J2EE的公交查询系统,让人们通过互联网很快的查出该城市任意两站点之间的最短乘车路线。

1.2 项目的主要研究工作

本系统是从城市交通现状出发,根据人们的出行规律,设计了一个完整的基于J2EE体系的公交车查询系统。该系统可以根据商厦名称,公交车号,日常站点和站点之间为查询条件分别进行查询,解决了市民出行乘坐公交车时经常遇到的困难。

本系统模型构架分为下面四层结构,如下。

(1)J2EE应用程序组件

J2EE应用程序是由组件构成的。J2EE组件是具有独立功能的软件单元,它们通过相关的类和文件组装成J2EE应用程序,并与其他组件交互。本系统包括如下组件:

①应用客户端程序及J2EE服务器。

②Java Servlet和JavaServer Pages(JSP)Web组件及JavaBean。

(2)WEB层组件

J2EE web层组件包含JSP页面或Servlet。按照J2EE规范,还包含某些JavaBean对象来处理用户输入,并把输入发送给运行在业务逻辑层上的组件来进行处理。

(3)客户层组件

基于WEB方式的静态HTML页面或是Applet客户端的小应用程序。

(4)编写算法

编写最短路径数据结构算法,解决完成站点之间最短乘车路径查询。

1.3 开发环境

开发工具:Eclipse 3.2 + MyEclipse 5.0GA。

运行环境:JSDK 1.5.0_04虚拟机。

服务器:Tomcat 5.5。

数据库:MicroSoft SQL Server 2000。

操作系统:Windows XP。

所需内存:512 M。

2 理论基础

2.1 概念

2.1.1 J2EE的概念

J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2标准平台。J2EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。

 

2.1.2 JSP的概念

JSP程序是一个服务端页面脚本程序,可以在这个脚本中直接编写客户端浏览器需要显示的HTML文档内容,当然也可以依照JSP规范将Java程序代码嵌入脚本。JSP脚本规范提供了若干内部对象来简化JSP程序和浏览器之间的输入输出处理。由于JSP程序是从HTML页面添加Java动态处理代码而来,因此,JSP程序又称为动态JSP页面。

 

2.1.3 Java Bean的概念

JavaBean是一种JAVA语言写成的可重用组件,用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。这个对J2EE业务逻辑层处理具有相当重要的部分。

 

2.1.4 Java Servlet的概念

Java Servlet使用的是一种请求/响应机制,也就是说通过特定的Java程序设计技术,由该Servlet动态产生的响应向某一特定的请求做出响应。Servlet所能应用的请求/响应场合很多,但常用的还是在Web应用程序中用于产生超文本传输协议响应(HTTP)。据此,Servlet可能取代其他类型的HTTP请求/响应机制,譬如通用网关接口(CGI)脚本。

 

2.1.5 Session对象

Session对象是类javax.servlet.Httpsession的一个对象,是用来保存每个用户信息(以会话的形式直接保存在WEB服务器端),以便跟踪每个用户的操作状态。

2.2 J2EE的结构

J2EE结构具有一个很大的特点,就是与平台无关性的J2EE结构。所开发出来的程序可以在任何操作系统下运行。这样就使得J2EE程序的编写变得十分简单,因为业务逻辑被封装成可以复用的组件,并且J2EE服务器以容器的形式为所有的组件类型提供后台服务,所以你可以集中精力解决手头的业务逻辑。

2.3 J2EE的容器类型

J2EE容器类型可以分为WEB容器和EJB容器。

EJB容器管理所有J2EE应用程序中企业级Bean的执行,Enterprise Bean和它们的容器运行在J2EE服务器上。

WEB容器也是管理所有J2EE应用程序中JSP和Servlet组件执行,同理WEB组件和它们的容器也是运行在J2EE服务器上的。

2.4 J2EE的体系与模式

2.4.1 J2EE的体系(分布式计算)

1表示层:Web Page| HTML | HTTP

2控制层:JSP | Servlets

3逻辑层:JavaBean

4数据层:Database

5JDBC

 

2.4.2 J2EE的模式

MVC(Model – View – Controller)

页面bean是一个模型(model),而JSP是一个视图(view), Servlet是一个控制器(controller)。

3 公交查询系统功能分析

3.1 公交查询系统的需求

3.1.1 系统需求描述

公交查询系统的需求最主要是通过站点与车次之间的关系,利用数据结构算法构造一个公交查询的网络图,然后通过最短路径算法,为用户准确地提供两站点之间的最短乘车路线。

其次从业务实现上来说,需要在业务逻辑层上编写最短路径算法,同时还要编写当用户查询请求时必须的数据库连接,然后根据用户提供查询站点信息,建立公交查询网络图,最终调用算法获取两站点之间的最短乘车线路。当查询完成后,如果用户需要进行其它的操作,则释放该连接资源。

最后,为了让公交线路信息得到及时的更新或是信息删除,需要做出相应的操作和处理。

 

3.1.2 系统数据流图

图3.1 系统数据流图

3.2 公交查询系统的功能

1)通过选择商厦名称进行相应的信息查询。

2)通过选择车号进行相应的信息查询。

3)通过选择站点进行相应的信息查询。

4)通过选择任意两个站点,完成两站点之间最短乘车路线查询。

5)完成车次和站点添加功能。

6)完成车次和站点更新功能。

7)完成车次和站点删除功能。

8)用户登录验证功能。

9)用户注册信息功能。

10)用户注销功能。

11)删除用户信息功能。

12)添加用户留言,删除用户留言,查看用户留言。

13)管理员登录验证功能。

14)管理员注销功能。

3.3 公交查询系统的数据库设计

3.3.1 E-R图

图3.2 用户实体及属性

图3.3 管理员实体及属性

图3.4 留言板实体及属性

图3.5 车次与站点之间关系

 

3.3.2 数据库表设计

(1)用户表userInfo(如表3.1)

表3.1 用户表信息

列名

中文名称

数据类型

长度

允许空

username

用户名

varchar

50

Not null

userpassword

用户密码

varchar

50

Not null

userage

用户年龄

int

4

null

address

地址

varchar

50

null

email

邮箱

varchar

50

null

question

问题

varchar

50

null

answer

答案

varchar

50

null

idnum

证件号

varchar

50

null

 

 4 公交查询系统的设计与实现

4.1 创建管理员登录的Servlet

(1)打开Eclipse开工具,新建一个ConfirmServlet类(如图4.1)

 

图4.1 创建管理员登录ConfirmServlet类

(2)在已创建好ConfirmServlet类中,生成一个具有私有属性的login()方法,该方法就是对管理员请求过来的信息进行验证。该方法首先利用HttpServletRequest,HttpServletResponse进行对象初始化。利用HttpServletRequest的getParameter()来获取管理员页面传来的两个参数,一个是adminname,另一个是adminpassword。然后调用自定义连接数据库类进行数据库对象实例化,最后在进行验证的时候,获取管理页面验证码,如果验证码无误就对管理员账号和管理员密码验证,最终将正确的管理员账号和管理员密码放入session会话变量中。

管理员登录界面(如图4.2)

 

图4.2 管理员登录界面

相应代码:

 4.2 创建用户登录的Servlet

(1)打开Eclipse开工具,新建一个UserLoginServlet类(如图4.3)

 

图4.3 创建用户登录UserLoginServlet类

(2)与管理员中的ConfirmServlet类一样,也生成一个具有私有属性的login()方法,该方法也同样的继承了HttpServletRequest和HttpServletResponse类,通过这个类来获取用户界面请求过来的参数,当通过用户信息验证后,同样也将用户账号和用户的密码放入session会话变量中,一旦用户最终关闭浏览器,session会话变量也随即销毁。

用户登录界面(如图4.4)

 

图4.4 用户登录界面

4.3 公交系统查询模块

4.3.1商厦查询

商厦查询是为用户提供按具体的名称(如:欧尚)查询,并显示到这个地点所有公交车车次的相关信息(如:车号,站点名称,票价,车子的档次和这个商厦的名称等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。当用户传来的车次提交信息,首先商厦查询页面先编译成服务器上的Servlet,然后根据需要调用业务逻辑层中相应类。

商厦信息查询结果(如图4.5)

 

图4.5 商厦查询

相应代码:

 调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryPlace()这个方法。

 

4.3.2 车次信息查询

车次信息查询是为用户提供一个按公交车的车号(如:1路)查询,并显示该公交车的相关信息(如:公交车的起点站、终点站、票价和车子的档次等信息)。而查询功能的实现是由系统的业务逻辑层中的QueryData类来实现的。

车次信息查询结果(如图4.6)

 

图4.6 车次信息查询

相应的代码:

 调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用statisticsByBusInfo()这个方法。

 

4.3.3 站点信息查询

站点信息查询是为用户提供按公交车某一个站点查询到该站点需要乘坐公交车的车号。该查询功能的实现也是由系统的业务逻辑层中的QueryData类来实现的。

站点信息查询结果(如图4.7)

 

图4.7 站点信息查询

相应代码:

 调用此方法时,在页面中先引用包com.busSystem.util,再创建QueryData类的对象,通过对象调用queryStInfo()这个方法。

 

4.3.4 两个站点间的信息查询

任意两个站点间的查询页面(如图4.8)

 

图4.8 最短路径查询页面

任意两个站点间查询结果页面(如图4.9)

 

图4.9 任意两个站点间查询结果

(1)广度优先遍历概念

给定一个起点,广度优先遍历首先访问起点与起点的邻接点,然后分别考察每一个邻接点并访问它们的邻接点。遍历使用一个队列存放顶点的未被访问邻接点,每当从队列中删除一个顶点,就将这个顶点的未访问邻接点插入队列,遍历的顺序即为顶点插入这个队列的顺序。

(2)图的建立过程

图4.10 构造图的流程

①初始化车次列表listBusNum,它是用来存储数据库中现有的车号,为建立图的先做好准备。

②在建立图的过程需要连接数据库,所以必须将需要用到连接数据库的类全部对象初始化,如:connection,statement,resultset这三个关键类。

③首先建立图的时候,需要添加图的各个节点。而这里的节点就是数据库站点信息(stinfo)表中的站点ID号。

④查询站点信息表,将所有的站点从数据库中取出来,调用添加站点graph.addVertex()的方法,将图的各个节点建立好。

⑤通过车次列表,循环的取出各个车号,查询车号与站点ID关系表(busst),找到该车号对应的所有站点。

⑥创建向量vector,该向量用来存放一个车号对应多个站的ID号。

⑦初始化站点列表listStID,它用来存放已经保存好站点ID的向量,这样子就建立起一个关系,就是站点列表中保存了每一个车号所对应车号它自身的所有站点ID。

⑧将站点列表和初始化好了的图一起传入createEdgeByDateBase中,建立双向图。最后图的建立过程结束。

(3)最短路径算法原理图(如图4.11)

图4.11 最短路径算法原理图

(4)最短路径算法原理描述:

①将顶点A入队,同时将顶点A设置为已经被访问。

②判断队列是否为空,如果不是则顶点A出队,同时判断顶点A的邻接顶点B、E、D是否已经被访问,如果没有,则将顶点B、E、D入队,并分别设置为已经被访问,接着将入队顶点B、E、D分别指向他们的前置顶点A,并分别判断顶点B、E、D是否为目的顶点I,不是则进入下一步3。

③判断队列是否为空,如果不是则顶点B出队,同时判断顶点B的邻接顶点E是否已经被访问。判断可知顶点B的邻接顶点E已经被访问,则顶点E不用指向他的前置顶点B。接着进入下一步4。

④判断队列是否为空,如果不是则顶点E出队,同时判断顶点E的邻接顶点F、H是否已经被访问,如果没有,则将顶点F、H入队,并分别设置为已经被访问,接着将入队顶点F、H分别指向他们的前置顶点E,并分别判断顶点F、H是否为目的顶点I,不是则进入下一步5。

⑤判断队列是否为空,如果不是则顶点D出队,同时判断顶点D的邻接顶点G是否已经被访问,如果没有,则将顶点G入队,并分别设置为已经被访问,接着将入队顶点G分别指向他们的前置顶点D,并分别判断顶点G是否为目的顶点I,不是则进入下一步6。

⑥判断队列是否为空,同时判断入队的顶点F是否是目的顶点I。如果不是则顶点F出队,同时判断顶点F的邻接顶点C是否已经被访问,如果没有,则将顶点C入队,并分别设置为已经被访问,接着将入队顶点C分别指向他们的前置顶点F。并分别判断顶点C是否为目的顶点I,不是则进入下一步7。

⑦判断队列是否为空,如果不是则顶点H出队,同时判断顶点H的邻接顶点I是否已经被访问,如果没有,则将顶点I入队,并分别设置为已经被访问,接着将入队顶点I指向他们的前置顶点H,并分别判断顶点I是否为目的顶点I,可以判断顶点I就是目的顶点,将顶点I入堆栈,进入下一步8。

⑧判断I的前置顶点是否为空,如果不是则将前置顶点入堆栈,循环判断前置顶点的前置顶点,如果不为空,则入堆栈,直到循环判断到空为止。这样堆栈中的所有顶点出堆栈,出堆栈的顶点A->E->H->I就是查询出来最短路径。

最短路径算法相应的程序(利用广度优先遍历算法查找最短路径):

 4.4 公交系统添加模块

4.4.1 添加车次

添加车次功能主要是增加一个车次详细信息,其中包括:车次号,起点站,终点站,票价,汽车档次,票价类型。需要注意,在添加起点站和终点站的时候,数据都是从站点库获得然后添加到起点站和终点站中去。因为添加车次它只涉及到车次的详细信息,如果要想添加站点,则需要在添加站点功能页面中进行相应的操作。

添加车次页面(如图4.12)

 

图4.12 添加车次

 

4.4.2 添加站点

添加站点功能:(1)在添加站点的文本框中输入要添加的站点名称。(2)提供了一个站点重名的查找功能,该功能可以对你输入添加的站点名称进行名称查重,通过查询站点编码表,显示这个站点是否已经存在。如果不存在,则将此新增站点名称插入到站点编码表中,如果存在,则不需将此站点名称插入到站点编码表中。(3)通过下拉选择框选择新增站点所对应的车次号。(4)如果查询站点总数在文本框中显示为“0”,则需要将起点站和终点站同新增的站点一起插入车次和站点的关系表中。如果查询站点总数在文本框中显示不为“0”,则只需将新增的站点插入车次和站点关系表中即可。

添加站点页面(如图4.13)

 

图4.13 添加站点

4.5 公交系统删除模块

4.5.1 删除车次

删除车次功能:分页列出车次信息表中所有的车次信息,选择操作中的删除,就可以将对应的车次信息删除,但是在删除车次信息的时候需要先删除车次与站点关系表中所有对应该车次的信息。如果不先删除就会出现违反数据库完整性。

删除车次页面(如图4.14)

 

图4.14 删除车次

 

4.5.2 删除站点

删除站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击删除操作就可以删除该站点。需要注意:因为在车次中从起点站到终点站计算,其所有的站点是一个有次序的排列,所以删除一个站点,则它的下个站点次序号依次减少一位。

删除站点页面(如图4.15)

 

图4.15 删除站点

4.6 公交系统更新模块

更新站点功能:通过车次的下拉选择框选择车次,进行查询列出该车次的所有站点信息,然后点击更新操作就可以更新该站点。需要注意的是,在更新起点站(或是终点站)的时候,也要同时更新车次表中的起点站(或是终点站)。

更新站点页面(如图4.16)

 

图4.16 更新站点

4.7 公交系统留言板模块

4.7.1 发表留言

发表留言是公交查询系统的一个新增的功能,主要是收集用户的留言信息,可以根据用户提供的留言信息或是提出的建议,对系统进行修改和完善。使得系统更加趋于成熟完整。注册的用户登录到发表留言的板块当中,系统会自动提取用户名称,用户只需添上自己的邮箱,发表的主题和内容即可。

发表留言页面(如图4.17)

 

图4.17 发表留言

 

4.7.2 查看留言

查看留言很简单为用户提供了一个查看自己的发表的留言,而其它用户是不能看见的。因为系统是一个管理方面的功能较多,所以不会将用户留言信息提供其它的用户查看。

查看留言(如图4.18)

 

图4.18 查看留言

 

4.7.3 删除留言

删除留言功能只有管理员才能查看并操作,在删除的显示页面中会将所有的用户留言信息及用户名显示出来。这样也为管理员提供查看哪些用户是非法的发布留言内容。针对这种情况删除该用户。

删除留言页面(如图4.19)

 

图4.19 删除留言

5 系统测试与分析

设计完成系统的各个模块之后,需要对整个系统进行全面的测试。目的是让整个系统能够快速、稳定、安全的运行。在进行系统测试过程中出现如下几种情况:

(1)对页面提交的过来的数据进行空指针异常捕捉。凡是遇到无效或是空值数据都需要用程序进行操作处理。

(2)及时的捕捉数据库连接和关闭异常。以免数据库连接资源及时释放,提供下一次请求调用。

(3)对数据库查询操作异常进行捕捉。

(4)对数据库查询操作异常进行捕捉。

(5)对数据库更新操作异常进行捕捉。

(6)对数据库添加操作异常进行捕捉。

(7)对数据库删除操作异常进行捕捉。

(8)权限控制,通过session会话变量对管理员和用户的权限进行控制。

(9)页面的编码方式不同,需要的对字符串进行转码操作。

结    论

通过对J2EE知识的认真学习,理论联系实践,最终完成了基于J2EE公交查询系统的设计与实现。经过多次测试,运行效果良好。对于该系统,加强后台管理,就可以单独作为大型公交管理系统的一个模块,也可以将它的功能更加完善后放置于城市公共场所,为人们提供快捷、方便的查询。这样不仅体现出一个城市的公交查询系统的发展水平,更可以显示出城市的数字化和信息化水平。公交查询系统的开发利用也必将促使城市公交更好的服务于人们。

在完成这次毕业设计的过程中,自己查阅了大量的书籍,并且通过互联网也查阅了许多相关资料,开发出具有B/S结构模式的公交系统,从而使我的编程能力和自学能力得到了很大程度的提高,对网站设计有了更深地了解。

但是,由于整个系统完全都是由个人设计的,有关J2EE许多知识都要靠自己去摸索,加之自己水平有限,未能完全地理解J2EE的强大功能,因此,系统还存在着许多不足之处。

参考文献

[1] 刘晓华.J2EE企业级应用开发[M].北京:飞思科技产品研发中心,2003。

[2] 赛奎春,陈威.JSP工程应用与项目实践[M].北京:清华大学出版社,2004。

[3] Cay S.Horstmann,Gary Cornell.java核心技术卷2高级特性[M].北京:机械工业出版社,2003。

[4] Frank M.Carrano,Walter Savitch.数据结构与抽象:Java语言版[M].北京:清华大学出版社,2005。

[5] 孙卫琴,李洪成.Tomcat与Java Web开发技术详解[M].北京:电子工业出版社,2004。

[6] 高铁杠,顾巧论.智能公交查询系统[J].新技术应用,2005,(7):31-32。

[7] 王宏.MSSQL 数据库管理[M].北京:人民邮电出版社,2001

 

 

 


 

10

· 南菜园到鼓楼大街

· 南菜园到长陵

· 南菜园到永定门东街

· 南菜园到华联商城大兴店

· 南菜园到丰台路口西

· 航天桥东到九龙山

· 航天桥东到史各庄(S216)

· 航天桥东到岔路口

· 航天桥东到土桥村

· 航天桥东到北京华侨城北站

 

 

11路:

 

 

 

 

 

 

11路上行所有公交车站

 (共20站)

· 1大北窑东站

· 2八王坟南站

· 3北京东站北站

· 4九龙山站

· 5珠江帝景站

· 6大郊亭桥西站

· 7大郊亭桥东站

· 8东石门站

· 9唐家村站

· 10小海子站

· 11四根旗杆站

· 12方家村站

· 13朝阳半壁店站

· 14观音堂北站

· 15观音堂站

· 16古塔公园站

· 17王四营站

· 18王四营桥东站

· 19孛罗营村北站

· 20孛罗营站

 

 

 

 

12路

· 1五间楼站

· 2横七条站

· 3刘家窑桥东站

· 4方庄南口站

· 5芳星园站

· 6八里河站

· 7左安门外站

· 8左安门内站

· 9龙潭湖游泳池站

· 10龙潭公园站

· 11龙潭湖站

· 12光明楼站

· 13夕照寺站

· 14夕照寺街北口站

· 15广渠门内站

· 16安化楼站

· 17培新街站

· 18南花市大街站

· 19羊市口站

· 20花市路口北站

· 21崇文门东站

· 22北花市大街站

· 23小市口站

· 24东花市大街站

· 25白桥大街站

· 26夕照寺街北口站

· 27夕照寺站

· 28光明楼站

· 29龙潭湖站

· 30龙潭公园站

 

 

想要源码和完整文档的请联系QQ:1329331182


你可能感兴趣的:(java,算法)