Spring Web MVC介紹及詳細教程

目錄

1.什么是Spring Web MVC?

1.1 MVC定義

1.2 Spring MVC與MVC關系

2.為什么要學習Spring MVC

3.項目創建

4.Spring MVC連接

4.1 @RequestMapping

4.2 @PostMapping和@GetMapping

5.Spring MVC參數獲取

5.1 獲取單個參數

5.2 獲取多個參數

5.3 獲取普通對象

5.4 接收JSON對象

?5.5 獲取URL中參數

5.6 獲取文件

?5.7 獲取Cookie/Session

5.8 獲取Header

6.返回數據(響應)

6.1 返回靜態頁面

6.2 返回數據

6.3 返回HTML代碼片段

6.4 返回JSON


1.什么是Spring Web MVC?

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, "Spring Web MVC",comes from the name of its source module (spring-webmvc)

?引至:Spring Web MVC :: Spring Framework

Spring Web MVC 是基于 Servlet API 構建的原始 Web 框架,從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱(Spring-webmvc),但它通常被稱為"Spring
MVC".

那么什么是Servet呢?為什么不直接使用Servet?

Servlet 是 Java 語言編寫的服務器端程序,用于處理客戶端發送的請求并生成響應。Servlet 運行在支持 Java Servlet 規范的 Web 服務器中,如 Apache Tomcat、Jetty 等。Servlet 提供了一種在 Web 服務器上動態生成 Web 內容的方式,可以處理各種類型的請求,如 HTTP 請求。

盡管 Servlet 可以實現 Web 應用程序的各種功能,但它們通常是在較低級別上操作 HTTP 請求和響應的。使用 Servlet 編寫應用程序需要處理很多底層細節,例如解析請求參數、處理會話管理、管理狀態等。這些工作可以在開發 Web 應用程序時變得繁瑣和重復

也就是說Servet開發Web還是太麻煩了,現在這個追求效率的時代,再去使用Servet已經是out了。

用一句話總結Spring Web MCV:Spring Web MVC 是?個 Web 框架.,下面簡稱為Spring MVC。然?要真正的理解什么是 Spring MVC?我們?先要搞清楚什么是 MVC


1.1 MVC定義

MVC 是 Model View Controller 的縮寫,它是軟件?程中的?種軟件架構設計模式,它把軟件系統分為模型、視圖和控制器三個基本部分 。
? View(視圖) 指在應?程序中專??來與瀏覽器進?交互,展?數據的資源.
? Model(模型) 是應?程序的主體部分,?來處理程序中數據邏輯的部分.
? Controller(控制器)可以理解為?個分發器,?來決定對于視圖發來的請求,需要?哪?個模型來處理,以及處理完后需要跳回到哪?個視圖。即, ?來連接視圖和模型

1.2 Spring MVC與MVC關系

MVC 是?種架構設計模式, 也?種思想(這種思想很早就有了,在Spring MVC之前可以通過其他的方式來實現), 而 Spring MVC 是對 MVC 思想的具體實現. 除此之外,SpringMVC還是?個Web框架. 總結來說,Spring MVC 是?個實現了 MVC 模式的 Web 框架.

所以, Spring MVC主要關注有兩個點:?

1.MVC

2.Web架構。


2.為什么要學習Spring MVC

現在絕?部分的 Java 項?都是基于 Spring(或 Spring Boot)的,而 Spring 的核心就是 Spring
MVC。也就是說 Spring MVC 是 Spring 框架的核?模塊, Spring Boot 是 Spring 的腳?架,因此我們可以推斷出,現在市?上絕?部分的 Java 項?約等于 Spring MVC 項目,這是我們要學 Spring MVC 的原因。
在創建 Spring Boot 項?時,我們勾選的 Spring Web 框架其實就是 Spring MVC 框架,如下圖所
示:
簡單來說,咱們之所以要學習 Spring MVC 是因為它是?切項?的基礎,創建的所有Spring、Spring Boot 項?基本都是基于 Spring MVC 的。 學習Spring MVC, 重點也就是學習如何通過瀏覽器和??程序進?交互. 主要分以下三個??:
1. 建?連接:將??(瀏覽器)和 Java 程序連接起來,也就是訪問?個地址能夠調?到我們的
Spring 程序。
2. 請求: ??請求的時候會帶?些參數,在程序中要想辦法獲取到參數, 所以請求這塊主要是 獲取參數的功能.
3. 響應: 執?了業務邏輯之后,要把程序執?的結果返回給??, 也就是響應.
對于 Spring MVC 來說,掌握了以上 3 個功能就相當于掌握了 Spring MVC.

3.項目創建

Spring MVC 項?創建和 Spring Boot 創建項?相同,在創建的時候選擇 Spring Web 就相當于創建了Spring MVC 的項?. 勾選的 Spring Web 框架其實就是 Spring MVC 框架,如上一節提到的圖片所示。
創建方式1:Spring MVC 使? Spring Boot 的?式創建
創建方式2:Spring MVC更早期的創建?式:通過maven添加所需要的各種依賴,這種方式中的過程較復雜,故在2018年以后基本都是使用Spring Boot來進行創建Spring MVC項目。

?通過Spring Boot創建Spring MVC項目:


4.Spring MVC連接

前面提到了學習Spring MVC的第一個點:

1. 建?連接:將??(瀏覽器)和 Java 程序連接起來,也就是訪問?個地址能夠調?到我們的Spring 程序。
這個過程大概也就是路由映射的過程。什么是路由映射:
路由映射是將用戶發起的請求(通常是 URL 請求)與服務器端程序中的特定處理邏輯進行關聯的過程。在 Web 開發中,當用戶在瀏覽器地址欄輸入一個 URL 或點擊頁面中的鏈接時,瀏覽器會向服務器發送一個請求。路由映射的作用是將這個請求映射到后端服務器中的某個處理器(例如控制器方法)上,以執行相應的業務邏輯。

Spring MVC項目實現連接的操作就與路由映射密切相關,實現路由映射可以使用注解。

用來實現注冊接口的路由映射的常見注解有@RequestMapping@PostMapping@GetMapping

4.1 @RequestMapping

@RequestMapping 是 Spring Web 應?程序中最常被?到的注解之?,它是?來注冊接?的路由映射的。
使用方法:
創建?個 UserController 類,實現??通過瀏覽器和程序的交互,具體實現代碼如下:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@RestController
public class UserController {// 路由器規則注冊@RequestMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}

@RequestMapping注解的基本用法說明:

  1. @RequestMapping注解可以修飾類,也可以修飾方法,當修飾類和方法時,訪問的地址是類+方法。
  2. ?@RequestMapping注解可以處理任何HTTP方法的請求,包括GET、POST、PUT、DELETE等。
  3. @RequestMapping注解可以使用method屬性來進行限定處理請求的HTTP方法。
  4. @RequestMapping 的URL 路徑最前?加不加 / (斜杠)都可以, Spring程序啟動時, 會進?判斷, 如果前?沒有加 / , Spring會拼接上?個 /
接下來訪問: http://127.0.0.1:8080/sayHi , 就可以看到程序返回的數據了:

4.2 @PostMapping和@GetMapping

(1)@PostMapping基本使用

@RestController
public class UserController {// 路由器規則注冊@PostMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}

@PostMapping注解的基本用法說明:

  • @PostMapping注解通常用于修飾控制器類中的方法,而不是類本身。
  • @PostMapping注解只可以處理HTTP POST請求映射到處理方法上。

(2)@GetMapping基本使用

@RestController
public class UserController {// 路由器規則注冊@GetMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}

@GetMapping注解的基本用法說明:

  • @GetMapping注解通常用于修飾控制器類中的方法,而不是類本身。
  • @GetMapping注解只可以處理HTTP GET請求映射到處理方法上

(3)get請求在Spring MVC中的3種寫法

// 寫法1
@RequestMapping("/index")
// 寫法2
@RequestMapping(value = "/index",method = RequestMethod.GET)
// 寫法3
@GetMapping("/index")

(4)post的2種寫法

// 寫法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 寫法2
@PostMapping("/index")

5.Spring MVC參數獲取

5.1 獲取單個參數

(1)代碼

(2)Postman發送請求驗證

注意:

  • 代碼中聲明的參數名與請求地址欄中的參數名要完全一致

  • ?否則,必須要在后端對變量進行重命名

注意: 此時我們的前端就必須傳遞被重命名后的變量了,也就是前端的變量名必須是userName,否則就會報錯。

我們查看@RequestParam 注解的實現細節就可以發現端倪,注解實現如下:

5.2 獲取多個參數

(1)代碼:

(2)Postman驗證

獲取多個參數注意說明:

1)進行參數匹配時,后端代碼的參數名稱要與地址欄中的參數名稱要保證完全一致。

2)前后端進行參數匹配時,是以參數的名稱進行匹配的,因此地址欄中的參數位置是不影響后端獲取參數的結果。

5.3 獲取普通對象

實體類:

(1)代碼:

(2)postman驗證

獲取普通對象注意說明:

1)Spring MVC 會根據地址欄中輸入的參數列表自動實現參數對象的賦值操作。

5.4 接收JSON對象

@RequestBody 接收JSON對象
(1)代碼:
(2)postman:

?5.5 獲取URL中參數

使用@PathVariable注解

(1)代碼:
(2)Poatman:

?注意:

如果?法參數名稱和需要綁定的URL中的變量名稱不?致時, 需要@PathVariable的屬性value賦值,比如:

5.6 獲取文件

使用@RequestPart

(1)代碼:

(2)postman發送請求:

?(3)觀察硬盤F:/Download下是否成功寫入后端接收的前端傳來的文件:

?5.7 獲取Cookie/Session

(1)什么是Cookie

HTTP 協議??是屬于 "?狀態" 協議. 也就是說:默認情況下 HTTP 協議的客?端和服務器之間的這次通信, 和下次通信之間沒有直接的聯系.

但是實際開發中, 我們很多時候是需要知道請求之間的關聯關系的: 例如登陸?站成功后, 第?次訪問的時候服務器就能知道該請求是否是已經登陸過了.

上述圖中的 "令牌" 通常就存儲在 Cookie 字段中。

此時在服務器這邊就需要記錄"令牌"信息, 以及令牌對應的??信息, 這個就是 Session 機制所做的?作
(2)理解Session
先來理解一下什么是會話:
在計算機領域, 會話是?個客?與服務器之間的不中斷的請求響應. 對客?的每個請求,服務器能夠識別出請求來?于同?個客?. 當?個未知的客?向Web應?程序發送第?個請求時就開始了?個會話. 當客?明確結束會話或服務器在?個時限內沒有接受到客?的任何請求時,會話就結束了。
服務器同?時刻收到的請求是很多的. 服務器需要清楚的區分每個請求是從屬于哪個??, 也就是屬于哪個會話, 就需要在服務器這邊記錄每個會話以及與??的信息的對應關系. Session是服務器為了保存??信息?創建的?個特殊的對象.
Session的本質就是?個 "哈希表", 存儲了?些鍵值對結構. Key 就是SessionID, Value 就是??信息(??信息可以根據需求靈活設計).
更加詳細的區別和聯系不再贅述了,這里主要還是講解SpringMVC,感興趣的可以通過我的另一篇博文來了解Cookie和Session。
(3)獲取Cookie
使用@CookieValue

(4)Session的存儲與獲取

Session是服務器端的機制, 我們需要先存儲, 才能再獲取
Session 也是基于HttpServletRequest 來存儲和獲取的
傳統獲取Session有兩種方式:
  • HttpSession getSession(boolean create);
  • HttpSession getSession();
HttpSession getSession(boolean create) : 參數如果為 true, 則當不存在會話時新建會話; 參數如果為 false, 則當不存在會話時返回 null 。
HttpSession getSession(): 和getSession(true) 含義?樣, 默認值為true.
獲取剛才存入的Session:
當然,課也可以通過@SessionAttribute注解的方式來實現獲取Session

5.8 獲取Header

傳統方式獲取Header

獲取Header也是從 HttpServletRequest 中獲取

?也可以通過@RequestHeader注解來實現:


6.返回數據(響應)

獲取到前端傳來的參數后,我們可以在后端進行業務編排和處理。當處理完業務后,需要再將數據響應給前端,響應結果可以是數據, 也可以是靜態??,也可 以針對響應設置狀態碼, Header信息等。

6.1 返回靜態頁面

創建前端?? index.html(注意路徑)

后端代碼:

執行結果:

結果卻發現, ??未正確返回, http響應把 "/index.html" 當做了http響應正?的數據
那Spring MVC如何才能識別出來 index.html 是?個靜態??, 并進?返回呢?
這是因為使用了@ResponseBody注解,@ResponseBody 表?返回數據.把該注解去掉:

@RestController = @Controller + @ResponseBody?

6.2 返回數據

@ResponseBody 表?返回數據
@ResponseBody 既是類注解, ?是?法注解
如果作?在類上, 表?該類的所有?法, 返回的都是數據, 如果作?在?法上, 表?該?法返回的是數據. 也就是說: 在類上添加 @ResponseBody 就相當于在所有的?法上添加了 @ResponseBody 注解.
同樣, 如果類上有 @RestController 注解時:表?所有的?法上添加了 @ResponseBody 解, 也就是當前類下所有的?法返回值做為響應數據。
如果?個類的?法?, 既有返回數據的, ?有返回??的, 就把 @ResponseBody 注解添加到對應的?法上即可
@Controller
public class IndexController {@RequestMapping("/index")public Object index(){return "/index.html";
}@RequestMapping("/returnData")@ResponseBodypublic String returnData(){return "該?法返回數據";}
}

6.3 返回HTML代碼片段

后端返回數據時, 如果數據中有HTML代碼, 也會被瀏覽器解析

6.4 返回JSON


結 語

這就是本期總結的全部關于Spring MVC的知識點,希望這篇博客能夠幫助大家更好地掌握SpringMVC,并在實際項目中應用這些知識,構建出高效、穩定的Web應用。如果你有任何疑問或需要進一步的探討,歡迎在評論區留言,我們一起交流學習。感謝你的閱讀!

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

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

相關文章

通用代碼生成器應用場景一,項目前期

通用代碼生成器是一種自動化編程軟件,是一種先進的編譯系統。它具有表級抽象。把系統抽象為域對象,枚舉,彈性登錄模塊,復雜版面和圖形報表。使用通用代碼生成器完成項目前期,比直接使用對應的高級語言快的多&#xff0…

element Notification 消息過多需要折疊

Notification 消息過多太長 希望能折疊 如圖下效果 element-plus 可以將dom 插入到具體的元素 結合css :nth-child 來控制樣式達到效果 element dom 只能插入到body中 所以無法使用:nth-child 1.Notification需要消息提示時設置class let eleNum 0 // 彈窗的序號 function…

vue+canvas實現逐字手寫效果

在pc端進行逐字手寫的功能。用戶可以在一個 inputCanvas 上書寫單個字&#xff0c;然后在特定時間后將這個字添加到 outputCanvas 上&#xff0c;形成一個逐字的手寫效果。用戶還可以保存整幅圖像或者撤銷上一個添加的字。 <template><div class"container"…

小紅書-社區搜索部 (NLP、CV算法實習生) 一面面經

&#x1f604; 整個流程按如下問題展開&#xff0c;用時60min左右面試官人挺好&#xff0c;前半部分問問題&#xff0c;后半部分coding一道題。 各位有什么問題可以直接評論區留言&#xff0c;24小時內必回信息&#xff0c;放心~ 文章目錄 1、自我介紹2、介紹下項目&#xff…

金額計算導致的錯誤問題匯總解決

在日常的開發中&#xff0c;前端計算金額是非常常見&#xff0c;如果不夠仔細&#xff0c;考慮不夠周全的話&#xff0c;很容易犯錯的&#xff0c;金額這個東西一但錯了是很嚴重的&#xff0c;因此總結一些常見的錯誤&#xff1a; 1.最重要的&#xff0c;涉及到計算的參數一定要…

關于做事方式的小討論

大家好&#xff0c;我是阿趙。 ??之前五一勞動節期間&#xff0c;看到了這么一個新聞&#xff1a;某動物園內部收費項目五一期間漲價&#xff0c;喂長頸鹿的樹葉&#xff0c;一枝需要30元。然后新聞下面的評論就炸鍋了&#xff0c;紛紛的指責動物園太黑心&#xff0c;一枝樹葉…

淄博公司商標駁回復審條件及流程

商標是人工審查的&#xff0c;所以不同的人會有不同的想法和意見&#xff0c;導致同一案件的審查結果不同。特別是商標審查周期縮短到5個月&#xff0c;全國平均每個工作日有1萬多個商標提交申請&#xff0c;而全國只有一個商標審查單位——國家商標局提交申請。這種情況下&…

從入門到精通:掌握Scrapy框架的關鍵技巧

在當今信息爆炸的時代&#xff0c;獲取并利用網絡數據成為了許多行業的核心競爭力之一。而作為一名數據分析師、網絡研究者或者是信息工作者&#xff0c;要想獲取網絡上的大量數據&#xff0c;離不開網絡爬蟲工具的幫助。而Scrapy框架作為Python語言中最為強大的網絡爬蟲框架之…

ubuntu當前登錄用戶IP驗證

設置一個白名單列表檢查到登錄用戶IP信息不在白名單&#xff0c;發送信息到指定郵箱 #!/bin/bash# 定義常用IP地址列表文件 KNOWN_IP_FILE"/path/to/known_ips.txt" # 替換為實際路徑# 定義郵件接收者 EMAIL_TO"test163.com"# 定義日志文件 LOG_FILE&quo…

2024-5-23

今日安排&#xff1a; 繼續審計 nf_tables 源碼 && iptables 相關學習?????復現 CTF 相關題目????mount 的使用&#xff0c;學習 namespace (昨昨昨昨昨昨昨昨昨昨昨昨昨天殘留的任務)&#xff08;&#xff1a;看我能擱到什么時候???靜不下心學習新知識就…

qmt量化交易策略小白學習筆記第11期【qmt編程之獲取股票訂單流數據--原生Python】

qmt編程之獲取股票訂單流數據 qmt更加詳細的教程方法&#xff0c;會持續慢慢梳理。 也可找尋博主的歷史文章&#xff0c;搜索關鍵詞查看解決方案 &#xff01; 感謝關注&#xff0c;需免費開通量化回測與咨詢實盤權限&#xff0c;可以和博主聯系&#xff01; 獲取股票訂單流…

Java版工程行業管理系統-提升工程項目的綜合管理能力

工程項目管理涉及眾多環節和角色&#xff0c;如何實現高效協同和信息共享是關鍵。本文將介紹一個采用先進技術框架的Java版工程項目管理系統&#xff0c;該系統支持前后端分離&#xff0c;功能全面&#xff0c;可滿足不同角色的需求。從項目進度圖表到施工地圖&#xff0c;再到…

Java泛型類和方法聲明

泛型方法 protected <E> TableDataInfo<E> getDataTable(List<E> list){TableDataInfo<E> rspData new TableDataInfo();rspData.setCode(HttpStatus.SUCCESS);rspData.setMsg("查詢成功");rspData.setRows(list);rspData.setTotal(new Pag…

C++_vector操作使用

文章目錄 &#x1f680;1.1 vector介紹&#x1f680;1.2 vector的初始化&#x1f680;1.3 vector的常用內置函數&#x1f680;1.4 vector的遍歷 &#x1f680;1.1 vector介紹 vector是表示可變大小數組的序列容器。就像數組一樣&#xff0c;vector也采用的連續存儲空間來存儲元…

MySQL主從復制(docker搭建)

文章目錄 1.MySQL主從復制配置1.主服務器配置1.拉取mysql5.7的鏡像2.啟動一個主mysql&#xff0c;進行端口映射和目錄掛載3.進入/mysql5.7/mysql-master/conf中創建my.cnf并寫入主mysql配置1.進入目錄2.執行命令寫入配置 4.重啟mysql容器&#xff0c;使配置生效5.進入主mysql&a…

python篇-pywinauto使用-持續更新

1- pywinauto 中的uia是什么意思&#xff1f; 在pywinauto庫中&#xff0c;uia指的是UI Automation&#xff0c;這是Windows操作系統提供的一種技術框架&#xff0c;用于實現用戶界面(UI)的自動化測試和輔助功能訪問。UI Automation是微軟從Windows Vista開始引入的核心技術&am…

2024年電工杯高校數學建模競賽(B題) 建模解析| 大學生平衡膳食食譜的優化設計 |小鹿學長帶隊指引全代碼文章與思路

我是鹿鹿學長&#xff0c;就讀于上海交通大學&#xff0c;截至目前已經幫200人完成了建模與思路的構建的處理了&#xff5e; 本篇文章是鹿鹿學長經過深度思考&#xff0c;獨辟蹊徑&#xff0c;實現綜合建模。獨創復雜系統視角&#xff0c;幫助你解決電工杯的難關呀。 本題&…

面試八股之MySQL篇5——主從同步原理篇

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…

IP地址的風險畫像及其應用

在現代互聯網環境中&#xff0c;IP地址不僅是設備在網絡中的唯一標識符&#xff0c;還是分析網絡安全和風險管理的重要工具。IP地址的風險畫像通過分析IP地址的行為和相關數據&#xff0c;揭示潛在的安全威脅&#xff0c;為企業和組織提供有效的風險管理方案。本文將探討IP地址…

齊業成工程行業數字化預算費控方案:編制、執行、數據分析全過程閉環管理

工程建設企業具備項目周期長、業務復雜的特點&#xff0c;預算費控涉及內部管理、項目、客戶、收支等&#xff0c;賬目多、且難控。 在工程企業日常預算費控過程中存在著諸多挑戰&#xff1a; ? 數據核對難&#xff1a;涉及數據多&#xff0c;需多部門協同填寫&#xff0c;需…