1. 程式人生 > >javaweb開發:從傳統的MVC架構到現在流行的前後端分離開發架構(RESTful架構)

javaweb開發:從傳統的MVC架構到現在流行的前後端分離開發架構(RESTful架構)

本文介紹傳統的MVC框架和現代的RESTful架構.介紹他們之間的對比。

傳統的MVC框架vs基於RESTful架構前後端分離的開發架構

傳統方法

對於傳統的java'開發,我們使用常用的一處框架是SSH(spring+struts+Hibernate),SSM(spring+springmvc+mybatis).這兩個組合都簡化了開發過程,讓程式設計師更加專注於業務邏輯而非其他細節。簡要回顧一下傳統框架的核心技術: spring:提供IOC/AOP核心功能。實現了低耦合和高內聚的特點,讓java開發者更加關注與業務邏輯的實現。spring最強大的地方在於它能夠與其他主流框架整合以減輕程式設計師的開發負擔。 ORM:當前使用最多的O/R mapping框架,一個是Mybatis(IBATIS), 另一個是Hibernate Controller:對服務端的MVC框架,使用最多的是Structs2以及SpringMVC. 那麼對於傳統的MVC開發模式,我們做一點簡要回顧: 模型(Model):是用於封裝資料的載體,例如,在Java中一般通過一個簡單的POJO(Plain Ordinary Java Object)來表示,其本質是一個普通的Java Bean。
檢視(View):它更加偏重於展現,也就是說,檢視決定了介面到底長什麼樣子,在Java中可通過JSP來充當檢視,或者通過純HTML的方式進行展現,而後者才是目前的主流。
控制器(Controller):模型和檢視需要通過控制器來進行粘合,例如,使用者傳送一個HTTP請求,此時該請求首先會進入控制器,然後控制器去獲取資料並將其封裝為模型,最後將模型傳遞到檢視中進行展現。

那麼傳統的MVC框架的不足之處在哪呢? 1)每次請求必須經過“控制器->模型->檢視”這個流程,使用者才能看到最終的展現的介面,這個過程似乎有些複雜。
2)實際上檢視是依賴於模型的,換句話說,如果沒有模型,檢視也無法呈現出最終的效果。 渲染檢視的過程是在服務端來完成的,最終呈現給瀏覽器的是帶有模型的檢視頁面,效能無法得到很好的優化。

新的方法


正如上圖所示,我們在傳統的MVC框架中進行了改進: 首先從瀏覽器傳送AJAX請求,然後服務端接受該請求並返回JSON資料返回給瀏覽器,最後在瀏覽器中進行介面渲染。
而這個模型正是REST(表述性狀態轉移),這種輕量級的Web服務我們把它稱之為RESTful Web Services服務(REST服務)。 所以如果把瀏覽器視作是前端,伺服器是作為後臺,則將會有如下圖所示:

(注:starUML中箭頭會重疊,所以分為兩個用例了。) 總結:REST服務能夠使得前後端分離。 下面使用SpringMVC建立REST API的一個例子:(當然這裡沒有使用框架)
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bestpay.skynet.mockerplatform.entity.User;
import com.bestpay.skynet.mockerplatform.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;

@RequestMapping("showUser")
public String toIndex(HttpServletRequest request, Model model) {
Long userId = Long.parseLong(request.getParameter("id"));
User user = userService.searchUserModelInfo(userId);
model.addAttribute("user", user);
return "showUser";
}

@RequestMapping(value="/selectUserById/{userId}", method=RequestMethod.GET)
public @ResponseBody User selectUser(@PathVariable Long userId) {
return userService.searchUserModelInfo(userId);
}

@RequestMapping(value="/createUser", method=RequestMethod.POST)
public @ResponseBody Long createUser(@RequestBody User user) {
return userService.addUserModelInfo(user);
}

@RequestMapping(value="/updateUser", method=RequestMethod.PUT)
public @ResponseBody Long updateUser(@RequestBody User user) {
return userService.updateUserModelInfo(user);
}

@RequestMapping(value="/deleteUserById/{userId}", method=RequestMethod.DELETE)
public @ResponseBody Long deleteUser(@PathVariable Long userId) {
return userService.removeUserModelInfo(userId);
}
}

說明:
toIndex方法:傳統的MVC模式,HTTP請求被控制器處理,封裝成模型,最終通過檢視展示。
selectUser方法:前後端分離的REST模式,客戶端通過HTTP請求獲取到JSON資料後進行解析渲染展示。

新的問題:

但是並非前後端開發模式就優越於傳統的開發模式: 問題1.對於傳統MVC:前端人員僅僅提供靜態html頁面,其餘工作皆由後端開發人員完成。---減輕前端人員開發負擔,後端開發壓力較大。 前後端分離開發:可以減後臺負擔,加快研發效率,當然,前提是前端能做好的話。以往只需要提供靜態頁面的前端人員,在前後端分離模式中要負責專案的view+controller部分,即除了靜態頁面,還需要負責頁面的所有互動程式碼、以及nodejs與檢視層以及後端API的互動工作,無疑增加了前端人員的學習成本,在沒有足夠知識和人才儲備的情況下,只能讓前端人員加班加點。結果是大量前端人員離職 問題2:很多公司認為採用前後端分離之後,前後端只需要通過指定API進行互動即可,前端負責頁面渲染,Nodejs負責路由分配,後端提供API。忽視了大量關鍵工作,職責分配和細節處理沒有相應文件規定,快取機制、圖片上傳下載、資料校驗、語言國際化等等並沒有出具相應資訊。另外,大量忽視了nodejs層的作用,僅僅把nodejs當成一個路由中轉,這一方面也是對nodejs技術的不熟悉導致的,其實nodejs能負責很多事,除了複雜業務邏輯處理和資料操作由Java 負責,大量工作完全可以在nodejs層處理。 問題3:很多公司採用了前後端分離模式後,後端API仍然採用以往的傳統風格,這是不合理的,Restful風格的API應該是前後端分離的最佳實踐。ResultFul推薦每個URL能操作具體的資源,而且能準確描述伺服器對資源的處理動作,通常伺服器對資源支援get/post/put/delete/等,用來實現資源的增刪改查。前後端分離的話,這些api-url是對接的橋樑,採用resultFul介面地址含義才更清晰、見名知意 問題四:前後端分離後,無論是API介面的對接還是測試工作,都涉及到前後端人員的溝通,很多公司採用前後端分離後,前後端協作模式配合力度底,互相等待,開發效率低下,反而不如傳統的開發模式。例如:當後端 API 沒有編寫完成時,前端無法進行除錯,這就導致了前端會被後端阻塞的情況。其實像這種互相等待的模式需要改進, Mock Server 可能可以解決一些問題。

如何實現前後端分離開發

怎麼做前後端分離?大方向就是:後端專注於:後端控制層(Restful API) & 服務層 & 資料訪問層;前端專注於:前端控制層(Nodejs) & 檢視層.
大致的前後端分離模式: 1、專案設計階段,前後端架構負責人將專案整體進行分析,討論並確定API風格、職責分配、開發協助模式,確定人員配備;設計確定後,前後端人員共同制定開發介面。
2、專案開發階段,前後端分離是各自分工,協同敏捷開發,後端提供Restful API,並給出詳細文件說明,前端人員進行頁面渲染前臺的任務是傳送API請(GET,PUT,POST,DELETE等)獲取資料(json,xml)後渲染頁面。 3、專案測試階段,API完成之前,前端人員會使用mock server進行模擬測試,後端人員採用junit進行API單元測試,不用互相等待;API完成之後,前後端再對接測試一下就可以了,當然並不是所有的介面都可以提前定義,有一些是在開發過程中進行調整的。
4、專案部署階段,利用nginx 做反向代理,即Java + nodejs + nginx 方式進行。