MVC模式的理解和實踐

????????在軟件開發中,MVC(Model-View-Controller)模式是一種經典的設計模式,特別適用于構建用戶界面復雜的Web應用程序。MVC通過將應用程序的業務邏輯、數據顯示和用戶交互分離,使代碼結構更加清晰,易于維護和擴展。本文將詳細介紹MVC模式的概念、原理,并通過一個Java Web應用程序的實例,展示MVC模式的實踐應用。

一、MVC模式概述

????????MVC,全稱為Model-View-Controller,是一種軟件設計典范,它將軟件系統劃分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller)。

  1. 模型(Model):表示業務規則和數據。它負責處理業務邏輯、數據驗證和數據庫操作等。在MVC模式中,模型是核心部分,它封裝了應用程序的數據和業務邏輯。

  2. 視圖(View):是用戶看到并與之交互的界面。它負責顯示數據和接收用戶輸入。視圖層通常使用HTML、CSS和JavaScript等技術來構建用戶界面,但并不直接處理業務邏輯,而是將用戶輸入和請求傳遞給控制器。

  3. 控制器(Controller):是MVC系統的核心,它接收用戶的輸入(通常來自視圖),并決定如何處理這些輸入。控制器層通常使用Servlet、Spring MVC等框架來實現。它接收視圖傳遞的請求,解析請求參數,然后調用模型層來處理業務邏輯,并將處理結果返回給視圖。

????????MVC模式的核心思想是將業務邏輯從界面中分離出來,允許它們單獨改變而不會相互影響。這種分離使得代碼更加模塊化,提高了代碼的可維護性和可擴展性。

二、MVC模式的原理

????????MVC模式的原理可以概括為:View接收用戶輸入,發送請求給Controller,Controller調用Model完成具體操作,Model從數據庫獲取數據并進行業務邏輯判斷,然后觸發事件,即間接返回數據給View。

  1. 用戶交互:用戶通過視圖層(如HTML頁面)與系統進行交互,輸入數據或觸發請求。

  2. 請求傳遞:視圖層將用戶輸入和請求傳遞給控制器層。

  3. 請求處理:控制器層解析請求參數,調用模型層中的業務邏輯方法來處理請求。

  4. 業務邏輯處理:模型層處理業務邏輯,可能涉及數據驗證、數據庫操作等,并返回處理結果。

  5. 結果返回:控制器層將處理結果傳遞給視圖層,視圖層根據結果渲染用戶界面并顯示給用戶。

????????在MVC系統中,視圖層、控制器層和模型層之間應該保持松散的耦合關系,便于系統的維護和擴展。

三、MVC模式的實踐——以Java Web應用程序為例

????????下面,我們將通過一個簡單的Java Web應用程序實例,展示MVC模式的實踐應用。這個應用程序將實現一個基本的用戶登錄功能。

1. 模型(Model)層

????????在模型層,我們需要創建一個User類來表示用戶信息,以及一個UserService類來處理用戶相關的業務邏輯。

// User.java
public class User {private String username;private String password;// Getters and Setterspublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}// UserService.java
import java.util.HashMap;
import java.util.Map;public class UserService {private Map<String, String> userDatabase = new HashMap<>();public UserService() {// 初始化一些用戶數據userDatabase.put("admin", "password123");}public User validateUser(String username, String password) {String storedPassword = userDatabase.get(username);if (storedPassword != null && storedPassword.equals(password)) {User user = new User();user.setUsername(username);return user;}return null;}
}


2. 視圖(View)層

????????在視圖層,我們需要創建一個JSP頁面來顯示登錄表單,并接收用戶輸入。

<!-- login.jsp -->
<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><h2>Login</h2><form action="login" method="post">Username: <input type="text" name="username"><br>Password: <input type="password" name="password"><br><input type="submit" value="Login"></form><c:if test="${not empty error}"><p style="color:red;">${error}</p></c:if>
</body>
</html>


3. 控制器(Controller)層

????????在控制器層,我們需要創建一個LoginController類來處理登錄請求。

// LoginController.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;@Controller
public class LoginController {@Autowiredprivate UserService userService;@RequestMapping(value = "/login", method = RequestMethod.GET)public String showLoginForm() {return "login";}@RequestMapping(value = "/login", method = RequestMethod.POST)public String login(@RequestParam String username, @RequestParam String password, Model model) {User user = userService.validateUser(username, password);if (user != null) {// 登錄成功,重定向到主頁return "redirect:/home";} else {// 登錄失敗,顯示錯誤信息model.addAttribute("error", "Invalid username or password");return "login";}}
}


4. 配置Spring MVC

????????最后,我們需要配置Spring MVC來支持我們的控制器。在web.xml中添加Spring的DispatcherServlet配置。

<!-- web.xml -->
<web-app><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>


????????并在dispatcher-servlet.xml中配置視圖解析器和組件掃描。

<!-- dispatcher-servlet.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.example.controller" /><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" /></bean>
</beans>

總結

????????通過以上步驟,我們實現了一個簡單的Java Web應用程序,該應用程序使用MVC模式來處理用戶登錄功能。在這個例子中,模型層封裝了用戶數據和驗證邏輯,視圖層負責顯示登錄表單和錯誤信息,控制器層處理登錄請求并調用模型層進行驗證。

????????MVC模式通過將業務邏輯、數據顯示和用戶交互分離,使得代碼結構更加清晰,易于維護和擴展。在實際項目中,MVC模式可以應用于更復雜的功能模塊,如用戶權限管理、數據查詢和編輯等。通過合理使用MVC模式,我們可以構建出更加模塊化、可維護性和可擴展性更強的Web應用程序。

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

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

相關文章

[A-22]ARMv8/v9-SMMU多級頁表架構

ver0.1 [看前序文章有驚喜,關注W\X\G=Z+H=“浩瀚架構師”,可以解鎖全部文章] 前言 前文我們對SMMU的系統架構和基本功能做了簡要的介紹,現在大家大致對SMMU在基于ARM體系的系統架構下的總線位置和產品形態有了基本的了解。這里我們還是簡單做個前情回顧,從總線架構角度看…

【UE5 “RuntimeLoadFbx”插件】運行時加載FBX模型

前言 為了解決在Runtime時能夠直接根據FBX模型路徑直接加載FBX的問題&#xff0c;推薦一款名為“RuntimeLoadFBX”的插件。 用法 插件用法如下&#xff0c;只需要指定fbx的地址就可以在場景中生成Actor模型 通過指定輸入參數“Cal Collision”來設置FBX模型的碰撞 還可以通過…

(11)(3.1) ESC接地和接線注意事項

文章目錄 前言 1 歸納 2 電容式 3 電阻 前言 ESC 接地問題由 3 種形式的 ESC 信號/耦合問題組成&#xff0c;即電阻、電容和電感。在制造飛機時&#xff0c;應考慮這三個因素。 1 歸納 這是電流突然變化導致系統中出現大電壓尖峰的趨勢。電源系統中的電感主要是由 ESC 和…

精品基于Python實現的微信小程序校園導航系統-微信小程序

[含文檔PPT源碼等] [包運行成功永久免費答疑輔導] 《django微信小程序校園導航系統》該項目采用技術Python的django框架、mysql數據庫 &#xff0c;項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、核心代碼介紹視頻等 軟件開發環境及開發工具&#xf…

Rstudio-server的安裝、配置、維護

一、安裝Rstudio-server (1)安裝R語言&#xff1a; sudo apt install r-base # 如果沒有管理員權限無法操作 # 這樣裝上R默認在/usr/bin/R其實基本上的流程都可以參考posit的官網&#xff08;也就是Rstudio的官網&#xff09;&#xff1a; https://posit.co/download/rstudio…

Python序列的應用(八):元組、字典

前言&#xff1a;在Python編程語言中&#xff0c;序列是一種非常重要的數據結構&#xff0c;它允許我們存儲和操作有序的數據集合。在前幾期的內容中&#xff0c;我們已經探討了列表&#xff08;List&#xff09;和集合&#xff08;Set&#xff09;這兩種序列的應用&#xff0c…

OpenCV 功能函數介紹

一&#xff0c; 二值化函數 功能&#xff1a; 用于對圖像進行二值化處理 參數&#xff1a; cv2.threshold(輸入你的圖像所對應的灰度圖&#xff0c; 閾值&#xff1a;是浮點還是整數取決予圖像的數據類型 最大值;高于閾值的像素值&#xff0c; 閾值類型&#xff1a;cv2.THR…

【Python】使用Selenium的find_element模塊獲取網頁上的大段文字和表格的方法(建議收藏!)

發現了一個使用Selenium的find_element模塊&#xff0c;快速獲取文字和表格的方法&#xff0c;很實在&#xff0c;以后爬網的時候&#xff0c;就不用beautifulSoup 和 pandas的read_html 混起來用了&#xff01; 文字部分&#xff1a;實現網絡節點下&#xff0c;某個節點下的其…

APP滲透測試記錄(一、Android應用基本構造)

Android應用基本構造 雷電模擬機進入 adb shell# 如果不是root權限 su一下 su 1.了解APK文件 安卓應用的擴展名為.apk(Android Application Package),它是一個包含多個文件和文件夾的數據存檔文件。 1.1 apk文件解壓后的目錄結構 AndroidManifest.xml:包含應用的大部分…

【AI知識】有監督學習之回歸任務(附線性回歸代碼及可視化)

1. 回歸的基本概念 在機器學習的有監督學習中&#xff0c;回歸&#xff08;Regression&#xff09;是一種常見的任務&#xff0c;它的目標是通過觀察數據來建立一個模型&#xff0c;用一個或多個自變量來預測因變量的值。 回歸分析通常用于&#xff1a; a.預測&#xff0c;基于…

fastadmin批量壓縮下載遠程視頻文件

后端代碼 // 批量下載并壓縮 public function downloadAll(){$ids input(ids);$row $this->model->where(id, in, $ids)->field(id,title,video_url)->select();if (!$row) {$this->error(記錄不存在);}$arr [];$tempFiles []; // 用來存儲臨時下載的視頻文…

邊緣計算+人工智能:讓設備更聰明的秘密

引言&#xff1a;日常生活中的“智能”設備 你是否發現&#xff0c;身邊的設備正變得越來越“聰明”&#xff1f; 早上醒來時&#xff0c;智能音箱已經根據你的日程播放舒緩音樂&#xff1b;走進廚房&#xff0c;智能冰箱提醒你今天的食材庫存&#xff1b;而在城市道路上&…

JVM 雙親委派模型以及垃圾回收機制

目錄 1. JVM 內存區域劃分 2. JVM 中類加載的過程 1) 類加載的基本流程 2) 雙親委派模型 3. JVM 中垃圾回收機制 1) 找到垃圾 a) 引用計數 b) 可達性分析 2) 釋放垃圾 1. JVM 內存區域劃分 一個運行起來的 Java 進程&#xff0c;其實就是一個 JVM 虛擬機。 而進程是…

ansible自動化運維(四)jinjia2模板

Jinjia2模板 前面說到playbook組成的時候&#xff0c;有介紹到template模塊&#xff0c;而template模塊對模板文件進行渲染時&#xff0c;使用的就是jinja2模板引擎&#xff0c;jinja2本身就是基于python的模板引擎&#xff0c;所以下面先來了解一下jinjia2模板的一些用法 基…

通過k-means對相似度較高的語句進行分類

本文介紹了如何使用K-Means算法對相似度較高的語句進行分類&#xff0c;并附上java案例代碼 import java.util.ArrayList; import java.util.List; import java.util.Random;public class KMeansTextClustering {public static void main(String[] args) {// 初始化語句數據集…

Oracle 19c rac 補丁升級,從19.7 to19.22-集群

1. 補丁包概述 數據庫環境 角色 數據庫 IP地址 數據庫版本 主機名 數據庫名稱 源端 RAC 172.30.21.166/167 19.7 hfcwdb66/hfcwdb67 hfdb 將以下補丁包上傳到/soft下 上傳到兩個節點的soft目錄下&#xff1a;p6880880_190000_Linux-x86-64.zip &#xff08;更新o…

Windows安裝Jira

下載 Download Jira Data Center | Atlassian https://product-downloads.atlassian.com/software/jira/downloads/atlassian-jira-software-10.3.0-x64.exe 以管理員身份安裝&#xff0c;否則彈出以下提醒 創建和配置MySQL數據庫&#xff1a;參照 Connecting Jira applicat…

uniapp - 微信小程序

一、background-image 大圖不顯示的問題 解決方法&#xff1a; 1、使用網絡地址&#xff1b;2、使用 base64 urlTobase64(filePath) {// #ifdef MP-WEIXINlet img ${filePath},imgBase64 wx.getFileSystemManager().readFileSync(img, "base64"),base64Url data:…

DETR: End-to-End Object Detection with Transformers論文學習

論文地址&#xff1a;https://arxiv.org/pdf/2005.12872 代碼地址&#xff1a;https://github.com/facebookresearch/detr 相關學習視頻&#xff1a;https://space.bilibili.com/94779326/lists?sid1531941 標題前言&#xff1a; DETR 是 Facebook 團隊于 2020 年提出的基于…

LeetCode 24反轉鏈表

單鏈表反轉&#xff1a;詳細解析與代碼實現 在數據結構的學習過程中&#xff0c;鏈表是一個非常重要且有趣的部分&#xff0c;而單鏈表的反轉操作更是常考的基礎知識點。今天就來和大家詳細講講如何實現單鏈表的反轉&#xff0c;并通過代碼示例來加深理解呀。 題目 給定單鏈…