Java學習手冊:Spring MVC 架構與實現

Spring MVC 架構與實現

一、Spring MVC 概述

Spring MVC 是 Spring 框架的一個模塊,它提供了一套 Web 應用開發的解決方案,實現了 MVC(Model-View-Controller)設計模式。Spring MVC 提供了清晰的分離邏輯層、視圖層和控制器層的結構,便于開發、測試和維護 Web 應用。

二、Spring MVC 的架構

  • DispatcherServlet :前端控制器,是整個 Spring MVC 的核心。它負責接收所有的 HTTP 請求,并將請求分發給相應的處理器。
  • HandlerMapping :處理器映射器,用于將請求映射到具體的處理器(Controller)上。它根據請求的 URL、HTTP 方法等信息,找到對應的處理器。
  • Controller :處理器,用于處理具體的業務邏輯。它接收請求參數,執行相應的業務操作,返回模型和視圖信息。
  • ViewResolver :視圖解析器,用于將邏輯視圖名稱解析為具體的視圖實現。它根據控制器返回的視圖名稱,找到對應的視圖文件(如 JSP、HTML 等)。
  • View :視圖,用于展示數據給用戶。它可以是 JSP、HTML、JSON 等多種形式。

三、Spring MVC 的工作流程

  1. 用戶發送請求到 DispatcherServlet :DispatcherServlet 作為前端控制器,接收所有的 HTTP 請求。
  2. DispatcherServlet 查詢 HandlerMapping :DispatcherServlet 根據請求的 URL 和 HTTP 方法,查詢 HandlerMapping 來找到對應的處理器(Controller)。
  3. HandlerMapping 返回處理器 :HandlerMapping 返回找到的處理器給 DispatcherServlet。
  4. DispatcherServlet 調用處理器 :DispatcherServlet 調用處理器(Controller)來處理請求。
  5. 處理器處理請求并返回模型和視圖 :處理器執行業務邏輯,處理請求參數,返回模型(Model)和視圖(View)信息。
  6. DispatcherServlet 查詢 ViewResolver :DispatcherServlet 使用 ViewResolver 將邏輯視圖名稱解析為具體的視圖實現。
  7. ViewResolver 返回視圖 :ViewResolver 返回具體的視圖給 DispatcherServlet。
  8. DispatcherServlet 渲染視圖 :DispatcherServlet 將模型數據填充到視圖中,渲染視圖。
  9. 將響應返回給用戶 :DispatcherServlet 將渲染后的視圖作為響應返回給用戶。

四、Spring MVC 的配置

1. XML 配置

在 XML 配置文件中,可以配置 DispatcherServlet、HandlerMapping、Controller、ViewResolver 等組件。

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 配置

<beans><!-- 配置 HandlerMapping --><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean><!-- 配置 Controller --><bean name="/hello" class="com.example.controller.HelloController"></bean><!-- 配置 ViewResolver --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/"></property><property name="suffix" value=".jsp"></property></bean>
</beans>
2. 基于注解的配置

從 Spring 2.5 開始,引入了基于注解的配置方式,使得配置更加簡潔和直觀。常用的注解包括 @Controller@RequestMapping@RequestParam@ModelAttribute 等。

Controller 類

@Controller
@RequestMapping("/hello")
public class HelloController {@RequestMapping(method = RequestMethod.GET)public String sayHello(@RequestParam(value = "name", required = false, defaultValue = "World") String name, Model model) {model.addAttribute("name", name);return "hello";}
}

配置類

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/views/");viewResolver.setSuffix(".jsp");return viewResolver;}
}

五、Spring MVC 的主要組件

  • DispatcherServlet :前端控制器,是整個 Spring MVC 的核心。它負責接收所有的 HTTP 請求,并將請求分發給相應的處理器。
  • HandlerMapping :處理器映射器,用于將請求映射到具體的處理器(Controller)上。常用的 HandlerMapping 實現有 BeanNameUrlHandlerMapping、RequestMappingHandlerMapping 等。
  • Controller :處理器,用于處理具體的業務邏輯。它接收請求參數,執行相應的業務操作,返回模型和視圖信息。可以通過 @Controller 注解來標記一個類為 Controller。
  • ViewResolver :視圖解析器,用于將邏輯視圖名稱解析為具體的視圖實現。常用的 ViewResolver 實現有 InternalResourceViewResolver、.FreeMarkerViewResolver 等。
  • View :視圖,用于展示數據給用戶。它可以是 JSP、HTML、JSON 等多種形式。

六、Spring MVC 的優勢

  • 清晰的架構 :Spring MVC 實現了 MVC 設計模式,將邏輯層、視圖層和控制器層清晰地分離,便于開發、測試和維護。
  • 靈活的配置 :Spring MVC 支持多種配置方式,包括 XML 配置和注解配置,可以根據項目的需求靈活選擇。
  • 強大的功能 :Spring MVC 提供了豐富的功能,如請求參數綁定、數據驗證、國際化、文件上傳下載等,滿足 Web 開發的各種需求。
  • 良好的集成性 :Spring MVC 是 Spring 框架的一部分,可以方便地與其他 Spring 模塊(如 Spring JDBC、Spring ORM 等)進行集成,構建完整的企業級應用。
  • 非侵入式設計 :Spring MVC 的設計是非侵入式的,它不會強迫開發者遵循特定的編碼風格或框架結構,開發者可以自由地選擇使用框架的哪些功能,而不影響已有的代碼。

七、總結

Spring MVC 是 Spring 框架的一個重要模塊,為 Web 應用開發提供了一套完整的解決方案。通過掌握 Spring MVC 的架構、工作流程、配置方式和主要組件,開發者可以更好地構建高質量的 Web 應用。Spring MVC 的清晰架構、靈活配置、強大功能和良好的集成性,使其成為開發 Java Web 應用的首選框架之一。在實際開發中,合理利用 Spring MVC 的各種功能和特性,可以提高開發效率,降低開發成本,構建出更加穩定、可靠的 Web 應用。

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

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

相關文章

【TF-BERT】基于張量的融合BERT多模態情感分析

不足&#xff1a;1. 傳統跨模態transformer只能處理2種模態&#xff0c;所以現有方法需要分階段融合3模態&#xff0c;引發信息丟失。2. 直接拼接多模態特征到BERT中&#xff0c;缺乏動態互補機制&#xff0c;無法有效整合非文本模態信息 改進方法&#xff1a;1. 基于張量的跨模…

maven坐標導入jar包時剔除不需要的內容

maven坐標導入jar包時剔除不需要的內容 問題描述解決方案 問題描述 maven坐標導入jar包時剔除不需要的內容 解決方案 Spring Boot 默認使用 Logback&#xff0c;需在 pom.xml 中排除其依賴&#xff1a; <dependency><groupId>org.springframework.boot</gro…

C與指針——輸入輸出

錯誤定位 當一個庫函數出錯時&#xff0c;errno會被重置 perror(const char* s);\\輸出s: errno 對應的錯誤信息 \\如果單獨想要錯誤信息可以 char* e strerror(errno);\\系統錯誤碼轉換為對應的錯誤信息字符串輸出緩沖區 一般輸出緩沖區滿的時候才刷新&#xff0c;也就是…

JSON Web Token 默認密鑰 身份驗證安全性分析 dubbo-admin JWT硬編碼身份驗證繞過

引言 在web開發中&#xff0c;對于用戶認證的問題&#xff0c;有很多的解決方案。其中傳統的認證方式&#xff1a;基于session的用戶身份驗證便是可采用的一種。 基于session的用戶身份驗證驗證過程&#xff1a; 用戶在用進行驗證之后&#xff0c;服務器保存用戶信息返回sess…

STM32GPIO輸出實戰-LED模板

STM32GPIO輸出實戰-LED模板 一&#xff0c;LED控制原理1&#xff0c;LED控制時GPIO的配置2&#xff0c;LED連接方式3&#xff0c;使用HAL庫控制LED的常用函數&#xff1a; 二&#xff0c;任意控制LED模板1&#xff0c;Led底層2&#xff0c;代碼詳細解析 三&#xff0c;實用技巧…

第二十七屆華東杯數學建模A 題 跳臺滑雪問題 完整思路模型及代碼

題目背景 跳臺滑雪起源于 19 世紀&#xff0c;是冬季運動會的傳統競技項目。今年亞洲冬季運動會在我國 哈爾濱舉行&#xff0c;跳臺滑雪項目吸引了包括中國在內的亞洲各國運動健兒踴躍參加&#xff0c;我國運動員取得了優異的成績。 跳臺滑雪融合了速度、力量與精確控制&…

Python之學習筆記(六)

文章目錄 1. 字典&#xff08;Dictionary&#xff09;2. 集合&#xff08;Set&#xff09;3. 字典 vs 集合4. 應用場景5. 注意事項 Python中的字典&#xff08; dict&#xff09;和集合&#xff08; set&#xff09;是兩種高效且常用的數據結構&#xff0c;適用于不同的場景。…

緩存與數據庫的高效讀寫流程解析

目錄 前言1 讀取數據的流程1.1 檢查緩存是否命中1.2 從數據庫讀取數據1.3 更新緩存1.4 返回數據 2 寫入數據的流程2.1 更新數據庫2.2 更新或刪除緩存2.3 緩存失效 3 緩存與數據庫的一致性問題3.1 寫穿&#xff08;Write-through&#xff09;策略3.2 寫回&#xff08;Write-back…

PowerShell 備份 Windows10/11 還原計算機驅動程序SOP

一、現在計算機C目錄下創建一個新的文件夾名稱為 driverbackup 二、打開cmd 以管理員身份執行 dism /online /export-driver /destination: C:\driverbackup 在正常情況下&#xff0c;Windows 10會自動檢測您的設備所需的驅動程序&#xff0c;并將其安裝到您的PC上。 但是&am…

自監督學習(Self-supervised Learning)李宏毅

目錄 Self-supervised Learning簡介&#xff1a; BERT : How to use BERT case1&#xff1a;sequence to class 語言積極性OR消極性判斷 case2&#xff1a;sequence to sequence句子中的詞語詞性標注 case3&#xff1a;sequence2 to class兩個句子是不是一個為前提一個為…

Python基于Django的全國二手房可視化分析系統【附源碼】

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

解決 3D Gaussian Splatting 中 SIBR 可視化組件報錯 uv_mesh.vert 缺失問題【2025最新版!】

一、&#x1f4cc; 引言 在使用 3D Gaussian Splatting&#xff08;3DGS&#xff09;進行三維重建和可視化的過程&#xff0c;SIBR_gaussianViewer_app 是一款官方推薦的本地可視化工具&#xff0c;允許我們在 GPU 上實時瀏覽重建結果。然而&#xff0c;許多用戶在啟動該工具時…

shell_plus

python manage.py shell_plus 是由 django-extensions 提供的一個增強版的 Django shell&#xff0c;它自動導入你的所有模型和其他一些便捷功能&#xff0c;使得交互式開發更加方便。 如果你遇到配置或運行問題&#xff0c;特別是與 RQ_SHOW_ADMIN_LINK 相關的 ImproperlyCon…

文章記單詞 | 第62篇(六級)

一&#xff0c;單詞釋義 noon [nu?n] n. 中午&#xff0c;正午clothes [kl??z] n. 衣服&#xff0c;衣物reward [r??w??d] n. 報酬&#xff0c;獎賞&#xff1b;vt. 獎勵&#xff0c;獎賞newly [?nju?li] adv. 最近&#xff0c;新近&#xff1b;以新的方式premier [?…

Linux watch 命令使用詳解

簡介 watch 命令會以固定間隔&#xff08;默認每 2 秒&#xff09;重復運行給定命令&#xff0c;并在終端上顯示其輸出。它非常適合監控不斷變化的輸出&#xff0c;例如磁盤使用情況、內存使用情況、文件更改、服務狀態等。 基礎語法 watch [options] command常用選項 -n, -…

C++類_成員函數指針

在 C11 里&#xff0c;成員函數指針是一種特殊的指針&#xff0c;它指向類的成員函數。下面詳細介紹成員函數指針的定義、使用及注意事項。 定義 成員函數指針的定義格式如下&#xff1a; 返回類型 (類名::*指針名)(參數列表);例如&#xff1a; class MyClass { public:voi…

qmt下載的數據放在了哪里了?

#qmt獲取日線數據 from xtquant import xtdata # 設置股票代碼列表和時間范圍 stock_list xtdata.get_stock_list_in_sector(滬深A股) # print("獲取到的股票列表&#xff1a;", stock_list,len(stock_list)) start_time 20240501 end_time 20250501# 下載多只股票…

深入淺出數據庫管理系統

數據庫管理系統&#xff1a;數字世界的“隱形管家” ——從數據雜亂到井井有條的秘密武器 一、數據庫管理系統&#xff1a;數字世界的“隱形管家” 你有沒有想過&#xff0c;為什么我們在電商平臺購物時&#xff0c;商品庫存能實時更新&#xff1f;為什么銀行轉賬時&#xff…

關于Docker拉取鏡像超時/無法訪問鏡像倉庫解決方案

文章目錄 關于Docker拉取鏡像超時/無法訪問鏡像倉庫解決方案卸載原先安裝的Docker及相關配置使用代理后無法拉取鏡像解決方案驗證代理連通性安裝 Docker 最新版配置 Docker Daemon HTTP 代理重啟驗證與拉取鏡像 不使用代理解決方案安裝 Docker 最新版配置阿里云容器鏡像加速 關…

Docker Compose:服務編排:批量管理多個容器

通過docker compose進行容器批量管理&#xff1a;一次性啟動四個容器&#xff08;nginx&#xff0c;tomcat&#xff0c;redis&#xff0c;mysql&#xff09; &#xff08;1&#xff09; 創建docker-compose目錄 mkdir ~/docker-compose cd ~/docker-compose &#xff08;2&…