小白練手—基于JSP的實(shí)驗(yàn)系統(tǒng)(包調(diào)試成功)
摘要 在當(dāng)今的社會(huì)中, 隨著社會(huì)經(jīng)濟(jì)的快速發(fā)展以及計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和通訊技術(shù)的快速成長,網(wǎng)絡(luò)應(yīng)用領(lǐng)域也一天天擴(kuò)大,網(wǎng)絡(luò)中的新鮮事物層出不窮。電子商務(wù)的發(fā)展增加了許多商業(yè)交易的平臺(tái),借助于這種互聯(lián)網(wǎng)平臺(tái),人們進(jìn)行商品宣傳、業(yè)務(wù)交易等多種行為,進(jìn)而使得電子商務(wù)快速發(fā)展,成為當(dāng)今社會(huì)迅速成長的主流之一,電子商務(wù)在我們?nèi)粘I钪邪缪葜絹碓街匾慕巧?在網(wǎng)絡(luò)如此發(fā)達(dá)的潮流中,順應(yīng)趨勢,設(shè)計(jì)了基于JSP的網(wǎng)上購書系統(tǒng)這個(gè)銷售平臺(tái),讓用戶可以更直觀、便捷,足不出戶即可在虛擬書店里購書。本網(wǎng)站頁面主要用JSP實(shí)現(xiàn),業(yè)務(wù)邏輯層用SSH框架(Hibernate+Struts+Spring)及Java代碼實(shí)現(xiàn),數(shù)據(jù)管理用MySQL數(shù)據(jù)庫,開發(fā)工具使用Eclipse,服務(wù)器用Tomcat8最新版本。本系統(tǒng)針對管理員和普通兩類用戶設(shè)置了不同的功能。管理員功能包括:圖書信息管理、圖書類別管理、訂單管理、用戶信息管理;普通用戶功能包括:注冊信息、瀏覽書店信息、瀏覽圖書信息、搜索圖書、在線生成訂單等功能。該系統(tǒng)用戶界面友好,模塊劃分清晰,具有使用方便,安全穩(wěn)定,維護(hù)簡單等特點(diǎn)。 關(guān)鍵詞:網(wǎng)上購書;Java;JSP;MySQL The Online Bookstores System Based On JSP Abstract
In today’s society, the fast development of computer network technology and the communication technology, the increasing scale of the network, the new things in the network also increased a lot, in the Internet platform for publicity, trading and other acts, which makes the network more and more become the mainstream of today’s social development, the site is composed of a very large network elements. Online book system This sales platform, allowing users to more intuitive and moreconvenient, do not have to go home to see a lot of books. The software system for ordinaryusers of the web page is mainly used to achieve JSP, the business logic layer with SSHframework (Hibernate+Struts+Spring) and Java code, data management with MySQL database, development tools using Eclipse, the latest version of the server with Tomcat 8.The system sets differentfunctions for administrators and ordinary users. Administrator functions include: book information management, book category management, order management, user information management; Common user functions include: regist information browsing bookstore information, browsing book information, searching book,generating orders online, etc.The system has the advantages of friendly user interface, clear module division, convenient operation, safety and stability, simple maintenance and so on. Key words:Online Bookstores;Java;JSP;MySQL 目 錄 摘要i Abstractii 1 前言1 1.1 概述1 1.2 整體敘述1 2 系統(tǒng)開發(fā)背景3 2.1 課題的背景3 2.2 課題的研究現(xiàn)狀3 2.3 課題的研究意義3 3 系統(tǒng)分析5 3.1 系統(tǒng)開發(fā)目的與意義5 3.2 可行性分析5 3.2.1 技術(shù)可行性5 3.2.2 經(jīng)濟(jì)可行性5 3.2.3 操作可行性6 3.2.4 法律可行性6 3.2.5 管理可行性6 3.3 需求分析6 3.3.1 功能需求分析6 3.3.2 數(shù)據(jù)邏輯分析6 3.3.3 性能需求分析7 3.4 數(shù)據(jù)庫分析7 3.5 開發(fā)環(huán)境7 3.6 開發(fā)工具及技術(shù)8 3.6.1 開發(fā)工具8 3.6.2 開發(fā)技術(shù)8 4 系統(tǒng)總體設(shè)計(jì)10 4.1 設(shè)計(jì)思想10 4.2 功能模塊設(shè)計(jì)10 4.3 界面設(shè)計(jì)12 4.4 系統(tǒng)用戶用例圖13 4.4.1 普通用戶用例圖13 4.4.2 管理員用例圖13 4.5 數(shù)據(jù)庫的設(shè)計(jì)14 4.5.1 數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計(jì)14 4.5.2 數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計(jì)16 5 系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)20 5.1 管理員登錄頁面20 5.2 管理員模塊21 5.2.1 圖書類目管理21 5.2.2 圖書信息管理23 5.2.3 用戶信息管理27 5.2.4 訂單信息管理28 5.2.5 退出系統(tǒng)28 5.3 普通用戶模塊28 5.3.1 系統(tǒng)主頁面實(shí)現(xiàn)28 5.3.2 圖書查詢29 5.3.3 用戶登錄注冊30 5.3.4 圖書分類查詢30 5.3.5 在線下單31 5.3.6 管理訂單功能32 6 系統(tǒng)測試33 6.1 系統(tǒng)測試目的與意義33 6.2 測試過程33 6.2.1 網(wǎng)站首頁用戶登錄測試33 6.2.2 管理員刪除圖書信息測試34 6.2.3 生成訂單測試34 6.2.4 其他錯(cuò)誤測試35 7 系統(tǒng)的運(yùn)行和維護(hù)36 結(jié)論37 參考文獻(xiàn)38 致謝39 附錄:外文原文40 中文翻譯49 1 前言
1.1 概述
當(dāng)今人類社會(huì)的生活方式因?yàn)榛ヂ?lián)網(wǎng)的蓬勃發(fā)展而發(fā)生了質(zhì)的變化,網(wǎng)絡(luò)給人們帶來了足不出戶即可了解新鮮事物和獲得自己想要的東西的便利,所以正是需求推動(dòng)社會(huì)發(fā)展,在虛擬網(wǎng)絡(luò)中買賣交易商品,人們越來越來喜歡這種網(wǎng)上購物方式。 互聯(lián)網(wǎng)行業(yè)剛興起才露出其新面容是上世紀(jì)90年代,國內(nèi)也發(fā)展起來了幾大互聯(lián)網(wǎng)企業(yè),一些商業(yè)人士也就泛起了通過網(wǎng)絡(luò)進(jìn)行交易買賣圖書的別人沒想過的主意。但是在互聯(lián)網(wǎng)初期還存在一些問題,比如企業(yè)的信譽(yù)不是一時(shí)半會(huì)能建立起來的、不完善的國家對于的網(wǎng)絡(luò)的政策、當(dāng)時(shí)不發(fā)達(dá)的物流等一連串的原因致使網(wǎng)上交易生意發(fā)展的步伐有所遲緩。新世紀(jì)以來,整個(gè)社會(huì)成長進(jìn)步了不少,影響網(wǎng)上業(yè)務(wù)買賣的各大問題被消滅,越來越多的企業(yè)看出互聯(lián)網(wǎng)勢不可擋,互聯(lián)網(wǎng)的隊(duì)伍日益壯大[6]。 小時(shí)候購買圖書都是現(xiàn)場商家與消費(fèi)者面對面銷售,賣書的地點(diǎn)對于大部分商家來說都是固定的,客流量也是固定的,并且圖書種類偏向固定,這樣導(dǎo)致利潤上漲緩慢,甚至不盈利。 從商家角度來看,當(dāng)打點(diǎn)店鋪的職工想查找哪一類圖書銷量大需要進(jìn)貨時(shí),要根據(jù)每一天的銷量情況來決定。當(dāng)然用數(shù)據(jù)說話更準(zhǔn)確,例如用庫房的電腦查看銷售圖書數(shù)量以及類別,這樣就很繁瑣。從買家為出發(fā)點(diǎn)的話,想要購買書籍還要先去圖書館查看是否有心中所想的那本書及價(jià)錢,要想比較不同書店同一本書的價(jià)格還要跑到另一家去讓工作人員手工查找,很費(fèi)時(shí)間及人力。隨著社會(huì)發(fā)展,網(wǎng)店的出現(xiàn),機(jī)械以精準(zhǔn)、快速而遠(yuǎn)超過手工運(yùn)轉(zhuǎn)的大優(yōu)勢替代手工,工作職員再也不用手工查書了,更方便的是其可在電腦上輸入書名就能快速出現(xiàn)結(jié)果;消費(fèi)者也可以通過在同一個(gè)平臺(tái)的不同頁面查詢自己需要的書籍及單價(jià),還能同時(shí)登陸不同的平臺(tái)來進(jìn)行比較不同商家的同一件商品,很大水平上節(jié)省了人們的時(shí)間,因此網(wǎng)上購書既節(jié)約時(shí)間又不耗費(fèi)人力、不必要的費(fèi)用,讓賣家和買家間的溝通矛盾有效減少了。 1.2 整體敘述
本論文所包括的主要內(nèi)容章節(jié)整體信息如下: 可行性分析
本系統(tǒng)的分析主要從技術(shù)方面著手,判斷可完成的功能,再從經(jīng)濟(jì)角度出發(fā),得出系統(tǒng)開發(fā)的成本和硬件條件以及最后系統(tǒng)的部署環(huán)境、運(yùn)行成本等,以上都可行后說明該系統(tǒng)的是有必要開發(fā)的[6]。
2、系統(tǒng)分析
當(dāng)今社會(huì)互聯(lián)網(wǎng)的飛快發(fā)展,社會(huì)主流網(wǎng)絡(luò)購物已經(jīng)深入眾多消費(fèi)者人心,因此,
為了讓消費(fèi)者的買書需求得到滿足讓人們的生活水平提高,也是為更好的社會(huì)發(fā)展,讓消費(fèi)者買書更方便快捷,就此,嘗試開發(fā)一個(gè)小型網(wǎng)上購書系統(tǒng)來滿足眾多消費(fèi)者。目前,也有很好的購書網(wǎng)站,比如淘寶網(wǎng)、亞馬遜、當(dāng)當(dāng)網(wǎng)等平臺(tái)被人們所熟知,本小型平臺(tái)在借鑒他人勞動(dòng)成果的基礎(chǔ)上鍛煉自己的技術(shù)水平。每個(gè)軟件項(xiàng)目在正式開發(fā)前都要研究分析其是否可行,意義在于預(yù)防開發(fā)中未預(yù)料到的問題的出現(xiàn)。
3、系統(tǒng)總體設(shè)計(jì)
(1)瀏覽器/服務(wù)端模式是本系統(tǒng)總體開發(fā)的模式,該模式有以下好處:
(a)層次清晰分明的前臺(tái)、后臺(tái)邏輯處理關(guān)系,符合很多已經(jīng)對于網(wǎng)絡(luò)搜索熟悉習(xí)慣的消費(fèi)者;
(b)使用面向?qū)ο罄砟钤O(shè)計(jì)和開發(fā)概念、使用模塊化方式設(shè)計(jì)。模塊化設(shè)計(jì)就是將所有功能都分解開來,分成若干個(gè)子功能模塊,這樣簡化系統(tǒng)設(shè)計(jì)實(shí)現(xiàn),讓重復(fù)的代碼能將其單獨(dú)作為一個(gè)類或方法,實(shí)現(xiàn)代碼重載,不僅讓開發(fā)更簡單,而且提高了代碼維護(hù)性。系統(tǒng)開發(fā)不僅要實(shí)現(xiàn)功能,而且要考慮系統(tǒng)可靠性,既滿足設(shè)計(jì)要求又可以在此基礎(chǔ)上進(jìn)行改進(jìn)擴(kuò)展,更能適應(yīng)社會(huì)發(fā)展?jié)M足人們需求。
數(shù)據(jù)庫設(shè)計(jì):使用MySQL,本系統(tǒng)后臺(tái)程序使用Struts+Spring+hibernate即SSH框架,在Spring的配置文件中配置數(shù)據(jù)庫相關(guān)信息。
4、系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 系統(tǒng)詳細(xì)設(shè)計(jì)要完成的是各模塊代碼的編寫(包括前端網(wǎng)站各頁面和后臺(tái)管理系統(tǒng)),用戶交互界面的設(shè)計(jì)等內(nèi)容。 系統(tǒng)前臺(tái)模塊包括用戶進(jìn)入網(wǎng)站首頁、查看圖書和網(wǎng)站虛擬書店的信息,注冊信息、登錄網(wǎng)站、加入購物車和下訂單等內(nèi)容;系統(tǒng)后臺(tái)管理模塊分為管理層用戶登錄后臺(tái)、添加圖書類別、更新圖書信息等內(nèi)容;用戶交互界面的設(shè)計(jì)包括一般用戶登錄模塊界面的設(shè)計(jì)和后臺(tái)管理界面的設(shè)計(jì)。 該網(wǎng)上購書系統(tǒng)的界面簡單大方,方便各年齡階段的消費(fèi)者使用,有著友好和錯(cuò)誤的提示操作。系統(tǒng)管理者功能有:更新書籍信息、對書籍分類、對訂單標(biāo)記已處理、添加用戶、管理系統(tǒng)等。普通用戶可以查看圖書信息,圖書分類查詢,生成購買書籍訂單,修改個(gè)人的基本信息等功能。保障性大,避免了人為的破壞性行為。 5、系統(tǒng)測試 每個(gè)系統(tǒng)開發(fā)中都會(huì)有或多或少的bug,系統(tǒng)檢測的目的是極大多數(shù)的檢查出軟件中出現(xiàn)的問題,增強(qiáng)程序的可靠性。這個(gè)過程又分為3個(gè)步驟:模塊、接口、驗(yàn)收測試。 在系統(tǒng)初步形成時(shí),為了看到自己開發(fā)的成果,一開始用于檢測的信息都是隨意輸入,單純地為了測試,用戶信息也不是真的。但是到后來,要檢驗(yàn)系統(tǒng)的可靠性使用了較真實(shí)的測試信息,并清除了假數(shù)據(jù)。 在通過不斷的測試消滅各種bug,才能讓系統(tǒng)放心運(yùn)作起來。 6、系統(tǒng)運(yùn)行和維護(hù) 系統(tǒng)開發(fā)測試完畢后就要投入使用了,確保系統(tǒng)能正常運(yùn)行非常重要,社會(huì)不斷發(fā)展人們的需求也在不斷變化,這就要求系統(tǒng)維護(hù)人員能及時(shí)發(fā)現(xiàn)系統(tǒng)問題并向上級(jí)反映對系統(tǒng)改進(jìn)。 2 系統(tǒng)開發(fā)背景 2.1 課題的背景
自從進(jìn)入互聯(lián)網(wǎng)時(shí)代以來,網(wǎng)絡(luò)以其前所未有的速度改變著人們的生活方式,改變著人們的價(jià)值觀念。如果說這是一次經(jīng)濟(jì)革命,它比工業(yè)革命所帶來的影響價(jià)值更深入徹底得多,它將傳統(tǒng)經(jīng)濟(jì)推向了無形的虛擬空間。地球村即真是地體現(xiàn)了經(jīng)濟(jì)全球化的趨勢。網(wǎng)絡(luò)經(jīng)濟(jì)模式以迅猛勢頭席卷我們生活的各個(gè)領(lǐng)域:隨著電子商務(wù)的日益成熟,網(wǎng)上購書應(yīng)運(yùn)而生,并以其方便、快捷等一系列優(yōu)點(diǎn)沖擊著我們傳統(tǒng)的圖書發(fā)行產(chǎn)業(yè),這既是機(jī)遇又是挑戰(zhàn)。網(wǎng)絡(luò)時(shí)代的今天,誰能更好的利用好這柄雙刃劍必將成為威力啊圖書出版發(fā)行業(yè)新的主宰者。我過由于網(wǎng)絡(luò)技術(shù)起步較晚,電子商務(wù)體系還不很完善,與歐美等國有一定的差距。[3] 網(wǎng)上購書是電子商務(wù)網(wǎng)站的一種類型。網(wǎng)上購書是近年來隨著網(wǎng)絡(luò)技術(shù)的發(fā)展而產(chǎn)生的一種新型的書店形式。隨著網(wǎng)絡(luò)的發(fā)展,電子商務(wù)的不斷完善,賣書商家越來越強(qiáng)烈地意識(shí)到網(wǎng)絡(luò)帶來的巨大商機(jī),幾乎都進(jìn)行圖書的線上銷售經(jīng)營活動(dòng),不管對于商家網(wǎng)上銷售還是對于消費(fèi)者網(wǎng)上購書都是種新型的銷售和購書模式,并很受歡迎。 2.2 課題的研究現(xiàn)狀
隨著我國經(jīng)濟(jì)的發(fā)展,電子商務(wù)在企業(yè)的日常生活中將會(huì)發(fā)揮越來越多的作用,尤其在金融、政府、事業(yè)單位方面電子商務(wù)更是可以發(fā)揮其競爭優(yōu)勢。網(wǎng)上購書系統(tǒng)的研究主要是從信息流、資金流等角度進(jìn)行研究。 李大星認(rèn)為,最具代表性的網(wǎng)上購書系統(tǒng)首推亞馬遜網(wǎng)站。用戶訪問該網(wǎng)站首頁,利用電腦檢索圖書,物色到自己喜歡的書。通過鍵盤向該網(wǎng)站訂購,美國本土的購書人大概兩三天內(nèi)便可收到。其主頁推薦的書目每日更換,提供最新書目和相關(guān)信息??蛻羧缦蚓W(wǎng)站提供自己的個(gè)人信息,網(wǎng)上購書系統(tǒng)會(huì)定期向你傳遞有關(guān)的書目信息及相關(guān)著作,形成個(gè)性化服務(wù)。 張志強(qiáng)根據(jù)中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告對國內(nèi)網(wǎng)上圖書銷售的優(yōu)勢、存在問題等進(jìn)行了分析。它認(rèn)為長遠(yuǎn)角度看,國內(nèi)網(wǎng)上圖書銷售具有消費(fèi)主體、消費(fèi)習(xí)慣、需求等優(yōu)勢,但也存在著交易安全性、圖書質(zhì)量、支付手段等問題。他建議網(wǎng)上銷售圖書要重視信譽(yù),樹立品牌;增加技術(shù)含量,提高服務(wù)質(zhì)量;恰當(dāng)運(yùn)用網(wǎng)上廣告等擴(kuò)大影響。由于我國電子商務(wù)的概念并未深入人心、信息服務(wù)不完善、安全保障等問題令人擔(dān)憂。這些問題既嚴(yán)重阻礙了我國網(wǎng)上圖書購買的發(fā)展,也妨礙了我國的信息化進(jìn)程。網(wǎng)上購書面臨的這些問題有待解決。[3] 2.3 課題的研究意義
近年來,隨著計(jì)算機(jī)的普遍推廣,電子商務(wù)得以快速發(fā)展,網(wǎng)上購書不僅成為一種時(shí)尚,也成為人們學(xué)習(xí)必做的功課。網(wǎng)上購書系統(tǒng)運(yùn)用計(jì)算機(jī)技術(shù)將賣家、買家、廠商等緊密地結(jié)合在一起,大大彌補(bǔ)了過去時(shí)間和空間帶來的障礙,從而幫助人們節(jié)約了成本,擴(kuò)大了營銷市場,同時(shí)通過此次項(xiàng)目的開展,我可以更進(jìn)一步了解項(xiàng)目開發(fā)的一般流程,深化對基于B/S模式下開發(fā)項(xiàng)目的了解,進(jìn)一步了解和掌握Web開發(fā)技術(shù)。 基于JSP的網(wǎng)上購書系統(tǒng)是在當(dāng)今網(wǎng)上購物風(fēng)靡一時(shí)的情況下根據(jù)老師的指導(dǎo)和建議得出的課題,重點(diǎn)在于檢驗(yàn)學(xué)生知識(shí)的運(yùn)用能力和實(shí)際操作能力。隨著時(shí)間的推移,電子商務(wù)得到快速發(fā)展同時(shí)人們的生活節(jié)奏也越來越快,更多的人追求速度和效率,實(shí)物店購買圖書難以滿足人們的要求,因此網(wǎng)上購物成為人們必要的選擇。網(wǎng)上購書系統(tǒng)包括:查看圖書信息、增加圖書信息、刪除圖書信息、用戶注冊、訂單處理、后臺(tái)管理等工作。 3 系統(tǒng)分析
3.1 系統(tǒng)開發(fā)目的與意義
該系統(tǒng)作為基于網(wǎng)絡(luò)平臺(tái)的書籍交易系統(tǒng),跟以前舊銷售方式比較,主要優(yōu)點(diǎn)有: 1、檢索便捷 網(wǎng)上購書提供了比較多的檢索途徑,比如可以根據(jù)分類查找、根據(jù)價(jià)格查找、根據(jù)是否是特價(jià)商品或根據(jù)圖書的作者等多種途徑進(jìn)行檢索,方便、快速、準(zhǔn)確。 2、信息量大 與以前在某個(gè)地點(diǎn)賣書的舊形式不同,老形式銷售老板帶的書數(shù)量有限,種類不會(huì)那么齊全,而該系統(tǒng)基于網(wǎng)絡(luò)不受時(shí)間、地點(diǎn)的限制,遍及世界各地,這也就極大限度地?cái)U(kuò)大了出版物的發(fā)行范圍。 3、成本低,無區(qū)域限定 網(wǎng)上購書最大的優(yōu)勢是消費(fèi)者可于任何時(shí)間、地點(diǎn)購買心儀的書籍,增多了消費(fèi)者群體,提高了商家競爭力,更節(jié)約了開實(shí)體店所需投入的資本(人力、生產(chǎn)力以及物力)和租賃錢財(cái)。 基于以上網(wǎng)上購書的優(yōu)點(diǎn),網(wǎng)上購書才能得以在短時(shí)間內(nèi)迅速發(fā)展起來。其目的與意義就是為了讓人們更方便購書,更快樂地享受生活。 3.2 可行性分析
任何一個(gè)系統(tǒng)的開發(fā),都有時(shí)間和資源上一定的限制。所以每一個(gè)項(xiàng)目在開發(fā)之前,對其進(jìn)行可行性分析是必不可少的,這樣才能降低項(xiàng)目開發(fā)過程中的風(fēng)險(xiǎn),較少及避免財(cái)力、物力、人力的浪費(fèi)。以下在技術(shù)、操作、經(jīng)濟(jì)還有法律4個(gè)方面進(jìn)行可行性分析的闡述。 3.2.1 技術(shù)可行性
該軟件系統(tǒng)使用我們學(xué)過的開發(fā)工具Eclipse開發(fā),用具有性能高、跨平臺(tái)、代碼可重載的Java編程語言編碼,數(shù)據(jù)庫使用開源軟件MySQL。而且對于ssh框架這些都有所學(xué)習(xí), ssh框架有良好的可擴(kuò)展性和可維護(hù)性,提高了對象管理方法,因此對我而言,在技術(shù)上實(shí)現(xiàn)該系統(tǒng)是行得通的。 本軟件體系的協(xié)議傳輸和請求返回原理工作圖如下圖1:
圖3.1 系統(tǒng)工作原理圖 3.2.2 經(jīng)濟(jì)可行性
由于本系統(tǒng)是畢業(yè)設(shè)計(jì)課題這一特殊性,通過使用含有標(biāo)準(zhǔn)配置的電腦,下載JDK以及開發(fā)所需要的jar包即可進(jìn)行開發(fā),由于該系統(tǒng)中使用的軟件是開源的,這就節(jié)省了開發(fā)系統(tǒng)節(jié)所需的大部分的資金和時(shí)間,實(shí)現(xiàn)了更低的開發(fā)成本,提高了系統(tǒng)開發(fā)的效率。 3.2.3 操作可行性
本系統(tǒng)操作簡單,頁面框架基本上使用統(tǒng)一風(fēng)格,且頁面簡單,可根據(jù)需要和文字提示即可完成圖書的搜索和購買,很容易上手操作,學(xué)起來是比較簡單的,對操作人員的要求條件不高,只需要熟練操作Windows操作系統(tǒng),另外再對系統(tǒng)運(yùn)行的操作稍加訓(xùn)練即可,而系統(tǒng)的可視性很好,所以不會(huì)很難使用。 3.2.4 法律可行性
本網(wǎng)上購書系統(tǒng)是一個(gè)自主開發(fā)的購書系統(tǒng),是一個(gè)對大部分消費(fèi)者來說很實(shí)用的系統(tǒng),開發(fā)環(huán)境工具和數(shù)據(jù)庫的操作都有開源的代碼,該系統(tǒng)的開發(fā)與普通軟件系統(tǒng)的開發(fā)有不同的地方,在法律上沒有任何侵犯,是可行的。 3.2.5 管理可行性
系統(tǒng)設(shè)計(jì)目標(biāo)應(yīng)該放長遠(yuǎn),讓此系統(tǒng)的開發(fā)具有良好的擴(kuò)展性,不會(huì)因企業(yè)的變動(dòng)而隨之淘汰。 具體實(shí)施體現(xiàn)為以下幾點(diǎn): (1)標(biāo)準(zhǔn)性:一保證系統(tǒng)運(yùn)行質(zhì)量,二在此標(biāo)準(zhǔn)技術(shù)上有所進(jìn)步。 (2)可靠性:系統(tǒng)的軟硬件質(zhì)量必須保證。 (3)安全性:控制用戶接觸數(shù)據(jù)的權(quán)限。確保用戶只可操作對應(yīng)的數(shù)據(jù)。 (4)高效性:數(shù)據(jù)庫的大小影響瀏覽器的響應(yīng)。 (5)可維護(hù)性:系統(tǒng)設(shè)計(jì)分成幾個(gè)模塊來設(shè)計(jì),這樣既能減少工作人員工作量,又能便于開發(fā)及維護(hù)。 3.3 需求分析
3.3.1 功能需求分析
1、該系統(tǒng)所具有的功能需求有: 前臺(tái)網(wǎng)站:
a、一般游客:瀏覽書店簡介、瀏覽圖書信息、搜索圖書、根據(jù)分類查尋圖書、注冊信息等功能;
b、在線用戶:包含上邊普通游客所有功能,登陸網(wǎng)站、添加書籍到購物車、管理已購買書籍訂單等功能。
后臺(tái)管理:管理員可管理圖書、設(shè)置是否是促銷或最新圖書;工作人員可以查看、增添用戶;管理圖書種類,包含查看所有分類、增添書籍類型;管理訂單包括查看所有用戶訂單、標(biāo)記訂單是否已處理、查看詳情、刪除等功能。
3.3.2 數(shù)據(jù)邏輯分析
在網(wǎng)站系統(tǒng)頁面,若注冊信息,用戶填寫的信息會(huì)提交到UserAction類,判斷用戶名和密碼是否正確從而調(diào)用service層,service層調(diào)用dao層添加用戶信息,以此類推,各種數(shù)據(jù)只要和數(shù)據(jù)庫打交道那就需要經(jīng)過action類,在對應(yīng)action類中進(jìn)行邏輯處理,跳轉(zhuǎn)到相應(yīng)頁面,需要操作數(shù)據(jù)庫時(shí)action類調(diào)用service層類,再調(diào)用dao層類來實(shí)現(xiàn)數(shù)據(jù)的保存或更新及刪除。
3.3.3 性能需求分析
1、系統(tǒng)的安全性
在管理限定上嚴(yán)格管制,本軟件體系要求如下:
1)對于后臺(tái)管理系統(tǒng),首先必須是系統(tǒng)的管理員才能對系統(tǒng)各方面進(jìn)行更新,其次須憑借無誤的昵稱和密碼口令登陸到系統(tǒng),沒有權(quán)限包含不是管理工作人員或者是工作人員時(shí)輸入不正確的昵稱或密碼口令登陸系統(tǒng)的人員都不能登陸進(jìn)后臺(tái),對系統(tǒng)中任何信息都不能查看或更新,這樣來保證系統(tǒng)的安全性和可靠性。
2)對于前臺(tái)網(wǎng)站首頁,對于擁有不同權(quán)限的用戶來說,有兩種權(quán)限分別是一般游客和在線用戶,這兩種消費(fèi)者不能跨越本級(jí)別操作。具體:一般游客只能在網(wǎng)站首頁瀏覽虛擬書店的介紹信息、書籍的基本信息以及分類查詢書籍和搜索書籍,這類用戶通過在網(wǎng)站注冊信息登錄即可變成在線用戶;在線用戶不但具備一般游客全部能力,而且可以生成訂單、管理訂單、更改個(gè)人基本信息。
2、數(shù)據(jù)的完整性系統(tǒng)用到的全部信息的完整性,包含保存用戶個(gè)人信息和書籍的信息。
2) 信息和信息保持一定的互動(dòng)。 3) 同一種信息在不同表中保存的數(shù)據(jù)應(yīng)保持相同。 3.4 數(shù)據(jù)庫分析
數(shù)據(jù)庫是計(jì)算機(jī)系統(tǒng)的核心,其在數(shù)據(jù)庫系統(tǒng)的管理下,對信息進(jìn)行收集、整理、儲(chǔ)存、檢索、數(shù)據(jù)更新、數(shù)據(jù)加工以及數(shù)據(jù)統(tǒng)計(jì)和有用消息的傳達(dá)等操縱?,F(xiàn)在,信息系統(tǒng)等計(jì)算機(jī)系統(tǒng)的根基和核心部分已經(jīng)成為了數(shù)據(jù)庫,因此數(shù)據(jù)庫的品質(zhì)好壞直接關(guān)系到整個(gè)體系的質(zhì)量和效率。[4] MySQL是一種關(guān)系型數(shù)據(jù)庫,其所使用的SQL語言是常用的訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)化語言,MySQL具有體積小、速度快的優(yōu)點(diǎn),更因其是開源軟件,這個(gè)大特點(diǎn)就很大程度降低了開發(fā)成本,縱使MySQL也有不足之處,但它提供的功能已綽綽有余,因此本系統(tǒng)使用MySQL數(shù)據(jù)庫。 3.5 開發(fā)環(huán)境
1、硬件環(huán)境: CPU:Intel(R)Core(TM)i5 內(nèi)存:4GB 磁盤:400G以上 2、軟件環(huán)境: 系統(tǒng)類型:Win7 64位操作系統(tǒng) 開發(fā)工具:Eclipse j2EE 后臺(tái)服務(wù)器:Tomcat 8.0 主要開發(fā)語言:JSP、Java 瀏覽器:Firefox/IE8.0/Google Chrome 3.6 開發(fā)工具及技術(shù)
3.6.1 開發(fā)工具
Eclipse
Eclipse是基于Java的完全開源的一個(gè)可擴(kuò)展的開發(fā)平臺(tái),Eclipse Enterprise Workbench是針對Eclipse IDE的擴(kuò)展,是Eclipse針對企業(yè)開發(fā)的平臺(tái)(簡稱Eclipse),使得我們在企業(yè)級(jí)開發(fā)應(yīng)用、部署、封裝,數(shù)據(jù)庫管理方面方面提升了較高的效率。簡單來說,Eclipse是一個(gè)JavaEE開發(fā)平臺(tái),它有編寫代碼、Debug模式下用斷點(diǎn)來排錯(cuò)即
調(diào)試
、測試功能、發(fā)布應(yīng)用功能,并且它完全支持一些流行框架如Hibernate、Struts等,前端編碼語言如HTML、JSP、CSS、JavaScript,還有數(shù)據(jù)庫SQL語句。 2、Tomcat Tomcat是web應(yīng)用開發(fā)以及調(diào)試JSP代碼的首選。Tomcat 是屬于輕量級(jí)免費(fèi)的、開源的應(yīng)用服務(wù)器。[5]選擇tomcat作為服務(wù)器,一般是中小型企業(yè)還有一些對于同一項(xiàng)目同一時(shí)間訪問的人數(shù)不是特別高的公司使用的,在開發(fā)和調(diào)試JSP 程序中,Tomcat占有絕對的優(yōu)勢,運(yùn)行時(shí)占用的系統(tǒng)資源小。[10]這些暫且不說,而且它的擴(kuò)展性非常好,因?yàn)橐陨显騎omcat已經(jīng)備受,但是Tomcat并沒有說因?yàn)楫?dāng)前成就而停止前進(jìn)的步伐。 3、MySql MySQL是一種關(guān)系型數(shù)據(jù)庫,最主要的功能就是將來前臺(tái)和后臺(tái)對數(shù)據(jù)進(jìn)行查詢、保存等操作,其所使用的SQL語言是常用的訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)化語言。Hibernate它對JDBC做了簡單的封裝,使用Hibernate對數(shù)據(jù)進(jìn)行增刪改查的功能,這次用Hibernate是因?yàn)樗蓪?shí)現(xiàn)實(shí)體類反向生成數(shù)據(jù)庫,操作簡單。 MySql支持多種操作系統(tǒng)如常見的Windows、Linux等; 提供了TCP / IP、ODBC和JDBC等數(shù)據(jù)庫的連接路徑; 作為開源軟件,MySQL是小中型系統(tǒng)開發(fā)的不二之選。[4] 3.6.2 開發(fā)技術(shù)
1、JSP JSP在服務(wù)端器實(shí)現(xiàn)給客戶端瀏覽器響應(yīng)的是html頁面,因此客戶端只要有瀏覽器方可看到響應(yīng)內(nèi)容,JSP頁面包括兩部分一個(gè)是Java語言寫的腳本代碼,另一個(gè)是html代碼??蛻舳税l(fā)出請求之后,頁面上的Java腳本代碼在客戶端請求web頁面之后被解析處理,然后返回給瀏覽器響應(yīng)的html頁面。[2] JSP技術(shù)的優(yōu)勢: (1)一次編碼,各個(gè)系統(tǒng)平臺(tái)都能運(yùn)轉(zhuǎn)。 (2)JSP組件跨平臺(tái)。在不同的平臺(tái)上都能運(yùn)行。 (3)擁護(hù)多種網(wǎng)頁格式。JSP支持html、wml等瀏覽器樣式。 (4)JSP標(biāo)簽可擴(kuò)充性。JSP技術(shù)準(zhǔn)許開發(fā)人員擴(kuò)展JSP標(biāo)簽,還能自定義標(biāo)簽,降低了制作網(wǎng)頁的復(fù)雜度。 (5)健壯性與安全性。JSP頁面包含Java代碼,而Java有健壯的存儲(chǔ)管理機(jī)制和高安全性,因此JSP也有健壯性和安全性。[8] 2、JavaScript JavaScript腳本語言是動(dòng)態(tài)弱類型的語言,它的解釋器是瀏覽器所包含的,運(yùn)行在客戶端,通常應(yīng)用在網(wǎng)頁端的腳本語言中。它一開始用于HTML(超文本標(biāo)記語言)頁面,以向HTML網(wǎng)頁增添動(dòng)態(tài)功能。 JavaScript的特點(diǎn)是: (1)js是一種執(zhí)行時(shí)再翻譯的動(dòng)態(tài)語言(代碼未預(yù)先編譯); (2)提高用戶界面交互體驗(yàn),為頁面添加動(dòng)態(tài)驗(yàn)證 (3)腳本部分的代碼要放在特定的標(biāo)記中間,或者單獨(dú)寫成js文件,并引用進(jìn)來;(4)js是基于瀏覽器,是運(yùn)行在瀏覽器中的,就算在不同的平臺(tái)上也可運(yùn)作。[3] Struts2
Struts2優(yōu)勢: Struts2Action對象為每一個(gè)請求產(chǎn)生一個(gè)實(shí)例,因此沒有線程安全問題。
Struts2強(qiáng)大的標(biāo)簽庫提高開發(fā)效率。
頁面脈絡(luò)清晰,通過查看配置文件把握整個(gè)系統(tǒng)的關(guān)系,方便開發(fā)人員崗位流動(dòng)時(shí)的維護(hù)。
4、Spring Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。 Spring優(yōu)勢: Spring提供了一種管理對象的方法,可以把中間層對象有效地組織起來。一個(gè)完美的框架“黏合劑”。
有利于面向接口編程習(xí)慣的養(yǎng)成,使代碼結(jié)構(gòu)清晰。
采用了分層結(jié)構(gòu),可以增量引入到項(xiàng)目中。
目的之一是為了寫出易于測試的代碼。
非侵入性,應(yīng)用程序?qū)pringAPI的依賴可以減至最小限度。
一致的數(shù)據(jù)訪問介面。
一個(gè)輕量級(jí)的架構(gòu)解決方案。
5、Hibernate Hibernate是一個(gè)開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級(jí)的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate優(yōu)勢: Hibernate是JDBC輕量級(jí)的封裝,占用內(nèi)存較少,性能比較高。與JDBC相比,如果開發(fā)JDBC的人員技術(shù)能力非常強(qiáng),hibernate執(zhí)行效率會(huì)比JDBC弱一些,但是大部分情況是程序員在使用JDBC時(shí)是不可能做到最高效率,hibernate可以幫大部分開發(fā)人員提高運(yùn)行效率。
可以引入第三方二級(jí)緩存,提高系統(tǒng)查詢效率,減少系統(tǒng)里存在大量單例類(singleton),大量的單例類,會(huì)降低系統(tǒng)的可測試性和面向?qū)ο蟪潭取?/p>
優(yōu)秀的ORM框架,理論上節(jié)省開發(fā)人員95%的開發(fā)工作量。
Hibernate兼容JDBC。
4 系統(tǒng)總體設(shè)計(jì) 4.1 設(shè)計(jì)思想
設(shè)計(jì)思想遵循以下幾點(diǎn): 1、本系統(tǒng)使用瀏覽器 / 服務(wù)器模式開發(fā),因?yàn)榭紤]到許多用戶已經(jīng)習(xí)慣于在頁面上搜索。 2、Java面向?qū)ο蟮乃枷霊?yīng)融合在整個(gè)系統(tǒng)的開發(fā)中,每個(gè)模塊都是獨(dú)立的,各模塊組成一個(gè)整體,零散而聚集; 3、系統(tǒng)應(yīng)具有安全性以及可靠性,分配角色權(quán)限是解決他們的最好途徑; 4、操作方便,界面從優(yōu); 5、設(shè)計(jì)不僅要重點(diǎn)突出,而且要細(xì)致周到。為滿足設(shè)計(jì)要求,在可能的基礎(chǔ)上改進(jìn)系統(tǒng)的擴(kuò)展,以適應(yīng)用戶的需求。 4.2 功能模塊設(shè)計(jì)
該系統(tǒng)使用起來容易,操作簡單,有清晰明了的提示文字,讓用戶的整個(gè)購書過程很輕松享受。本體系實(shí)現(xiàn)的基本功能如下: 一般游客:瀏覽書店簡介、瀏覽圖書信息、搜索圖書、根據(jù)分類查尋圖書、注冊信息等功能;
在線用戶:包括一般游客全部功能,除此之外,還有登錄網(wǎng)站首頁、管理購物車、生成訂單、查看訂單等功能;
3、管理員具有圖書類型管理、圖書信息管理、訂單查看刪除管理、用戶添加刪除管理、后臺(tái)管理功能; 4、除了以上,該系統(tǒng)的用戶交互界面簡易明了,易于使用,還有友善的不正確的提示信息,有比較好的安全性。 系統(tǒng)整體的功能模塊圖如圖4.1所示:
圖4.1 系統(tǒng)總體功能模塊圖 軟件體系的總體功能模塊圖,分普通用戶模塊,管理員模塊。 普通用戶的模塊圖說明:普通用戶在網(wǎng)店首頁可以進(jìn)行了解書店簡介,瀏覽圖書信息;如果要在線操作首先需要備案一個(gè)個(gè)人賬號(hào),再登錄上網(wǎng)站,可進(jìn)行在線下訂單,書籍查詢操作,如圖4.2所示:
圖4.2 普通用戶模塊 管理員功能結(jié)構(gòu)模塊圖說明:作為一種用戶角色,管理員的權(quán)限能力最高。管理員功能結(jié)構(gòu)模塊圖,如圖4.3所示:
圖4.3 管理者模塊 (1)用戶管理模塊:該模塊可觀察瀏覽用戶信息、更正、消除用戶信息功能。 (2)訂單管理模塊:該模塊主要處理買家完成的訂單,查察、刪除等功能。 (3)圖書管理模塊:該模塊主要管理書籍,包括增添圖書、更新圖書信息、設(shè)置最新圖書、推薦圖書、促銷圖書等。 (4)書籍分類管理模塊:該模塊對圖書類型信息進(jìn)行打理,包含添加新類型、查詢類別意思、改動(dòng)、和消除等功能操作。其中圖書類別信息主要是類別稱號(hào)、類別含義。 (5)系統(tǒng)管理模塊:書店簡介信息的更新,系統(tǒng)維護(hù)。 (6)修改密碼模塊:修改管理員密碼功能。 4.3 界面設(shè)計(jì)
目前,軟件質(zhì)量評(píng)估的重要指標(biāo)就是界面設(shè)計(jì),良好的用戶界面可以加強(qiáng)用戶對整個(gè)軟件體系使用的信念和感覺。用戶界面可以說是用于在系統(tǒng)和顧客之間交互和交換信息的媒介,用戶界面實(shí)現(xiàn)了數(shù)據(jù)的內(nèi)部形式和人本身可接受的形式之間的更調(diào)。 1、輸出設(shè)計(jì) 使得網(wǎng)上購書系統(tǒng)的成果能滿足用戶需求的一些數(shù)據(jù)和效果即輸出。輸出設(shè)計(jì)的目標(biāo)是實(shí)時(shí)反映和構(gòu)成各部門無誤管理需求所需的信息,信息是否滿足人們的需求,直接關(guān)系到軟件體系的投入使用和該體系是否是告成的。 設(shè)計(jì)系統(tǒng)的過程剛好與實(shí)施過程相反,并不是從輸入
設(shè)計(jì)到輸出設(shè)計(jì),而與其正好是相反的,輸出設(shè)計(jì)的準(zhǔn)則是不但要周全的反映不同工作人員的要求,并且要簡潔,而不是把用戶需求和不必要的全供應(yīng)給用戶。[10] 2、輸入設(shè)計(jì) 提高效率、減小誤差是輸入設(shè)計(jì)的最終目的。輸入接口把信息系統(tǒng)與用戶鏈接起來,根據(jù)用戶的需求來設(shè)計(jì)準(zhǔn)確的輸入格式,使得輸出更準(zhǔn)確即讓管理員及消費(fèi)者能得到正確信息。 通過以下幾點(diǎn)可以實(shí)現(xiàn)其目的:克制輸入量;盡可能快的輸入;降低輸入誤差;減少不必要的步驟。[10] 4.4 系統(tǒng)用戶用例圖
用例圖的主要作用有: (1)獲取需求; (2)指導(dǎo)測試; (3)對整個(gè)系統(tǒng)開發(fā)過程中其它工作流起到指導(dǎo)作用。 4.4.1 普通用戶用例圖
從安全方面的角度思量,為了對買家信息和訂單保密,普通用戶即沒有登錄系統(tǒng)的游客不能生成訂單、更新自己基本信息,只有在網(wǎng)站首頁瀏覽圖書基本信息和對圖書查詢、瀏覽書店簡介等功能,其它功能須登錄實(shí)現(xiàn),普通用戶用例圖如圖4.4所示:
圖4.4 用例圖-普通用戶 4.4.2 管理員用例圖
管理工作人員是該系統(tǒng)的焦點(diǎn)角色,共包含六大功能模塊,管理人員的權(quán)利最大,該軟件的全部功能管理人員都能操作,其能夠?qū)崟r(shí)更新系統(tǒng)所包含的書籍、訂單信息,而且是動(dòng)態(tài)的。管理員用戶用例圖如下圖4.5所示:
圖4.5 用例圖-管理員 4.5 數(shù)據(jù)庫的設(shè)計(jì)
數(shù)據(jù)庫是一種對信息的保存的過程,它建立在選定好數(shù)據(jù)庫的基礎(chǔ)之上。進(jìn)行數(shù)據(jù)庫的設(shè)計(jì)除了分析用戶需求之外,還需要進(jìn)行概念結(jié)構(gòu)的設(shè)計(jì)、邏輯結(jié)構(gòu)設(shè)計(jì)以及物理結(jié)構(gòu)的設(shè)計(jì),做到與系統(tǒng)分析與設(shè)計(jì)的階段相對應(yīng)。根據(jù)系統(tǒng)需要在數(shù)據(jù)庫中創(chuàng)建訂單、用戶、書籍類別、圖書等表。 4.5.1 數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計(jì)
概念結(jié)構(gòu)設(shè)計(jì)的任務(wù)是將它們籠統(tǒng)為不依靠任何必定機(jī)械的數(shù)據(jù)模型,即概念模型,其是建立在需求分析階段生成的需求規(guī)范的基礎(chǔ)上。概念模型讓設(shè)計(jì)者能集中注意力于最重要的新聞的組織結(jié)構(gòu)和處理模式上。 概念結(jié)構(gòu)設(shè)計(jì)最直觀的表達(dá)方式是E-R圖即是實(shí)體-聯(lián)系圖,它更加清晰的、方便的、直觀的去看實(shí)體屬性之間的聯(lián)系,將現(xiàn)實(shí)社會(huì)物體非常好的展現(xiàn)出來,其能直觀的看出實(shí)體具有的屬性,對數(shù)據(jù)庫設(shè)計(jì)起到輔助作用。 綜上,使用E-R圖的設(shè)計(jì)方法對數(shù)據(jù)庫設(shè)計(jì),以下對數(shù)據(jù)表進(jìn)行E-R圖設(shè)計(jì),可以直觀地觀察到表中各屬性的結(jié)構(gòu)。 系統(tǒng)主要的實(shí)體及其屬性如下: 普通用戶實(shí)體
主要說明普通用戶個(gè)體的基本信息,如圖4.6所示:
圖4.6 普通用戶實(shí)體圖 管理員登錄信息實(shí)體
主要說明了管理員要登錄后臺(tái)管理系統(tǒng)需要的用戶名和密碼有效信息,如圖4.7所示:
圖4.7 管理員登錄信息實(shí)體圖 書籍信息實(shí)體
主要說明了每本書的基本信息,如圖4.8所示:
圖4.8 書籍信息實(shí)體圖 圖書類別實(shí)體
主要說明了書籍的分類的類目,包括類目名稱和介紹,其實(shí)體結(jié)構(gòu)如圖4.9所示:
圖4.9 圖書類別實(shí)體圖 訂單信息實(shí)體
主要說明用戶在線生成的訂單的各種信息,如下圖4.10所示:
圖4.10 訂單信息實(shí)體圖 4.5.2 數(shù)據(jù)庫邏輯結(jié)構(gòu)設(shè)計(jì)
上邊的數(shù)據(jù)庫概念設(shè)計(jì)是在系統(tǒng)需求分析結(jié)果中總結(jié)實(shí)體信息,這個(gè)過程很重要,在這個(gè)基礎(chǔ)上再對各實(shí)體及屬性進(jìn)行詳細(xì)設(shè)計(jì)在,因此根據(jù)在數(shù)據(jù)庫概念結(jié)構(gòu)設(shè)計(jì)中的E-R圖來設(shè)計(jì)出本系統(tǒng)中,涉及到的數(shù)據(jù)項(xiàng)和表結(jié)構(gòu),邏輯結(jié)構(gòu)設(shè)計(jì)首先要把E-R圖轉(zhuǎn)換為關(guān)系模型,轉(zhuǎn)換時(shí)要留意:一是E-R圖中每個(gè)實(shí)體和關(guān)系模型一一對應(yīng);二是表中主鍵不能為空;三是實(shí)體之間的聯(lián)系其中多對多這種情況應(yīng)該將這種關(guān)系獨(dú)立為一個(gè)關(guān)系模型。 下圖為各實(shí)體轉(zhuǎn)換后的關(guān)系模型,如圖4.11所示:
圖4.11 關(guān)系模型圖 由上邊關(guān)系模型圖可知有6個(gè)表,以下是詳細(xì)的表結(jié)構(gòu): 普通用戶表
描述登錄該系統(tǒng)網(wǎng)站用戶的登錄信息,具體字段類型如表4.1所示:
表4.1 普通用戶表
圖書類別信息表
描述了書籍分類的類目信息,具體字段類型如表4.2所示:
表4.2 圖書類目信息表
圖書信息表
描述每本圖書的基本介紹,具體字段類型如下表4.3所示:
表4.3 圖書信息表
管理員信息表
描述管理工作人員的基本信息,具體字段類型如表4.4所示:
表4.4 管理員信息表
訂單項(xiàng)表
該表主要描述了買家全部訂單的明細(xì)信息,具體字段類型如表4.5所示:
表4.5 訂單項(xiàng)表
訂單表
描述了用戶購買圖書產(chǎn)生的訂單條目,包括訂單id、書籍總價(jià)、訂單是否被處理、用戶昵稱、訂單產(chǎn)生時(shí)間等,具體字段類型如下表4.6所示: 表4.6 訂單信息表
5 系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 在經(jīng)過上邊對這個(gè)系統(tǒng)的一連串必要步驟進(jìn)行完之后,現(xiàn)在正式開始系統(tǒng)的詳細(xì)設(shè)計(jì)階段,也就是程序編碼過程。需求分析確定了系統(tǒng)的所有功能,系統(tǒng)設(shè)計(jì)階段確定了所用到的技術(shù)以及結(jié)合自己我會(huì)不會(huì)該技術(shù),然后數(shù)據(jù)庫設(shè)計(jì)階段確定了在該階段我要把數(shù)據(jù)以怎樣的形式存起來,詳細(xì)設(shè)計(jì)是系統(tǒng)從分析到實(shí)現(xiàn)、從邏輯到物理實(shí)現(xiàn)的過程,該階段是系統(tǒng)分析系統(tǒng)設(shè)計(jì)之后一重要環(huán)節(jié)。 5.1 管理員登錄頁面
1、描述:從確保本系統(tǒng)的安全性方面思量,作為管理工作者要想操作該系統(tǒng)后臺(tái)管理系統(tǒng)必需先登錄進(jìn)系統(tǒng)的后臺(tái)管理中。下圖是后臺(tái)登陸界面,界面簡潔大方。 2、運(yùn)行效果如圖5.1所示:
圖5.1 管理員登錄界面 3、功能實(shí)現(xiàn): 管理員在后臺(tái)系統(tǒng)登錄界面輸入用戶名和密碼,點(diǎn)登錄請求跳轉(zhuǎn)到后臺(tái)的action類中,在該類中進(jìn)行邏輯判斷,用戶名和密碼都對的情況下跳轉(zhuǎn)到管理主界面,其中一項(xiàng)信息錯(cuò)誤就出現(xiàn)“用戶名或密碼錯(cuò)誤”提示信息,沒有任何頁面跳轉(zhuǎn)。 登錄界面判斷輸入信息準(zhǔn)不準(zhǔn)確,不準(zhǔn)確提示錯(cuò)誤信息的部分代碼: if (adminService.checkUser(admin.getUsername(), admin.getPassword())) { getSession().put(“admin”, admin.getUsername()); return “main”; } addActionError(“用戶名或密碼不正確!”); return “l(fā)ogin”; 5.2 管理員模塊
1、描述:管理員對系統(tǒng)管理的主界面:左側(cè)頁面顯示管理員可進(jìn)行操作的四大功能,而且各個(gè)模塊都有對應(yīng)的二級(jí)子菜單來選擇具體操作。 2、運(yùn)行效果如圖5.2所示:
圖5.2 管理員主頁面 5.2.1 圖書類目管理
5.2.1.1 添加類目 1、描述:工作人員輸入類目名稱,不用輸入類別id,存入類別后id會(huì)自增。 2、運(yùn)行效果如圖5.3所示:
圖5.3 添加圖書類目 3、功能實(shí)現(xiàn): 添加類別關(guān)鍵代碼: Action層: categoryService.add(category); return “recategory”; Service層: public Integer add(Category category) { return categoryDao.save(category); } Dao層: getSession().save(object); 5.2.1.2 圖書類目列表 1、描述:管理員點(diǎn)左邊的“類目管理”菜單,下邊出現(xiàn)子菜單,點(diǎn)擊“類目列表”,調(diào)用后臺(tái)的邏輯處理類從數(shù)據(jù)庫中查找所有的圖書分類信息,右側(cè)出來所有圖書類別名稱和對應(yīng)操作。該頁面左下角點(diǎn)擊增添類目即可跳到增添類目頁面。每個(gè)類目右邊有對應(yīng)修改和刪除操作。 2、運(yùn)行效果如圖5.4所示:
圖5.4 圖書類目列表 3:實(shí)現(xiàn)代碼: categoryService.update(category); return “recategory”; 5.2.1.3 類目信息刪除 1、描述:點(diǎn)左側(cè)“類目管理”菜單,點(diǎn)擊“類目列表”,在類目列表頁面,點(diǎn)擊修改或者刪除來實(shí)現(xiàn)對應(yīng)操作。 2、運(yùn)行效果如圖5.5所示:
圖5.5 類別刪除功能 3、實(shí)現(xiàn)代碼: categoryService.delete(category); public boolean delete(Category category) { return categoryDao.delete(category); } try { getSession().delete(object); } catch (HibernateException e) 5.2.2 圖書信息管理
5.2.2.1 添加圖書 1、描述:點(diǎn)左邊“圖書管理”、“添加圖書”,在右側(cè)添加圖書信息,填寫下圖中包含的圖書信息,在此也可將圖書直接劃分到所屬的類別中,使用下拉框?qū)崿F(xiàn)。 2、運(yùn)行效果如圖5.6所示:
圖5.6 圖書信息錄入 3、代碼實(shí)現(xiàn): 在該頁面出版日期組件使用datepicker組件完成,初始日期是本天,對應(yīng)設(shè)置語句為$( “#datepicker” ).datepicker(‘setDate’, new Date()); 5.2.2.2 圖書信息列表 描述:在管理主頁面上點(diǎn)擊左邊“圖書管理”菜單,在二級(jí)子目錄中點(diǎn)擊“圖書列表”,調(diào)用后臺(tái)的邏輯處理類查找出全部的書籍信息,將封裝這些信息的collection放入請求對象中,然后帶著這些數(shù)據(jù)轉(zhuǎn)跳到響應(yīng)的
jsp
頁面,從而書籍信息展現(xiàn)在右側(cè)頁面中。
2、運(yùn)行效果如圖5.7所示:
圖5.7 圖書信息列表頁面
3、代碼實(shí)現(xiàn):
圖書管理關(guān)鍵代碼:
Action層:
bookList = bookService.getList(status, page, rows);
return “book”;
Service層:
return bookDao.getList(status, page, rows);
Dao層:
public List
圖5.8 圖書管理圖
3、代碼實(shí)現(xiàn):
[&flag=11&status=${status}&page=${page}”>設(shè)為推薦]
其他功能“設(shè)為最新”、“設(shè)為促銷”類似代碼。
修改和刪除類似。
5.2.2.4 圖書推薦列表
1、描述:點(diǎn)擊“圖書管理”,點(diǎn)擊“推薦列表”,右側(cè)出現(xiàn)的圖書均為商家對買家推薦的書籍,用戶可根據(jù)愛好需求下訂單。
2、運(yùn)行效果如圖5.9所示:
圖5.9 推薦圖書列表圖 3、代碼實(shí)現(xiàn): public String bookSet(){ book = bookService.get(id); switch (flag) { case 10: book.setSpecial(false); break; case 11: book.setSpecial(true); break; case 20: book.setNews(false); break; case 21: book.setNews(true); break; case 30: book.setSale(false); break; case 31: book.setSale(true); break; } bookService.update(book); return “rebook”; } 5.2.2.5 圖書最新列表 1、描述:點(diǎn)擊“圖書管理”,點(diǎn)擊“最新列表”,右側(cè)出現(xiàn)的圖書均為商家對買家推薦的最新書籍,用戶可根據(jù)愛好需求進(jìn)行瀏覽下訂單。 2、運(yùn)行效果如圖5.10所示:
圖5.10 最新圖書列表圖 3、代碼實(shí)現(xiàn):同上邊的推薦列表部分的代碼。 5.2.2.6 圖書促銷列表 1、描述:點(diǎn)擊“圖書管理”,點(diǎn)擊“促銷列表”,右側(cè)出現(xiàn)的圖書均為商家對買家推薦的最新書籍,用戶可根據(jù)愛好需求進(jìn)行瀏覽下訂單。 2、運(yùn)行效果如圖5.11所示:
圖5.11 促銷圖書列表圖 3、代碼實(shí)現(xiàn):同上邊的推薦列表部分的代碼。 5.2.3 用戶信息管理
5.2.3.1 用戶信息列表 1、描述:消費(fèi)者進(jìn)入該網(wǎng)站首頁就成為了該系統(tǒng)的一位用戶,管理員登錄后臺(tái)系統(tǒng)后能對注冊后的用戶信息進(jìn)行管理,點(diǎn)擊左邊欄目“用戶管理“,頁面鏈接到后臺(tái)的邏輯處理類(userAction),在這個(gè)類里邊,和數(shù)據(jù)庫打交道取出信息,把用戶信息查尋出來,進(jìn)一步輸出到響應(yīng)的jsp顯示頁面。 2、運(yùn)行效果如圖5.12所示:
圖5.12 用戶信息列表 3、關(guān)鍵代碼實(shí)現(xiàn): userList = userService.getList(page, rows); 5.2.3.2 管理員用戶添加 1、描述:管理員在后臺(tái)能增添管理員用戶,這些用戶都是系統(tǒng)保護(hù)用戶,不會(huì)被刪除。 2、運(yùn)行效果如圖5.13所示:
圖5.13 添加管理用戶圖 3、代碼實(shí)現(xiàn): if (adminService.isExist(admin.getUsername())) { addActionError(“用戶名已存在!”); return “adminadd”; } adminService.add(admin); return “readmin”; 5.2.4 訂單信息管理
5.2.4.1 訂單信息管理 1、描述:管理人員在后臺(tái)管理頁面能看到所有用戶完成的訂單,進(jìn)而對訂單進(jìn)行管理。 2、運(yùn)行效果如圖5.14所示:
圖5.14 訂單信息管理 5.2.5 退出系統(tǒng)
1、描述:點(diǎn)擊這
四個(gè)字,回到網(wǎng)站首頁。
點(diǎn)此“注銷”退出后臺(tái)系統(tǒng),返回到后臺(tái)系統(tǒng)登陸界面。 2、關(guān)鍵代碼: 網(wǎng)站首頁 注銷 5.3 普通用戶模塊
5.3.1 系統(tǒng)主頁面實(shí)現(xiàn)
1、描述:網(wǎng)站首頁界面由四部分組成:上面是關(guān)于主題書的照片以及導(dǎo)航條、搜索欄,左邊是各頁面展示的區(qū)域,右邊的上方是固定的對于網(wǎng)站書店(該書店是虛擬的)的簡介,右邊的下方是圖書的分類信息以及促銷書籍的展示,下方是固定區(qū)域顯示其他信息。 2、運(yùn)行效果如圖5.15所示:
圖5.15 網(wǎng)站主頁面設(shè)計(jì) 3、功能實(shí)現(xiàn):頁面由JSP完成,具體代碼不做展示。 5.3.2 圖書查詢
1、描述:用戶在搜索框中輸入圖書名稱查尋。調(diào)用后臺(tái)的java類search.Action查詢圖書,在顯示層jsp展示出來。 2、運(yùn)行效果如圖5.16所示:
圖5.16 類別查詢界面設(shè)計(jì) 3、功能實(shí)現(xiàn): 搜索功能關(guān)鍵代碼:
5.3.3 用戶登錄注冊
1、描述:游客能在網(wǎng)站首頁瀏覽圖書信息和書店簡介信息,想成為網(wǎng)站的一名用戶,必須通過注冊登記自己的信息,成為了用戶,在沒有登錄網(wǎng)站時(shí),能做的操作有瀏覽書籍信息,圖書查詢,分類查詢等,能把看好的書加入購物車,然則再提交訂單時(shí)必須登錄才能完成訂單的生成。 2、運(yùn)行效果如圖5.17所示:
圖5.17 用戶登錄界面設(shè)計(jì) 3、功能實(shí)現(xiàn): 普通用戶登錄關(guān)鍵代碼: public boolean checkUser(String username, String password){ return userDao.getByUsernameAndPassword(username, password); } 5.3.4 圖書分類查詢
1、描述:用戶可根據(jù)不同類別的名稱點(diǎn)進(jìn)去查找心儀圖書,這樣可減小查尋范圍。 2、運(yùn)行效果如圖5.18所示:
圖5.18 圖書分類查詢 3、功能實(shí)現(xiàn):
5.3.5 在線下單
1、描述:一般游客若沒有登錄系統(tǒng)則不能生成訂單,若登錄系統(tǒng)就可在線買書了。 2、運(yùn)行效果如圖5.19、5.20所示: 用戶沒有登錄系統(tǒng)下訂單失敗如圖5.19所示:
圖5.19 未登錄下訂單失敗 用戶登錄后下訂單
成功
如圖5.20所示:
圖5.20 登錄后下訂單成功 3、功能實(shí)現(xiàn): 判斷用戶是否在線下訂單關(guān)鍵代碼: if (getSession().get(“username”)==null || getSession().get(“username”).toString().isEmpty()) { addActionMessage(“請登錄后提交訂單!”); return “l(fā)ogin”; } 要想提交訂單只有登錄的用戶才能成功提交。以此來升高系統(tǒng)的安全性,防止用戶沒通過登錄頁面直接進(jìn)入子菜單頁面。 5.3.6 管理訂單功能
1、描述:用戶在成功登陸網(wǎng)站并完成訂單后,點(diǎn)擊
可查察所有訂單,但不能刪除已下訂單,刪除可與管理員取得聯(lián)系,因?yàn)槿粲脩艨呻S意刪除已下訂單的話,對管理員很不好處理用戶的訂單,所以設(shè)計(jì)成只能管理員單向刪除訂單。 2、運(yùn)行效果如圖5.21所示:
圖5.21 用戶查看所有訂單圖
3、功能實(shí)現(xiàn):
用戶查看所有訂單關(guān)鍵代碼:
我的訂單(
6.1 系統(tǒng)測試目的與意義
一個(gè)完整的系統(tǒng)的實(shí)現(xiàn)所經(jīng)歷的周期中非常重要和歷時(shí)最長完成的階段就是系統(tǒng)測試,本網(wǎng)上購書系統(tǒng)也不例外,確保該系統(tǒng)的方方面面的質(zhì)量和實(shí)用性是系統(tǒng)測試過程中非常重要的,是最終的系統(tǒng)實(shí)現(xiàn),包含系統(tǒng)平臺(tái)的分析、系統(tǒng)模塊的設(shè)計(jì)以及系統(tǒng)平臺(tái)完成的最后的一道程序。[9] 盡可能多的檢驗(yàn)出代碼中的錯(cuò)誤是系統(tǒng)測試環(huán)節(jié)的目的,從而增強(qiáng)系統(tǒng)的實(shí)用和可靠性,系統(tǒng)檢測的目的是測試系統(tǒng)“用戶體驗(yàn)怎么樣”。系統(tǒng)測試過程又分三階段從不同的角度測試:分別是單元測試、組裝測試、確認(rèn)測試;第一步測試每個(gè)單元模塊代碼的準(zhǔn)確性,第二步測試模塊間銜接的準(zhǔn)確性,第三步對整個(gè)軟件體系經(jīng)過調(diào)試后看是否滿足用戶功能要求和性能要求進(jìn)行測試,找出不準(zhǔn)確地方的原因和位置,然后糾正。測試的目的是想給用戶更好的體驗(yàn),讓工作人員根據(jù)不用的測試用例,不同的思路去發(fā)現(xiàn)系統(tǒng)中可能出現(xiàn)的錯(cuò)誤或者說是安全隱患,為企業(yè)的利益做到最大化。 6.2 測試過程
6.2.1 網(wǎng)站首頁用戶登錄測試
測試步驟: 1、進(jìn)入系統(tǒng)主頁面,輸入多次不同類型錯(cuò)誤的信息 2、嘗試登錄查看效果 3、最后輸入對的用戶名和密碼 4、點(diǎn)擊登錄查看效果 設(shè)計(jì)該模塊的測試用例如表6.1所示: 表6.1 主界面的登錄功能測試表
6.2.2 管理員刪除圖書信息測試
測試步驟: 1、管理員登錄后臺(tái)管理,在圖書管理中先刪除一本書籍 2、在前臺(tái)搜索欄中用關(guān)鍵字搜索圖書,看能否找到該圖書 3、查看測試結(jié)果 結(jié)論:圖書刪除的功能正常。 刪除前如圖6.1所示:
圖6.1 刪除圖書前效果圖 刪除后再搜索如圖6.2所示:
圖6.2 刪除圖書后效果圖 6.2.3 生成訂單測試
測試步驟: 1、打開系統(tǒng)網(wǎng)站首頁,不登錄時(shí)往購物車添加一本圖書,看能不能成功 2、登錄后再添加,看能不能添加成功 3、查看測試結(jié)果 結(jié)論:未登錄時(shí)用戶只能將商品添加到購物車,不能生成訂單,登錄后才能提交訂單,所以生成訂單功能正常。 效果圖如圖6.3所示:
圖6.3 未登錄提交訂單效果圖 6.2.4 其他錯(cuò)誤測試
在執(zhí)行程序的過程中肯定會(huì)產(chǎn)生種種不可預(yù)知的錯(cuò)誤,好比說寫入錯(cuò)誤,值類型不匹配,參數(shù)的傳遞等問題。這些不僅需要仔細(xì)的測試,而且需要連續(xù)調(diào)試去解決掉。例如,當(dāng)由于粗心錯(cuò)誤導(dǎo)致的action路徑配置錯(cuò)誤引起的操作時(shí),如圖6.4所示:
圖 6.4 action路徑配置錯(cuò)誤,運(yùn)行出現(xiàn)的提示 7 系統(tǒng)的運(yùn)行和維護(hù) 作為現(xiàn)代化的軟件,它首先應(yīng)該有良好的界面,使用方便的特點(diǎn);在性能方面,要求他速度快、存儲(chǔ)數(shù)據(jù)容量大、方便操作等特點(diǎn)且CPU處理數(shù)據(jù)的速率要快。由于以上出發(fā)點(diǎn),本次系統(tǒng)開發(fā)的工具,使用了Java語言,MySQL 數(shù)據(jù)庫,Tomcat服務(wù)器。軟件開發(fā)行業(yè),只有系統(tǒng)具有穩(wěn)定性操作以及系統(tǒng)的吞吐量足夠好,才是一款優(yōu)秀的軟件應(yīng)用。在此基礎(chǔ)上,還應(yīng)該做好用戶的維護(hù)。在整個(gè)軟件體系使用期間,一直都進(jìn)行的一件工作就是系統(tǒng)維護(hù),確保系統(tǒng)能正常運(yùn)行和管理是系統(tǒng)維護(hù)的主要目的。[5] 系統(tǒng)運(yùn)行正??煽?,可以使系統(tǒng)持續(xù)改善,從而使它充分展現(xiàn)其作用,以下兩類是系統(tǒng)維護(hù)的主要分類:對數(shù)據(jù)庫的維護(hù)和代碼維護(hù)。前者主要對數(shù)據(jù)庫安全方面和數(shù)據(jù)完整性還有事務(wù)的并發(fā)進(jìn)行負(fù)責(zé)和控制,當(dāng)需要往數(shù)據(jù)庫中增加信息時(shí),管理員對相關(guān)數(shù)據(jù)進(jìn)行更改,最重要的是當(dāng)有某些不可抗因素導(dǎo)致數(shù)據(jù)會(huì)丟失時(shí),要及時(shí)對數(shù)據(jù)進(jìn)行備份和恢復(fù);后者的維護(hù),社會(huì)在進(jìn)步,人們的思想在更新,還有業(yè)務(wù)需求的變動(dòng)使軟件體系都會(huì)做出相應(yīng)變動(dòng),系統(tǒng)代碼會(huì)相應(yīng)增長、刪除還有增加新的模塊。 結(jié)論
現(xiàn)在網(wǎng)上銷售書籍平臺(tái)的優(yōu)勢有很多,所以更多的人在網(wǎng)上購買或者在網(wǎng)絡(luò)上開自己的店銷售物品,該系統(tǒng)是自己練習(xí)鍛煉的一個(gè)項(xiàng)目,在老師、實(shí)習(xí)同事們和同學(xué)們的幫助下讓我能完成現(xiàn)在的系統(tǒng),讓我充分了解了專業(yè)知識(shí),雖然基本功能已有,但是系統(tǒng)還有很多不足的地方,比如網(wǎng)上支付和書籍發(fā)貨以及物流跟蹤功能,這些功能還需要我繼續(xù)學(xué)習(xí)。 本系統(tǒng)主要模塊是前臺(tái)針對用戶的購書平臺(tái)和后臺(tái)針對管理員管理系統(tǒng)的平臺(tái)。前臺(tái)主要實(shí)現(xiàn)了圖書信息瀏覽、虛擬書店介紹展示,用戶注冊登錄、增添圖書到購物車、生成訂單等功能;后臺(tái)模塊主要實(shí)現(xiàn)了管理員管理用戶、管理圖書信息、管理訂單信息、圖書類別管理功能。層次分明、操作簡單,用戶和管理員能方便舒適的使用該系統(tǒng)。 參考文獻(xiàn)
[1]鄭阿奇.JSP實(shí)用教程.電子工業(yè)出版社,2008 [2] 飛思科技產(chǎn)品研發(fā)中心. JSP應(yīng)用開發(fā)詳解(第二版) [M]. 北京:電子工業(yè)出版社,2004 [3] 吳以欣,陳小寧.JavaScript腳本程序設(shè)計(jì)[M]. 北京:人民郵電出版社,2005 [4] 薩師煊,王珊.數(shù)據(jù)庫系統(tǒng)概論(第五版)[M]. 北京:高等教育出版社,2014 [5]孫衛(wèi)琴,李洪成.Tomcat與Java Web開發(fā)技術(shù)詳解[M]. 北京:電子工業(yè)出版社,2004 [6]?
劉中兵
,
李伯華
,
鄒晨
.
JSP數(shù)據(jù)庫項(xiàng)目案例導(dǎo)航
.清華大學(xué)出版社,2006. [7] 劉長生,謝強(qiáng),丁秋林.Java應(yīng)用中的漢字亂碼問題分析[J]. 計(jì)算機(jī)技術(shù)與發(fā)展,2006,16(1):158-161 [8] Tsui,F(xiàn)rank F. JSP EM DASH A RESEARCH SIGNAL PROCESSOR IN JOSEPHSON TECHNOLOGY[C]. IBM Journal of Research and Development,Vol24, No2,1980:243-252 [9] Sanden, Bo. SYSTEMS PROGRAMMING WITH JSP:EXAMPLE – A VDU [10] Mark Wutka,Alan Moffet,Kunal Mittal.Sams Teach Yourself JAVAServer Pages 2.0 with Apache Tomcat in 24 Hours[M].Sams Publishing,2003 [14]James Turner,Kevin Bedell. Struts Kick Start[M]. SAMS,2004 [15] Kong Michael. An environment for secure SQL/Server computing [M].Oxford University Press Inc., 1993: 149 致謝 我的畢業(yè)設(shè)計(jì)和論文是在老師的指導(dǎo)下完成進(jìn)行的,老師將其學(xué)生拉入一個(gè)QQ群,會(huì)集中處理我們的問題,認(rèn)真負(fù)責(zé)有耐心,非常感謝老師對我的指導(dǎo)。 感謝上海杰普老師在畢業(yè)設(shè)計(jì)期間給我的幫助,王老師有事情會(huì)給我打電話及時(shí)解決問題,感謝老師。 感謝我的同事和同學(xué)對我的關(guān)心和幫助。 附錄:外文原文 Hibernate In Action Retrieving objects Retrieving persistent objects from the database is one of the most interesting (andcomplex) parts of working with Hibernate. Hibernate provides the following waysto get objects out of the database: ●Navigating the object graph, starting from an already loaded object,byaccessingtheassociatedobjectsthrough property accessor methods such as a User.getAddress().getCity().Hibernate will automatically load (or preload)nodes of the graph while you navigate the graph if the Session is open. ●Retrieving by identifier, which is the most convenient and performant method when the uniqueidentifier value of an object is known. ●Using the Hibernate Query Language (HQL), which is a full object-orientedquerylanguage. ●Using the, Hibernate Criteria API, which provides a type-safe and objectoriented way to perform queries without the need for string manipulation.This facility includes queries based on an example object. ●Using native SQL queries, where Hibernate takes care of mapping the JDBC result sets to graphs of persistent?
http://objects.In
?your Hibernateapplications, you’ll use a combination of these techniques.Each retrieval method may use a different fetching strategy—that is, a strategy that defines what part of the persistent object graph should be retrieved. The goal is to find the best retrieval method and fetching strategy for every use case in your application while at the same time minimizing the number of SQL queries for best performance. We won’t discuss each retrieval method in much detail in this section; instead we’ll focus on the basic fetching strategies and how to tune Hibernate mapping files for best default fetching for all methods. Before we look at the fetchingstrategies,we’ll give an overview of the retrieval methods. (We mention the Hibernate caching system but fully explore it in the next chapter.)Let’s start with the simplest case, retrieval of an object by giving its identifier value (navigating the object graph should self-explanatory). You saw a simple retrieval by identifier earlier in this chapter, but there is more to know about it. Retrieving objects by identifier The following Hibernate code snippet retrieves a User object from the database: User user = (User) session.get(User.class, userID);The get() method is special because the identifier uniquely identifies a single;instance of a class. Hence it’s common for applications to use the identifier as aconvenient handle to a persistent object. Retrieval by identifier can use the cachewhen retrieving an object, avoiding a database hit if the object is already cached.Hibernate also provides a load() method:User user = (User) session.load(User.class, userID); The load() method is older; get() was added to Hibernate’s API due to userrequest. The difference is trivial: ●If load() can’t find the object in the cache or database, an exception isthrown. The load() method never returns null. The get() method returnsnull if the object can’t be found. ●The load() method may return a proxy instead of a real persistent instance.A proxy is a placeholder that triggers the loading of the real object when it’s accessed for the first time; we discuss proxies later in this section. On the other hand, get() never returns a proxy.Choosing between get() and load() is easy: If you’re certain the persistentobject exists, and nonexistence would be considered exceptional, load() is a good option. If you aren’t certain there is a persistent instance with the given identifier, use get() and test the return value to see if it’s null. Using load() has a further implication: The application may retrieve a valid reference (a proxy) to a persistent instance without hitting the database to retrieve its persistent state. So load() might not throw an exception when it doesn’t find the persistent object in the cache or database; the exception would be thrown later, when the proxy is accessed. Of course, retrieving an object by identifier isn’t as flexible as using arbitrary queries Introducing HQL The Hibernate Query Language is an object-oriented dialect of the familiar relational query language SQL. HQL bears close resemblances to ODMG OQL andEJB-QL; but unlike OQL, it’s adapted for use with SQL databases, and it’s much more powerful and elegant than EJB-QL (However, EJB-QL 3.0 will be very similar to HQL.) HQL is easy to learn with basic knowledge of SQL. HQL isn’t a data-manipulation language like SQL. It’s used only for object retrieval, not for updating, inserting, or deleting data. Object state synchronization is the job of the persistence manager, not the developer. Most of the time, you’ll only need to retrieve objects of a particular class and restrict by the properties of that class. For example, the following query retrieves a user by first name: Query q = session.createQuery(“from User u where u.firstname = :fname”); q.setString(“fname”, “Max”); List result = q.list(); After preparing query q, we bind the identifier value to a named parameter, fname.The result is returned as a List of User objects. HQL is powerful, and even though you may not use the advanced features all the time, you’ll need them for some difficult problems. For example, HQL supports the following: ●The ability to apply restrictions to properties of associated objects related by reference or held in collections (to navigate the object graph using query language). ●The ability to retrieve only properties of an entity or entities, without the overhead of loading the entity itself in a transactional scope. This is sometimes called a report query; it’s more correctly called projection. ●The ability to order the results of the query. ●The ability to paginate the results. ●Aggregation with group by, having, and aggregate functions like sum, min, and max. ●Outer joins when retrieving multiple objects per row. ●The ability to call user-defined SQL functions. ●Subqueries (nested queries). Query by criteria The Hibernate query by criteria (QBC) API lets you build a query by manipulating criteria objects at runtime. This approach lets you specify constraints dynamically without direct string manipulations, but it doesn’t lose much of the flexibility or power of HQL. On the other hand, queries expressed as criteria are often less readable than queries expressed in HQL. Retrieving a user by first name is easy using a Criteria object: Criteria criteria = session.createCriteria(User.class); criteria.add( Expression.like(“firstname”, “Max”) ); List result = criteria.list(); A Criteria is a tree of Criterion instances. The Expression class provides static factory methods that return Criterion instances. Once the desired criteria tree is built, it’s executed against the database. Many developers prefer QBC, considering it a more object-oriented approach. They also like the fact that the query syntax may be parsed and validated at compile time, whereas HQL expressions aren’t parsed until runtime. The nice thing about the Hibernate Criteria API is the Criterion framework. This framework allows extension by the user, which is difficult in the case of a query language like HQL Query by example As part of the QBC facility, Hibernate supports query by example (QBE). The idea behind QBE is that the application supplies an instance of the queried class with certain property values set (to nondefault values). The query returns all persistent instances with matching property values. QBE isn’t a particularly powerful approach, but it can be convenient for some applications. The following code snippet demonstrates a Hibernate QBE: User exampleUser = new User(); exampleUser.setFirstname(“Max”); Criteria criteria = session.createCriteria(User.class); criteria.add( Example.create(exampleUser) ); List result = criteria.list(); A typical use case for QBE is a search screen that allows users to specify a range of property values to be matched by the returned result set. This kind of functionality can be difficult to express cleanly in a query language; string manipulations would be required to specify a dynamic set of constraints. Both the QBC API and the example query mechanism are discussed in more detail in chapter 7. You now know the basic retrieval options in Hibernate. We focus on the strategies for fetching object graphs in the rest of this section. A fetching strategy defines what part of the object graph (or, what subgraph) is retrieved with a query or load operation. Fetching strategies In traditional relational data access, you’d fetch all the data required for a particular with a single SQL query, taking advantage of inner and outer joins to retrieve related entities. Some primitive ORM implementations fetch data piecemeal, with many requests for small chunks of data in response to the application’s navigating a graph of persistent objects. This approach doesn’t make efficient use of the relational database’s join capabilities. In fact, this data access strategy scales poorly by nature. One of the most difficult problems in ORM—probably the most difficultis providing for efficient access to relational data, given an applicationthat prefers to treat the data as a graph of objects. For the kinds of applications we’ve often worked with (multi-user, distributed, web, and enterprise applications), object retrieval using many round trips to/from the database is unacceptable. Hence we argue that tools should emphasize the R in ORM to a much greater extent than has been traditional. The problem of fetching object graphs efficiently (with minimal access to the database) has often been addressed by providing association-level fetching strategies specified in metadata of the association mapping. The trouble with this approach is that each piece of code that uses an entity requires a different set of associated objects. Butthis isn’t enough. We argue that what is needed is support forfine-grained runtime association fetching strategies. Hibernate supports both, it lets you specify a default fetching strategy in the mappingfile and then override it at runtime in code. Hibernate allows you to choose among four fetching strategies forany association, in association metadata and at runtime: ●Immediate fetching—The associated object is fetched immediately, using a sequential database read (or cache lookup). ●Lazy fetching—The associated object or collection is fetched “l(fā)azily,” when it’s first accessed. This results in a new request to the database (unless the associated object is cached). ●Eager fetching—The associated object or collection is fetched together with the owning object, using an SQL outer join, and no further database requestis required. ●Batch fetching—This approach may be used to improve the performance of lazy fetching by retrieving a batch of objects or collections when a lazy association is accessed. (Batch fetching may also be used to improve the performance of immediate fetching.) Let’s look more closely at each fetching strategy. Immediate fetching Immediate association fetching occurs when you retrieve an entity from the database and then retrieve another associated entity or entities in a further request to the database or cache. Immediate fetching isn’t usually an efficient fetching strategy unless you expect the associated entities to almost always be cached already. Lazy fetching When a client requests an entity and its associated graph of objects from the database, it isn’t usually necessary to retrieve the whole graph of every (indirectly) associated object. You wouldn’t wantto load the whole database into memory at once; for example, loading a single Category shouldn’t trigger the loading of all Items inthat category. Lazy fetching lets you decide how much of the object graph is loaded in the first database hit and which associations should be loaded only when they’re first accessed. Lazy fetching is a foundational concept in object persistence and the first step to attaining acceptable performance. We recommend that, to start with, all associations be configured for lazy (or perhaps batched lazy) fetching in the mapping file. Thisstrategy may then be overridden at runtime by queries that force eager fetching to occur. Eager (outer join) fetching Lazy association fetching can help reduce database load and is often a good default strategy. However, it’s a bit like a blind guessas far as performance optimization goes. Eager fetching lets you explicitly specify which associated objects should be loaded together with the referencing object.Hibernatecan then return the associated objects in a single database request,utilizing an SQL OUTER JOIN. Performance optimization in Hibernate often involves judicious use of eager fetching for particular transactions.Hence, even though default eager fetching may be declared in the mapping file, it’s more common to specify the use of this strategyat runtime for a particular HQL or criteria query. Batch fetching Batch fetching isn’t strictly an association fetching strategy; it’s a technique that mayhelp improve the performance of lazy (or immediate) fetching. Usually,when you load an object or collection, your SQL WHERE clause specifies the identifier of the object or object that owns the collection.If batch fetching is enabled, Hibernate looks to see what other proxied instances or uninitialized collections are referenced in the current session and tries to load them at the same time by specifying multiple identifier values in the WHERE clause. We aren’t great fans of this approach; eager fetching is almostalways faster. Batch fetching is useful for inexperienced users who wish to achieve acceptable performance in Hibernate without having to think too hard about the SQL that will be executed. (Note that batch fetching may be familiar to you, since it’s used by many EJB2engines.) We’ll now declare the fetching strategy for some associations inour mapping metadata. Struts——An Open-source MVC Implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control change in your Web project and promote specialization. Even if you never implement a system with Struts, you may get some ideas for your future servlets and JSP page implementation Introduction Kids in grade school put HTML pages on the Internet. However, there is a monumental difference between a grade school page and a professionally developed Web site. The page designer (or HTML developer) must understand colors, the customer, product flow, page layout, browser compatibility, image creation, JavaScript, and more. Putting a great looking site together takes a lot of work, and most Java developers are more interested in creating a great looking object interface than a user interface. JavaServer Pages (JSP) technology provides the glue between the page designer and the Java developer. If you have worked on a large-scale Web application, you understand the term change. Model-View-Controller (MVC) is a design pattern put together to help control change. MVC decouples interface from business logic and data. Struts is an MVC implementation that uses Servlets 2.2 and JSP 1.1 tags, from the J2EE specifications, as part of the implementation. You may never implement a system with Struts, but looking at Struts may give you some ideas on your future Servlets and JSP implementations. Model-View-Controller (MVC) JSP tags solved only part of our problem. We still have issues with validation, flow control, and updating the state of the application. This is where MVC comes to the rescue. MVC helps resolve some of the issues with the single module approach by dividing the problem into three categories: Model The model contains the core of the application’s functionality. The model encapsulates the state of the application. Sometimes the only functionality it contains is state. It knows nothing about the view or controller. View The view provides the presentation of the model. It is the look of the application. The view can access the model getters, but it has no knowledge of the setters. In addition, it knows nothing about the controller. The view should be notified when changes to the model occur. Controller The controller reacts to the user input. It creates and sets the model. Struts details Displayed in Figure 6 is a stripped-down UML diagram of the org.apache.struts.action package. Figure 6 shows the minimal relationships among ActionServlet (Controller), ActionForm (Form State), and Action (Model Wrapper). The ActionServlet class Do you remember the days of function mappings? You would map some input event to a pointer to a function. If you where slick, you would place the configurationinformation into a file and load the file at run time. Function pointer arrays were the good old days of structured programming in C. Life is better now that we have Java technology, XML, J2EE, and all that. The Struts Controller is a servlet that maps events (an event generally being an HTTP post) to classes. And guess what — the Controller uses a configuration file so you don_t have to hard-code the values. Life changes, but stays the same. ActionServlet is the Command