侯金彪
(德州學(xué)院計算機(jī)與信息學(xué)院,山東 德州253023)
當(dāng)今世界是數(shù)據(jù)信息隨處可見的時代,時至今日信息依靠于現(xiàn)代先進(jìn)科技的計算機(jī)網(wǎng)絡(luò)信息技術(shù)早就被看作是人們工作、學(xué)習(xí)中非常重要的一部分?,F(xiàn)在在互聯(lián)網(wǎng)上進(jìn)行信息的管理和分配已經(jīng)成為極其普遍的事情,利用互聯(lián)網(wǎng)技術(shù)來構(gòu)建一個外賣系統(tǒng)也是有一定必要的,通過對傳統(tǒng)訂餐方式的改變,能夠使得用戶就餐得到較大的便利;通過這個系統(tǒng),可以對菜品、訂單、配送的各項情況進(jìn)行電腦化和系統(tǒng)化的管理,能夠持續(xù)不斷地加快系統(tǒng)管理的進(jìn)程,也使得飯菜食物管理所需要的各項數(shù)據(jù)信息能便捷迅速地完成記錄、查詢、刪除和更新等操作,并對相應(yīng)關(guān)鍵數(shù)據(jù)也能夠方便快速地得到統(tǒng)計[1]。本文采用比較流行的Jsp技術(shù),實現(xiàn)了一個功能強大的外賣系統(tǒng)。
Jsp具備面向服務(wù)器的特點,正因為如此它支持在在各類瀏覽器軟件上運行。當(dāng)客戶端發(fā)送數(shù)據(jù)請求的時候,該數(shù)據(jù)將通過Jsp服務(wù)器將數(shù)據(jù)傳輸?shù)娇蛻舳耍襃sp可以利用JavaBean或Servlet等不同的組件做出一些適當(dāng)正確的反饋,這個對管理系統(tǒng)設(shè)計的反饋過程可能有對表中內(nèi)容資料的查詢、刪除、更新等多個不一樣的操縱工作,再將所得到的結(jié)果返還回到前臺頁面,并加以顯示,該過程實現(xiàn)了服務(wù)器客戶端的B/S模式。[2]
Jsp第一次接到對其傳遞出來的申請請求時候,與之對應(yīng)的Jsp文件就會借助Jsp引擎轉(zhuǎn)變替換成Servlet。Jsp文件可能會由Jsp引擎轉(zhuǎn)化成Java文件的過程中產(chǎn)生語法錯誤,若語法有誤,轉(zhuǎn)換將會失敗。錯誤信息也會被服務(wù)器和客戶端搜集起來。如果轉(zhuǎn)化完成沒有錯誤的話,這個Java文件將會被Jsp引擎編譯成相應(yīng)的class文件,并且逐漸生產(chǎn)成為Servlet實例,然后借助Servlet實例中的Jsp Service把HTML文件精準(zhǔn)確切地送回到與之相對應(yīng)的客戶端。
MySQL是一個關(guān)系數(shù)據(jù)庫控制系統(tǒng),適用于中小型企業(yè)開發(fā)。MySQL會把數(shù)據(jù)信息存儲在一個個不同名字的表中,而不是將所有數(shù)據(jù)信息都堆放在一個大型的倉庫內(nèi),表與表之間可以獨立也可以相互關(guān)聯(lián),這樣就加快了程序運行速率并且提高了管理工作的靈便性。一般習(xí)慣用的標(biāo)準(zhǔn)化SQL語言就是數(shù)據(jù)庫能夠采用的語言[3]。
MySQL憑借它所占用的體積小、運行速率快、各方面性能優(yōu)越等多個特點優(yōu)點被很多人使用[4]。其基本組成部分流程圖如圖1所示。

圖1 MySQL基本組成部分流程圖
Struts2是一個關(guān)于MVC設(shè)計樣式的Web框架,站在MVC的角度上來看,包含了這幾個部分,分別是模型層、視圖層、控制層。簡單來說大致為:模型層的任務(wù)是承擔(dān)完成事務(wù)功能,包括兩個組成成分:業(yè)務(wù)數(shù)據(jù)跟業(yè)務(wù)操作邏輯。 目標(biāo)對象類、DAO、Service全部存在在模型層中。視圖層的主要任務(wù)就是承擔(dān)顯示頁面跟使用者互相交流并且獲取使用者的資料。存在視圖中的類是沒有涵蓋業(yè)務(wù)邏輯和控制邏輯的Jsp??刂破魇墙覯和視圖層V之間的紐帶,目的是操作管理運行過程[5]。
Struts 2是Struts的更新一代Web開發(fā)框架。Struts 2基于MVC模式在操作申請轉(zhuǎn)發(fā)方面非常方便,通常而言是依據(jù)攔截器的機(jī)制來解決使用者的申請,這樣的設(shè)計也讓業(yè)務(wù)邏輯控制器可以跟Servlet API徹底分開,這樣框架愈來愈方便使用。當(dāng)Jsp經(jīng)由表單遞交數(shù)據(jù)的過程中,Struts 2架包中的過濾器就會攔住[6]。
Internet計算機(jī)技術(shù)逐漸發(fā)展使得外賣系統(tǒng)軟件也得到了更好更快地發(fā)展,外賣市場的潛力巨大,由此也可以確立了以下幾點需求:菜品類別管理、菜品管理、訂單管理、菜品評價、在線下單、菜品瀏覽。
(1)系統(tǒng)需求
依據(jù)JavaEE技術(shù)把B/S系統(tǒng)作為基礎(chǔ),計算機(jī)程序跟數(shù)據(jù)一起存于后臺中。全部系統(tǒng)管理操作都是在瀏覽器的基礎(chǔ)上進(jìn)行的,下載、安裝、運行、維修保護(hù)、更新都非常便利。
(2)功能需求
根據(jù)目前的調(diào)研看,軟件應(yīng)該實現(xiàn)菜品類別管理、菜品管理、訂單管理、菜品評價、在線下單、菜品瀏覽等功能。
(3)性能需求
為了保證系統(tǒng)能夠長期高效、安全穩(wěn)定地運行,系統(tǒng)對菜品和數(shù)據(jù)的管理以及程序開發(fā)語言的編寫很重要,所以這個系統(tǒng)就采用Struts2框架來進(jìn)行開發(fā)。性能上總體要求如下:
a.需要網(wǎng)站提供一定的并發(fā)量,保證用戶可以正常訪問。
b.網(wǎng)站能夠自發(fā)處理一些異常的問題,比如路徑訪問出錯就會出現(xiàn)友好的404錯誤界面等。
c.由于這個軟件設(shè)計到了很多表格與信息的載入,能夠以較快的形式完成數(shù)據(jù)顯示與執(zhí)行。
(4)運行需求
系統(tǒng)要求較低,商場主流配置即可。
(5)其他需求
這個系統(tǒng)可維護(hù)性比較好,安全性比較高,可靠性也比較強。界面很容易讓用戶來操作,同時在后臺方面也要對用戶訂單的管理有好處。并且在開發(fā)時間,經(jīng)費上要嚴(yán)格控制,以最大的限度,合理地利用有限資源,來完成所需要的功能,滿足外賣系統(tǒng)和用戶們的需求。
本系統(tǒng)的設(shè)計及開發(fā)利用Jsp來進(jìn)行前臺展示,采用MVC框架(利用Struts2作為框架)來實現(xiàn)對網(wǎng)站的整體設(shè)計,來達(dá)到對業(yè)務(wù)功能的實現(xiàn),在對系統(tǒng)角色進(jìn)行細(xì)分后對不同的菜品信息進(jìn)行展示和管理等。
數(shù)據(jù)庫設(shè)計是極為重要的,在這個流程中充分考慮到所有表結(jié)構(gòu)之間的數(shù)據(jù)關(guān)聯(lián),同時還應(yīng)該琢磨數(shù)據(jù)表之間的對應(yīng)聯(lián)系。下圖2即為數(shù)據(jù)庫中表的關(guān)系圖。

圖2 數(shù)據(jù)庫關(guān)系圖
從外賣系統(tǒng)的設(shè)計角度看,對應(yīng)的功能列表下面需要有對應(yīng)的數(shù)據(jù)庫表,依據(jù)上節(jié)數(shù)據(jù)庫關(guān)系圖能夠知道,由于網(wǎng)站設(shè)計的數(shù)據(jù)表有些多,因此接下來羅列一些關(guān)鍵數(shù)據(jù)表的設(shè)計,如下面表1-表9所示:

表1 admin表

表2 dd表

表3 fl表

表4 member表

表5 news表

表6 pl表

表7 prep表

表8 sale表

表9 system表
3.4.1 系統(tǒng)結(jié)構(gòu)設(shè)計 MVC就是按照職責(zé)不同將程序劃分為3個組成部分,可以改善程序結(jié)構(gòu),便于日后維護(hù)和擴(kuò)展,其中,Model層實現(xiàn)系統(tǒng)中的業(yè)務(wù)邏輯,用JavaBean(實體類)來實現(xiàn);View層一般被用來和系統(tǒng)使用者進(jìn)行交流互動,借助Jsp達(dá)到目的;Controller層是Model與View交流的紐帶。
1)M-Model 模型
Model的職責(zé)為承擔(dān)業(yè)務(wù)邏輯工作。
2)V-View 視圖 V View的職責(zé)為承擔(dān)展現(xiàn)頁面與使用者交流互動(獲取使用者資料)。
3)C-Controller 控制器
在Struts2的架構(gòu)中,Struts2的框架部分主要負(fù)責(zé)MVC設(shè)計中的主要用來實現(xiàn)整個系統(tǒng)的流程跳轉(zhuǎn)過程。圖3即為系統(tǒng)執(zhí)行流程圖。

圖3 系統(tǒng)執(zhí)行流程圖
3.4.2 系統(tǒng)功能模塊設(shè)計
外賣系統(tǒng)在開發(fā)中應(yīng)該通過軟件管理功能來分解軟件功能模塊,而且開展完成相應(yīng)模塊。系統(tǒng)功能模塊圖如下圖4所示。

圖4 系統(tǒng)功能模塊圖
在諸多Web中應(yīng)該有導(dǎo)入數(shù)據(jù)源的模塊。一般而言,存在兩種數(shù)據(jù)庫的連接情況,一種是通過于Java類寫明數(shù)據(jù)庫驅(qū)動與數(shù)據(jù)庫連接名等信息開展適當(dāng)?shù)倪B接與釋放操作,另一種是通過數(shù)據(jù)庫連接池,這種方式的優(yōu)點在于可以合理的管控數(shù)據(jù)庫的連接。設(shè)計結(jié)合以上兩種的特點,將連接和釋放的操作通過一個統(tǒng)一的類來管理,這個數(shù)據(jù)庫連接類即為Conn.java,在該類中將數(shù)據(jù)庫連接和關(guān)閉寫成靜態(tài)方法,方便適時的關(guān)閉和打開。
通過下面的代碼段來聲明變量,并在該類中的方法內(nèi)做說明。
// 定義MySQL數(shù)據(jù)庫的連接地址
private String url = "jdbc:mysql://localhost:3306/takeaway";
// MySQL數(shù)據(jù)庫的連接用戶名
private String user = "root";
// MySQL數(shù)據(jù)庫的連接密碼 private String password = "123";
借助這幾個變量來實現(xiàn)與之相符的數(shù)據(jù)庫連接,得到手段的代碼。
public Connection getCon() throws Exception {
Class.forName(jdbcName);
Connection con = DriverManager.getConnection(url, user, password);
return con;
}
得到連接之后,也應(yīng)該為數(shù)據(jù)庫展開及時地停止關(guān)掉工作,停止關(guān)掉的工作能夠參考下面方式:
public void closeCon(Connection con) throws Exception {
if(con!=null) {
con.close();
}
}
在外賣系統(tǒng)中,普通用戶需要登錄系統(tǒng)之后才能夠下單,管理員對系統(tǒng)進(jìn)行數(shù)據(jù)維護(hù)和處理也需要進(jìn)行登錄操作,因此在平臺的登錄系統(tǒng)需要提供對應(yīng)的接口。
由于系統(tǒng)采用了Struts2的架構(gòu),因此,系統(tǒng)的所有請求都會經(jīng)過一個稱為struts.xml的文件,通過該文件可以知道最后的請求地址,即根據(jù)login的請求做一定的分發(fā)操作,具體的代碼部分如下所示。
從上面的程序片段中可以看出,系統(tǒng)識別到了login對象會通過Action中名為LoginAction的類,該類中做進(jìn)一步的處理,比如用戶在登錄的過程中會觸發(fā)下面的函數(shù)入口。
public String login() throws Exception{
}
在該函數(shù)的入口中,可以看到首先通過下面的方式來判斷用戶名和密碼是否完整,并且是否符合匹配要求。
if(StringUtil.isEmpty(user.getUserName()) || StringUtil.isEmpty(user.getPassword())) {
error = "用戶名或密碼為空!";
return ERROR;
}
if(StringUtil.isEmpty(imageCode)) {
error = "驗證碼為空!";
return ERROR;
}
if(!imageCode.equals(session.getAttribute("sRand"))){
error = "驗證碼錯誤!";
return ERROR;
}
倘若數(shù)據(jù)符合系統(tǒng)條件之后,經(jīng)過數(shù)據(jù)庫練級,接下來繼續(xù)進(jìn)行,如果數(shù)據(jù)庫連接成功之后,到了最終檢索申請傳達(dá)到數(shù)據(jù)庫中實現(xiàn)檢索,辨別有沒有該使用者,同時密碼有沒有和這個使用者的相對應(yīng),倘若完全對應(yīng)就會調(diào)轉(zhuǎn)到Main,即進(jìn)入到軟件的服務(wù)器界面,關(guān)鍵代碼在下面展現(xiàn)。
con=dbUtil.getCon();
User currentUser=userDao.login(con, user);
if(currentUser!=null){
session.setAttribute("currentUser", currentUser);
return "main";
}else{
request.setAttribute("error", "用戶名或密碼錯誤!");
return "login";
}
使用者單擊系統(tǒng)運行后所實現(xiàn)界面的注冊鏈接便跳轉(zhuǎn)到注冊界面,在注冊界面上填寫上必填的使用者名字、密碼、確認(rèn)密碼、聯(lián)系人住處的使用者資料。當(dāng)使用者上交時,先由網(wǎng)頁腳本辨別有沒有合乎上交的基礎(chǔ)條件,合乎條件則給后臺上交表單數(shù)據(jù)。倘若輸入不對,就會彈出不對警告框,讓顧客再次輸入。
購物車模塊的實現(xiàn)方式主要有三種,一種是將商品信息加入數(shù)據(jù)庫,這樣用戶重新登錄系統(tǒng)后可以查看到用戶的購物車中的商品;另一種是將顧客購物車內(nèi)容放到session中存放在服務(wù)器端,就能夠達(dá)到多個頁面的資源共享。
在設(shè)計的模塊中,菜品類別的管理也是一重要的模塊,因為在該模塊中,管理員可以設(shè)置菜品品類,有利于后面對菜品信息管理;菜品信息更改或刪除完成后,也能夠用另一個頁面進(jìn)行添加菜品。
以菜品類別為例,重點介紹關(guān)于列表數(shù)據(jù)展示的模塊和實現(xiàn)過程,菜品類別信息展開查詢時會一開始借助Struts2的配置文件,并且依據(jù)配置文件完成一個跳轉(zhuǎn),一些主要代碼參考如下。
利用該配置的過程可以實現(xiàn)一次數(shù)據(jù)的跳轉(zhuǎn),即點擊了菜品類別后會進(jìn)入到GoodsTypeAction該類中。
運行代碼的時候,一開始應(yīng)該對數(shù)據(jù)庫構(gòu)成連接,在完成數(shù)據(jù)庫連接后再對數(shù)據(jù)展開處理,重點代碼如下所示。
Connection con = null;
PageBean pageBean = new PageBean(Integer.parseInt(page),Integer.parseInt(rows));
try {
if(goodsType==null){
goodsType = new GoodsType();
}
goodsType.setTypeName(s_typeName);
con = dbUtil.getCon();
JSONObject result = new JSONObject();
JSONArray jsonArray = JsonUtil.formatRsToJsonArray(goodsTypeDao.goodsTypeList(con, pageBean, goodsType));
int total = goodsTypeDao.goodsTypeCount(con, goodsType);
result.put("rows", jsonArray);
result.put("total", total);
ResponseUtil.write(ServletActionContext.getResponse(), result);
}catch(Exception e){
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
系統(tǒng)開發(fā)的時候,常常遇到開發(fā)不對的問題。最大限度地找到系統(tǒng)中的不足,而不是證明系統(tǒng)的優(yōu)點,這是經(jīng)典的一句對測試的解釋。及時察覺錯誤,就可以避免一些不必要的損失。系統(tǒng)測試不僅能確保軟件的正常實現(xiàn),還能證明需求和功能相符合,系統(tǒng)測試包括兩部分:一部分是驗證產(chǎn)品質(zhì)量,它包括檢查軟件的實現(xiàn)在需求分析的一致性、軟件實現(xiàn)速度的快慢跟計算機(jī)系統(tǒng)的擴(kuò)展性等等;另一部分查找軟件中的不對并修改,確保軟件功能的實現(xiàn)。
系統(tǒng)測試對形式上的不同而言可以包括靜態(tài)測試與動態(tài)測試兩個關(guān)鍵部分。
1)靜態(tài)測試方法
靜態(tài)測試法根據(jù)系統(tǒng)功能需求、源代碼跟腳本的察看和考慮,找出系統(tǒng)存在的缺點。
2)動態(tài)分析方法
動態(tài)測試方法根據(jù)查看當(dāng)前代碼與想要達(dá)到的要求之間的直接差距,從性能、用處、可靠性等角度考評軟件。
對測試的內(nèi)部結(jié)構(gòu)與操作的算法上來說,其動態(tài)測試方法又涵蓋白盒測試法和黑盒測試法這兩種方法。
其中黑盒測試法(Black-Box Test)基本上將程序代碼當(dāng)成黑色盒子,不看程序內(nèi)部結(jié)構(gòu)跟算法,而僅著眼于程序代碼的外部特性來測試軟件有沒有達(dá)到要求。
在這個部分測試過程中,往往使用以黑盒測試法的手段來完成計算機(jī)系統(tǒng)查看,這樣能夠有效找出錯誤,檢驗系統(tǒng)能否滿足用戶需要,達(dá)到最佳測試效果。
功能測試是計算機(jī)軟件用處的檢驗,憑借功能測試用例,一個一個察看,查看程序有沒有完成了使用者想要的結(jié)果,各個測試如下:
1)登錄功能的測試
目標(biāo):確保使用者可以根據(jù)對的使用者名字跟密碼進(jìn)入服務(wù)器。
測試方法:
(1)不做輸入直接回車。
(2)輸入空字符串然后回車。
(3)輸入合理的字符數(shù)據(jù)然后回車登錄。
2)菜品類別管理功能的測試
目的:確保用戶可以對菜品類別進(jìn)行管理。
測試方法:
(1)單擊菜的類別,核對是否能夠顯示正確的功能表。
(2)選中對應(yīng)的餐品信息,核對是否可以完成修改與刪除工作。
(3)修改跟刪除信息,核對可不可以實現(xiàn)和得到反饋。
本模塊各個功能的測試結(jié)果如下:
1)進(jìn)入功能不發(fā)生異常,使用者可以進(jìn)入系統(tǒng)。
2)餐品使用正常,用戶對于餐品資料實現(xiàn)合理的增刪改查此操作。
本次測試結(jié)果與預(yù)計基本一致。通過測試,可得出以下結(jié)論:該模塊滿足外賣系統(tǒng)的功能需求,運行穩(wěn)定,具備實用價值。
隨著社會生活的迅速發(fā)展,互聯(lián)網(wǎng)給予人們的公共服務(wù)也慢慢地變多了,為了滿足廣大的用戶就餐方面的需求,本設(shè)計采用編程語言Jsp,開發(fā)了一個基于B/S架構(gòu)的外賣系統(tǒng),這個外賣系統(tǒng)牽涉到了對多個不同的應(yīng)用領(lǐng)域的相關(guān)認(rèn)知,有效幫助整合相關(guān)知識框架,滿足了社會的需要,有一定的現(xiàn)實意義和社會價值。