王悅 張雷
摘 ?要: 闡述了企業級web項目開發的需求特點,架構設計的基本原則和思路,提出了使用多層結構的Web項目架構思想,分析了不同層次的業務范圍和功能特點,研究了表示層、控制器層、業務邏輯層、數據持久化層的主要功能及面相接口編程的實現方案。
關鍵詞: Spring;表示層;控制器層;業務邏輯層;數據持久化層
中圖分類號: TP311. 11 ? ?文獻標識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.06.012
本文著錄格式:王悅,張雷. 基于Spring的企業級Web項目架構設計研究[J]. 軟件,2019,40(6):5356
【Abstract】: This paper expounds the requirements and characteristics of enterprise-level web project development, the basic principles and ideas of architecture design, and puts forward the idea of multi-tier web project architecture. It also analyses the business scope and functional characteristics of different levels, and studies the main functions of presentation layer, controller layer, business logic layer and data persistence layer, as well as the implementation scheme of face-to-face interface programming.
【Key words】: Spring; Presentation layer; Controller layer; Business logic layer; Data persistence layer
0 ?引言
伴隨著信息社會的到來,各類型的應用系統不斷涌現,在Web領域的應用系統開發中,占據主導地位的JAVA技術往往采用Spring框架作為Web項目開發的主體技術。Spring框架從誕生到如今已經經歷了多個版本,精簡了大量配置操作,減少了J2EE的使用難度,是業界較為推崇的主流開源框架。
在企業級項目開發中,對于項目開發的可管理性、科學性、項目化等方面提出了更高的要求,由于企業級項目開發具有開發人員多、項目復雜度高等特點,為實現高內聚、低耦合的原則,必須在團隊化項目開發中有一整套完整的、可分解的、易于
對接的架構設計模型作為開發的基礎,對架構進行科學、合理的分層設計,達到原子化的架構模型設計。
1 ?基于Spring的企業級項目架構
一般來說,基于Spring的企業級架構分為六個層次,分別是表示層、控制器層、業務邏輯層、數據持久化層、數據存儲層和操作系統層。
由圖1可知,表示層是用戶與系統交流的接口層,是用戶直接與系統進行信息交互的重要一層,該層又可以叫做用戶接口層,簡稱UI(user interface);表示層的下面是控制器層,該層負責將表示層提交的信息處理后給到下一層業務邏輯層,同時也將業務邏輯層的結果返回給表示層,負責相關頁面的跳轉等操作;業務邏輯層是整個系統的核心,該層定義了系統的主要業務需求的實現與管理[1];數據持久化層是負責將系統信息在系統與數據存儲層之間的操作管理;數據存儲層一般是脫離于Web項目的獨立子系統,常用的如MySql數據管理系統、Oracle數據管理系統等,用于對數據的存取進行管理;操作系統層是項目運行的環境,負責與網絡、硬件之間進行對接,是獨立于Web項目的系統。
2 ?Spring的表示層
Spring框架的表示層(Presentation layer)設計往往采用較為傳統的Html+Css+JavaScript組合或者Html+Thymeleaf組合,Html是頁面編程語言,一種標準的標簽語言,在大多數的項目開發中,其都是一種前端開發標準;Css是頁面美化的主要工具,近些年來,隨著移動設備的興起對于多設備兼容等問題的出現,Css也推出了Css3這個版本,可以有效的解決多設備自適應問題;JavaScript動態前端編程語言,可以實現實時的前后端信息交互,是目前較為流行的動態前端的主要技術[2]。
Thymeleaf是一個前后端兼顧的框架,可以將后臺代碼直接在前端頁面中調用,同時可以將前端信息直接帶入后端,結合Spring框架可以做到很好的前后端互動。其在前端的調用中一般需要在文件中添加th:標簽,在后面加入相應的代碼可以實現前后代碼的互動。在Spring項目開發中Thymeleaf是一個很好的前后端兼容框架,常常被各大項目所采用[3]。
3 ?Spring的控制器層
控制器層(Controller Layer)是MVC設計模型中的一個重要環節,模型(model)、視圖(View)、控制器(Controller)是一種經典的設計模型,其將項目開發分為了三個層次,也就是視圖、控制器、模型,在Spring框架的企業級開發中,在MVC的基礎上更加細致的劃分了開發層次,但是控制器層仍然采用MVC中的Controller。
Spring MVC框架是Spring技術體系滿足Web項目開發中采用MVC架構時所設計的一個專用框架,在該框架下,開發人員可以使用豐富的庫資源實現表示層與控制器層之間的交互,滿足前后端信息的傳遞與處理[4]。在Spring MVC框架中常常使用Annotation的方式聲明控制器類,該種情況下的控制器工作流程是,用戶通過表示層傳遞過來的請求信息將被DispatcherServlet控制器攔截,HandlerMapping處理映射關系,找到對應的處理器,生產處理器對象及處理器攔截器,DispatcherServlet通過返回的信息選擇合適的HandlerAdapter(處理適配器),HandlerAdapter調用并執行Handler(這里就是后端控制器,也就是開發人員開發的注解Controller類),Handler按照程序執行處理后,將返回一個ModelAndView對象,該對象包含對應的返回結果前端視圖,DispatcherServlet根據該前端視圖將結果返回,前端渲染視圖展示結果。
DispatcherServlet的配置有兩種方式,Xml和Annotation兩種,Xml配置較為常用,其在Web.xml文件中添加對應的標簽。
……
public class MyWebA implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext arguments) throws Exception {
XmlWebApplicationContext mycontext = new XmlWebApplicationContext();
mycontext.setConfigLocation("/WEB-INF/myspring/dispatcherConfigs.xml");
ServletRegistration.Dynamic mydispatcher = arguments.addServlet("mydispatcher", new DispatcherServlet (mycontext));
mydispatcher.setLoadOnStartup(1);
mydispatcher.addMapping("/");
}
}
Spring MVC的核心是一個配置文件,該文件被存儲在類路徑下,該文件負責將DispatcherServlet攔截下來的Web請求加以分類處理,例如:根據擴展名的不同交由不同的后端控制器處理,一般該配置文件由兩種配置方案處理,一種是使用該配置文件的Xml配置方式,另一種是由Annotation注解的方式加以處理,但是第二種方案仍然需要Spring MVC配置文件的存在。
<?xml version="1.0" encoding="UTF-8"?>
……
……
上面是一個簡單的Spring MVC配置文件,其中的
4 ?Spring的業務邏輯層
業務邏輯層(Business Logic Layer)是企業開發的核心層,是考驗一個項目是否成功的關鍵所在,其接受上層控制器層傳遞的信息、命令,調用相關的算法、下層的數據持久化層完成相關業務的處理,并將結果返回給控制器層,該層是整個Web項目的核心,控制中樞,在很多大的Web項目中該層都是由設計人員首要考慮完成、豐富和實現的內容,由于業務邏輯層由業務而生,不同的業務有不同的需求,所以在Spring框架中并未設置專屬的類庫加以封裝,而是由設計者采用面向接口編程IOP(Interface-oriented programming)的思維模式設計而成,基本思路是,將業務中需要實現的方法統一的由一個Service接口來管理,方法具體實現的內容則由實現該接口的類來實現,接口可以設置某一業務領域的統一方法名,分支領域的業務實現有所不同,可以為每個分支領域設置一個實現類來實現相關方法,從而實現“思想統一,但具體事情具體分析”的特性。
從目錄結構來講,業務邏輯會有一個統一的包,往往采用services結尾,例如:com.gdkm.services,其中com是公司的簡稱,gdkm是項目的簡稱,services代表業務邏輯的總目錄,不同的業務邏輯可以存放在該目錄下的子目錄中,從而實現統一、規范的管理。在某一分支目錄下創建業務邏輯,一般是由一個接口對應多個實現類的方式,每個接口也可以設置一個上層父接口,從而實現代碼復用。例如:我們要對賬號進行相關的業務處理,可以構建一個AccountService接口,在該接口中設置多個業務邏輯處理方法,addAccount(Account account)、findAccountById(Int id)、saveAccount(Account account)、deleteAccount(Int id),分別對應的處理添加賬號,查詢賬號,保存賬號,刪除賬號的業務邏輯,根據不同的分支領域這些業務的實現由不同的實現方法來實現,那就要創建不同的實現類來完成,實現類的命名一般是AccountServiceImp1、AccountServiceImp2以此類推,或者可以將Imp由具體可表示業務的簡稱所取代,這就要由設計團隊來規范和統一管理[6]。在實現類中,每個方法會根據業務的需要調用相關的Api和數據持久化層對象,例如:需要將表示層提交的文件保存到對應的服務器目錄中,這時就要對文件上傳這類業務加以處理,可以通過處理List
由上面的分析可知,這一層的設計規范性尤為重要,良好的規范制定將決定這層結構的設計是否符合具體項目的開發與實施,甚至是影響整個項目是否成功的關鍵所在,有經驗的架構師和分析師會將相關的標準和規范制定清晰,并在實際的開發中對相關開發人員加以指導,強調該層次規范操作的重要性,從而保證項目的順利實施[7]。
5 ?Spring的數據持久化層
數據持久化層(Data Persistence Layer)是負責將項目運行中的數據信息持久的保存起來[8],例如:用戶在項目中修改了自己的信息,該信息被保存到數據庫中,這一行為就是一個持久化的過程。Spring在持久化的技術上有自己獨立的一套技術體系Spring Data,該套技術體系中幾乎包括了現有的持久化技術的全部領域,包括Spring Data Commons、Spring Data JDBC、Spring Data JDBC Ext、Spring Data JPA、Spring Data KeyValue、Spring Data LDAP、Spring Data MonGoDB、Spring Data Redis、Spring Data REST等技術解決方案,數據庫存儲、非數據庫存儲;關系型數據庫存儲、非關系型數據庫等等多個領域的技術解決方案Spring Data均給出了相關技術支撐。
在實際的企業級項目開發中,由于底層采用的存儲方式有所不同,為滿足大多數持久化操作的需求,往往采用Dao模式進行規范,也就是通過創建數據訪問對象的方式加以設計,該種模式是一種典型的面相接口編程IOP(Interface-oriented programming)思維,前面業務邏輯層使用了該種模式,在數據持久化層設計中也是如此。有別于業務邏輯層的設計,數據持久化層的接口設計較為簡單,一般包括增加、刪除、修改、查詢四類操作,較為復雜的是查詢操作,可以根據實際需要設計多個具體的查詢方法[9]。接口要統一的創建一個包加以管理,例如:com.gdkm.dao,com是公司名稱,gdkm是項目名稱,dao代表所有的數據持久化操作庫。實際開發中可以為每個細致的操作設計特定的Dao層接口和具體實現類,例如:賬號管理的AccountDao,在該接口中創建對應的增加、刪除、修改、查詢方法,save(Account account)、update(Account account)、deleteById(int id)、findById(int id)、findAll()、findByName(Stirng name),以上的方法對應添加、更新、刪除、通過id查詢、查詢所有、通過名字查詢幾個方法,根據具體要求創建對應的實現類,實現類中通過調用Spring Data中的具體庫來實現每個具體的方法,從而實現數據持久化操作。
6 ?結束語
綜上所述,企業級項目開發中對可管理性、科學性、項目化等方面提出了更高的要求,堅持以實現高內聚、低耦合的Web項目為原則,將Spring項目開發分為了表示層、控制器層、業務邏輯層、數據持久化層,研究了各個層面所設計的業務領域和實現方法,著重分析了Spring的控制器層和業務邏輯層的設計原則、主要技術和實現過程,對表示層和數據持久化層進行了深入的分析和研究,從以上的研究可知使用Spring框架開發的Web項目具有技術框架成熟、層次劃分清晰、組織架構鮮明、人員分工明確等特點,適合于中大型的企業級軟件項目建設[10]。
參考文獻
[1] Phillip Webb, Dave Syer et al, Spring Boot Reference Guide, https://spring.io/projects/spring-data, Pivotal team, 2019.
[2] wilkinsona,springboot Reporting Issues, https://github.com/ spring-projects/spring-boot,github.com, 2019.
[3] 姚云飛, 杜洪波, 梁建輝. 基于 SpringMVC 框架畢業設計管理系統設計[J]. 軟件, 2018, 39(01): 91-93.
[4] 李敏. 基于struts2-hibernate-spring 的Java Web 系統國際化設計與實現[J]. 軟件, 2016, 37(02): 166-169.
[5] 董恒競. 一種企業移動應用平臺架構設計[J]. 軟件, 2016, 37(01): 136-138.
[6] 韓凌波. 基于mvc 架構的普法考試系統設計與實現[J]. 軟件, 2015, 36(3): 132-134.
[7] 趙康, 李康, 孟晨宇, 等. 基于C/S架構的遠程協助和管理系統[J]. 軟件, 2015, 36(4): 14-17.
[8] 黃沛. 基于RESTful架構的科技信息共享接口系統的設計[J]. 軟件, 2018, 39(7): 170-172.
[9] 陳瑞, 基于Springboot高并發Java Web開發模式[J]. 電腦編程技巧與維護, 2019(04): 27-30.
[10] 張雷, 王悅, 基于SpringBoot微服務架構下的MVC模型研究[J]. 安徽電子信息職業技術學院學報, 2018, 17(4): 1-9.