基於java最短路徑演算法公交查詢系統的設計與實現
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
(5)JDBC
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 |
|
郵箱 |
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。