【JavaWeb】MVC三層架構

MVC三層架構

  • MVC 是什么?
  • 三層架構的組成(View、Controller、Model)
  • 各層職責劃分
  • 示例說明
  • 面試高頻問題與參考答案

MVC(Model-View-Controller)是一種經典的軟件設計模式,廣泛應用于 Web 應用開發中,尤其是 Java Web(Servlet + JSP)、Spring MVC 等框架。


什么是 MVC?

MVC 全稱是 Model-View-Controller,它將應用程序分為三個核心部分:

層級英文名中文名職責
MModel模型處理數據、業務邏輯
VView視圖用戶界面(如 HTML 頁面)
CController控制器接收請求,調用模型,返回視圖

MVC 在 Java Web 中的三層架構詳解

在實際開發中,我們通常把 MVC 擴展為 三層架構(3-tier architecture),分別是:

表現層(View / UI Layer)

  • 技術實現:JSP、HTML、CSS、JavaScript
  • 作用
    • 展示數據給用戶
    • 接收用戶輸入
    • 不處理復雜邏輯,只負責展示和跳轉

控制層(Controller Layer)

  • 技術實現:Servlet、Spring MVC 的 @Controller@RestController
  • 作用
    • 接收用戶的 HTTP 請求
    • 調用 Service 層處理業務邏輯
    • 根據結果選擇跳轉的頁面(Forward/Redirect)

示例代碼(Servlet):

@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}

業務邏輯層(Service Layer)

  • 技術實現:Java 類(如 UserServiceOrderService
  • 作用
    • 處理具體的業務規則(如登錄驗證、訂單計算)
    • 調用 DAO 層獲取或保存數據

示例代碼:

public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}

數據訪問層(DAO Layer / Persistence Layer)

  • 技術實現:Java 類(如 UserDao),配合 JDBC、MyBatis、Hibernate 等
  • 作用
    • 與數據庫交互(增刪改查)
    • 封裝底層 SQL 操作

示例代碼:

public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 連接數據庫查詢// 返回 User 對象}
}

MVC 分層結構

+---------------------+
|       Browser       |
+----------+----------+|| HTTP Requestv
+----------+----------+
|     Controller      | ←→ 調用 Service 層
+----------+----------+|| 調用 DAO 層v
+----------+----------+
|       Service       |
+----------+----------+|| 操作數據庫v
+----------+----------+
|         DAO         |
+----------+----------+|| 數據庫操作v
+----------+----------+
|       Database      |
+---------------------+

MVC 的優勢

優點說明
分工明確各層職責清晰,便于團隊協作
易于維護修改某一層不影響其他層
可擴展性強可以替換某一層而不影響整體架構
降低耦合各層之間通過接口通信,松耦合設計
提高復用性Service 層可被多個 Controller 復用

簡單案例演示

場景:用戶登錄功能

View(login.jsp)
<form action="login" method="post">用戶名:<input type="text" name="username"><br>密碼:<input type="password" name="password"><br><input type="submit" value="登錄">
</form>
Controller(LoginServlet)
@WebServlet("/login")
public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");UserService userService = new UserService();User user = userService.login(username, password);if (user != null) {request.setAttribute("user", user);request.getRequestDispatcher("welcome.jsp").forward(request, response);} else {response.sendRedirect("login.jsp");}}
}
Service(UserService.java)
public class UserService {private UserDao userDao = new UserDao();public User login(String username, String password) {return userDao.findByUsernameAndPassword(username, password);}
}
DAO(UserDao.java)
public class UserDao {public User findByUsernameAndPassword(String username, String password) {// 查詢數據庫并封裝成 User 對象return user;}
}
View(welcome.jsp)
<h1>歡迎你,${user.username}</h1>

面試高頻問題

Q1:MVC 和三層架構的區別是什么?

A:MVC 是一種設計模式,強調的是 用戶交互流程;而三層架構是從 系統架構角度 劃分的層次結構,兩者結合后形成完整的 Web 應用結構。


Q2:為什么要在項目中使用 MVC?

A:為了實現 前后端分離、邏輯清晰、易于維護、提高開發效率。各層分工明確,便于多人協作開發。


Q3:Servlet 在 MVC 中屬于哪一層?JSP 呢?

A:

  • Servlet 屬于 Controller 層,用于接收請求和控制流程;
  • JSP 屬于 View 層,用于展示數據和頁面渲染。

Q4:如果不用 MVC,會有什么問題?

A:會出現大量業務邏輯混雜在 JSP 頁面中,導致代碼難以維護、不易測試、安全性差等問題。


Q5:如何保證各層之間的低耦合?

A:通過接口編程、依賴注入等方式,使各層之間僅依賴接口而非具體實現類。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83593.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83593.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83593.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

嵌入式分析利器:DuckDB與SqlSugar實戰

? 一、DuckDB 的核心特性與適用場景 DuckDB 是一款 嵌入式分析型數據庫&#xff08;OLAP&#xff09; &#xff0c;專為高效查詢設計&#xff0c;主要特點包括&#xff1a; 列式存儲與向量化引擎 數據按列存儲&#xff0c;提升聚合統計效率&#xff08;如 SUM/AVG&#xf…

React---day6、7

6、組件之間進行數據傳遞 **6.1 父傳子&#xff1a;**props傳遞屬性 父組件&#xff1a; <div><ChildCpn name"蔣乙菥" age"18" height"1,88" /> </div>子組件&#xff1a; export class ChildCpn extends React.Component…

Windows上用FFmpeg采集攝像頭推流 → MediaMTX服務器轉發流 → WSL2上拉流播放

1. Windows上 FFmpeg 推流&#xff08;攝像頭采集&#xff09; 設備名稱可用 ffmpeg -list_devices true -f dshow -i dummy 查詢&#xff0c;假設為Integrated Camera 采集推流示例&#xff08;推RTMP到MediaMTX&#xff09;&#xff1a; ffmpeg -rtbufsize 100M -f dshow …

SpringBoot1--簡單體驗

1 Helloworld 打開&#xff1a;https://start.spring.io/ 選擇maven配置。增加SpringWeb的依賴。 Generate之后解壓&#xff0c;代碼大致如下&#xff1a; hpDESKTOP-430500P:~/springboot2/demo$ tree ├── HELP.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── s…

MATLAB 中調整超參數的系統性方法

在深度學習中&#xff0c;超參數調整是提升模型性能的關鍵環節。以下是 MATLAB 中調整超參數的系統性方法&#xff0c;涵蓋核心參數、優化策略及實戰案例&#xff1a; 一、關鍵超參數及其影響 超參數作用典型范圍學習率 (Learning Rate)控制參數更新步長&#xff0c;影響收斂…

根目錄0xa0屬性對應的Ntfs!_SCB中的FileObject是什么時候被建立的----NTFS源代碼分析--重要

根目錄0xa0屬性對應的Ntfs!_SCB中的FileObject是什么時候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…

(二)stm32使用4g模塊(移遠ec800k)連接mqtt

下面代碼是隨手寫的&#xff0c;沒有嚴謹測試僅供參考測試 uint8_t msgBuf[200]{"msg from mcu"}; uint8_t txBuf[250]{0}; uint16_t msgid0; uint16_t mqttTaskState0; uint16_t t100msCount0; uint8_t sendFlag10; uint8_t sendFlag20; void t100msTask1(void) { …

哈希表入門:用 C 語言實現簡單哈希表(開放尋址法解決沖突)

目錄 一、引言 二、代碼結構與核心概念解析 1. 數據結構定義 2. 初始化函數 initList 3. 哈希函數 hash 4. 插入函數 put&#xff08;核心邏輯&#xff09; 開放尋址法詳解&#xff1a; 三、主函數驗證與運行結果 1. 測試邏輯 2. 運行結果分析 四、完整代碼 五、優…

Windows下運行Redis并設置為開機自啟的服務

下載Redis-Windows 點擊redis-windows-7.4.0下載鏈接下載Redis 解壓之后得到如下文件 右鍵install_redis.cmd文件&#xff0c;選擇在記事本中編輯。 將這里改為redis.windows.conf后保存&#xff0c;退出記事本&#xff0c;右鍵后選擇以管理員身份運行。 在任務管理器中能夠…

2025年ESWA SCI1區TOP,改進成吉思汗鯊魚算法MGKSO+肝癌疾病預測,深度解析+性能實測

目錄 1.摘要2.成吉思汗鯊魚優化算法GKSO原理3.MGKSO4.結果展示5.參考文獻6.代碼獲取7.算法輔導應用定制讀者交流 1.摘要 本文針對肝癌&#xff08;HCC&#xff09;早期診斷難題&#xff0c;提出了一種基于改進成吉思汗鯊魚優化算法&#xff08;MGKSO&#xff09;的計算機輔助診…

李沐-動手學深度學習:RNN

1.RNN從零開始實現 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l#8.3.4節 #batch_size&#xff1a;每個小批量中子序列樣本的數目&#xff0c;num_steps&#xff1a;每個子序列中預定義的時間步數 #loa…

【C++ Qt】多元素控件(ListWidget、TableWidget、TreeWidget)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章將通過代碼示例詳細介紹了Qt中QListWidget、QTableWidget和QTreeWidget三種多元素控件的使用方法與核心功能&#xff0c;涵蓋列表的增刪操作、表格…

基于TI DSP控制的光伏逆變器最大功率跟蹤mppt

基于TI DSP&#xff08;如TMS320F28335&#xff09;控制的光伏逆變器最大功率跟蹤&#xff08;MPPT&#xff09;程序通常涉及以下幾個關鍵部分&#xff1a;硬件電路設計、MPPT算法實現、以及DSP的編程。以下是基于TI DSP的光伏逆變器MPPT程序的一個示例&#xff0c;主要采用擾動…

Python實現P-PSO優化算法優化卷積神經網絡CNN回歸模型項目實戰

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔&#xff09;&#xff0c;如需數據代碼文檔可以直接到文章最后關注獲取。 1.項目背景 隨著人工智能和深度學習技術的快速發展&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;在圖像分類、目標檢測…

計算機視覺入門:OpenCV與YOLO目標檢測

計算機視覺入門&#xff1a;OpenCV與YOLO目標檢測 系統化學習人工智能網站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目錄 計算機視覺入門&#xff1a;OpenCV與YOLO目標檢測摘要引言技術原理對比1. OpenCV&#xff1a;傳統圖像處理與機器學…

【PCB工藝】繪制原理圖 + PCB設計大綱:最小核心板STM32F103ZET6

繪制原理圖和PCB布線之間的聯系,在繪制原理圖的時候,考慮到后續的PCB設計+嵌入式軟件代碼的業務邏輯,需要在繪制原理圖之初涉及到 硬件設計流程的前期規劃。在嵌入式系統開發中,原理圖設計是整個項目的基礎,直接影響到后續的: PCB 布線效率和質量 ☆☆☆重點嵌入式軟件的…

Centos系統搭建主備DNS服務

目錄 一、主DNS服務器配置 1.安裝 BIND 軟件包 2.配置主配置文件 3.創建正向區域文件 4.創建區域數據文件 5.檢查配置語法并重啟服務 二、從DNS服務配置 1.安裝 BIND 軟件包 2.配置主配置文件 3.創建緩存目錄 4.啟動并設置開機自啟 一、主DNS服務器配置 1.安裝 BIN…

LeetCode[513]找樹左下角的值

思路&#xff1a; 找樹左下角的值&#xff0c;有可能這個值不是左葉子節點&#xff0c;可能是右葉子節點&#xff0c;但怎么說這個值都是葉子節點&#xff0c;首先這道題用層序遍歷的思路比如什么隊列和BSF的遞歸都可以做&#xff0c;但我比較喜歡用純遞歸來搞&#xff0c;因為…

ubuntu20.04.5--arm64版上使用node集成java

ubuntu20.04.5arm上使用node集成java #ssh&#xff0c;可選 sudo apt update sudo apt install openssh-server sudo systemctl status ssh sudo systemctl enable ssh sudo systemctl enable --now ssh #防火墻相關&#xff0c;可選 sudo ufw allow ssh sudo ufw allow 22…

更新 Docker 容器中的某一個文件

&#x1f504; 如何更新 Docker 容器中的某一個文件 以下是幾種在 Docker 中更新單個文件的常用方法&#xff0c;適用于不同場景。 ? 方法一&#xff1a;使用 docker cp 拷貝文件到容器中&#xff08;最簡單&#xff09; &#x1f9f0; 命令格式&#xff1a; docker cp <…