1. 程式人生 > >JavaWeb程序架構模式的演進

JavaWeb程序架構模式的演進

學習 分享 images 邏輯 容器 mvc架構 多人 一個表 三元

JavaWeb程序架構模式的演進

老一輩的程序員一般都經歷了Web程序架構模式的演進,從最開始的在jsp或者jsp+Servlet上做開發,到後來的mvc、三層等。而現在有挺多人學完web,可能都沒怎麽使用過jsp或jsp+Servlet開發過項目,就直接學習使用Spring、Spring Boot或者SpringMVC等框架進行開發。如果沒有經歷這樣一個逐步演進的過程,就很難理解框架帶給了我們什麽樣的好處,而且開發過程中遇到問題也難以解決,更別說去學習這些框架中的源碼了。學習是一個循序漸進的過程,不能急於求成,所以本文旨在簡單的聊一聊Web的發展史。

一、web發展簡史

以目前Spring Boot作為時間軸的話,web發展的過程大致可以分為以下幾個階段:

1.純jsp / jsp+Servlet / jsp+JavaBean+Servlet
2.MVC / MVP / 三層架構
3.使用EJB進行分布式應用的開發,EJB是重量級框架,在使用上比較復雜和麻煩
4.由於EJB太重了,於是Spring應運而生,但是Spring在發展上越來越臃腫,所以還是有許多繁瑣的配置
5.同樣的由於String配置太繁瑣,於是Spring boot誕生了,這時就可以體驗到 “約定大於配置” 的樂趣

二、web發展初始階段

1.jsp / jsp+Servlet / jsp+JavaBean+Servlet開發模式:

在最開始的時候,jsp剛剛出來,那時候的web開發基本都是在jsp+JavaBean上完成的。更有甚著直接把頁面、邏輯、數據處理全都寫在jsp上,想也知道這種方式開發的項目代碼不僅亂、而且耦合性相當高,造成項目難以維護。

純JSP流程圖如下:
技術分享圖片

JSP+JavaBean流程圖如下:
技術分享圖片

相信很多人在剛開始學習JavaWeb的時候,或多或少都使用過以上兩種模式的開發,第一種模式就不用說了,所有的代碼都寫在JSP上耦合度相當地高。第二種模式雖然相較於第一種模式上,在一定程度上解耦了,但JSP依舊要負責頁面控制以及請求與響應的處理,職責不單一。耦合度依舊比較高,高度耦合的結果是JSP代碼十分復雜混亂,後期維護很困難。

以上這種模式雖然開發起來比較簡單,當時這種模式也能夠適合一些小型項目的開發,但是由於代碼混亂維護困難也就逐漸被淘汰了。

領教到這種模式的蛋疼之後就開始加上了Servlet,這時JSP只負責頁面控制,Servlet上負責數據的驗證,JavaBean負責具體的業務邏輯與數據處理、封裝以及和數據庫交互等。

JSP+JavaBean+Servlet流程圖如下:
技術分享圖片

在這種模式上已經開始有點MVC的影子了,但是這種模式還不能稱之為一個比較完善的MVC設計模式。這種模式相對於之前的兩種模式來說分工更明確,抽取出了Servlet層,體現了一個簡單的分層思想。

思維導圖:
技術分享圖片

三、web發展初中級階段

1.MVC架構模式
這時候web開發上也開始應用了MVC架構模式,盡管MVC早已不是什麽新鮮的架構模式了,早在桌面開發的時代MVC模式就已經存在。MVC是Model、View、Controller的縮寫,MVC將系統分解為模型、視圖、控制器三部分,每一部分都相對獨立,職責單一,在實現過程中可以專註於自身的核心邏輯。MVC是對系統復雜性的一種合理的梳理與切分,它的思想實質就是“關註點分離”。至於MVC三元素的職責劃分與相互關系,這裏不再贅述,下圖給出了非常細致的說明:
技術分享圖片

上圖說明了MVC組件的功能和關系。

MVC模式各部分之間的通信方式如下:
技術分享圖片

View 傳送指令到 Controller
Controller 完成業務邏輯後,要求 Model 改變狀態
Model 將新的數據發送到 View,用戶得到反饋
所有通信都是單向的

接受用戶指令時,MVC 可以分成兩種方式。一種是通過 View 接受指令,傳遞給 Controller,流程圖如下:
技術分享圖片

另一種是直接通過controller接受指令,流程圖如下:
技術分享圖片

一般在實際項目中往往采用更靈活的方式,通常會把這兩種方式結合在一起,大致流程圖如下:
技術分享圖片

1.用戶可以向 View 發送指令(頁面請求)。
2.用戶也可以直接向 Controller 發送指令(Servlet請求)。

現在的SpringMVC就是MVC架構模式的框架。

MVP架構模式:
MVP與MVC很像,MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。所以很多人都不是很分的清這兩種模式的區別,簡單來說兩者主要的區別在於,MVC是單向通信的,而MVP是雙向通信的。MVP模式將 Controller 改名為 Presenter,所以同時改變了通信方向,流程圖如下:
技術分享圖片

MVP特點:

  • 各部分之間的通信,都是雙向的。
  • View 與 Model 不發生聯系,都通過 Presenter 傳遞。
  • View 非常薄,不部署任何業務邏輯,稱為"被動視圖"(Passive View),即沒有任何主動性,而 Presenter非常厚,大部分主要邏輯都部署在那裏。

三層架構模式:
三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為:界面層(User Interface layer)、業務邏輯層(Business Logic Layer)、數據訪問層(Data access layer)。區分層次的目的即為了“高內聚低耦合”的思想。在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構。微軟推薦的分層式結構一般分為三層,從下至上分別為:數據訪問層、業務邏輯層(又或稱為領域層)、表示層。

很多人容易把三層模式與MVC模式混淆,三層與MVC的最不同的地方在於三層是沒有Controller控制器的概念。雖然同樣是架構級別的,三層與MVC相同的地方在於他們都有一個表現層,但是他們不同的地方在於其他的兩個層。MVC沒有把業務的邏輯訪問看成兩個層,這是采用三層架構或MVC搭建程序最主要的區別。當然了,在三層中也提到了Model概念,但是三層架構中Model的概念與MVC中Model的概念是不一樣的,“三層”中典型的Model層是以實體類構成的,而MVC裏,則是由業務邏輯與訪問數據組成的。

在三層中JSP與Servlet代碼都屬於表示層,業務邏輯層則是完成業務規則的實體類,數據訪問層則是JDBC等代碼,示意圖:
技術分享圖片

以上已經介紹了幾種架構模式,可以看到架構模式的演進目的都是為了解耦,低耦合的架構才能方便於項目後期的維護和擴展,好的架構模式才能讓項目有較好的健壯性。

四、web發展中高級階段

這個階段開始使用EJB進行分布式應用的開發:

EJB是sun的JavaEE服務器端組件模型,設計目標與核心應用是部署分布式應用程序。簡單來說就是把已經編寫好的程序(即:類)打包放在服務器上執行。憑借java跨平臺的優勢,用EJB技術部署的分布式系統可以不限於特定的平臺。EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定義了一個用於開發基於組件的企業多重應用程序的標準。其特點包括網絡服務支持和核心開發工具(SDK)。 在J2EE裏,Enterprise Java Beans(EJB)稱為Java 企業Bean,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。在EJB3.0推出以後,實體Bean被單獨分了出來,形成了新的規範JPA。

EJB 從技術上而言不是一種"產品",EJB 是一種描述了構建應用組件要解決的標準:

  • 可擴展 (Scalable)
  • 分布式 (Distributed)
  • 事務處理(Transactional)
  • 數據存儲(Persistent)
  • 安全性 (Secure)

以上轉自百度百科。

由於我個人沒有使用過EJB進行開發,不敢隨便發表意見,以免誤導大家,對EJB有興趣的可以參考以下文章:

http://www.uml.org.cn/j2ee/2009112011.asp

Spring的誕生:
Rod Johnson在2002年編寫的《Expert One-to-One J2EE Design and Development》一書,Rod 在本書中對J2EE正統框架(EJB)臃腫、低效、脫離現實的種種學院派做法提出了質疑,並以此書為指導思想,編寫了interface21框架,也就是後來的Spring。

基於最優方法並適用於各種應用類型的Spring框架的建立要歸功於Rod Johnson。這些想法也在他的書中得以闡述。書發表後,基於讀者的要求,源代碼在開源使用協議下得以提供。

一批自願拓展Spring框架的程序開發員組成了團隊,2003年2月在Sourceforge上構建了一個項目。在Spring框架上工作了一年之後,這個團隊在2004年3月發布了第一個版本(1.0)。這個版本之後,Spring框架在Java社區裏變得異常流行,部分的要歸結於它好於一般水準的文檔功能和參考文獻,特別是對於一個開源項目而言尤其如此。

Spring解決的是業務邏輯層和其他各層的松耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式) 輕量級開源框架。

Spring框架的特征:

  • 輕量
  • 控制反轉
  • 面向切面
  • 容器
  • 框架
  • MVC

Spring架構概述:
技術分享圖片

Spring雖然相較於EJB要輕量很多,但是發展到現在,Spring也有些臃腫了,在配置上也稍微有些繁瑣,但是Spring依舊是現在的主流框架之一。框架的存在就是為了方便於我們使用一些架構模式,不必再從底層去開始開發,提高了開發的效率。

五、web發展目前階段

到目前為止,已經出現了很多優秀的java開源框架,常見的有Spring、SpringMVC、Spring Boot、Struts 、Hibernate、MyBatis等,其中Spring Boot是Spring框架的簡化。通過這些框架,我們可以很高效的應用架構模式去開發大型的項目。

化繁為簡,Spring Boot框架:

Spring Boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。通過這種方式,Spring Boot致力於在蓬勃發展的快速應用開發領域(rapid application development)成為領導者。

Spring Boot特點:

  • 可以創建獨立的Spring應用程序
  • 嵌入的Tomcat,無需部署WAR文件
  • 簡化Maven配置
  • 自動配置Spring
  • 提供生產就緒型功能,如指標,健康檢查和外部配置
  • 絕對沒有代碼生成以及不要求配置XML

Spring Boot雖然目的是為了簡化Spring,似乎看起來無需去學習Spring的繁瑣配置,直接學Spring Boot多好啊,配置簡單美滋滋,但是如果沒有忍受過Spring的繁瑣配置,沒有經歷過架構模式的演進以及JavaWeb基礎不紮實的話,在使用Spring Boot的過程中就容易出現沒有遇到過的錯誤,也不知道如何去解決。而且設計模式不熟悉的話,也不知道人家框架是怎麽進行實現的,設計思想完全不知道,那麽即便有好的框架在手也沒法玩得6,更別說去設計架構模式了。

六、小結

從以上的演進簡史可以看到目前這些主流框架是怎麽來的,為什麽要有這些框架。可以說我們目前學習技術的時代趕上了最好的時代,現在有那麽多優秀的開源框架可以使用,又有那麽多的設計思想可以借鑒,我們跳過了很多前人經常踩的坑,正是前人踩過了這些坑之後,才能發展那麽多優秀的開源框架與設計思想。但是我們也應該要去經歷一下這種架構模式的演進,才能深刻體會到不同的架構模式與框架帶給我們的好處。現在的新東西越來越多,你我只有不停的進步,不停地學習才能跟上這個時代。

JavaWeb程序架構模式的演進