iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 3

Day 03 - Spring MVC WalkThrough - 遊走 Spring MVC

  • 分享至 

  • xImage
  •  

前陣子開玩笑跟朋友提到 lagacy code's gonna live forever /images/emoticon/emoticon70.gif
想想好像有點適合聽 Bon Jovi 的 It's My Life 齁 XD

Yes

昨天提到 Spring Framework 的核心概念,今天來講講 Spring 框架中的設計模式:Spring MVC。

什麼是 MVC(Model-View-Controller)?

  • MVC 是一種軟體設計模式,專門用於組織和管理 GUI (Graphical User Interface) 應用程式的程式碼
  • MVC 中三個互相協作讓應用程式更好維護和擴充的元件:
    1. Model (模型):代表應用程式的核心 logic 和 data。它獨立於使用者界面,並與之隔離。
    2. View (視圖):呈現模型數據的使用者界面。通常,model 會通知 view 它何時需要更新。
    3. Controller (控制器):負責處理使用者輸入和更新 model 及 view。

MVC 的源起:

MVC 的設計模式可以追溯到 1970s,在此之前多數的應用程式都是「緊 (ㄋㄧˇ) 密 (ㄋㄨㄥˊ) 耦 (ㄨㄛˇ) 合 (ㄋㄨㄥˊ)」的架構。

這種單一模組缺乏明確的組織結構,意味著系統中的不同功能(例如資料存取層、業務邏輯層和使用者介面)彼此耦合,容易導致不一致性。另外,這種耦合的程式碼也會讓自動化測試變得相當困難。

由於 MVC 架構能把 業務邏輯使用者界面使用者輸入 清楚地分開,如此可以讓軟體開發朝向模組化發展,所以逐漸受到開發者喜愛,並在各種平台和語言中被採用。

想像一下在餐廳點餐時:

  • Model (模型):在情境中即為廚房和廚師們,廚師知道怎麼製作餐點,並擁有所有食材和工具。我的訂單(今天是打拋豬 XD)就是一個具體的 Model 實例
  • View (視圖):桌上的菜單和看板。看板上會顯示餐點選項和描述。當廚房備好食物,服務生將食物送到我的桌前,這也是 View 的一部分。
  • Controller (控制器):在這範例中指的是服務生。我在櫃檯決定點什麼東西都必須告訴服務生,只有服務生接受我的 輸入(選擇的餐點),並將該這個 輸入 傳達到廚房 Model。廚房根據輸入製作相對應的食物,然後服務生最後再將烹調好的食物(更新後的 View)送來給我。

從這個例子可以簡單理解 MVC 中三個元件間的交互協作:Controller 接受 input,Model 處理 logic,而 View 呈現 result。透過這種分離讓應用程式各個部分能獨立開發和修改,不互相干擾。

接下來可以進一步討論 Spring MVC 了

什麼是 Spring MVC?

  • Spring MVC 是 Spring 框架中的 Web MVC 模組,目的是提供一個輕度耦合的方式來開發 Web 應用。
  • 基於 MVC 架構所設計,由於 Spring MVC 提供更多功能和整合上的優勢,用來替代早期的 SSH 框架。

Spring MVC 和一般提到的 MVC 有何不同?

  • 一般的 MVC 架構只是一個概念或設計原則,不提供實際的工具或框架來實作
  • Spring MVC 使用一個 DispatcherServlet 的前端 controller,該 controller 負責將 request 轉發到正確的 controller 和 view。在一般的 MVC 裡比較沒有這種統一的前端 controller 概念
  • 另外還有 ModelAndViewViewResolver

https://ithelp.ithome.com.tw/upload/images/20230918/20162682X0Y425XWaq.png

Spring MVC 將過去屬於 Servlet 拆分為不同元件,透過 Spring MVC 提供的框架可以避免將不同層混寫在一起

上一篇
Day 02 - Spring Framework Core Technologies - Spring 框架中的硬核(?)技術
下一篇
Day 04 - Spring Boot Starter
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言