【正文】
兩種:設(shè)值注入和構(gòu)造注入。這種注入方式簡(jiǎn)單、直觀,因而在 Spring 依賴注入里最常用。 設(shè)值注入和構(gòu)造注入的依賴注入實(shí)現(xiàn)模式均具備無(wú)侵入性的特點(diǎn),都是目前主流的依賴注入方式。 在 OOP 中模塊化的單元是類,而在 AOP 中 15 模塊化的單元?jiǎng)t是切面。在 AOP 術(shù)語(yǔ)中通常稱為橫切關(guān)注點(diǎn)。使用類似于 OOP 的方式進(jìn)行切面的編程工作。目前 AOP 的實(shí)現(xiàn)眾多,也都比較優(yōu)秀,下面揀幾個(gè)有代表性的進(jìn)行簡(jiǎn)單描述: AspectJ,是語(yǔ)言級(jí)的 AOP 實(shí)現(xiàn),它擴(kuò)展了 Java 語(yǔ)言,定義了 AOP 語(yǔ)法,能夠在編譯初期提供 橫切代碼的織入,所以它有一個(gè)專門(mén)的編譯器用來(lái)生成遵守 Java 字節(jié)碼規(guī)范的 class 文件。 JBoss AOP:框架修改 classloader,在加載類時(shí)對(duì)其進(jìn)行二進(jìn)制增強(qiáng)。 Spring 并不嘗試提供最完整的 AOP 實(shí)現(xiàn) ,相反,它側(cè)重于提供一種和 Spring IoC 容器整合的 AOP 實(shí)現(xiàn),用以解決企業(yè)級(jí)開(kāi)發(fā)中的常見(jiàn)問(wèn)題。通過(guò) AJAX,可使用 JavaScript 的 XMLHttpRequest 對(duì)象來(lái)直接與服務(wù)器進(jìn)行通信。 AJAX 在瀏覽器與 Web 服務(wù)器之間使用異步數(shù)據(jù)傳輸( HTTP 請(qǐng)求),這樣就可使網(wǎng)頁(yè)從服務(wù)器請(qǐng)求少量的信息,而不是整個(gè)頁(yè)面。 主要包含的技術(shù)有: 基于 web 標(biāo)準(zhǔn) (Standardsbased presentation) XHTML+CSS 的表示; 使用 DOM( Document Object Model)進(jìn)行動(dòng)態(tài)顯示及交互; 16 使用 XML 和 XSLT 進(jìn)行數(shù)據(jù)交換及相關(guān)操作; 使用 XMLHttpRequest 進(jìn)行異步數(shù)據(jù)查詢、檢索; 使用 JavaScript 將所有的東西綁定在一起。 Ajax的頁(yè)面端工作原理見(jiàn)圖 ,其整個(gè)系統(tǒng)框架的工作原理見(jiàn)圖 。這使得 Web 應(yīng)用程序更為迅捷地回應(yīng)用戶動(dòng)作,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒(méi)有改變過(guò)的信息。就像 DHTML 應(yīng)用程序那樣, Ajax 應(yīng)用程序必須在眾多不同的瀏覽器和平臺(tái)上經(jīng)過(guò)嚴(yán)格的測(cè)試。同樣,也 出現(xiàn)了另一種輔助程序設(shè)計(jì)的技術(shù),為那些不支持JavaScript 的用戶提供替代功能。在動(dòng)態(tài)更新頁(yè)面的情況下,用戶無(wú)法回到前一個(gè)頁(yè)面狀態(tài),這是因?yàn)闉g覽器僅能記下歷史記錄中的靜態(tài)頁(yè)面。這些解決方案也同時(shí)解決了許多關(guān)于不支持后退按鈕的爭(zhēng)論。 18 3 團(tuán)購(gòu)網(wǎng)站系統(tǒng)分析 系統(tǒng)可行性研究 問(wèn)題的提出 針對(duì)目前國(guó)內(nèi)涌現(xiàn)的大量團(tuán)購(gòu)網(wǎng)站和開(kāi)源模板都是用 PHP 進(jìn)行快速搭建的現(xiàn)狀,雖然其開(kāi)發(fā)周期可能比較短、開(kāi)發(fā)成本相對(duì)比較低,但是對(duì)于整個(gè)團(tuán)購(gòu)網(wǎng)站的本質(zhì) 電子商務(wù)站點(diǎn)來(lái)說(shuō),我對(duì)于這種技術(shù)構(gòu)建的電子商務(wù)系統(tǒng)架構(gòu)的穩(wěn)定性、安全性和靈活可擴(kuò)展性還是存在很大疑問(wèn)的。鑒于這種情況,我覺(jué)得很有必要對(duì)目前團(tuán)購(gòu)網(wǎng)站的現(xiàn)狀做一下適當(dāng)?shù)奶剿餍愿淖儯瑸榇?,我模擬了現(xiàn)在網(wǎng)絡(luò)上的團(tuán)購(gòu)需求,開(kāi)發(fā)了這套基于 J2EE 技術(shù)的團(tuán)購(gòu)系統(tǒng)?;旧纤心K都涉及到和后臺(tái)數(shù)據(jù)庫(kù)的數(shù)據(jù)交互工作,都要求表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)持久層的相互協(xié)作配合方能完成一個(gè)模塊完整的功能。 系統(tǒng)設(shè)計(jì)思想 根據(jù)團(tuán)購(gòu)系統(tǒng) 的基本設(shè)計(jì)思想是把整個(gè)系統(tǒng)按照幾個(gè)實(shí)現(xiàn)模塊進(jìn)行分解,采用 J2EE架構(gòu), MySQL數(shù)據(jù)庫(kù)。本團(tuán)購(gòu)系統(tǒng)采用 J2EE平臺(tái),其表示層由 Struts2管理,業(yè)務(wù)邏輯層由 Spring管理,數(shù)據(jù)持久層由 Hibernate管理,后臺(tái)數(shù)據(jù)層在本系統(tǒng)內(nèi)主要指數(shù)據(jù)庫(kù)系統(tǒng),本系統(tǒng)采用的是 MySQL數(shù)據(jù)庫(kù),用來(lái)存儲(chǔ)和管理系統(tǒng)的數(shù)據(jù)。 普通團(tuán)購(gòu)用戶在進(jìn)入本站點(diǎn)后所需求的功能就是瀏覽所有團(tuán)購(gòu)商品信息、登錄、注冊(cè)、進(jìn)行團(tuán)購(gòu)、在線支付、管理查看個(gè)人信息、團(tuán)品評(píng)價(jià)或轉(zhuǎn)讓。 管理員在進(jìn)入后臺(tái)管理界面之后可以對(duì)所有的商品信息進(jìn)行更新維護(hù)、添加新的團(tuán)購(gòu)信息、管理所有用戶的信息。 20 團(tuán) 購(gòu) 站 點(diǎn)用 戶團(tuán) 購(gòu) 顧 客 團(tuán) 購(gòu) 商 家 管 理 員瀏覽團(tuán)購(gòu)信息注冊(cè)登錄搜索團(tuán)購(gòu)信息購(gòu)物車(chē)模塊在線支付模塊個(gè)人信息管理模塊團(tuán)品評(píng)價(jià)轉(zhuǎn)讓模塊申請(qǐng)?jiān)诒菊具M(jìn)行團(tuán)購(gòu)活動(dòng)商品信息錄入模塊商品數(shù)據(jù)信息維護(hù)模塊會(huì)員信息管理模塊 圖 系統(tǒng)功能結(jié)構(gòu)流程圖 系統(tǒng)功能分析 由圖 可知本系統(tǒng)總共可分為 12 個(gè)子模塊,現(xiàn)在分別就其功能做一下簡(jiǎn)要分析。 (2) 登錄模塊,這個(gè)模塊是在瀏覽團(tuán)購(gòu)信息的用戶想?yún)F(tuán)之前所必須用到 的一個(gè)功能模塊。 (4) 購(gòu)物車(chē)模塊,當(dāng)用戶參與團(tuán)購(gòu)下單之后,可以對(duì)用戶的下單情況進(jìn)行跟蹤記載。 (6) 個(gè)人信息管理模塊,在注冊(cè)過(guò)的用戶登錄了本站點(diǎn)之后,可以對(duì)自己以往下的訂單進(jìn)行瀏覽和評(píng)價(jià)。 (8) 搜索團(tuán)品信息模塊,當(dāng)用戶只想瀏覽自己感興趣的相關(guān)商品時(shí),可以進(jìn)行關(guān)鍵字搜索。 (10) 商品信息模塊,當(dāng)商家把團(tuán)購(gòu)商品的詳細(xì)信息提交給本站點(diǎn)后,由站點(diǎn)管理員負(fù)責(zé)進(jìn)行商品的入庫(kù)和發(fā)布。 (12) 會(huì)員信息管理模塊,系統(tǒng)管理員可以對(duì)系統(tǒng)中的注冊(cè)會(huì)員和商家的信息進(jìn)行相應(yīng)的修改維護(hù)操作。 SSH 架構(gòu)的產(chǎn)品在開(kāi)發(fā)和使用階段對(duì)硬件條件沒(méi)有特殊要求,以下是系統(tǒng)的開(kāi)發(fā)環(huán)境: 操作系統(tǒng): Windows 7 數(shù)據(jù)庫(kù): MySQL Web 服務(wù)器: Tomcat Java 編譯器: JDK 22 開(kāi)發(fā)框架: +++Ajax+JQuery 開(kāi)發(fā)工具: MyEclipse 4 WEB 系統(tǒng)架構(gòu)分析 系統(tǒng)應(yīng)用模型的技術(shù)分析 客戶端與服務(wù)器 (C/S)及瀏覽器與服務(wù)器 (B/S) 在最初設(shè)計(jì)本系統(tǒng)時(shí),很自然會(huì)考慮所應(yīng)該使用的哪種網(wǎng)絡(luò)應(yīng)用模型?,F(xiàn)對(duì)這兩種模式做一下簡(jiǎn)要對(duì)比介紹??蛻魬?yīng)用程序是系統(tǒng)中用戶與數(shù)據(jù)進(jìn)行交互的部件。中間件負(fù)責(zé)聯(lián)結(jié)客戶應(yīng)用程序與服務(wù)器管理程序,協(xié)同完成一個(gè)作業(yè),以滿足用戶查詢管理數(shù)據(jù)的要求。把傳統(tǒng) C/S模式中的服務(wù)器部分分解為一個(gè)數(shù)據(jù)服務(wù)器與一個(gè)或多個(gè)應(yīng)用服務(wù)器 (Web 服務(wù)器 ),從而構(gòu)成一個(gè)三層結(jié)構(gòu)的客戶服務(wù)器體系??蛻舻膽?yīng)用程序精簡(jiǎn)到一個(gè)通用的瀏覽器軟件,如 Netscape Navigator,微軟公司的 IE,開(kāi)源的 Firefox 等。網(wǎng)頁(yè)還具備一定的交互功能,允許用戶在網(wǎng)頁(yè)提供的申請(qǐng)表上輸入信息提交給后臺(tái),并提出處理請(qǐng)求。 第二層 Web服務(wù)器將啟動(dòng)相應(yīng)的進(jìn)程來(lái)響應(yīng)這一請(qǐng)求,并 動(dòng)態(tài)生成一串 HTML代碼,其中嵌入處理的結(jié)果,返回給客戶機(jī)的瀏覽器。 第三層數(shù)據(jù)庫(kù)服務(wù)器的任務(wù)類似于 C/S 模式,負(fù)責(zé)協(xié)調(diào)不同的 Web 服務(wù)器發(fā) 23 出的 SQL 請(qǐng)求,管理數(shù)據(jù)庫(kù)。 當(dāng)今主流開(kāi)發(fā)模式及未來(lái)趨勢(shì)分析 基于 B/S 模型的應(yīng)用系統(tǒng)只需要管理服務(wù)器,所有的客戶端只是瀏覽器,不需要做任何的維護(hù)。在 B/S 模型下,客戶機(jī)越來(lái)越“瘦”,而服務(wù)器越來(lái)越“胖”,軟件升級(jí)和維護(hù)會(huì)越來(lái)越容易,使用會(huì)越來(lái)越簡(jiǎn)單,這對(duì)于人力、時(shí)間、費(fèi)用等開(kāi)銷的節(jié)省是顯而易見(jiàn)的,也是未來(lái)信息化發(fā)展的主流方向。一旦發(fā)生服務(wù)器“崩潰”等問(wèn)題,那后果不堪設(shè)想。 另外,隨著 時(shí)代的到來(lái), HTML CSS云存儲(chǔ)和網(wǎng)格化等技術(shù)的日趨成熟和普及,相信在不久的將來(lái) C/S 模式,甚至是操作系統(tǒng)都會(huì)漸漸被 B/S模式所取代,用戶只需打開(kāi)瀏覽器,就可以享用到所有以前只能由的桌面應(yīng)用程序所提供的功能,而免去了之前需要下載安裝大量客戶端程序并為之更新維護(hù)的苦惱。 系統(tǒng)架構(gòu)設(shè)計(jì)的目標(biāo) 建立一個(gè)可擴(kuò)展,可維護(hù),可移植,高效穩(wěn)定的網(wǎng)上團(tuán)購(gòu)系統(tǒng)。而商家則可以每天根據(jù)需求及時(shí)推出各種團(tuán)購(gòu)商品。為了集成三種框架,必須明確架構(gòu)的層次結(jié)構(gòu),同時(shí)明確每一個(gè)層次的職責(zé),各層次的功能不能相混合。表現(xiàn)層使用 Struts并糅合了 Ajax的異步交互功能,業(yè)務(wù)邏輯層使用 Spring,持久層使用 Hibernate,再通過(guò)配置文件把三層結(jié)構(gòu)集成一體。下面就結(jié)合本系統(tǒng)案例,簡(jiǎn)述各個(gè)框架在整個(gè)系統(tǒng)架構(gòu)中分別擔(dān)任的角色。 Struts2 在本系統(tǒng)中扮演的角色就是,當(dāng)前臺(tái)頁(yè)面通過(guò)表單或者 Ajax框架向服務(wù)器發(fā)送請(qǐng)求時(shí),它的核心控制器會(huì)讀取 配置文件,根據(jù)請(qǐng)求路徑轉(zhuǎn)發(fā)給相應(yīng)的 Action, Action 再調(diào)用業(yè)務(wù)邏輯層的相關(guān)方法 (本系統(tǒng)中全是 XxxBizImpl 類的方法 ),通過(guò)持久層框架 Hibernate 的 ORM 技術(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn)取得所需數(shù)據(jù)后,存進(jìn)本系統(tǒng)中數(shù)據(jù)持久層的各種數(shù)據(jù)庫(kù)表的映射類實(shí)例對(duì)象的屬性當(dāng)中, Action 在獲取持久層數(shù)據(jù)類實(shí)例對(duì)象中存儲(chǔ)的數(shù)據(jù)之后根據(jù)客戶端請(qǐng)求進(jìn)行了相應(yīng)的處理,然后將處 理結(jié)果或者轉(zhuǎn)發(fā)給下一個(gè) Action、或者轉(zhuǎn)發(fā)給視圖層的 JSP 頁(yè)面。 Spring 在本系統(tǒng)整個(gè)流程中充當(dāng)?shù)慕巧妥饔?,首先,?Spring 容器 啟動(dòng)時(shí),會(huì)實(shí)例化 Spring 配置文件 中已經(jīng)注冊(cè)的所有 bean類。最后,在 Action 調(diào)用業(yè)務(wù)邏輯層的類對(duì)象相關(guān)方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí), Spring 會(huì)將已經(jīng)實(shí)例化的持久層相應(yīng)的 XxxDAO 類對(duì)象動(dòng)態(tài)注入到業(yè)務(wù)邏輯層的類對(duì)象的屬性中,以供 XxxBizImpl 的方法調(diào)用,并對(duì)一些涉及到數(shù)據(jù)庫(kù)事務(wù)操作的方法進(jìn)行 AOP 事務(wù)管理。它主要是利用 JavaScript 中的 XMLHttpRequest 對(duì)象將前臺(tái)的請(qǐng)求數(shù)據(jù)以 JSON 格式傳送給后臺(tái)的 Action 類,同時(shí)不中斷用戶的交互體驗(yàn),待 Action 類處理完用戶請(qǐng)求并返回 JSON 格式的數(shù)據(jù)之后, XMLHttpRequest 對(duì)象進(jìn)行接收并利用 DOM 和CSS 技術(shù)對(duì)網(wǎng)頁(yè)進(jìn)行局部更新。 整個(gè)系統(tǒng)架構(gòu)如圖 所示 : 26 系 統(tǒng) 架 構(gòu)F r o n t C o n t r o l l e rS t r u t s A c t i o n V a l i d a t i o n V i e w ( J S P )S t r u t sS e r v i c e I n t e r f a c eS e r v i c e B e a n I m p l e m e n tT r a n s a c t i o n M a n a g e r m e n t B u s i n e s s B e a n s H i b e r n a t e I n t e g r a t i o nS p r i n gD a t a A c c e s s O b j e c tO / R M a p p i n g H i b e n a t e S e r v i c e s T r a n s a c t i o n M a n a g e r m e n tH i b e r n a t eD a t a B a s e ( M y S Q L )表 現(xiàn) 層業(yè) 務(wù) 邏 輯 層數(shù) 據(jù) 持 久 層后 臺(tái) 數(shù) 據(jù) 層A j a x 圖 系統(tǒng)架構(gòu)圖 27 5 系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì) 數(shù)據(jù)庫(kù) ER 圖設(shè)計(jì) g r o u p b u y _ g o o d sP K g o o d s _ i dI 2 c i t y c a t e g o r y g r o u p B u y _ t i t l e s o u r c e _ p r i c e g r o u p _ p r i c e l o w _ n u m m o s t _ n u m b e g i n _ t i m e e n d _ t i m e g o o d s _ c u e g o o d s _ i n t r o d u c eI 1 b u s i n e s s m a n g o o d s _ n a m e g o o d s _ i m g g o o d s _ d e t a i l g r o u p b u y _ a d d r e s s l o c a t i o n i s _ t u i j i a n d i s c o u n tm y o r d e rP K o r d e r _ i dI 1 o r d e r _ o f _ u s e r o r d e r _