畢業(yè)論文-基于Java EE的內(nèi)容管理系統(tǒng)
《畢業(yè)論文-基于Java EE的內(nèi)容管理系統(tǒng)》由會(huì)員分享,可在線閱讀,更多相關(guān)《畢業(yè)論文-基于Java EE的內(nèi)容管理系統(tǒng)(41頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、濟(jì)南大學(xué)畢業(yè)設(shè)計(jì) 摘 要 本設(shè)計(jì)旨在開(kāi)發(fā)一款基于Java EE的內(nèi)容管理系統(tǒng)(Content Management System,簡(jiǎn)稱CMS),系統(tǒng)面向開(kāi)發(fā)人員,提供一套切實(shí)可行的內(nèi)容管理系統(tǒng)基礎(chǔ)開(kāi)發(fā)架構(gòu)解決方案,以開(kāi)放源代碼的方式為開(kāi)發(fā)人員提供一套內(nèi)容管理系統(tǒng)的二次開(kāi)發(fā)框架,將開(kāi)發(fā)人員從繁重的前期開(kāi)發(fā)過(guò)程中解放出來(lái)。 系統(tǒng)基于JavaEE平臺(tái)開(kāi)發(fā),構(gòu)建在Spring框架之上,借助Spring Roo快速開(kāi)發(fā)技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層以及Service層的快速開(kāi)發(fā),使用AspectJ實(shí)現(xiàn)編譯時(shí)織入訪問(wèn)權(quán)限控制以及內(nèi)建聲明式緩存解決方案,實(shí)現(xiàn)了一套基本的內(nèi)容管理系統(tǒng)所應(yīng)具有的基礎(chǔ)功能,如RB
2、AC訪問(wèn)權(quán)限控制、用戶管理、內(nèi)容發(fā)布管理、公告管理、站內(nèi)信、友情鏈接等,使得開(kāi)發(fā)人員在項(xiàng)目開(kāi)發(fā)中專注于系統(tǒng)業(yè)務(wù)邏輯開(kāi)發(fā),緩解開(kāi)發(fā)人員的工作壓力,提高項(xiàng)目開(kāi)發(fā)效率,縮短項(xiàng)目開(kāi)發(fā)周期。 關(guān)鍵詞:CMS;內(nèi)容管理系統(tǒng);二次開(kāi)發(fā)平臺(tái);Spring ABSTRACT This design is to develop a Content Management System(CMS), the system is for developer, it supply a useful framework of secondary development based on Content Manag
3、ement System . This basic infrastructure solution make the developer get rid of the heavy work . The system is developed based on Java EE platform, and build with Spring framework , we take fully advantage of Spring Roo Rapid application development tool to build our data access and service layer,
4、 by using AspectJ, we weaving access control and cache solution in compile time, Implements a set of basic functions of a CMS should have, such as role based access control, user management, content publish management, announce management, blogroll management .The system make developer focus on busi
5、ness logic, Relieve the pressure on developers, improve the efficiency of project development, and shortening the project cycle and improving product quality. Key words:CMS;Secondary development platform;Spring 目錄 摘 要 I ABSTRACT II 目錄 III 1 系統(tǒng)開(kāi)發(fā)背景 1 1.1 內(nèi)容管理系統(tǒng)概論 1 1.2 國(guó)內(nèi)外內(nèi)容管理系統(tǒng)發(fā)展現(xiàn)狀 2
6、1.3本文檔結(jié)構(gòu) 2 2 系統(tǒng)架構(gòu)技術(shù)及開(kāi)發(fā)工具概述 4 2.1 開(kāi)發(fā)工具 4 2.1.1 Spring Tool Suite 4 2.1.2 操作系統(tǒng)平臺(tái) 5 2.1.3 Spring Roo 5 2.2 開(kāi)發(fā)技術(shù)概要 5 2.2.1 Java EE技術(shù) 6 2.2.2 Spring Framework 6 2.2.3 AspectJ 9 2.2.4 Hibernate 10 2.2.5 Dwr 10 2.2.6 Bootstrap 11 3 系統(tǒng)總體設(shè)計(jì) 12 3.1 需求分析 12 3.1.1 傳統(tǒng)Java EE企業(yè)架構(gòu)的不足 12 3.1.2 本系統(tǒng)開(kāi)發(fā)
7、需求 13 3.1.3 性能需求 15 3.2 系統(tǒng)整體架構(gòu) 15 3.2.1 系統(tǒng)架構(gòu)模式 15 3.2.2 系統(tǒng)目錄結(jié)構(gòu) 17 3.3 系統(tǒng)核心模塊設(shè)計(jì) 20 3.3.1 基于AOP的訪問(wèn)權(quán)限控制 20 3.3.2 基于Annotation的聲明式緩存方案 25 3.2.3 擴(kuò)展開(kāi)發(fā) 27 4 項(xiàng)目管理和測(cè)試 32 4.1 項(xiàng)目管理 32 4.1.1基于Maven的依賴管理 32 4.1.2代碼托管Github 32 4.2 系統(tǒng)測(cè)試 33 4.2.1 單元測(cè)試 33 4.2.2 系統(tǒng)運(yùn)行測(cè)試 34 結(jié) 論 35 參 考 文 獻(xiàn) 36 致 謝
8、 37 IV 1 系統(tǒng)開(kāi)發(fā)背景 1.1 內(nèi)容管理系統(tǒng)概論 網(wǎng)站內(nèi)容管理系統(tǒng), 即 Content Management System ,英文縮寫是CMS。 網(wǎng)站內(nèi)容管理系統(tǒng)具有許多基于模板的優(yōu)秀設(shè)計(jì),可以加快網(wǎng)站開(kāi)發(fā)的速度和減少開(kāi)發(fā)的成本。 網(wǎng)站內(nèi)容管理系統(tǒng)的功能并不只限于文本處理,它也可以處理圖片、Flash動(dòng)畫、聲像流、圖像甚至電子郵件檔案。 網(wǎng)站內(nèi)容管理系統(tǒng)其實(shí)是一個(gè)很廣泛的稱呼,從一般的博客程序,新聞發(fā)布程序,到綜合性的網(wǎng)站管理程序都可以被稱為內(nèi)容管理系統(tǒng)。 內(nèi)容管理系統(tǒng)是一個(gè)很泛的概念:從商業(yè)門戶網(wǎng)站的新聞系統(tǒng)到個(gè)人的博客都可以稱作是內(nèi)容發(fā)布系統(tǒng)。 根據(jù)不
9、同的需求,網(wǎng)站內(nèi)容管理系統(tǒng)有幾種不同的分類方法。比如,根據(jù)應(yīng)用層面的不同,可以被劃分為: (1) 重視后臺(tái)管理的網(wǎng)站內(nèi)容管理系統(tǒng) (2) 重視風(fēng)格設(shè)計(jì)的網(wǎng)站內(nèi)容管理系統(tǒng) (3) 重視前臺(tái)發(fā)布的網(wǎng)站內(nèi)容管理系統(tǒng) 根據(jù)系統(tǒng)的開(kāi)發(fā)方式有可以劃分為: (1) 框架型:本身不包含任何的實(shí)現(xiàn),只是提供了底層的框架,開(kāi)發(fā)人員可以在此基礎(chǔ)之上根據(jù)需求進(jìn)行二次開(kāi)發(fā),實(shí)現(xiàn)項(xiàng)目需要的功能。 (2) 應(yīng)用型:本身是一個(gè)面向具體類型的應(yīng)用實(shí)現(xiàn),已經(jīng)包含了新聞/評(píng)論管理,投票,論壇,WIKI等一些子系統(tǒng)。 就已經(jīng)存在的各種CMS來(lái)說(shuō),最終界面上都是大同小異,但是在編程風(fēng)格與管理方式上來(lái)講卻是千差萬(wàn)別。 就
10、CMS本身被設(shè)計(jì)出來(lái)的出發(fā)點(diǎn)來(lái)說(shuō),應(yīng)該是方便一些對(duì)于各種網(wǎng)絡(luò)編程語(yǔ)言并不是很熟悉的用戶用一種比較簡(jiǎn)單的方式來(lái)管理自己的網(wǎng)站。這雖然是本身的出發(fā)點(diǎn),但由于各個(gè)CMS系統(tǒng)的原創(chuàng)者們自己本身的背景與對(duì)“簡(jiǎn)單”這兩個(gè)字的理解程度的不同,就造成了沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)群雄紛爭(zhēng)的局面。 簡(jiǎn)而言之,CMS就是可以讓你不需要學(xué)習(xí)復(fù)雜的建站技術(shù),不需要學(xué)習(xí)太多復(fù)雜的程序設(shè)計(jì)語(yǔ)言,你就能夠利用CMS構(gòu)建出一個(gè)風(fēng)格統(tǒng)一功能強(qiáng)大的專業(yè)網(wǎng)站。 根據(jù)需求不同,內(nèi)容管理系統(tǒng)又可以被分離成以下幾個(gè)層面: 后臺(tái)業(yè)務(wù)管理子系統(tǒng):后臺(tái)管理系統(tǒng)主要包含新聞錄入、論壇管理、全文檢索等,針對(duì)不同的需求,提供不同的內(nèi)容錄入管理方式,比如所見(jiàn)
11、即所得的編輯界面或者是基于代碼的管理頁(yè)面,系統(tǒng)權(quán)限控制等側(cè)重于管理。 門戶系統(tǒng): 門戶系統(tǒng)是表現(xiàn)優(yōu)先的,系統(tǒng)大部分的最終輸出頁(yè)面,網(wǎng)站首頁(yè), 子頻道,專題,新聞詳情等各種模塊的組合,這種發(fā)布組合邏輯是非常豐富的,門戶系統(tǒng)就是負(fù)責(zé)以上這些后臺(tái)子系統(tǒng)的組合表現(xiàn)管理。 前臺(tái)發(fā)布系統(tǒng): 這一部分是效率優(yōu)先的,面向最終用戶的緩存發(fā)布以及搜索引擎爬蟲和URL的設(shè)計(jì)等。 1.2 國(guó)內(nèi)外內(nèi)容管理系統(tǒng)發(fā)展現(xiàn)狀 目前不論是國(guó)內(nèi)國(guó)外,都有大量?jī)?yōu)秀的CMS系統(tǒng),這些CMS大都專注于特定領(lǐng)域,當(dāng)然,隨著技術(shù)的進(jìn)步和發(fā)展,也有部分廠商為多數(shù)應(yīng)用領(lǐng)域都提供了內(nèi)容管理的解決方案。 比較著名的WordPress起初只
12、是一款博客平臺(tái),到現(xiàn)在已經(jīng)發(fā)展為了一款綜合的CMS管理平臺(tái),當(dāng)然它的主要功能還是博客,但是通過(guò)插件機(jī)制,可以很輕松的實(shí)現(xiàn)公司宣傳網(wǎng)站,作品集網(wǎng)、圖庫(kù)甚至是全功能的商業(yè)網(wǎng)站。WordPress的后端非常直觀易用,操作都是標(biāo)準(zhǔn)化的,只要你學(xué)會(huì)了一個(gè)管理模塊的操作,其它部分的操作就得心應(yīng)手了,它的功能組織也非??茖W(xué),很容易找到需要的功能,其所見(jiàn)即所得的編輯器功能非常強(qiáng)大,包括插入圖像、視頻和其它媒體,可以在HTML模式和可視化模式之間輕松來(lái)回切換。 Joomla是目前最流行的開(kāi)源CMS系統(tǒng),它運(yùn)行在PHP和MySQL上,后臺(tái)相對(duì)簡(jiǎn)單易用,包括文章管理、頭版、菜單、媒體和其它內(nèi)容,下拉菜單也有許多選
13、項(xiàng),Joomla有一個(gè)好用的所見(jiàn)即所得編輯器,支持大量的格式化選項(xiàng)和表情。 當(dāng)然,國(guó)內(nèi)也有很多優(yōu)秀的CMS系統(tǒng),較為常見(jiàn)的諸如Discuz是一款老牌的論壇管理系統(tǒng),而PHPCMS則以文章發(fā)布以及二次開(kāi)發(fā)等著稱。 Discuz是康盛創(chuàng)想(北京)科技有限公司(英文簡(jiǎn)稱Comsenz)推出的一套通用的社區(qū)論壇軟件系統(tǒng),用戶可以在不需要任何編程的基礎(chǔ)上,通過(guò)簡(jiǎn)單的設(shè)置和安裝,在互聯(lián)網(wǎng)上搭建起具備完善功能、很強(qiáng)負(fù)載能力和可高度定制的論壇服務(wù)。Discuz! 的基礎(chǔ)架構(gòu)采用世界上最流行的web編程組合PHP+MySQL實(shí)現(xiàn),是一個(gè)經(jīng)過(guò)完善設(shè)計(jì),適用于各種服務(wù)器環(huán)境的高效論壇系統(tǒng)解決方案。 PHPCM
14、S采用模塊化開(kāi)發(fā),支持多種分類方式,使用它可方便實(shí)現(xiàn)個(gè)性化網(wǎng)站的設(shè)計(jì)、開(kāi)發(fā)與維護(hù)。它支持眾多的程序組合,可輕松實(shí)現(xiàn)網(wǎng)站平臺(tái)遷移,并可廣泛滿足各種規(guī)模的網(wǎng)站需求,可靠性高,是一款具備文章、下載、圖片、分類信息、影視、商城、采集、財(cái)務(wù)等眾多功能的強(qiáng)大、易用、可擴(kuò)展的優(yōu)秀網(wǎng)站管理軟件。 1.3本文檔結(jié)構(gòu) 在本文檔中,將會(huì)介紹如下內(nèi)容。 在第一章中,也就是上面的章節(jié)中,介紹了什么是內(nèi)容管理系統(tǒng)以及當(dāng)前國(guó)內(nèi)外內(nèi)容管理系統(tǒng)技術(shù)發(fā)展的現(xiàn)狀。 第二章將會(huì)對(duì)系統(tǒng)開(kāi)發(fā)過(guò)程中使用的技術(shù)以及開(kāi)發(fā)工具進(jìn)行一個(gè)簡(jiǎn)要的描述,使得在后面的文檔閱讀過(guò)程中,對(duì)文檔中提到的一些工具以及技術(shù)有一個(gè)概要性的了解,方便文檔的閱讀
15、。 第三章是對(duì)系統(tǒng)總體設(shè)計(jì)的概述,主要包含了項(xiàng)目開(kāi)發(fā)前期的需求分析、系統(tǒng)的整體架構(gòu)以及系統(tǒng)核心模塊的設(shè)計(jì),在閱讀完該部分后,將會(huì)對(duì)系統(tǒng)的總體架構(gòu)以及核心技術(shù)有一個(gè)簡(jiǎn)要的了解。 第四章是對(duì)系統(tǒng)開(kāi)發(fā)過(guò)程中項(xiàng)目管理以及系統(tǒng)測(cè)試的說(shuō)明,系統(tǒng)是基于Maven進(jìn)行項(xiàng)目管理的,因此有必要對(duì)Maven進(jìn)行一些說(shuō)明,同時(shí),項(xiàng)目代碼托管于Github,測(cè)試作為系統(tǒng)開(kāi)發(fā)的重要環(huán)節(jié),在這里也會(huì)有一個(gè)概括性的描述。 最后是結(jié)論,該部分主要描述了系統(tǒng)完成情況以及系統(tǒng)開(kāi)發(fā)過(guò)程中的一些問(wèn)題和今后的開(kāi)發(fā)方向等。 2 系統(tǒng)架構(gòu)技術(shù)及開(kāi)發(fā)工具概述 2.1 開(kāi)發(fā)工具 2.1.1 Spring Tool Suite S
16、pring Tool Suite(STS)是一款基于Eclipse的IDE, 它為開(kāi)發(fā)基于Spring的企業(yè)應(yīng)用而產(chǎn)生,提供了最好的Eclipse開(kāi)發(fā)環(huán)境,STS同時(shí)也提供了最新的基于JAVA和Spring應(yīng)用開(kāi)發(fā)所需要的所有工具,并且配備了最新的Eclipse版本。 STS同時(shí)也為Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā)提供了一些其它的特性,比如基于Spring DM Server的OSGi開(kāi)發(fā),以及一些其它的Spring項(xiàng)目支持,如Spring Roo, Spring Batch等。Spring Tool Suite如圖2.1所示。 圖2.1 Spring Tool Suite 與MyEclips
17、e等編輯器不同,STS在提供大量開(kāi)發(fā)者需要的功能以及對(duì)Eclipse進(jìn)行各種優(yōu)化的同時(shí),對(duì)STS也采用了開(kāi)源免費(fèi)使用的策略,因此,使用STS進(jìn)行JAVA甚至是Groovy等基于JVM的編程語(yǔ)言的開(kāi)發(fā)是完全免費(fèi)的,任何人都可以無(wú)限制的使用它。 當(dāng)然,STS并不強(qiáng)制你使用完整的STS編輯器進(jìn)行開(kāi)發(fā),如果更喜歡原生的Eclipse IDE的話,可以通過(guò)STS的在線更新連接對(duì)Eclpse進(jìn)行更新,安裝STS的插件,使得使用原生的eclipse也可以體驗(yàn)STS的強(qiáng)大功能。 2.1.2 操作系統(tǒng)平臺(tái) 由于系統(tǒng)采用Java語(yǔ)言進(jìn)行開(kāi)發(fā),自然繼承了Java語(yǔ)言的跨平臺(tái)特性,不僅支持windows下的開(kāi)發(fā)
18、以及部署,任何支持jvm的操作系統(tǒng)平臺(tái)都可以平穩(wěn)的運(yùn)行。 2.1.3 Spring Roo Spring Roo是針對(duì) Java 技術(shù)的一個(gè)可擴(kuò)展的、基于文本的開(kāi)源 RAD 工具。它是用于創(chuàng)建和管理基于 Spring 的應(yīng)用程序的一個(gè)強(qiáng)大資源。 Spring Roo是SpringSource新的開(kāi)放源碼技術(shù),該技術(shù)主要面向企業(yè)級(jí)Java應(yīng)用的開(kāi)發(fā)者,該工具在不犧牲工程的完整和靈活性的基礎(chǔ)上,簡(jiǎn)化了開(kāi)發(fā)人員的開(kāi)發(fā)工作。不管是對(duì)Java新手還是資深的架構(gòu)師,Spring Roo都可以在短短的幾分鐘內(nèi)構(gòu)建一個(gè)全面完整的工作應(yīng)用。 Spring Roo是用來(lái)創(chuàng)建Spring工程的工具,它通過(guò)一
19、系列的命令快捷的建立起一個(gè)基于Spring的項(xiàng)目,通過(guò)不同的命令,可以完成Spring框架的大部分特性的操作。 Spring 框架于 2002 年年底發(fā)布,目的在于簡(jiǎn)化 J2EE(目前是 JavaEE)開(kāi)發(fā)。在過(guò)去 8 年中,Spring 成功完成了該使命,提供了 Java 社區(qū)框架或功能,比如 Spring Security、Spring MVC、事務(wù)管理、Spring 批處理和 Spring 集成,這都易于理解和使用。Spring 希望讓 Java 開(kāi)發(fā)人員的工作更輕松、更富成效。為此,Spring 創(chuàng)建了一個(gè)名為 Spring Roo 的開(kāi)發(fā)工具。 使用Spring Roo,你可以動(dòng)
20、態(tài)的添加和配置JPA、Spring MVC、Spring Security等功能,使用log4j進(jìn)行日志記錄,Junit進(jìn)行單元測(cè)試以及jms,電子郵件等框架,僅需要在Roo shell中敲入相應(yīng)的命令即可。使用Spring roo添加這些常用的功能極大的節(jié)省了開(kāi)發(fā)時(shí)間,提高了開(kāi)發(fā)人員的生產(chǎn)效率。Roo不能用于編寫業(yè)務(wù)邏輯,單完全可以用來(lái)管理程序的基礎(chǔ)結(jié)構(gòu)或者是配置。 Roo是一個(gè)開(kāi)發(fā)時(shí)間工具,這意味著應(yīng)用程序運(yùn)行時(shí)應(yīng)該獨(dú)立運(yùn)行著Roo。由于Roo通過(guò)AspectJ對(duì)代碼完成了編譯時(shí)織入代碼,因此,在最終的產(chǎn)品中,并不會(huì)存在SpringRoo部分,因此,對(duì)系統(tǒng)性能和內(nèi)存開(kāi)銷不會(huì)有任何影響,同
21、時(shí)也確保了最終項(xiàng)目不會(huì)依賴于Spring Roo,只需要幾個(gè)按鍵就可以從項(xiàng)目中完整的刪除Roo。 2.2 開(kāi)發(fā)技術(shù)概要 在該項(xiàng)目的開(kāi)發(fā)過(guò)程中,用到了許多技術(shù),這一章,對(duì)主要用到的技術(shù)進(jìn)行一個(gè)簡(jiǎn)要的概括。 2.2.1 Java EE技術(shù) Java是一種可以用來(lái)編寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮拈_(kāi)發(fā)語(yǔ)言,它與1995年由Sun公司開(kāi)發(fā),現(xiàn)在屬于Oracle公司旗下。Java技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性以及安全性,廣泛的應(yīng)用于個(gè)人電腦,服務(wù)器、數(shù)據(jù)中心、高性能計(jì)算機(jī)以及智能手機(jī)和互聯(lián)網(wǎng)等各個(gè)領(lǐng)域,擁有全球最大得開(kāi)發(fā)者專業(yè)社群。在全球云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著
22、的優(yōu)勢(shì)和廣闊的前景。 Java主要有四個(gè)部分組成:Java編程語(yǔ)言、Java類文件格式、Java虛擬機(jī)以及Java API。Java自誕生之日起,分為了三個(gè)體系:Java EE, Java SE, Java ME。 與傳統(tǒng)程序不同,Sun公司在推出Java之際將其作為了一種開(kāi)放的技術(shù)。全球數(shù)以萬(wàn)計(jì)的開(kāi)發(fā)公司被要求設(shè)計(jì)的java軟件必須相互兼容。Java語(yǔ)言靠群眾力量而非公司力量是java公司的口號(hào)之一,并獲得了廣大的軟件開(kāi)發(fā)商的認(rèn)同。這與微軟公司所倡導(dǎo)的的注重精英和封閉式的模式完全不同。 Sun公司對(duì)java編程語(yǔ)言的解釋是:java編程語(yǔ)言是個(gè)簡(jiǎn)單的、面向?qū)ο蟮摹⒎植际?、解釋性、健壯?/p>
23、安全與系統(tǒng)無(wú)關(guān)、可移植、高性能、多線程和動(dòng)態(tài)的語(yǔ)言。 Java平臺(tái)是基于java語(yǔ)言的平臺(tái)。這樣的平臺(tái)非常流行。因此微軟公司推出了欲與其進(jìn)行競(jìng)爭(zhēng)并且模仿java語(yǔ)言的C#語(yǔ)言。 2.2.2 Spring Framework Sprng開(kāi)發(fā)框架是一個(gè)非?;钴S的開(kāi)源項(xiàng)目,它是一個(gè)基于IoC和AOP的Java EE系統(tǒng)框架,它不強(qiáng)迫你必須去使用它,而是將各種功能進(jìn)行高度解耦,開(kāi)發(fā)人員可以按照自己的喜好去選擇使用這些組件中的某一個(gè)或者是某幾個(gè)。 Spring框架通過(guò)IoC(控制反轉(zhuǎn)/依賴注入)實(shí)現(xiàn)了對(duì)Bean的管理,開(kāi)發(fā)人員只需要關(guān)注具體業(yè)務(wù)邏輯的開(kāi)發(fā),不必要花費(fèi)過(guò)多的時(shí)間在Bean的管理上,
24、極大的降低了Java開(kāi)發(fā)的難度,提高了開(kāi)發(fā)效率,減少了開(kāi)發(fā)過(guò)程中出現(xiàn)的各種問(wèn)題,使得應(yīng)用的開(kāi)發(fā)組建更加快捷簡(jiǎn)易。Spring IoC如圖2.2所示。 圖2.2 Spring IoC Spring是一個(gè)全功能的開(kāi)發(fā)框架,從數(shù)據(jù)訪問(wèn)層到事務(wù)管理,以及web層等都提供了強(qiáng)有力的支持,Spring建議采用面向接口開(kāi)發(fā),通過(guò)接口的實(shí)現(xiàn),使得應(yīng)用程序的各部分組建之間最大程度的解耦,實(shí)現(xiàn)了各個(gè)層次之間的分離。 Spring同時(shí)提供了強(qiáng)大的AOP支持,所謂的AOP就是面向切面編程,它通過(guò)預(yù)編譯以及運(yùn)行期間代理實(shí)現(xiàn)了在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一的添加功能的一種技術(shù)。AOP實(shí)際上是Gof
25、設(shè)計(jì)模式的一種延續(xù),設(shè)計(jì)模式孜孜不倦的追求的是調(diào)用者與被調(diào)用者之間的解耦,AOP可以說(shuō)是這種目標(biāo)的一種實(shí)現(xiàn)。 AOP、OOP在字面上雖然非常類似,但卻是面向不同領(lǐng)域的兩種設(shè)計(jì)思想。OOP(面向?qū)ο缶幊蹋┽槍?duì)業(yè)務(wù)處理過(guò)程的實(shí)體及其屬性和行為進(jìn)行抽象封裝,以獲得更加清晰高效的邏輯單元?jiǎng)澐帧? 而AOP則是針對(duì)業(yè)務(wù)處理過(guò)程中的切面進(jìn)行提取,它所面對(duì)的是處理過(guò)程中的某個(gè)步驟或階段,以獲得邏輯過(guò)程中各部分之間低耦合性的隔離效果。這兩種設(shè)計(jì)思想在目標(biāo)上有著本質(zhì)的差異。Spring AOP代理如圖2.3所示。 圖2.3 Spring AOP代理 Spring框架是一個(gè)分層的架構(gòu),它主要有七個(gè)定義良
26、好的模塊組成。Spring模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理bean的方式。Spring功能模塊如圖2.4所示。 圖2.4 Spring功能模塊圖 Spring MVC屬于SpringFramework的后續(xù)產(chǎn)品,已經(jīng)融合在Spring Web Flow中。Spring 框架提供了構(gòu)建Web應(yīng)用程序的全功能的MVC模塊。使用 Spring 可插入的 MVC 架構(gòu),可以選擇是使用內(nèi)置的 Spring Web 框架還可以是 Struts 這樣的 Web 框架。通過(guò)策略接口,Spring 框架是高度可配置的,而且包含多種視圖技術(shù),例如 JavaServer Pa
27、ges(JSP)技術(shù)、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的視圖,所以不會(huì)強(qiáng)迫您只使用 JSP 技術(shù)。Spring MVC 分離了控制器、模型對(duì)象、分派器以及處理程序?qū)ο蟮慕巧?,這種分離讓它們更容易進(jìn)行定制。Spring MVC架構(gòu)如圖2.5所示。 圖2.5 Spring MVC架構(gòu) 2.2.3 AspectJ AspectJ是一個(gè)面向切面的框架,它擴(kuò)展了Java語(yǔ)言。AspectJ定義了AOP語(yǔ)法所以它有一個(gè)專門的編譯器用來(lái)生成遵守Java字節(jié)編碼規(guī)范的Class文件。 AspectJ的動(dòng)機(jī)是發(fā)現(xiàn)那些使用傳統(tǒng)編程方法
28、無(wú)法很好處理的問(wèn)題。考慮一個(gè)應(yīng)用中的安全策略問(wèn)題。安全性始終貫穿與系統(tǒng)的所有模塊之間,每個(gè)模塊都需要安全機(jī)制才能保證整個(gè)系統(tǒng)的安全性,這里的安全策略實(shí)際上就是一個(gè)橫切關(guān)注點(diǎn),使用傳統(tǒng)的編程解決此問(wèn)題是相當(dāng)困難并且很容易產(chǎn)生各種差錯(cuò),這就是AOP發(fā)揮作用的時(shí)候了。@AspectJ使用了Java5的注解,可以將切面聲明為普通的java類。 在傳統(tǒng)的面向?qū)ο缶幊讨?,每一個(gè)單元就是一個(gè)類,而類似于安全性這方面的問(wèn)題,它們通常不能集中在一個(gè)類中處理,因?yàn)樗麄儥M切多個(gè)類,這就導(dǎo)致了代碼無(wú)法重用,可以維護(hù)性差而產(chǎn)生了大量的代碼冗余,這是我們都不喜歡看到的。 面向方面編程的出現(xiàn)正好給處于黑暗中的我們帶來(lái)了
29、光明,它針對(duì)于這些橫切關(guān)注點(diǎn)進(jìn)行處理,就好像面向?qū)ο缶幊烫幚硪话愕年P(guān)注點(diǎn)一樣。而作為AOP的具體實(shí)現(xiàn)之一的AspectJ,它向Java中加入了連接點(diǎn)(Join Point)這個(gè)新概念,其實(shí)它也只是現(xiàn)存的一個(gè)Java概念的名稱而已。它向Java語(yǔ)言中加入少許新結(jié)構(gòu):切點(diǎn)(pointcut)、通知(Advice)、類型間聲明(Inter-type declaration)和方面(Aspect)。切點(diǎn)和通知?jiǎng)討B(tài)地影響程序流程,類型間聲明則是靜態(tài)的影響程序的類等級(jí)結(jié)構(gòu),而方面則是對(duì)所有這些新結(jié)構(gòu)的封裝。 2.2.4 Hibernate Hibernate是一種Java語(yǔ)言下的對(duì)象關(guān)系映射解決方案。
30、 它是使用GNU寬通用公共許可證發(fā)行的自由、開(kāi)源的軟件。它為面向?qū)ο蟮念I(lǐng)域模型到傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的映射,提供了一個(gè)使用方便的框架。Hibernate也是目前Java開(kāi)發(fā)中最為流行的數(shù)據(jù)庫(kù)持久層框架,現(xiàn)已歸JBOSS所有。 它的設(shè)計(jì)目標(biāo)是將軟件開(kāi)發(fā)人員從大量相同的數(shù)據(jù)持久層相關(guān)編程工作中解放出來(lái)。無(wú)論是從設(shè)計(jì)草案還是從一個(gè)遺留數(shù)據(jù)庫(kù)開(kāi)始,開(kāi)發(fā)人員都可以采用Hibernate。 Hibernate不僅負(fù)責(zé)從Java類到數(shù)據(jù)庫(kù)表的映射(還包括從Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供了面向?qū)ο蟮臄?shù)據(jù)查詢檢索機(jī)制,從而極大地縮短的手動(dòng)處理SQL和JDBC上的開(kāi)發(fā)時(shí)間。Hibernate技
31、術(shù)架構(gòu)如圖2.6所示。 圖2.6 Hibernate技術(shù)架構(gòu) 2.2.5 Dwr Dwr(Direct Web Remoting)是一個(gè)允許基于java的服務(wù)端應(yīng)用程序和基于javascript的瀏覽器之間以盡可能簡(jiǎn)單的方式進(jìn)行直接交互的java類庫(kù)。它可以幫助開(kāi)發(fā)人員開(kāi)發(fā)出包含Ajax技術(shù)的網(wǎng)站。Dwr概述如圖2.7所示。 Dwr主要包含兩個(gè)部分: (1) 允許Javascript從web服務(wù)器上一個(gè)遵循了ajax原則的Servlet中獲取數(shù)據(jù)。 (2) 幫助web開(kāi)發(fā)人員輕松的獲取數(shù)據(jù)動(dòng)態(tài)改變網(wǎng)站內(nèi)容。 圖2.7 Dwr概述 2.2.6 Boots
32、trap Bootstrap是快速開(kāi)發(fā)Web應(yīng)用程序的前端工具包。它是一個(gè)CSS和HTML的集合,它使用了最新的瀏覽器技術(shù),給你的Web開(kāi)發(fā)提供了時(shí)尚的版式,表單,buttons,表格,網(wǎng)格系統(tǒng)等等。 3 系統(tǒng)總體設(shè)計(jì) 3.1 需求分析 本系統(tǒng)是一款基于Java EE平臺(tái),建立在Spring MVC之上的一款方便二次開(kāi)發(fā)的內(nèi)容管理系統(tǒng)(CMS)。本系統(tǒng)是一款基于B/S架構(gòu)的內(nèi)容管理系統(tǒng),用戶以及管理人員通過(guò)網(wǎng)絡(luò)瀏覽器對(duì)服務(wù)器上的系統(tǒng)進(jìn)行訪問(wèn),不需再安裝任何客戶端軟件。 3.1.1 傳統(tǒng)Java EE企業(yè)架構(gòu)的不足 在傳統(tǒng)的Java EE開(kāi)發(fā)過(guò)程中,通常我們會(huì)將整個(gè)系統(tǒng)分為四個(gè)層次
33、: 表現(xiàn)層、業(yè)務(wù)層、持久層、平臺(tái)層。JavaEE架構(gòu)分層如圖3.1所示。 圖3.1 Java EE架構(gòu)分層 由于平臺(tái)層處于最底層,作為JavaEE架構(gòu)的運(yùn)行環(huán)境,在這里我們不需要太多關(guān)注,在傳統(tǒng)的開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)人員關(guān)系最密切的往往是持久層、業(yè)務(wù)層、表現(xiàn)層。 對(duì)于每一個(gè)項(xiàng)目而言,我們需要開(kāi)發(fā)它的持久層、業(yè)務(wù)層、表現(xiàn)層,但是在大量的開(kāi)發(fā)實(shí)踐過(guò)程中,我們會(huì)發(fā)現(xiàn),持久層所做的事情都是比較類似的,無(wú)外乎對(duì)實(shí)體關(guān)系進(jìn)行映射,完成對(duì)數(shù)據(jù)庫(kù)的操作,常見(jiàn)的持久層我們通常會(huì)使用JPA、Hibernate或者是iBatis。由于在不同的項(xiàng)目中,持久層總是非常相似的,開(kāi)發(fā)人員需要定義各種實(shí)體,然后
34、添加需要的數(shù)據(jù)表對(duì)應(yīng)的字段,為這些字段添加相對(duì)應(yīng)的get/set方法,而在DAO層,需要實(shí)現(xiàn)對(duì)各個(gè)實(shí)體的增刪改查操作,一旦數(shù)據(jù)表的數(shù)量增大,給開(kāi)發(fā)人員造成的開(kāi)發(fā)工作量是很大也很繁瑣的。分層架構(gòu)如圖3.2所示。 圖3. 2 分層架構(gòu) 3.1.2 本系統(tǒng)開(kāi)發(fā)需求 本系統(tǒng)旨在建立一套基于Java EE企業(yè)架構(gòu)的內(nèi)容管理系統(tǒng),通過(guò)這樣一套系統(tǒng)能夠極大的減輕開(kāi)發(fā)人員開(kāi)發(fā)工作量,開(kāi)發(fā)人員不需要關(guān)注底層如果實(shí)現(xiàn),只需要按照預(yù)定的規(guī)范進(jìn)行開(kāi)發(fā),同時(shí),系統(tǒng)將提供基于eclipse的模板,極大的減輕開(kāi)發(fā)過(guò)程中需要手寫代碼的工作量。 本系統(tǒng)采用了Spring Roo技術(shù),通過(guò)AspectJ的編譯
35、時(shí)織入的強(qiáng)大功能,可以在項(xiàng)目編譯時(shí)完成很多需要手動(dòng)完成的操作,以往的持久層開(kāi)發(fā)往往需要定義字段、添加get/set方法、添加DAO層等一系列的步驟,但是使用了SpringRoo之后,開(kāi)發(fā)人員可以通過(guò)命令或者是手動(dòng)的寫入文件并加以相關(guān)注解的方式實(shí)現(xiàn)實(shí)體以及相關(guān)的get/set方法,對(duì)數(shù)據(jù)的增刪改查操作以及復(fù)雜的查詢操作等。 對(duì)于表現(xiàn)層來(lái)說(shuō),常見(jiàn)的開(kāi)發(fā)技術(shù)室采用Jsp進(jìn)行開(kāi)發(fā),當(dāng)然也可以使用JSF以及Freemarker等模板技術(shù),在使用Jsp開(kāi)發(fā)過(guò)程中,我們往往需要編寫大量的html以及javascript代碼以實(shí)現(xiàn)需要的功能,大量的html以及javascrit充斥著整個(gè)web的前端系統(tǒng),造
36、成開(kāi)發(fā)人員代碼維護(hù)難度增大,而且,往往大部分開(kāi)發(fā)人員對(duì)已頁(yè)面設(shè)計(jì)等并不關(guān)注,因此,很難做出符合要求以及合適的頁(yè)面,為了解決這個(gè)問(wèn)題,在本系統(tǒng)的開(kāi)發(fā)過(guò)程中,封裝了大量的標(biāo)簽,組成一套專注于系統(tǒng)后臺(tái)開(kāi)發(fā)的標(biāo)簽庫(kù),幫助開(kāi)發(fā)人員完成頁(yè)面的開(kāi)發(fā),基本事件處理,頁(yè)面布局,各種控件的增強(qiáng),文件上傳等。 業(yè)務(wù)邏輯層往往是開(kāi)發(fā)人員專注的領(lǐng)域,因此,開(kāi)發(fā)人員可以通過(guò)在Service層結(jié)合Controller層完成系統(tǒng)開(kāi)發(fā)任務(wù)。 系統(tǒng)需要提供一套完善的基于角色的訪問(wèn)控制系統(tǒng)(RBAC),以及在系統(tǒng)開(kāi)發(fā)過(guò)程中常用的組件: (1)基于角色的訪問(wèn)控制系統(tǒng) 實(shí)現(xiàn)一套完善的基于角色的訪問(wèn)控制系統(tǒng),能夠?qū)芾碛脩舭凑战?/p>
37、色進(jìn)行授權(quán),只有授權(quán)用戶才能訪問(wèn)相應(yīng)的模塊,提供對(duì)角色的增刪改查操作,提供對(duì)系統(tǒng)權(quán)限的控制,用戶管理(包含增刪改查操作),當(dāng)然,對(duì)一套基于角色的訪問(wèn)控制系統(tǒng)而言,菜單的管理以及自動(dòng)生成也是至關(guān)重要的,通過(guò)對(duì)菜單的管理,為每個(gè)角色可以分配不同的菜單。 (2)緩存方案 提供一套切實(shí)可行的緩存方案,減少緩存操作代碼量,以最簡(jiǎn)化的方式實(shí)現(xiàn)緩存,主要提供基于內(nèi)存和基于磁盤文件的兩種緩存實(shí)現(xiàn),后續(xù)考慮實(shí)現(xiàn)基于memcached的分布式緩存。 (3)友情鏈接管理 友情鏈接在一般網(wǎng)站中都作為基本組件提供,因此,系統(tǒng)很有必要提供一套友情鏈接管理功能,能夠?qū)崿F(xiàn)對(duì)友情鏈接的排序,分組,以及上傳鏈接圖片等操作
38、。 (4)公告管理 作為一款內(nèi)容發(fā)布系統(tǒng),公告管理是不可或缺的,因此,系統(tǒng)需要提供一套公告管理系統(tǒng),能夠方便管理人員發(fā)布公告,設(shè)定公告有效時(shí)間等。 (5)內(nèi)容發(fā)布管理 內(nèi)容發(fā)布作為系統(tǒng)的主要功能,需要完成對(duì)文章內(nèi)容的管理,主要包含內(nèi)容分類管理,內(nèi)容發(fā)布管理,內(nèi)容緩存以及內(nèi)容模型的定制。 (6)廣告管理 實(shí)現(xiàn)站點(diǎn)廣告的管理,能夠?qū)V告進(jìn)行分類,提供廣告圖片上傳,通過(guò)對(duì)廣告的分類,實(shí)現(xiàn)廣告位的管理等。 (7)消息管理 消息管理主要實(shí)現(xiàn)站內(nèi)信的管理,網(wǎng)站用戶之間的交流。 (8)站點(diǎn)配置 站點(diǎn)管理部分主要是完成對(duì)站點(diǎn)的基本配置。 (9)其它擴(kuò)展功能 提供提供擴(kuò)展功能,通過(guò)擴(kuò)展,
39、可以為系統(tǒng)提供更多的擴(kuò)展功能。 (10)代碼模板 提供常用代碼的eclipse模板,通過(guò)使用基于eclpse的IDE,可以迅速生成代碼,只需要做簡(jiǎn)單的修改即可投入使用。 3.1.3 性能需求 本系統(tǒng)采用Spring Roo進(jìn)行持久層以及Service層部分代碼開(kāi)發(fā),由于Spring Roo采用了AspectJ的編譯時(shí)代碼織入功能,因此,在最終的產(chǎn)品代碼中,Spring Roo以及AspectJ的切面等代碼是不會(huì)存在的,在編譯過(guò)程中,這些代碼都被寫入了相應(yīng)的類的二進(jìn)制字節(jié)碼文件中,避免了調(diào)用額外代碼所產(chǎn)生的開(kāi)銷。 系統(tǒng)采用獨(dú)立開(kāi)發(fā)的緩存技術(shù),通過(guò)AOP思想以及AspectJ的動(dòng)態(tài)織入功
40、能,完成聲明式的緩存方案。 緩存技術(shù)的采用,使得系統(tǒng)運(yùn)行過(guò)程中對(duì)數(shù)據(jù)庫(kù)的依賴減小,用少量?jī)?nèi)存開(kāi)銷換取了數(shù)據(jù)IO開(kāi)銷,大幅度提高系統(tǒng)的運(yùn)行效率。 3.2 系統(tǒng)整體架構(gòu) 本部分對(duì)系統(tǒng)的整體架構(gòu)進(jìn)行簡(jiǎn)要的描述,系統(tǒng)采用Spring Roo技術(shù),在Spring Tool Suite IDE上完成開(kāi)發(fā)。 3.2.1 系統(tǒng)架構(gòu)模式 系統(tǒng)基于Spring MVC開(kāi)發(fā),拋棄了傳統(tǒng)開(kāi)發(fā)中復(fù)雜的Model-Dao-Service-Web模式,而是在Dao層采用了Activity Record模式,簡(jiǎn)化了數(shù)據(jù)持久層的開(kāi)發(fā)。系統(tǒng)架構(gòu)如圖3.3所示。 圖3.3 系統(tǒng)架構(gòu) 系統(tǒng)主要包含五部分,分
41、別對(duì)應(yīng)著系統(tǒng)五個(gè)主要的功能點(diǎn),主要包括核心部分、擴(kuò)展部分、直接遠(yuǎn)程訪問(wèn)部分、公開(kāi)服務(wù)部分、前端站點(diǎn)部分。 其中核心部分是系統(tǒng)運(yùn)行過(guò)程中必須的部分,該部分作為系統(tǒng)的基礎(chǔ),支撐著整個(gè)系統(tǒng)的運(yùn)行,擴(kuò)展部分中,可以通過(guò)自定義添加不同的功能對(duì)框架功能進(jìn)行擴(kuò)展,實(shí)現(xiàn)支撐項(xiàng)目業(yè)務(wù)邏輯的模塊。直接遠(yuǎn)程訪問(wèn)部分允許使用Dwr、Hprose技術(shù)或者是其它技術(shù)完成直接遠(yuǎn)程訪問(wèn),公開(kāi)服務(wù)部分主要提供了常用的一些服務(wù),如驗(yàn)證碼、文件上傳等獨(dú)立于系統(tǒng)的服務(wù)。前端站點(diǎn)用戶向最終用戶展現(xiàn)網(wǎng)站內(nèi)容,屬于展現(xiàn)層的范疇。功能模塊劃分如圖3.4所示。 圖3.4 功能模塊劃分 3.2.2 系統(tǒng)目錄結(jié)構(gòu) 由于系統(tǒng)是支
42、持二次開(kāi)發(fā)的,因此,很有必要在此描述一下系統(tǒng)的目錄結(jié)構(gòu),在了解了目錄結(jié)構(gòu)后,可以方便的對(duì)系統(tǒng)進(jìn)行擴(kuò)展開(kāi)發(fā)。 整個(gè)系統(tǒng)的目錄結(jié)構(gòu)劃分的比較明確,不同目錄對(duì)應(yīng)著不同的功能,正是清晰的目錄結(jié)構(gòu)劃分,才使得系統(tǒng)的模塊化變得更加清晰明確。源碼包結(jié)構(gòu)如圖3.5所示。 圖3.5 源碼包結(jié)構(gòu) 系統(tǒng)源碼部分目錄結(jié)構(gòu)主要分為核心部分、擴(kuò)展部分、直接遠(yuǎn)程訪問(wèn)、開(kāi)放服務(wù)、前端站點(diǎn)以及實(shí)用工具、助手類部分。 (1) 核心部分 核心部分包含了整個(gè)系統(tǒng)運(yùn)行過(guò)程中必備的一些基本組件,如系統(tǒng)自定義的annotation,控制器/表單基類,數(shù)據(jù)字典,統(tǒng)一異常處理,主控制器,以及RBAC權(quán)限控制系統(tǒng)等 該部
43、分是系統(tǒng)的基礎(chǔ)組成部分,實(shí)現(xiàn)了系統(tǒng)運(yùn)行所需的核心功能。 (2) 擴(kuò)展部分 擴(kuò)展部分對(duì)系統(tǒng)各個(gè)模塊的功能進(jìn)行了劃分,盡最大程度保證了各個(gè)模塊之間的獨(dú)立性,該部分實(shí)現(xiàn)了系統(tǒng)需要實(shí)現(xiàn)的擴(kuò)展功能,如公告管理,友情鏈接管理,內(nèi)容發(fā)布管理等等。 如果需要對(duì)系統(tǒng)功能進(jìn)行擴(kuò)展,可以在該包下建立相應(yīng)的擴(kuò)展包,實(shí)現(xiàn)自己的業(yè)務(wù)邏輯以及領(lǐng)域?qū)ο?。系統(tǒng)的RBAC權(quán)限控制系統(tǒng)在權(quán)限控制以及菜單管理方面會(huì)根據(jù)控制器所提供的annotation自動(dòng)檢測(cè)到相應(yīng)的功能實(shí)現(xiàn),只需要在后臺(tái)進(jìn)行簡(jiǎn)單的配置即可使用。 (3) 直接遠(yuǎn)程訪問(wèn) 該部分提供了兩種直接遠(yuǎn)程訪問(wèn)的實(shí)現(xiàn),一種是dwr技術(shù),另一種是hprose技術(shù),兩種技術(shù)
44、在這里都可以直接使用,當(dāng)然,如果希望使用其他的實(shí)現(xiàn)技術(shù)的話,可以在這里手動(dòng)添加。 系統(tǒng)后臺(tái)管理部分在頁(yè)面展現(xiàn)層和控制層之間的數(shù)據(jù)交互采用的了dwr技術(shù)實(shí)現(xiàn),因此,dwr實(shí)現(xiàn)作為系統(tǒng)默認(rèn)直接遠(yuǎn)程訪問(wèn)實(shí)現(xiàn)是起著舉足輕重的作用的。 (4) 開(kāi)放服務(wù) 該部分一般是對(duì)外完全開(kāi)放的服務(wù),事實(shí)上,該部分也是控制器實(shí)現(xiàn),只不過(guò)在AOP訪問(wèn)控制方面,并沒(méi)有對(duì)該部分進(jìn)行限制,因此,對(duì)于所有的瀏覽者來(lái)說(shuō),該部分是完全開(kāi)放的,可以注意到,文件上傳部分也屬于開(kāi)放服務(wù),這是因?yàn)橄到y(tǒng)當(dāng)前將上傳模塊獨(dú)立,通過(guò)對(duì)上傳資源的限制,以及上傳表單令牌機(jī)制,對(duì)該部分的安全性進(jìn)行了管理,因此,該部分是安全的。 如果需要增加額外的
45、開(kāi)放服務(wù)模塊,可以在這里增加,一般情況下,該部分的服務(wù)僅僅是提供內(nèi)容處理的,一般不包含頁(yè)面渲染。 (5) 前端站點(diǎn) 該部分用來(lái)預(yù)留該前端站點(diǎn)開(kāi)發(fā),為了簡(jiǎn)化前端開(kāi)發(fā)模式,該部分采用了自定義的CmsDispatcherServlet進(jìn)行管理,并將Spring上下文注入到前端模塊,因此,該部分是一個(gè)獨(dú)立的Spring Web模塊實(shí)現(xiàn)。 同時(shí),該部分主要使用了核心模塊中提供的@Module和@FormModule注解。 1) @Module 該annotation的作用類似于傳統(tǒng)javaEE體系中的service層,該注解標(biāo)注的類將作為前端Service,為前端標(biāo)簽庫(kù)標(biāo)簽提供數(shù)據(jù)訪問(wèn)服務(wù)。
46、 2) @FormModule 該annotation的作用類似于web層,主要是完成前端標(biāo)簽庫(kù)標(biāo)簽的表單數(shù)據(jù)提交處理,提供站點(diǎn)普通用戶與系統(tǒng)之間的交互。 系統(tǒng)前端建議完全采用系統(tǒng)內(nèi)置的或者是開(kāi)發(fā)人員自定義的JSP標(biāo)簽開(kāi)發(fā)。 (6) 實(shí)用工具、助手類 實(shí)用工具部分提供了系統(tǒng)常用的一些功能類如加解密、Json格式轉(zhuǎn)換、消息構(gòu)建器等。 助手類部分提供了系統(tǒng)的緩存方案以及方便權(quán)限和菜單管理的反射工具集。 3.3 系統(tǒng)核心模塊設(shè)計(jì) 本部分主要對(duì)系統(tǒng)中用到的核心模塊進(jìn)行簡(jiǎn)要的描述。 3.3.1 基于AOP的訪問(wèn)權(quán)限控制 在傳統(tǒng)的Java EE應(yīng)用程序中,采取的訪問(wèn)控制往往是采用過(guò)濾器機(jī)
47、制實(shí)現(xiàn),通過(guò)過(guò)濾器攔截進(jìn)站的web請(qǐng)求,然后再根據(jù)用戶要訪問(wèn)的web地址進(jìn)行分析,如果用戶擁有對(duì)該URL地址的訪問(wèn)權(quán)限,則對(duì)用戶放行,這種實(shí)現(xiàn)有一個(gè)先天性的缺陷是只能夠?qū)eb層進(jìn)行安全控制,無(wú)法很好的實(shí)現(xiàn)對(duì)任意方法的執(zhí)行進(jìn)行權(quán)限控制,同時(shí),過(guò)濾器的使用對(duì)系統(tǒng)運(yùn)行性能也會(huì)產(chǎn)生一定的影響。 另外一種實(shí)現(xiàn)權(quán)限控制的方法是將角色權(quán)限的檢查的相關(guān)方法放在Controller類中,導(dǎo)致所有的訪問(wèn)控制代碼分散在應(yīng)用的各個(gè)部分,與業(yè)務(wù)邏輯代碼緊緊的耦合在一起,這就導(dǎo)致了程序的可重用性低,調(diào)試和維護(hù)代碼變得十分繁瑣,非常不利于軟件的開(kāi)發(fā)。 針對(duì)以上兩種情況的弊端,在本系統(tǒng)中,將訪問(wèn)控制模塊作為了一個(gè)橫切關(guān)
48、注點(diǎn)通過(guò)引入一個(gè)Aspect,將用戶角色訪問(wèn)控制的相關(guān)代碼抽取出來(lái),形成一個(gè)單獨(dú)的切面,通過(guò)AspectJ的編譯器在項(xiàng)目編譯時(shí)將訪問(wèn)控制代碼織入到各個(gè)功能模塊中,有效的分離了功能模塊和訪問(wèn)控制模塊,使得系統(tǒng)得以盡可能大的解耦。AOP實(shí)現(xiàn)權(quán)限控制原理如圖3.6所示。 圖3.6 AOP權(quán)限控制原理 為了開(kāi)發(fā)過(guò)程中的方便,系統(tǒng)實(shí)現(xiàn)的權(quán)限控制系統(tǒng)支持開(kāi)發(fā)者模式,在開(kāi)發(fā)模式下,系統(tǒng)會(huì)對(duì)所有的方法訪問(wèn)放行,因此,可以不用處處驗(yàn)證是否有權(quán)限進(jìn)行操作,方便開(kāi)發(fā)調(diào)試系統(tǒng),當(dāng)然,系統(tǒng)同樣支持超級(jí)管理員用戶,超級(jí)管理員用戶的賬號(hào)和密碼均采用sha256加密算法混淆加密后存儲(chǔ)在配置文件中,用戶登錄時(shí),系統(tǒng)會(huì)判
49、斷是否是超級(jí)管理員登錄,如果是,則所有權(quán)限對(duì)超級(jí)管理員均開(kāi)發(fā),可以方便在系統(tǒng)上線運(yùn)行過(guò)程中,需要對(duì)系統(tǒng)進(jìn)行相應(yīng)的權(quán)限管理配置等。
在權(quán)限控制的過(guò)程中,通常會(huì)有一些方法是我們希望對(duì)所有用戶開(kāi)放,任何人都可以直接訪問(wèn)的或者是只允許匿名用戶訪問(wèn)(如登錄/注冊(cè)等不希望已登錄用戶訪問(wèn)),因此,系統(tǒng)提供了公開(kāi)控制方法和匿名控制方法配置,通過(guò)對(duì)配置文件簡(jiǎn)單的配置,可以完成控制器方法甚至是整個(gè)控制器的開(kāi)放。權(quán)限控制執(zhí)行流程如圖3.7所示。
52、行管理,同時(shí),在該Advice中,加入了對(duì)控制層異常的處理,因此,控制層中的操作如果出現(xiàn)異常,可以直接拋出甚至是不需要處理,權(quán)限控制Aspect會(huì)根據(jù)方法命名規(guī)范采取相應(yīng)的錯(cuò)誤提示信息,如以ajax形式或者是直接以錯(cuò)誤頁(yè)面的形式。 系統(tǒng)為權(quán)限控制定義了四個(gè)Pointcut,通過(guò)這三個(gè)Pointcut相互約束,完成了對(duì)控制器方法的權(quán)限控制織入。 (1) execution(public * name.orionis.cms.core..*.*(..)) (2) execution(public * name.orionis.cms.extensions..*.*(..)) (3) @an
53、notation(org.springframework.web.bind.annotation.RequestMapping) (4) within(@org.springframework.stereotype.Controller *) 圖3.7 權(quán)限控制執(zhí)行流程 上面主要講述了權(quán)限控制的過(guò)程,系統(tǒng)不僅使用AOP完成了訪問(wèn)權(quán)限的控制,還實(shí)現(xiàn)了一套完整的基于角色的訪問(wèn)控制系統(tǒng)(RBAC)與AOP的權(quán)限控制相結(jié)合,從而更加靈活的對(duì)訪問(wèn)權(quán)限,用戶角色進(jìn)行管理。RBAC權(quán)限控制與AOP結(jié)合如圖3.8所示。 圖3.8 RBAC權(quán)限控制與AOP相結(jié)合 在RBAC中,
54、權(quán)限與角色相關(guān)聯(lián),用戶通過(guò)獲取適當(dāng)?shù)慕巧@取該角色的所有權(quán)限。這樣極大的簡(jiǎn)化了權(quán)限的管理。在這一組織中,角色是為了完成各種工作而創(chuàng)建的,用戶依據(jù)他們的職責(zé)和資格被授予相應(yīng)的角色,根據(jù)用戶角色的不同從而在系統(tǒng)中擁有不同的功能。而權(quán)限也可以根據(jù)角色的不同進(jìn)行回收。 系統(tǒng)通過(guò)對(duì)Rbac的引入以及實(shí)現(xiàn),靈活的完成了多用戶的管理,下面是表結(jié)構(gòu)。RBAC系統(tǒng)表結(jié)構(gòu)關(guān)系如圖3.9所示。 圖3.9 RBAC系統(tǒng)表結(jié)構(gòu)關(guān)系 系統(tǒng)在基本RBAC系統(tǒng)的基礎(chǔ)上進(jìn)行了擴(kuò)展,增加了對(duì)菜單的管理,這樣,就實(shí)現(xiàn)了不同用戶登錄系統(tǒng)后的菜單是不同的,增強(qiáng)了系統(tǒng)的可定制性。菜單定制如圖3.10所示。
55、圖3.10 菜單定制 3.3.2 基于Annotation的聲明式緩存方案 通常,在大型系統(tǒng)以及并發(fā)訪問(wèn)量比較大的系統(tǒng)中,為了減少對(duì)數(shù)據(jù)庫(kù)以及其它I/O資源所造成的耗時(shí)操作,減輕系統(tǒng)的壓力,對(duì)于常用的,不經(jīng)常發(fā)生變化的資源進(jìn)行緩存,而傳統(tǒng)的緩存方案無(wú)外乎創(chuàng)建緩存對(duì)象,判斷是否存在當(dāng)前對(duì)象緩存,如果存在,則返回,否則則緩存新的對(duì)象后再返回,對(duì)于每一次的緩存操作,這樣一個(gè)過(guò)程必不可少,因此,系統(tǒng)中難免會(huì)分散著各種重復(fù)的緩存代碼,這就造成了開(kāi)發(fā)人員需要不斷地復(fù)制粘貼相應(yīng)的緩存代碼,在進(jìn)行一定的修改后使用,但是這樣造成了一旦某一天希望換一種緩存實(shí)現(xiàn)的時(shí)候,程序很難解耦。因此很有必要有一種更加方便,
56、更低侵入性的緩存實(shí)現(xiàn)方案。 本系統(tǒng)自主實(shí)現(xiàn)了一套基于注解的聲明式緩存解決方案,與權(quán)限控制部分相似,為了提高系統(tǒng)的效率,緩存方案同樣采取了AOP機(jī)制,使用AspectJ進(jìn)行編譯時(shí)織入緩存代碼。被緩存方法調(diào)用如圖3.11所示。 圖3.11 被緩存方法調(diào)用 系統(tǒng)實(shí)現(xiàn)的緩存方案默認(rèn)通過(guò)方法簽名對(duì)方法返回值進(jìn)行緩存,當(dāng)方法參數(shù)不同時(shí),會(huì)分別進(jìn)行不同的緩存。當(dāng)然也可以手動(dòng)指定緩存使用的簽名或者是緩存主鍵使用的參數(shù)列表。不僅如此,該緩存方案還支持基于緩存時(shí)間的緩存,通過(guò)在@Cached注解上增加緩存有效期,可以實(shí)現(xiàn)緩存過(guò)期等。 系統(tǒng)默認(rèn)提供了兩種緩存方式: (1) 基于內(nèi)存的緩存實(shí)
57、現(xiàn)。 (2) 基于文件系統(tǒng)的緩存方式實(shí)現(xiàn)。 如果這兩種方式仍然不能滿足開(kāi)發(fā)者的需求,開(kāi)發(fā)者可以實(shí)現(xiàn)自己的緩存方案,比如如果開(kāi)發(fā)者需要使用memcached分布式key-value緩存方案,可以自定義緩存類,該類只需要實(shí)現(xiàn)ICache接口,同時(shí)在Spring配置文件中或者是通過(guò)@Component注解標(biāo)注為Spring管理的bean即可。 public interface ICache { public void put(String key , Object value); public void put(String key, Object value, long expira
58、tion); public Object get(String key); public boolean isExist(String key); public void remove(String key, boolean lazy); public void setDevMode(boolean devMode); public boolean isSupportExpiration(); } 圖3.12是緩存方法的執(zhí)行過(guò)程圖解: 圖3.12 緩存方法執(zhí)行過(guò)程 3.2.3 擴(kuò)展開(kāi)發(fā) 擴(kuò)展系統(tǒng)功能是相當(dāng)簡(jiǎn)單的,一般情況下,對(duì)于比較簡(jiǎn)單的功能,可以快速的生
59、成,這里,以公告發(fā)布管理為例,簡(jiǎn)述一下開(kāi)發(fā)過(guò)程。 首先需要?jiǎng)?chuàng)建公告數(shù)據(jù)表,假設(shè)公告數(shù)據(jù)表是如下結(jié)構(gòu): 表3.1 Announce表結(jié)構(gòu) 字段名 類型 約束 注釋 Id Long 主鍵,自增 主鍵 Version Int Hibernate用于做樂(lè)觀鎖 Title varchar 公告標(biāo)題 Content longtext 公告內(nèi)容 Create_date Datetime 創(chuàng)建時(shí)間 Publish_time Datetime 發(fā)布時(shí)間 Publisher Varchar 發(fā)布者 Updator Varcha
60、r 更新者 Start_time Datetime 生效時(shí)間 End_time Datetime 截止時(shí)間 Hits Int 點(diǎn)擊量 (1) 創(chuàng)建數(shù)據(jù)表實(shí)體 創(chuàng)建數(shù)據(jù)表實(shí)體,在Activity Record 模式下,也就相當(dāng)于DAO層的創(chuàng)建,在Spring Roo環(huán)境下,我們可以簡(jiǎn)單執(zhí)行下面幾條命令完成實(shí)體創(chuàng)建。 entity jpa --class ~.extensions.announce.model.Announce field string --fieldName title --sizeMin 1 --sizeMax 50 --notN
61、ull field string --fieldName content --sizeMin 0 --sizeMax 1000 field date --fieldName createDate --type java.util.Date field date --fieldName publishTime --type java.util.Date field string --fieldName publisher --sizeMax 30 field date --fieldName startTime --type java.util.Date --dateTimeFo
62、rmatPattern
field number --fieldName hits --type int --value 0
(2) 創(chuàng)建實(shí)體對(duì)應(yīng)的表單
創(chuàng)建表單類的目的是用于接收通過(guò)頁(yè)面提交的表單數(shù)據(jù),Spring會(huì)將表單項(xiàng)映射到表單實(shí)體的屬性上,可以通過(guò)annotation的方式方便的完成表單驗(yàn)證以及格式轉(zhuǎn)換。
public class AnnounceForm extends Form
63、 private String title; @Size(min = 0, max = 1000, message="Content length must not more than 1000.") private String content; @Temporal(TemporalType.TIMESTAMP) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date publishTime; @Temporal(TemporalType.TIMESTA
64、MP) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date startTime; @Temporal(TemporalType.TIMESTAMP) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date endTime; @Override public boolean validate(){ if(endTime.before(startTime)){
65、 errorMessages = "The end time must after start time!"; return false; } return true; } @Override public Announce toEntity() { Announce ann = new Announce(); ann.setTitle(title); ann.setContent(content); ann.setCreateDate(new Date()); ann.setStartTime
66、(startTime); ann.setEndTime(endTime); ann.setPublishTime(publishTime); return ann; } .……(get/set方法省略) } 需要注意的是,表單實(shí)體需要繼承Form類以獲取表單額外驗(yàn)證以及轉(zhuǎn)換為數(shù)據(jù)實(shí)體的能力,F(xiàn)orm類是一個(gè)泛型類,內(nèi)部包含兩個(gè)方法,validate和toEntitiy方法,分別用來(lái)添加額外的表單驗(yàn)證邏輯和將表單轉(zhuǎn)換為數(shù)據(jù)實(shí)體。在最簡(jiǎn)單的情況下,也就是這里,我們只需要實(shí)現(xiàn)toEntity方法,轉(zhuǎn)換表單對(duì)象為實(shí)體即可。 (3) 創(chuàng)建service 創(chuàng)建Service層是相當(dāng)簡(jiǎn)單的,只需要簡(jiǎn)單的執(zhí)行一條命令就可以完成service層的創(chuàng)建,service會(huì)自動(dòng)的實(shí)現(xiàn)所有的對(duì)數(shù)據(jù)實(shí)體的增刪改查操作。 service --interface ~.extensions.announce.service.AnnounceService --entity ~.extensions.announce.model.Announce (4) 創(chuàng)建控制器 對(duì)于控制
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版必修五《林教頭風(fēng)雪山神廟》ppt課件
- 人教版《分?jǐn)?shù)的意義和性質(zhì)》(完美版)課件
- 正比例函數(shù)及性質(zhì)
- 企業(yè)戰(zhàn)略環(huán)境分析
- 前列腺增生3課件
- 煉鐵基礎(chǔ)非高爐煉鐵課件
- 小兒腹瀉小講課分析課件
- 職業(yè)經(jīng)理人的壓力管理課件
- 街道改造PPT方案展示-項(xiàng)目概況案例分析現(xiàn)存建筑質(zhì)量設(shè)計(jì)理念課件
- 2022年北師大版小學(xué)數(shù)學(xué)《小數(shù)目物品平均分》課件
- 作文指導(dǎo)--場(chǎng)面描寫-PPT
- 肺癌診斷和治療的幾個(gè)問(wèn)題
- 一下《王二小》
- 第八章專題八(教育精品)
- 六年級(jí)數(shù)學(xué)下冊(cè) 正負(fù)數(shù) 2課件 人教新課標(biāo)