java畢業(yè)論文范文5篇(2)
java畢業(yè)論文范文篇三:
XX 大 學
畢業(yè)設計(論文)
題目: 基于Java技術的網(wǎng)上交易系統(tǒng)的開發(fā)
學 院:
專 業(yè):
班 級:
學 號: xxx
學生姓名: xx
指導老師: xx
2009年6月9日
摘 要
隨著信息高速公路的建立,Internet的普及,網(wǎng)絡技術的迅猛發(fā)展,人類社會已經(jīng)進入了一個信息化社會。
電子商務指利用簡單、快捷、低成本的電子通訊方式,買賣雙方通過網(wǎng)絡進行各種商貿(mào)活動的一種商業(yè)交易模式。隨著互聯(lián)網(wǎng)的發(fā)展,以及人們消費觀念和生活方式的改變,這種新型的商業(yè)模式逐漸融入了人們的生活中。通過企業(yè)的門戶網(wǎng)站,人們可以足不出戶的尋找自己所需的物品,通過對不同虛擬商城的訪問,“顧客”可以找出性價比最高的商品,自己有極大地選擇空間;通過下訂單,你可以很快得到自己想要的物品,這給顧客節(jié)省很多時間和精力;對于廠家來說,可以極大地降低庫存風險,可根據(jù)客戶需要,按需采購和生產(chǎn),大大地提高了效益。
本畢業(yè)設計的內(nèi)容是設計并且實現(xiàn)一個基于web技術的在線交易系統(tǒng)。系統(tǒng)主要以j2EE作為開發(fā)基礎,使用了struts+spring+hibernate等多種協(xié)議或技術,用eclipse作為開發(fā)工具,以Macromedia公司的Dreamweaver作為界面美化工具。基本實現(xiàn)了網(wǎng)上交易系統(tǒng)應有的主要功能模塊,包括:管理員的登錄,管理和維護;用戶注冊、登錄、注銷,個人信息的查詢、修改;商品管理,購物車管理,訂單管理。該系統(tǒng)界面簡單、操作方便,容易維護。
關鍵詞:電子商務 j2EE struts + spring + hibernate
Development of an Online Trading System Based on Java Technology
Abstract
With the establishment of high way of information, the popularization of Internet and the rapid development of network technology, human society has entered a society of information.
E-commerce is a new business transaction, through which both buyers and sellers can use a simple, fast and low-cost means of electronic and communication. With the development of the Internet, and people's consumption idea and the way of life changing, this new business model has gradually integrated into people's lives. Through the portal site of enterprise, people can look up the goods which they required without going out; through the different virtual mall visit, people can find the most cost-effective products, and they have much self-choice; through orders, people can find the things which they need, and quickly get the products which they ordered. This new business modle can save a lot of time and energy for custormers, and greatly reduce inventory risk of manufaturers. The manufactures can procure and produce according to customer needs, this was called on-demand procurement and production, which greatly improved the efficiency.
The subject of this graduation project is designing a web-based online trading system. This system mainly uses j2EE as the basis of development, and also use the struts + spring + hibernate technologies and other orders. This project use eclipse as the development tools, and Macromedia's Dreamweaver as the interfaces landscaping tools. The basic functions of an online trading system have been implemented, which include administrator login, management and maintenance; user registration, login, write-offs personal information enquiries and amendments; commodity management, cart management, order management. Interface of the system is simple, it can be used and maintained easily.
Key words: E-commerce j2EE struts + spring + hibernate
6
目錄
摘 要
Abstract
第一章 引言
1.1 課題背景
1.2 課題目的和意義
1.3 本文結構
第二章 系統(tǒng)應用的關鍵技術
2.1 JSP技術介紹
2.1.1 JSP的概述
2.1.3 JSP的強勢與劣勢
2.1.4 JSP與ASP的比較
2.2 Java組件JavaBeans
2.2.1 什么是JavaBeans
2.2.2 JSP與JavaBeans的關系
2.3 J2EE概述
2.4關于Struts
2.4.1 Struts簡介
2.4.2 Struts的主要功能
2.5 關于Spring
2.5.1 Spring簡介
2.5.2 為什么需要Spring
2.5.3 Spring帶給我們什么
2.6 關于Hibernate
2.6.1為什么引入hibernate
2.6.2使用Hibernate的好處
2.6.3 Hibernate的工作原理
2.7 Mysql
2.7.1 mysql的特點
2.7.2 mysql的安裝和配置(部分截圖)
2.8 Tomcat服務器
2.8.1 Tomcat 服務器簡介
2.8.2 Tomcat的特點
2.8.3 Tomcat的優(yōu)勢
2.8.4 Tomcat服務器的安裝和配置
小結
第三章 系統(tǒng)需求分析和總體設計
3.1 系統(tǒng)功能需求
3.2 系統(tǒng)角色及其功能分析
3.2.1 系統(tǒng)的3個角色:
3.2.2 系統(tǒng)角色的功能
3.3 總體設計思想概述
3.4 數(shù)據(jù)庫設計
3.4.1 E-R圖
3.4.2數(shù)據(jù)表的設計
3.5 系統(tǒng)的類設計
3.5.1 DAO類設計
3.5.2 POJO類設計(部分)
3.5.3 過濾器類設計
3.5.4 監(jiān)聽器類設計
3.6系統(tǒng)的用例圖
3.6.1 總體用例分析
3.6.2 用戶管理用例分析
3.6.3 購物車管理用例分析
小結
第四章 系統(tǒng)的詳細設計
4.1 數(shù)據(jù)庫與POJO映射的實現(xiàn)
4.2 主要模塊的設計說明與界面
4.2.1用戶管理模塊
4.2.2購物車管理模塊
4.2.3 定單模塊
4.3 系統(tǒng)的測試
小結
第五章 總結與展望
5.1 工作總結
5.2 后續(xù)工作展望
參考文獻
附錄
致謝
第一章 引言
1.1 課題背景
隨著當今世界進入信息時代,Internet的飛速發(fā)展和在全球的普及給人類生活帶來革命性的改變。Internet將傳統(tǒng)意義上的物理空間轉(zhuǎn)變成電子空間,把人們帶入了一個網(wǎng)絡社會中。網(wǎng)絡時代的到來,帶給人們的不只是快捷、方便,它帶來的是劃時代的進步。在網(wǎng)絡大家族中,電子商務則是一個熱點,它的發(fā)展速度之快遠遠超過我們的想象,普及速度之快令人難以置信。我們完全有理由相信,全球性的電子商務熱潮必將一浪高于一浪[1]。
電子商務一個最基本體現(xiàn)就是電子購物網(wǎng)站,從一定程度上講它就是網(wǎng)上超市,也就是一種網(wǎng)上交易。“網(wǎng)”字意味著它具有信息時代的快捷方便等特征。事實上電子商務的出現(xiàn),給消費者的地位,消費觀念帶來了重要的變化。網(wǎng)上交易系統(tǒng)正是應這種變化而悄然崛起,并以驚人的速度發(fā)展著。通過網(wǎng)上交易系統(tǒng),人們可以足不出戶的尋找自己所需的物品,通過對不同虛擬商城的訪問,“顧客”可以找出性價比最高的商品,自己有極大地選擇空間,通過下訂單,你可以很快得到自己想要的物品,這給顧客節(jié)省很多時間和精力,對于廠家來說,可以極大的降低庫存風險,根據(jù)客戶需要,按需生產(chǎn)和采購,大大的提高了效益。
1.2 課題目的和意義
自從電子商務出現(xiàn)在人們的視野中,電子商務就在全世界范圍內(nèi)受到了格外的關注,并得到了迅速的發(fā)展。從實用角度看,目前電子商務網(wǎng)站的普遍存在是購買者難以找到所希望購買的商品甚至用戶在耗費很大的經(jīng)歷與時間后即使找到了自己想要的產(chǎn)品,最后卻由于各種原因而放棄購買。很多報道指出,推銷商們普遍對目前的網(wǎng)絡行銷感到失望,盡管如此,電子商務無疑是目前最好的在線商品展示的媒體和工具。然而,網(wǎng)上產(chǎn)品展示的目的不僅僅是展示產(chǎn)品,而更重要的是通過讓客戶更多地了解產(chǎn)品而提高產(chǎn)品的購買率。因此,電子商務目前所面臨的挑戰(zhàn)之一就是網(wǎng)站的設計,如何使得網(wǎng)頁能夠有效地展示自己的產(chǎn)品,同時方便用戶的使用,使用戶以愉悅的心情選購稱心如意的商品。
本系統(tǒng)的目的和意義就是應上述挑戰(zhàn)而嘗試為用戶提供一個操作簡單方便的網(wǎng)上交易系統(tǒng)。利用本系統(tǒng),用戶可以自由地瀏覽商品,注冊成為網(wǎng)站會員,選擇商品加入自己的購物車,而后生成訂單,實現(xiàn)網(wǎng)上購物。
1.3 本文結構
本文共分五個章節(jié),系統(tǒng)地闡述了系統(tǒng)開發(fā)的全過程。
第一章,主要介紹了開發(fā)的背景、目的和意義。
第二章,主要介紹了本系統(tǒng)所用到的關鍵技術和工具,為下一步的設計的設計奠定基礎。
第三章,主要對系統(tǒng)進行需求分析并進行總體設計。需求分析階段通過分析系統(tǒng)的功能模塊的劃分以及角色的劃分,為系統(tǒng)的總體設計提供依據(jù)??傮w設計階段通過對數(shù)據(jù)庫、過濾器、監(jiān)聽器、和實體類的設計,以及各個模塊用例圖的描述,形成了開發(fā)的整體思路。
第四章,主要介紹了主要模塊的設計與實現(xiàn),并給出關鍵源代碼和最終的效果圖。
第五章,主要是對這次畢業(yè)設計的總結和對后續(xù)工作的展望。
第二章 系統(tǒng)應用的關鍵技術
2.1 JSP技術介紹
2.1.1 JSP的概述
JSP(Java Server Pages)是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術標準,類似于其他技術標準,如ASP,PHP等,主要用于開發(fā)動態(tài)網(wǎng)頁內(nèi)容。
JSP是新一代的動態(tài)內(nèi)容編程技術,它繼承了Java技術的“一次編寫,隨處運行”的特性,允許Web開發(fā)人員開發(fā)和維護與平臺無關,信息豐富動態(tài)的Web頁面,包括HTML,DHTML,XHTML和XML,它能使Web開發(fā)人員輕易搭建網(wǎng)絡平臺,建立起功能強大的Web網(wǎng)站。JSP可以把用戶界面從內(nèi)容層次中分離出來,使得Web開發(fā)人員不必修改在底層的動態(tài)內(nèi)容,就可以修改整體的頁面布局。
2.1.2 JSP的運行機制
JSP文檔被復制到Web服務器的文檔目錄中。當有人請求這個文檔時,服務器識別出這個帶有.jsp擴展名的文檔,并意識到需要做特殊處理。第一次請求這個文檔時,它被編譯成一個servlet對象,并存儲在內(nèi)存中,然后輸出內(nèi)容回送給發(fā)出請求的客戶機。第一請求之后,只要有請求到來,服務器將進行檢查,看看這個文件是否做過改動,如果沒有變化,服務器調(diào)用先前編譯過的servlet對象。
JSP請求的步驟[2]如圖2-1所示。
(1)客戶機請求一個JSP頁面。
(2)JSP引擎編譯該JSP成一個servlet。
Web
瀏覽器
JSP頁面
生成的servlet
編譯的servlet
Web服務器
2.第一次編譯
3.第二次編譯
1.請求
4.響應
圖2-1 一個JSP的請求步驟
(3)生成的servlet被編譯并裝載。
(4)編譯的servlet服務請求并把一響應發(fā)送回客戶機。
JSP主要是針對Java程序處理不熟悉的人設計的。與Servlet相比,JSP有如下兩個優(yōu)勢:方便與HTML混合;在開發(fā)、測試方面比Servlet方便。
2.1.3 JSP的強勢與劣勢
JSP的強勢:
(1)可移植性。JSP是用Java開發(fā)的,因此它是可移植的,可以一處編寫,隨處運行,支持多平臺。
(2)有效性。JSP的初始化代碼僅在Web服務器第一次加載時執(zhí)行一次。一旦加載,在處理一個新的請求時,只須調(diào)用一個新的服務方法。與處理每個請求都要全部加載一個完整的可執(zhí)行程序相比,這是一個相當有效的技術。
(3)強大的可伸縮性和可擴充性。它能夠在面向?qū)ο蟮恼Z言(Java)中進行開發(fā),并可以在現(xiàn)有對象基礎上進行擴展,形成新的對象,從而更好地滿足用戶的需求。
(4)多樣化和功能強大的開發(fā)工具支持。Java已經(jīng)有了許多非常優(yōu)秀的開發(fā)工具,而且許多可以免費得到,并且其中許多已經(jīng)可以順利的運行于多種平臺之下。
(5)Java Servlet是一種開發(fā)Web應用的理想框架。JSP以Servlet技術為基礎,又在許多方面作了改進。利用跨平臺的JavaBeans組件,JSP為分離處理邏輯與顯示樣式提供了卓越的解決方案。
JSP的劣勢:
(1)為了跨平臺的功能,為了極度的伸縮能力,極大的增加了產(chǎn)品的復雜性,Java系統(tǒng)中包括JRE,JDK,J2EE,EJB等多種產(chǎn)品,這就需要大量的學習和培訓才能掌握它們,將它們有效地搭配在一起,靈活地加以運用。
(2)Java的運行速度快是由于用戶將class常駐內(nèi)存,這樣使用的內(nèi)存空間就比較大。另一方面,它還需要硬盤空間來存儲一系列.Java文件和.class文件以及對應的版本文件。
(3)JSP只有對Java相當熟悉的人才能用得很好。
(4)JSP程序調(diào)試困難。
2.1.4 JSP與ASP的比較
JSP與ASP(Active Server Page)兩者都是常用的動態(tài)網(wǎng)頁技術,也都是可以嵌入HTML中的程序,但兩者是有著本質(zhì)的不同,主要從以下幾個方面對其進行比較:
(1)Web服務器的支持:大多數(shù)通用的 Web服務器如:Apache、Netscape和Microsoft IIS都支持JSP頁面,只有微軟本身的Microsoft IIS和Personal Web Server可以支持ASP。
(2)平臺的支持:JSP具有平臺獨立性,只要是一般的Java程序可以運行的平臺,都支持JSP程序。Windows平臺可以很好的支持ASP,但ASP對于基于Win32逐漸模型的依賴,使得它難于一直到其它平臺上。
(3)組件模型:JSP是建立在可重用的、跨平臺的組件(如:JavaBeans、Enterprises JavaBeans和用戶定制的標簽庫等組件)之上的,而ASP使用的是基于Win32的COM組件模型。
(4)腳本語言:JSP可以使用Java編程語言或JavaScript作為腳本語言,而ASP使用VBScript或Jscript作為腳本語言。
(5)安全性:JSP使用Java安全模型,而ASP使用Windows NT的安全結構。
(6)與Access數(shù)據(jù)庫的連接:JSP使用JDBC建立與Access數(shù)據(jù)庫的連接,而ASP對Access數(shù)據(jù)庫使用Data Active Objects。
(7)用戶定制的標簽:JSP可以使用用戶定制標簽庫進行擴充,而ASP中沒有用戶定制標簽庫,ASP是不能擴充的[3]。
2.2 Java組件JavaBeans
2.2.1 什么是JavaBeans
JavaBeans事實上有三層含義。首先,JavaBeans是一種規(guī)范,一種在Java(包括JSP)中使用可重復使用的Java組件的技術規(guī)范。其次,JavaBeans是一個Java的類,一般來說,這樣的Java類將對應于一個獨立的.java文件,在絕大多數(shù)情況下,這應該是一個public類型的類。最后,當JavaBeans這樣的一個Java類在我們的具體的Java程序中被示例之后,我們有時也會將這樣的一個JavaBeans的實例稱之為JavaBeans[4]。
2.2.2 JSP與JavaBeans的關系
使用JSP技術,Web頁面開發(fā)人員可以使用HTML和XML標識來設計和格式化最終頁面。使用JSP標識或者小腳本生成頁面上的動態(tài)內(nèi)容。生成內(nèi)容的邏輯被封裝在JSP標識和JavaBeans組件中,并且捆綁在小腳本中,所有的腳本在服務器端運行。核心邏輯封裝在標識和Beans中,可以方便頁面設計者編輯和使用JSP頁面。
在服務器端,JSP引擎解釋JSP標識和小腳本生成所請求的內(nèi)容(例如,通過訪問JavaBeans組件,使用JDBC技術訪問數(shù)據(jù)庫),并且將結果以HTML(或XML)頁面的形式發(fā)送回瀏覽器。
絕大多數(shù)JSP頁面依賴于可重用的跨平臺的足見(JavaBeans或者Enterprise JavaBeans組件)來執(zhí)行應用程序所要求的復雜的處理。這樣的好處是開發(fā)人員能夠共享和交換執(zhí)行普通操作的組件,加速了總體開發(fā)過程。因此,基于Web的較為復雜的應用程序(如電子商務網(wǎng)站或網(wǎng)上MIS),JSP的復雜架構必須由JavaBeans達成。
2.3 J2EE概述
J2EE(Java 2 Platform Enterprise Edition)是使用Java技術開發(fā)企業(yè)級應用的一種事實上的工業(yè)標準(Sun公司出于其自身利益的考慮,至今沒有將Java及其相關技術納入標準化組織的體系),它是Java技術不斷適應和促進企業(yè)級應用過程中的產(chǎn)物。目前,Java平臺有三個版本:適用于小型設備和智能卡的J2ME(Java 2 Platform Micro Edition)、適用于桌面系統(tǒng)的J2SE(Java 2 Platform Standard Edition)和適用于企業(yè)級應用的J2EE(Java 2 Platform Enterprise Edition)。Sun推出J2EE的目的是為了克服傳統(tǒng)Client/Server模式的弊病,迎合Browser/Server架構的潮流,為應用Java技術開發(fā)服務器端應用提供一個平臺獨立的、可移植的、多用戶的、安全的和基于標準的企業(yè)級平臺,從而簡化企業(yè)應用的開發(fā)、管理和部署。J2EE是一個標準,而不是一個現(xiàn)成的產(chǎn)品。各個平臺開發(fā)商按照J2EE規(guī)范分別開發(fā)了不同的J2EE應用服務器,J2EE應用服務器是J2EE企業(yè)級應用的部署平臺。由于它們都遵循了J2EE規(guī)范,因此,使用J2EE技術開發(fā)的企業(yè)級應用可以部署在各種J2EE應用服務器上。為了推廣并規(guī)范化使用J2EE架構企業(yè)級應用的體系架構,Sun同時給出了一個建議性的J2EE應用設計模型:J2EE Blueprints。J2EE Blueprints提供了實施J2EE企業(yè)級應用的體系架構、設計模式和相關的代碼,通過應用J2EE Blueprints所描述的體系模型,能夠部分簡化架構企業(yè)級應用這項復雜的工作。J2EE Blueprints是開發(fā)人員設計和優(yōu)化J2EE組件的基本原則,同時為圍繞開發(fā)工作進行職能分工給出了指導性策略,以幫助應用開發(fā)設計人員合理地分配技術資源。
J2EE的優(yōu)勢主要有以下幾點:
(1)高效的開發(fā): J2EE允許公司把一些通用的、很繁瑣的服務端任務交給中間件供應商去完成這樣開發(fā)人員可以集中精力在如何創(chuàng)建商業(yè)邏輯上,相應地縮短了開發(fā)時間。高級中間件供應商提供以下這些復雜的中間件服務:狀態(tài)管理服務 -- 讓開發(fā)人員寫更少的代碼,不用關心如何管理狀態(tài),這樣能夠更快地完成程序開發(fā)。
(2)持續(xù)性服務 : 讓開發(fā)人員不用對數(shù)據(jù)訪問邏輯進行編碼就能編寫應用程序,能生成更輕巧,與數(shù)據(jù)庫無關的應用程序,這種應用程序更易于開發(fā)與維護。分布式共享數(shù)據(jù)對象CACHE服務,讓開發(fā)人員編制高性能的系統(tǒng),極大提高整體部署的伸縮性。
(3)支持異構環(huán)境: J2EE能夠開發(fā)部署在異構環(huán)境中的可移植程序?;贘2EE的應用程序不依賴任何特定操作系統(tǒng)、中間件、硬件。因此設計合理的基于J2EE的程序只需開發(fā)一次就可部署到各種平臺。這在典型的異構企業(yè)計算環(huán)境中是十分關鍵的。J2EE標準也允許客戶訂購與J2EE兼容的第三方的現(xiàn)成的組件,把他們部署到異構環(huán)境中,節(jié)省了由自己制訂整個方案所需的費用。
(4)可伸縮性:企業(yè)必須要選擇一種服務器端平臺,這種平臺應能提供極佳的可伸縮性去滿足那些在他們系統(tǒng)上進行商業(yè)運作的大批新客戶?;贘2EE平臺的應用程序可被部署到各種操作系統(tǒng)上。例如可被部署到高端UNIX與大型機系統(tǒng),這種系統(tǒng)單機可支持64至256個處理器。(這是NT服務器所望塵莫及的)J2EE領域的供應商提供了更為廣泛的負載平衡策略。能消除系統(tǒng)中的瓶頸,允許多臺服務器集成部署。這種部署可達數(shù)千個處理器,實現(xiàn)可高度伸縮的系統(tǒng),滿足未來商業(yè)應用的需要。
(5)穩(wěn)定的可用性: 一個服務器端平臺必須能全天候運轉(zhuǎn)以滿足公司客戶、合作伙伴的需要。這是實時性很強商業(yè)系統(tǒng)理想的選擇[5]。
2.4關于Struts
2.4.1 Struts簡介
Struts已逐步越來越多運用于商業(yè)軟件,是一種非常優(yōu)秀的J2EE MVC實現(xiàn)方式。Struts用Java Servlet/JavaServer Pages技術,開發(fā)Web應用程序的開放源碼的framework。
2.4.2 Struts的主要功能
(1) 包含一個controller servlet,能將用戶的請求發(fā)送到相應的Action對象。
(2)JSP自由tag庫,并且在controller servlet中提供關聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應用。
(3)提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。Struts項目的目標是為創(chuàng)建Java web應用提供一個開放源代framework。Struts framework的內(nèi)核是基于例如Java Servlets,
JavaBeans, ResourceBundles, 和 XML,以及各種 Jakarta Commons包的標準技術的靈活的控制層。Struts提供了它自身的控制器組件,并整合了其他技術,以提供模型和視圖。Struts已逐步越來越多運用于商業(yè)軟件,是一種非常優(yōu)秀的J2EE MVC實現(xiàn)方式[6]。
2.4.3 Struts工作原理
MVC(Model-View-Controller),是一種常用的設計模式。MVC 減弱了業(yè)務邏輯接口和數(shù)據(jù)接口之間的耦合,以及讓視圖層更富于變化,MVC可以讓整個邏輯很清晰,這種思想和思維和人的思維很接近,很容易被理解。
MVC的工作原理如圖2-2所示:
圖2-2 MVC工作原理
Struts 是MVC的一種實現(xiàn),它將 Servlet和 JSP 標記(屬于 J2EE 規(guī)范)用作實現(xiàn)的一部分。Struts繼承了MVC的各項特性,并根據(jù)J2EE的特點,做了相應的變化與擴展。Struts的工作原理,如圖2-3所示:
圖2-3 struts工作原理
(1)Controller:在XML文件Struts-config.xml中,與之相關聯(lián)的是Controller,在Struts中,承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發(fā)送到Struts的HTTP請求的入口點。它截取和分發(fā)這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數(shù)填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。動作類實現(xiàn)核心商業(yè)邏輯,它可以訪問java bean 或調(diào)用EJB。最后動作類把控制權傳給后續(xù)的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。
(2)視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標簽庫:Html,Bean,Logic,Template等,這有利于分開表現(xiàn)邏輯和程序邏輯。
(3)模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調(diào)用Java Bean或EJB等[7]。
2.5 關于Spring
2.5.1 Spring簡介
Spring是一個開源框架,它由Rod Johnson創(chuàng)建。它是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益[8]。
◆目的:解決企業(yè)應用開發(fā)的復雜性
◆功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應用功能
◆范圍:任何Java應用
簡單來說,Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR文件里發(fā)布。并且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴于Spring的特定類。
◆控制反轉(zhuǎn)——Spring通過一種稱作控制反轉(zhuǎn)(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創(chuàng)建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
◆面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離應用的業(yè)務邏輯與系統(tǒng)級服務(例如審計(auditing)和事務(transaction)管理)進行內(nèi)聚性的開發(fā)。應用對象只實現(xiàn)它們應該做的——完成業(yè)務邏輯——僅此而已。它們并不負責(甚至是意識)其它的系統(tǒng)級關注點,例如日志或事務支持。
◆容器——Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype),你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯(lián)的。然而,Spring不應該被混同于傳統(tǒng)的重量級的EJB容器,它們經(jīng)常是龐大與笨重的,難以使用。
◆框架——Spring可以將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件里。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發(fā)留給了你。
所有Spring的這些特征使你能夠編寫更干凈、更可管理、并且更易于測試的代碼。它們也為Spring中的各種模塊提供了基礎支持。
2.5.2 為什么需要Spring
你可能正在想“Spring不過是另外一個的framework”。當已經(jīng)有許多開放源代碼(和專有) J2EE framework時,我們?yōu)槭裁催€需要Spring Framework?
Spring是獨特的,因為若干個原因:
◆它定位的領域是許多其他流行的framework沒有的。Spring關注提供一種方法管理你的業(yè)務對象。
◆ Spring是全面的和模塊化的。Spring有分層的體系結構,這意味著你能選擇使用它孤立的任何部分,它的架構仍然是內(nèi)在穩(wěn)定的。因此從你的學習中,你可得到最大的價值。例如,你可能選擇僅僅使用Spring來簡單化JDBC的使用,或用來管理所有的業(yè)務對象。
◆它的設計從底部幫助你編寫易于測試的代碼。Spring是用于測試驅(qū)動工程的理想的framework。
Spring對你的工程來說,它不需要一個以上的framework。Spring是潛在地一站式解決方案,定位于與典型應用相關的大部分基礎結構。它也涉及到其他framework沒有考慮到的內(nèi)容。
2.5.3 Spring帶給我們什么
◆方便解耦,簡化開發(fā)
通過Spring提供的IoC容器,我們可以將對象之間的依賴關系交由Spring進行控制,避免硬編碼所造成的過度程序耦合。有了Spring,用戶不必再為單實例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應用。
◆AOP編程的支持
通過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統(tǒng)OOP實現(xiàn)的功能可以通過AOP輕松應付。
◆聲明式事務的支持
在Spring中,我們可以從單調(diào)煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發(fā)效率和質(zhì)量。
◆方便程序的測試
可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring里,測試不再是昂貴的操作,而是隨手可做的事情。
◆方便集成各種優(yōu)秀框架
Spring不排斥各種優(yōu)秀的開源框架,相反,Spring可以降低各種框架的使用難度,Spring提供了對各種優(yōu)秀框架(如Struts,Hibernate、Hession、Quartz)等的直接支持。
◆降低Java EE API的使用難度
Spring對很多難用的Java EE API(如JDBC,JavaMail,遠程調(diào)用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些Java EE API的使用難度大為降低。
◆Java 源碼是經(jīng)典學習范例
Spring的源碼設計精妙、結構清晰、匠心獨用,處處體現(xiàn)著大師對Java設計模式靈活運用以及對Java技術的高深造詣。Spring框架源碼無疑是Java技術的最佳實踐范例。如果想在短時間內(nèi)迅速提高自己的Java技術水平和應用開發(fā)水平,學習和研究Spring源碼將會使你收到意想不到的效果[9]。
2.6 關于Hibernate
2.6.1為什么引入hibernate
在B/S項目的開發(fā)中,和數(shù)據(jù)庫的交互式不可避免的,J2EE的規(guī)范中提供了JDBC的接口來操作數(shù)據(jù)庫,對于JDBC,開發(fā)人員可以獲取數(shù)據(jù)庫連接,然后向數(shù)據(jù)庫發(fā)送SQL語句,并返回數(shù)據(jù)庫操作的結果集,然后封裝成對象返回給上層的應用程序。這就造成開發(fā)人員不但要求能夠編寫程序,熟悉業(yè)務邏輯,還要求開發(fā)人員同時能夠擔任DBA,對開發(fā)人員的要求很高;同時,當引入新的項目時,很多地方必須廢棄,因為我們的代碼中不光是業(yè)務邏輯,其中也嵌入了許多和底層有關的一些SQL代碼;
另外這些嵌入在代碼中的SQL語句也影響了我們程序的可測試性,我們在對代碼進行調(diào)試的時候,既要測試代碼,同時我們還要測試SQL語句。為了解決這些問題,引入了hibernate[10]。
2.6.2使用Hibernate的好處
(1)Hibernate是JDBC的輕量級的對象封裝,它是一個獨立的對象持久層框架,和App Server,和EJB沒有什么必然的聯(lián)系。Hibernate可以用在任何JDBC可以使用的場合,例如Java應用程序的數(shù)據(jù)庫訪問代碼,DAO接口的實現(xiàn)類,甚至可以是BMP(Bean-Managed Persistence)里面的訪問數(shù)據(jù)庫的代碼。
(2)Hibernate是一個和JDBC密切關聯(lián)的框架,所以Hibernate的兼容性和JDBC驅(qū)動,和數(shù)據(jù)庫都有一定的關系,但是和使用它的Java程序,和Application Server
沒有任何關系,也不存在兼容性問題。
(3)Hibernate不能用來直接和Entity Bean做對比,只有放在整個J2EE項目的框架中才能比較。并且即使是放在軟件整體框架中來看,Hibernate也是做為JDBC
的替代者出現(xiàn)的,而不是Entity Bean的替代者出現(xiàn)的。
(4)由于是對JDBC的輕易級封閉,內(nèi)存消耗少,最快的運行效率。
(5)開發(fā)效率高,Eclipse、JBuilder等主流JAVA集成開發(fā)環(huán)境對Hibernate有很好的支持,在大的項目,特別是持久層關系映射很復雜的情況下,Hibernate效率高的驚人。
(6)分布式,安全檢查,集群,負載均衡的支持。
2.6.3 Hibernate的工作原理
Hibernate的工作就是為Object和Ralational之間提供一個映射,其工作流程如下面的圖2-4所示。
圖2-4 hibernate工作流程
(1) 啟動Hibernate,如果在系統(tǒng)中添加Hibernate的支持,此處加載由系統(tǒng)自動完成。
(2) 讀取hibernate.cfg.xml或者hibernate.properties文件的配置信息,并將其加載為實例。
(3) 構建SessionFactory實例(包含二級緩存)。
(4) 從SessionFactory中取得Session對象,從而可以調(diào)用其方法,對數(shù)據(jù)庫進行操作,實現(xiàn)ORM的功能。
Hibernate可以通過一個XML的mapping文件把一個POJO(Plain old java object)和數(shù)據(jù)庫中的表對應起來,在這個XML文件(一般命名為*.hbm.xml)中,我們可以配置好Object和數(shù)據(jù)庫中標的映射關系,然后把這個mapping加入到hibernate.cfg.xml中,這樣Hibernate在啟動時就可以加載這些mapping,并可以根據(jù)配置文件對對象實現(xiàn)自動的加載,并且可以對這些Object實習自動的維護。Hibernate還提供查詢語句(HQL)供應用程序使用,Hibernate對數(shù)據(jù)訪問實現(xiàn)封裝,還可以對查詢語句的發(fā)送實現(xiàn)管理,達到優(yōu)化的目的,能夠有效減少數(shù)據(jù)庫的訪問頻率。
2.7 Mysql
數(shù)據(jù)庫(Database)是一系列信息資源的集合。在一個數(shù)據(jù)庫中,與一個項目有關的所有信息都可以叫做一條記錄(Record)。每一條記錄都是由一系列的字段(Field)組成的。一系列記錄的集合就構成了數(shù)據(jù)表格(Table)。對于一個簡單的“平面文件”的數(shù)據(jù)庫來說,它僅包含了一個數(shù)據(jù)表格,而對一個“關系型”數(shù)據(jù)庫來說,它卻包含兩個或兩個以上的數(shù)據(jù)表格,表格的各字段之間存在這一種或多種關系(有時可以把這種關系叫做“鏈接”)。
2.7.1 mysql的特點
MySQL是一種開放源代碼的關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),MySQL數(shù)據(jù)庫系統(tǒng)使用最常用的數(shù)據(jù)庫管理語言--結構化查詢語言(SQL)進行數(shù)據(jù)庫管理。
由于MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載并根據(jù)個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。大多數(shù)人都認為在不需要事務化處理的情況下,MySQL是管理內(nèi)容最好的選擇。它使用系統(tǒng)核心提供的多線程機制提供完全的多線程運行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等編程語言的編程接口(APIs),支持多種字段類型并且提供了完整的操作符支持查詢中的SELECT和WHERE操作。
目前MySQL被廣泛地應用在Internet上的中小型網(wǎng)站中。由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,許多中小型網(wǎng)站為了降低網(wǎng)站總體擁有成本而選擇了MySQL作為網(wǎng)站數(shù)據(jù)庫[11]。
2.7.2 mysql的安裝和配置(部分截圖)[12]
圖2-5 mysql安裝圖(開始)
安裝時一般采用默認路徑:
圖2-6 mysql安裝圖(路徑)
圖2-7 mysql安裝圖(數(shù)據(jù)庫類型)
為了支持中文,在下面的列表框中學者gb2312(切記)
圖2-8 mysql安裝圖(語言)
圖2-9 mysql安裝圖(等待成功)
2.8 Tomcat服務器
2.8.1 Tomcat 服務器簡介
Tomcat是一個免費的開源的Serlvet容器,它是Apache基金會的Jakarta項目中的一個核心項目,由Apache,Sun和其它一些公司及個人共同開發(fā)而成。由于有了Sun的參與和支持,最新的Servlet和Jsp規(guī)范總能在Tomcat中得到體現(xiàn)。 Tomcat中采用了Servlet容器:Catalina,完整的實現(xiàn)了Servlet2.3和Jsp1.2規(guī)范。Tomcat提供了各種平臺的版本供下載,可以從其官方網(wǎng)站上下載其源代碼版或者二進制版。由于Java的跨平臺特性,基于Java的Tomcat也具有跨平臺性[13]。
2.8.2 Tomcat的特點
在Tomcat中,應用程序的部署很簡單,你只需將你的WAR放到Tomcat的webapp目錄下,Tomcat會自動檢測到這個文件,并將其解壓。你在瀏覽器中訪問這個應用的Jsp時,通常第一次會很慢,因為Tomcat要將Jsp轉(zhuǎn)化為Servlet文件,然后編譯。編譯以后,訪問將會很快。另外Tomcat也提供了一個應用:manager,訪問這個應用需要用戶名和密碼,用戶名和密碼存儲在一個xml文件中。通過這個應用,輔助于Ftp,你可以在遠程通過Web部署和撤銷應用。當然本地也可以。
2.8.3 Tomcat的優(yōu)勢
Tomcat不僅僅是一個Servlet容器,它也具有傳統(tǒng)的Web服務器的功能:處理Html頁面。但是與Apache相比,它的處理靜態(tài)Html的能力就不如Apache.我們可以將Tomcat和Apache集成到一塊,讓Apache處理靜態(tài)Html,而Tomcat處理Jsp和Servlet.這種集成只需要修改一下Apache和Tomcat的配置文件即可。
2.8.4 Tomcat服務器的安裝和配置
在開始安裝之前,先準備J2SDK和TOMCAT兩個軟件,如果已經(jīng)安裝了J2SDK,就只需TOMCAT即可。
(1)需設置的環(huán)境變量
變量名:CATALINA_HOME
變量值:D:/Program Files/tomcat6.0
變量名:CLASSPATH
變量值:.;%JAVA_HOME%/lib;%CATALINA_HOME%/common/lib
(2)安裝完成后,打開tomcat服務器,啟動瀏覽器,在地址欄上輸入:http://localhost:8080/ 若出現(xiàn)以下界面說明安裝成功[14]。
圖2-10 tomcat啟動頁面
小結
本章全面介紹本系統(tǒng)所用到的關鍵技術和工具,其中jsp作為javaweb開發(fā)的基礎,對它的運行機制要理解,同時還要明白它的優(yōu)劣勢;j2ee作為開發(fā)的標準也作了簡單介紹。而SSH(struts+spring+hibernate)作為本系統(tǒng)的核心與亮點技術,更是作了詳細介紹,要掌握他們的工作原理,主要功能。最后介紹了本系統(tǒng)使用的數(shù)據(jù)庫mysql以及tomcat服務器的安裝與配置。只有掌握了這些技術基礎,才能使本系統(tǒng)的開發(fā)正常進行。
第三章 系統(tǒng)需求分析和總體設計
3.1 系統(tǒng)功能需求
圖3-1 系統(tǒng)功能模塊
如圖3-1所示,在本系統(tǒng)中主要闡述用戶管理、購物車管理、訂單管理、產(chǎn)品展示四個模塊。
(1)購物車管理:實現(xiàn)添加商品、取消一個商品、數(shù)量修改、清空購物車功能。
(2)訂單管理:實現(xiàn)提交訂單、刪除訂單、查詢訂單功能。
(3)產(chǎn)品展示:實現(xiàn)產(chǎn)品列表、產(chǎn)品明細功能。
(4)用戶管理:實現(xiàn)用戶注冊、用戶信息修改、用戶刪除、用戶查詢功能。
3.2 系統(tǒng)角色及其功能分析
3.2.1 系統(tǒng)的3個角色:
(1)注冊用戶
(2)管理員
(3)普通的網(wǎng)站瀏覽者(即游客)
3.2.2 系統(tǒng)角色的功能
(1)普通用戶
網(wǎng)站的普通瀏覽者(即游客)只能瀏覽商品。
(2)注冊用戶
普通瀏覽者只要注冊為網(wǎng)站用戶后,獲得自己的帳號,設置自己的密碼就具有以下功能:登錄,登出,向購物車中添加商品,生成并提交訂單。添加或修改個人明細資料。
(3)管理員
擁有注冊用戶的所有功能
還可以對用戶進行管理,包括添加新用戶、修改用戶密碼、刪除用戶。
3.3 總體設計思想概述
本系統(tǒng)是基于B/S架構下的多層結構應用系統(tǒng)。B/S(Browser/Server)結構即瀏覽器和服務器結構。它是隨著Internet技術的興起,對C/S結構的一種變化或者改進的結構。在這種結構下,用戶工作界面是通過WWW瀏覽器來實現(xiàn),極少部分事務邏輯在前端(Browser)實現(xiàn),但是主要事務邏輯在服務器端(Server)實現(xiàn),形成所謂三層3-tier結構。這樣就大大簡化了客戶端電腦載荷,減輕了系統(tǒng)維護與升級的成本和工作量,降低了用戶的總體成本(TCO)[15]。
在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構。推薦的分層式結構一般分為三層,從下至上分別為:數(shù)據(jù)訪問(持久)層、業(yè)務邏輯層(或稱為領域?qū)?、表示層[16],如圖3-2:
圖3-2 系統(tǒng)架構
總的來說,采用分層結構的設計思想,可以讓每個層由一組相關的類或組件構成,共同完成特定的功能。層與層之間存在自上而下的依賴關系,上層組件會依賴下層組件的API,而下層組件則不依賴于上層組件。例如:表述層依賴于業(yè)務邏輯層,而業(yè)務邏輯層依賴于數(shù)據(jù)庫層。并且每個層對對上層公開API,但具體的實現(xiàn)細節(jié)對外透明。當某一層發(fā)生變化,只要API不變,不會影響其他層的實現(xiàn)。
在本系統(tǒng)中,使用開源的mysql數(shù)據(jù)庫,持久層用到spring所集成的Hibernate技術,業(yè)務邏輯層用普通javabean實現(xiàn),表述層運用基于struts的MVC設計模式(struts用來做C層,spring實現(xiàn)V層與C層的解耦以及C層與M層的解耦)。
3.4 數(shù)據(jù)庫設計
3.4.1 E-R圖
下面是該系統(tǒng)數(shù)據(jù)庫表的E-R圖,如圖3-3:
圖3-3 E-R圖
3.4.2數(shù)據(jù)表的設計
下面列出了設計過程中所用到的數(shù)據(jù)庫表及其結構:
orders表用來保存客戶的訂單信息,如表3-1:
1. orders
列名類型長度描述
orderidint11訂單ID
totalpriceNUMBER16總價錢
orderstateNUMBER1訂單狀態(tài)
payinfoDATE 付款方式
CreatetimeDATE 創(chuàng)建日期
useridVARCHAR220用戶ID
User_item_idNUMBER8用戶明細ID
表3-1 orders
2. orderline表用來保存客戶訂單中的訂單項信息,如表3-2:
3. orderline
列名類型長度描述
order_item_idNUMBER16訂單條目ID
ProductidNUMBER16商品對象ID
OrderidVARCHAR220訂單對象ID
qualityNUMBER8數(shù)量
numNUMBER8商品數(shù)量
表3-2 orderline
3.orderstatus表用來保存定單狀態(tài),如表3-3:
orderstatus
列名類型長度描述
statusidint11狀態(tài)ID
namevarchar30狀態(tài)名
descriptionvarchar100描述
表3-3 orderstatus
4.users表用來保存用戶個人信息,如表3-4:
users
列名類型長度描述
user_idint11用戶ID
passwordvarchar15用戶密碼
表3-4 users
5.contactinfo表用來保存用戶個人明細,如表3-5:
contactinfo
列名類型長度描述
contact_idint11
User_idvarchar30用戶id
Street1varchar64住址1
Street2varchar64住址2
cityvarchar32城市
provincevarchar32省份
Countryvarchar32國家
zipvarchar20郵編
officephonevarchar50辦公室電話
cellphonevarchar20手機
emailvarchar20電郵
homephonevarchar12家庭電話
表3-5 contactinfo
6.product表用來保存商品,如表3-6:
product
列名類型長度描述
productidint11產(chǎn)品
modlevarchar30產(chǎn)品型號
namevarchar15品牌名
companyvarchar20出品公司
weightdouble50產(chǎn)品重量
pricedouble20價格
statevarchar20產(chǎn)品狀態(tài)
createtimedate 出廠日期
CategoryidInt10產(chǎn)品類型
descriptionvarchar1000產(chǎn)品描述
表3-6 product
7.category表用來保存商品類型,如表3-7:
category
列名類型長度描述
categoryidint11類型ID
namevarchar30類型名
descriptionvarchar100描述
表3-7 category
8. payway表用來保存權限信息,如表3-8:
payway
列名類型長度描述
paywayidint11ID
payStylevarchar30名
表3-8 payway
3.5 系統(tǒng)的類設計
3.5.1 DAO類設計
圖3-4 dao類設計
如圖3-4,通過這個工廠獲取對應的 DAO,然后使用DAO 進行數(shù)據(jù)庫操作。
3.5.2 POJO類設計(部分)
圖3-5 POJO類設計
這些實體類將通過hibernate映射到數(shù)據(jù)庫中
3.5.3 過濾器類設計
圖3-6 過濾器類設計1
如圖3-6,這是編碼過濾器類,通過他可保證頁面不出現(xiàn)亂碼問題。
圖3-7 過濾器類設計2
如圖3-7,這是登陸安全過濾器類,通過它來達到控制訪問權限的功能。
3.5.4 監(jiān)聽器類設計
如圖3-8,“CartSessionListener”啟動時把購物車信息初始化到內(nèi)存中,提高系統(tǒng)性能。“ProductContextListener”啟動時把商品信息初始化到內(nèi)存中,提高系統(tǒng)性能。
圖3-8 監(jiān)聽器類設計
3.6系統(tǒng)的用例圖
3.6.1 總體用例分析
圖3-9 總體用例圖
如圖3-9,用戶管理、購物車管理、訂單管理、產(chǎn)品展示四個模塊構成了本網(wǎng)上交易系統(tǒng)。User是指系統(tǒng)用戶,包括注冊用戶和匿名用戶兩種,匿名用戶只可以瀏覽商品,匿名用戶通過用戶管理模塊注冊后就可以使用購物車和下訂單。
3.6.2 用戶管理用例分析
圖3-10 用戶管理用例圖
如圖3-10,用戶管理模塊主要包括:用戶登陸、用戶注冊、用戶信息修改、用戶刪除、用戶信息查詢五個功能組成。
3.6.3 購物車管理用例分析
圖3-11 購物車管理用例圖
如圖3-11,購物車管理模塊主要包括:添加商品、取消一個商品、數(shù)量修改、清空購物車四個功能組成。
3.6.4 訂單管理用例分析
圖3-12 訂單管理用例圖
如圖3-12,訂單管理模塊主要包括:訂單提交、刪除訂單、訂單明細三個功能組成。
3.6.5 產(chǎn)品展示用例分析
圖3-13 產(chǎn)品展示用例圖
如圖3-13,商品展示模塊主要包括:產(chǎn)品列表、產(chǎn)品明細兩個功能組成。
小結
本章首先分析系統(tǒng)的功能需求,通過對系統(tǒng)功能模塊的劃分以及角色的劃分,明確了系統(tǒng)需求,為總體設計提供依據(jù)。接下來闡述了系統(tǒng)的總體設計思想,說明了本系統(tǒng)是基于B/S架構下的多層結構應用系統(tǒng)。最后通過對數(shù)據(jù)庫、過濾器、監(jiān)聽器、和實體類的設計分析,以及各個模塊用例圖的描述,形成了開發(fā)的整體思路,為下一步編程實現(xiàn)各個具體功能鋪平了道路。
第四章 系統(tǒng)的詳細設計
4.1 數(shù)據(jù)庫與POJO映射的實現(xiàn)
前面第二章曾介紹過:Hibernate可以通過一個XML的mapping文件把一個POJO(Plain old java object)和數(shù)據(jù)庫中的表對應起來,在這個XML文件(一般命名為*.hbm.xml)中,我們可以配置好Object和數(shù)據(jù)庫中表的映射關系,然后把這個mapping加入到hibernate.cfg.xml中,這樣Hibernate在啟動時就可以加載這些mapping,并可以根據(jù)配置文件對對象實現(xiàn)自動的加載,并且可以對這些Object實習自動的維護。
由于Spring提供了對Hibernate的集成,所以我們可以不配置hibernate.cfg.xml文件,而通過在applicationContext.xml文件中進行相關配置來達到同樣的目的。圖例說明如下:
圖4-1 user.hbm.xml
如圖4-1,user.hbm.xml文件配置了user類的相關信息。
圖4-2 session工廠配置
圖4-2是applicationContext.xml文件中Session工廠的配置信息,可以看到,圖中的mappingResources屬性中囊括了所有我們需要的mapping文件。
4.2 主要模塊的設計說明與界面
4.2.1用戶管理模塊
用戶管理模塊主要包括用戶注冊,登錄,退出3個部分.
(1)用戶注冊
當用戶第一次登錄時首先要注冊,成為會員后,才可以購買物品.用戶可以通過單擊首頁的注冊按鍵來打開注冊頁面進行會員注冊操作,用戶注冊頁面的運行結果如圖4-3所示.
圖4-3用戶登錄/注冊界面
如果用戶的注冊信息不符合要求,系統(tǒng)會提示用戶,部分結果如圖4-4:
圖4-4登錄信息提示界面
校驗用戶注冊信息是是否正確的javaScript部分代碼如下[17]:
當用戶確認所提按信息無誤后,單擊“注冊“按鈕,系統(tǒng)會執(zhí)行以下流程:
request 請求將頁面上的信息傳遞到控制層的struts中的Action類中,執(zhí)行以下代碼
/*
* 注冊一個新用戶
*/
public ActionForward register(ActionMapping mapping,
ActionForm form,HttpServletRequest req, HttpServletResponse res) throws Exception {
ActionForward forward = null;
RegisterActionForm registerForm = (RegisterActionForm) form;
User user = registerForm.getUser();
ContactInfo contactInfo = registerForm.getContactInfo();
if (userBiz.getUserById(user.getUserid()) != null) {
user.setContactinfo(contactInfo);
req.setAttribute("user", user);
forward = mapping.findForward("refresh");
} else {
try {
log.debug("begin save user info . . .");
userBiz.userRegister(user, contactInfo);
req.setAttribute("TIP_KEY", "恭喜您!注冊成功!");
forward = mapping.findForward("success");
} catch (ECPortException be) {
forward = mapping.findForward("fail");
be.printStackTrace();
log.error("save user info error. . .", be);
}
}
return forward;
}
在UserService中調(diào)用dao中的addUser方法,代碼如下:
public void addUser(User user) throws StoreException {
.....
try {
session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();
session.save(user);
tx.commit();
} .....
}
在注冊成功后,會跳轉(zhuǎn)到這樣的頁面,如圖4-4:
圖4-4注冊成功界面
(2)用戶登錄
網(wǎng)站首頁在用戶第一次訪問時會判斷用戶是否登錄,未登錄則顯示用戶登錄窗口,提示用戶登錄或注冊.對于已經(jīng)登錄的用戶,在用戶登錄窗口將顯示用戶的相關信息.
首頁主要是根據(jù)保存用戶名信息的Session參數(shù)來判斷用戶是否已經(jīng)登錄的,關鍵代碼如下:
在會員登錄窗口中單擊登錄按紐后,系統(tǒng)將對用戶名和密碼進行驗證,判斷用戶是否是已注冊用戶,如果已注冊,則更新用戶在網(wǎng)站中的狀態(tài),如果沒有注冊,則拒絕用戶的登錄操作,登錄數(shù)據(jù)驗證的程序代碼如下:
/*
* 用戶登錄方法
*/
public ActionForward login(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String username = request.getParameter("userid");
String password = request.getParameter("password");
if (userService.isLoginCorrect(username, password)) {
User user = userService.getUserByName(username);
/*
* 只有在用戶登錄的時候才創(chuàng)建一個session,并且把用戶的信息存放到session中;
* 同時sessionListener也會把car同時也放到session中,這樣能保證為每一個來
* 網(wǎng)站需要購物的用戶分配一個session,一個購物車,并且也可以利用session來 跟蹤用戶.
*/
HttpSession session = ((HttpServletRequest) request).getSession(true);
session.setAttribute("user", user);
return mapping.findForward("loginsuccess");
} else {
String message = "用戶名或者密碼錯誤!";
request.setAttribute("message", message);
return mapping.findForward("loginfailed");
}
}
public User getUserByName(String name) throws StoreException {
Session session = null;
try {
session = HibernateSessionFactory.getSession();
User user = (User) session.createQuery(
"from User u where u.username = '" + name + "'")
.uniqueResult();
return user;
} ....
}
(3)用戶退出
當用戶決定退出網(wǎng)站時,只要點擊當前頁面上的“退出”按鈕,就會回到首頁。
實現(xiàn)代碼如下:
/*
* 用戶退出系統(tǒng)并做一些清理工作;
*/
public ActionForward logout(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
HttpSession session = request.getSession();
session.removeAttribute("user");
session.removeAttribute("cart");
return mapping.findForward("logout");
}
(4)管理員登錄
系統(tǒng)設置了一個默認的管理員admin,只要通過此用戶名登錄就可進入管理員界面,如圖4-5和圖4-6所示:
圖4-5 管理員登錄
圖4-6 管理員界面
主要代碼如下:
public ActionForward toModify(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
HttpSession cur_session = req.getSession(false);
User user = (User) cur_session.getAttribute("USER");
String userid = user.getUserid();
String reqUserid = req.getParameter("userid");
if (reqUserid == null) {
List userList = userBiz.findAllUsers();
cur_session.setAttribute("userList", userList);
if (userid.equals("admin")) {
return mapping.findForward("adminInfo");
} else {
User p_user = userBiz.getUserById(userid);
req.setAttribute("user", p_user);
}
}
if (reqUserid != null) {
User p_user = userBiz.getUserById(reqUserid);
req.setAttribute("user", p_user);
}
return mapping.findForward("modify");
}
4.2.2購物車管理模塊
購物車管理模塊主要功能有如下幾個部分:
(1)創(chuàng)建購物車
當客戶登錄后,系統(tǒng)會給客戶創(chuàng)建一個購物車放入服務器的Session會話中。使客戶在整個會話中都擁有一個相同的購物車。這里主要運用了Http協(xié)議中的會話機制,將購物車保存在客戶的會話中,這樣在整個客戶游覽不同頁面商品的過程中,都會使用同一個購物車對象。
具體執(zhí)行步驟:
(1)從客戶的請求對象中獲取Session會話對象
(2)從會話對象中獲取購物車對象
(3)判斷是購物車對象是不是空的,如果是空是就創(chuàng)建一個
/*
* 在監(jiān)聽到session被創(chuàng)建之后,就立即向session中添加一個購物車Car;
*/
public void sessionCreated(HttpSessionEvent arg0) {
HttpSession session = arg0.getSession();
Cart cart=new Cart();
session.setAttribute("cart", cart);
}
/*
* 從session中獲得購物車
*/
Cart cart = (Cart) session.getAttribute("cart");
if (cart == null) {
cart = new Cart();
}
(2)向購物車中添加一個商品項
客戶在查看網(wǎng)頁上的一個商品時,當向服務器發(fā)送一個“添加到購物車”的請求時,會執(zhí)行這個功能。
功能執(zhí)行過程:
(1)從客戶請求對象中獲取商品的ID
(2)調(diào)用業(yè)務層的方法根據(jù)商品ID去數(shù)據(jù)查詢商品的信息,返回商品對象
(3)從商品對象中獲取商品名,商品價格,來構建一個商品項對象
(4)從Session會話中獲取購物車對象
(5)調(diào)用業(yè)務層的方法來根據(jù)購物車對象和商品項對象來執(zhí)行添加操作
(6)將些商品項對象放入到購物車中
部分實現(xiàn)代碼:
/*
* 從數(shù)據(jù)庫中把商品取到;
*/
ProductService productService = (ProductService) ServiceFactory.getInstance().getService(Globals.PRODUCT_SERVICE);
Integer id = Integer.parseInt(request.getParameter("productid"));
Product product = productService.getProductById(id);
/*
* 在向購物車中添加商品的時候會判斷商品是否已經(jīng)存在,
* 已存在的就不讓在加入了;
*/
if (cart.isExist(id)) {
message = "該商品已經(jīng)存在!請返回!";
request.setAttribute("message", message);
return mapping.findForward("error");
} else {
/*
* 向購物車添加一個商品;
*/
cart.addCart(product);
session.setAttribute("cart", cart);
return mapping.findForward("addcartsuccess");
}
(3) 修改購物車中一個商品項
在客戶查看購物車時,想修改自己的購買商品時,會執(zhí)行這個功能。由于商品的名稱和價格都是系統(tǒng)管理人員設置的,所以客戶都不可以修改,客戶只能修改他/她所購買商品的數(shù)量。修改所選購的商品數(shù)量時,相應的商品項的小計和購物車的總計都會保持實時的更新,如圖4-7。
圖4-7 修改商品數(shù)量
功能的執(zhí)行步驟:
(1)將ActionForm轉(zhuǎn)換為ItemForm對象
(2)從ItemForm對象中獲取商品ID
(3)從Session會話中獲取購物車對象
(4)根據(jù)商品ID去調(diào)用業(yè)務層的方法去修改商品項
(5)修改小計
(6)將些商品項對象放入到購物車中
部分實現(xiàn)代碼:
public ActionForward modifyNumber(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
String tempid = req.getParameter("productId");
Long productId = Long.parseLong(tempid);
String tempNum = req.getParameter("num" + productId);// num是一與JSP頁面一致的字符串
int num = new Integer(tempNum).intValue();
HttpSession session = req.getSession(false);
IShoppingCart cart = (IShoppingCart) session
.getAttribute("SHOPPING_CART");
cart.modifyProductAmountById(productId, num);
return mapping.findForward("success");
}
(4)查看購物車
客戶選取了所有的商品后,來向服務器發(fā)送“購物車”請求時,會執(zhí)行此功能,系統(tǒng)根據(jù)會話中的購物車中的商品項,來獲取客戶所選選商品的一個集合,在JSP頁面上對這個集合中的商品項進行顯示,如圖4-8。
圖4-8 我的購物車
功能的執(zhí)行步驟:
(1)從客戶的請求對象中獲取購物車對象
(2)從購物車對象中獲取所有的商品項
(3)將所有的商品項對象加載到請求對象中發(fā)送給客戶端
部分實現(xiàn)代碼:
var="orderLine" items="${sessionScope.SHOPPING_CART.orders.orderlines}" varStatus="status">
(5)刪除購物車中的一個商品項
客戶在查看購物車時,當向服務器發(fā)送一個“刪除商品項”的請求時,會執(zhí)行這個功能。刪除商品項時,系統(tǒng)會自動更新購物車的總計值,如圖4-9:
圖4-9 刪除商品
功能執(zhí)行過程:
1從客戶請求對象中獲取商品的ID
2調(diào)用業(yè)務層的方法根據(jù)商品ID去數(shù)據(jù)查詢商品的信息,返回商品對象
3從Session會話中獲取購物車對象
4調(diào)用業(yè)務層的方法根據(jù)商品ID去刪除購物車對象中的商品項
5將購物車重新加入到Session會話中,來更新Session會話中的購物車對象
部分代碼實現(xiàn):
//刪除購物車中一個商品項
public ActionForward deleteById(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
String tempid = req.getParameter("productId");
Long productId = Long.parseLong(tempid);
HttpSession session = req.getSession(false);
ShoppingCart cart = (ShoppingCart) session
.getAttribute("SHOPPING_CART");
cart.removeProductById(productId);
if (cart.isEmpty()) {
return mapping.findForward("index");
}
return mapping.findForward("success");
}
(6)清空購物車
客戶在查看購物時不要想要所有所選的商品時,向服務器發(fā)送“清空購物車”請求時會執(zhí)行此功能。如圖4-10:
圖4-10 清空購物車
執(zhí)行此功能的步驟:
(1)從請求對象中獲取Session會話
(2)從Session會話中獲取購物車對象
(3)將購物車對象傳給業(yè)務層的方法去清空購物車中的所有商品項
部分實現(xiàn)代碼:
/*
* 也就是從session中把購物車清除掉;
*/
public ActionForward clearShopCart(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
HttpSession session = req.getSession(false);
IShoppingCart cart = (IShoppingCart) session
.getAttribute("SHOPPING_CART");
cart.removeAllProducts();
return mapping.findForward("index");
}
4.2.3 定單模塊
生成訂單是網(wǎng)上購物商城的最終目的,前面的所有的功能的實現(xiàn)都是為最后生成一個用戶滿意的訂單做基礎,在此要生成一個可以供用戶隨時查詢訂單號,還要保存用戶訂單中所購買的商品信息。當用戶確認對購物車不再改變后,就可以到收銀臺結帳并生成訂單。結帳的流程是:從購物車中讀取商品名稱,商品數(shù)量,商品價格信息,生成唯一的一個訂單號,同時也把用戶注冊的基本信息讀取出來,形成一個完整的訂單寫入數(shù)據(jù)庫中。
1、創(chuàng)建一個訂單
客戶選好了所有的商品時,并確認要買時,會向服務器發(fā)送一個“生成定單”的請求,運行結果如圖4-11:
圖4-11 生成訂單
此時用戶可以添加收貨人的地址,點擊圖中的用戶信息“修改”,會彈出一個頁面,在此修改收貨人地址等信息,如圖4-12:
圖4-12 修改收貨地址
/*
* 將修改后的地址保存到數(shù)據(jù)庫中,其中保存了用戶的信息:id
*/
public void addUserItem(UserItem useritem) throws StoreException {
..
try {
session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();
session.save(useritem);
tx.commit();
} ..
}
用戶確認無誤后點擊圖4-11的“提交訂單“,會出現(xiàn)下圖:
圖4-13 訂單列表
部分實現(xiàn)代碼:
/*
* 確定定單
*/
public ActionForward checkOut(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
ActionForward forward = null;
GregorianCalendar gc = new GregorianCalendar();
Long paywayid = Long.parseLong(req.getParameter("payway"));
PayWay pw = new PayWay(paywayid);
List orderStatus = (List) req.getSession().getServletContext()
.getAttribute("all_orderStatus");
OrderStatus os = (OrderStatus) orderStatus.get(1);
HttpSession session = req.getSession(false);
User user = (User) session.getAttribute("USER");
ShoppingCart cart = (ShoppingCart) session
.getAttribute("SHOPPING_CART");
// Map orderLineMap = cart.getOrderLineMap();
Orders order = cart.getOrders();
order.setUsers(user);
order.setCost(cart.getTotalPrice());
order.setName(user.getUserid() + "-" + gc.get(gc.YEAR) + ""
+ gc.get(gc.MONTH) + "" + gc.get(gc.DAY_OF_MONTH));
order.setPayway(pw);
order.setOrderstatus(os);
try {
log.debug("=== begin to generator order =====");
orderBiz.checkOut(order);
log.debug("==== generator order success . . .");
forward = mapping.findForward("success");
} catch (ECPortException be) {
forward = mapping.findForward("fail");
log.error("==== save user order fail...", be);
be.printStackTrace();
}
cart.removeAllProducts(); // 定單產(chǎn)生后應清楚當明購物車中的商品
return forward;
}
/*
* 向數(shù)據(jù)庫中保存一個指定的order對象;
*/
public void save(Orders transientInstance) {
log.debug("saving Orders instance");
try {
getSession().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
2.查看定單
客戶確認了所有的訂單選項后,可以向服務器 發(fā)送“查看定單明細”的請求:當用戶點擊了圖4-13上的“明細”按鈕是,頁面運行結果如下:
圖4-14 訂單明細
部分代碼實現(xiàn):
/*
* 根據(jù)指定的order對象來獲得屬于該order的所有orderline項;
*/
public ActionForward orderDetail(ActionMapping mapping, ActionForm form,
HttpServletRequest req, HttpServletResponse res) throws Exception {
ActionForward forward = null;
String tempid = req.getParameter("orderid");
Long orderid = Long.parseLong(tempid);
Orders order = null;
try {
order = orderBiz.getOrderById(orderid);
log.debug("=== get order successful.===");
req.setAttribute("ORDER", order);
forward = mapping.findForward("showinfo");
} catch (ECPortException be) {
log.error("==== get failed .====");
forward = mapping.findForward("fail");
}
return forward;
}
4.3 系統(tǒng)的測試
測試是軟件開發(fā)必不可少的環(huán)節(jié),每個開發(fā)者都應該養(yǎng)成良好的測試習慣,一個系統(tǒng)的完善就是通過不斷地測試與維護來完成的。
測試的意義有以下幾點[18]:
(1)測試并不僅僅是為了找出錯誤.通過分析錯誤產(chǎn)生的原因和錯誤的發(fā)生趨勢,可以幫助項目管理者發(fā)現(xiàn)當前軟件開發(fā)過程中的缺陷,以便及時改進;
(2)這種分析也能幫助測試人員設計出有針對性的測試方法,改善測試的效率和有效性;
(3)沒有發(fā)現(xiàn)錯誤的測試也是有價值的,完整的測試是評定軟件質(zhì)量的一種方法。
測試一般有兩種方法:如果已經(jīng)知道了產(chǎn)品應該具有的功能,可以通過測試來檢驗是否每個功能都能正常使用;如果知道產(chǎn)品內(nèi)部工作過程,可以通過測試來檢驗產(chǎn)品的內(nèi)部動作是否按照說明書的規(guī)定正常運行。前一個方法稱為黑盒測試,后一個稱為白盒測試。
對于本系統(tǒng),我采取第一個方法,即黑盒測試。做完一個模塊,就進行測試,看所做的模塊能不能實現(xiàn)所需要的功能。經(jīng)過了先期的模塊測試和后期的綜合測試,本系統(tǒng)實現(xiàn)了規(guī)格說明書的所有功能,達到了預期的要求。
小結
本章詳細介紹了系統(tǒng)主要功能模塊的具體實現(xiàn),包括用戶管理模塊、購物車模塊和定單模塊,分析他們的設計思路,執(zhí)行步驟,并給出了每個功能的主要實現(xiàn)代碼,還有為每個功能的最終執(zhí)行結果配上截圖,讓我們看到更直觀的效果。最后對完成的系統(tǒng)進行了測試,介紹了兩種主流的測試方法,給出了測試結果,達到了預期的要求。
第五章 總結與展望
5.1 工作總結
開發(fā)Web站點,是一項復雜、繁重的工作,需要多方面的知識。
此次通過設計網(wǎng)上交易系統(tǒng),使我接觸到許多基于java語言的WEB網(wǎng)絡開發(fā)方面的知識,包括HTML語言,CSS級聯(lián)樣式表,客戶端開發(fā)語言JavaScript,MVC分層體系結構,支持MVC架構的struts框架,開源服務器Tomcat,mysql數(shù)據(jù)庫,服務器端開發(fā)語言JSP等,這些語言(或技術)擴展了我的知識面,也使我在制作的過程中對它們的特點,應用方向等有了基本的了解,并在實際的應用中大致明白如何將它們?nèi)诤线\用,以開發(fā)出界面美觀,功能強大的Web站點來。
通過本次親自動手設計系統(tǒng),我更加深刻的了解系統(tǒng)開發(fā)的全過程,從中我熟練掌握了B/S結構Web應用軟件設計的思想及其開發(fā)的全過程。首先要進行系統(tǒng)的需求分析,分析系統(tǒng)要達到什么功能,系統(tǒng)要劃分為幾個模塊來設計,系統(tǒng)的具體功能應當如何去實現(xiàn);分析完之后,考慮其涉及到的計算機專業(yè)知識,把問題細化,把大的問題劃分為小的問題,然后逐個進行解決。畢業(yè)設計開始階段,由于我們沒有軟件架構的設計經(jīng)驗,所以在項目的業(yè)務流程和軟件的開發(fā)規(guī)范上犯了很的錯誤,所以在后期的組裝過程變的非常的困難。
設計收獲:
1.掌握了網(wǎng)站開發(fā)的基本流程,設計整個網(wǎng)站的功能模塊圖;
2.掌握了如何搭建和配置一個Tomcat服務器;
3.掌握了使用JSP編程,實現(xiàn)對信息的顯示、修改、刪除和添加等;
遇到的問題:
1.JSP中文亂碼問題的解決
對于JSP中文亂碼問題的處理,常用的方法有兩種:一種方法是在JSP頁面上設置頁面的“contentType”屬性。這種方法就是在頁面開始時,設置頁面的“contentType”屬性,例如:
另一種方法是輸出中文信息時使用“ISO 8859-1”編碼。這種方法是在輸出中文信息之前,對中文信息進行一次“ISO 8859-1”編碼。
2.Java.lang.NullPointerException異常
一般是對一個為NULL值的變量進行操作引起的。為了避免這種異常,最好在對變量操作之前檢查看它是否為NULL值。
3.SQL語句換行書寫時未加適當?shù)目崭穸鴮е碌腻e誤。我們先看一段代碼,
String test=aaa;
String sql=〞select * from test〞+
〞where test1=’〞+a+〞’〞+
〞and test2=bbb〞;
上面所示的代碼在執(zhí)行時將轉(zhuǎn)換成這樣的SQL語句:
Select *from testwhere test1=’aaa’ and test2=bbb
從輸出的SQL語句可以看出test和where之間,以及’aaa’和and之間都缺空格,這樣是不能從數(shù)據(jù)庫中取出數(shù)據(jù)的.正確的寫法如下:
String test=aaa;
String sql=〞select * from test〞+
〞 where test1=’〞+a+〞’〞+
〞 and test2=bbb〞;
5.2 后續(xù)工作展望
由于個人能力有限以及實踐經(jīng)驗欠缺,系統(tǒng)基本滿足在線電子產(chǎn)品交易的功能需求,本系統(tǒng)不可避免有不足之處,如一些系統(tǒng)功能過于簡單,所以系統(tǒng)的功能還算不上很完善。希望老師和同學能給予建議和指導。
參考文獻
[1] 景玉建.電子商務的發(fā)展與前景[J].《職業(yè)時空》,2005年第13期,P10-11
[2] 張孝祥.深入Java Web開發(fā)內(nèi)幕——核心基礎[M].北京:電子工業(yè)出版社.北京.2006.10
致謝
本次畢業(yè)設計的最終完成離不開很多人的大力協(xié)助。衷心的感謝上海達內(nèi)科技有限公司在我實習期間交給我這個項目任務,使我有了設計課題,還感謝在實習期間給我?guī)椭捻椖拷?jīng)理以及公司同事。真誠的感謝本次畢業(yè)設計的指導老師-宋玲教授,給了我自由選題的機會,在我的論文審稿階段指出了很多方面的不足,并一一給出修改意見,對我進行悉心指導,對我的畢業(yè)論文最終完成給予了極大的支持和幫助。
特別感謝曹杰師兄,在畢業(yè)設計中遇到難點的時候,熱情和耐心地給予指導,對我畢業(yè)設計工作的順利完成有著重要的意義。
最后,再一次感謝所有幫助過我的人們!