Spring MVC 框架

目錄

1.MVC的定義

2.SpringMVC的實際應用

(1)建立連接

1.@RequestMapping注解介紹

2.@RequestMapping注解的請求方式

GET請求:

POST請求:

指定GET/POST方法類型:

(2)請求

傳遞參數

1.傳遞單個參數

2.傳遞多個參數

3.傳遞對象

4.后端參數重命名

5.傳遞數組

6.傳遞集合

7.傳遞JSON對象

8.獲取URL中參數@PathVariable

9.上傳文件@RequestPart

10.獲取Cookie/Session

介紹Cookie&Session:

Cookie和Session的區別

獲取Cookie

一般獲取Cookie:

簡潔獲取Cookie:

獲取Session

Session存儲

Session獲取

簡潔獲取Session(1)

簡潔獲取Session(2)

獲取Header

一般獲取Header

簡潔獲取Header

(3)響應

RestController和Controller注解:

返回數據@ResponseBody:

返回HTML代碼片段:

返回JSON:

設置Content-Type:

設置狀態碼:

設置Header:


1.MVC的定義

MVC是Model View Controller的縮寫,是軟件工程的一種軟件架構設計模式,它把軟件系統分為模型、視圖、控制器三個基本部分,如下圖所示:

對于MVC,在集成開發環境idea中同樣封裝有,具體使用方式是依靠注解的形式來使用。

在講解springMVC之前,我們需要了解一下瀏覽器和服務器是如何進行交互的。

使用瀏覽器來對服務器發送請求,我們就需要了解URL的相對格式,如拿京東搜索商品舉例:

對于本機的ip可以使用localhost或者127.0.0.1,運行本機web端的端口號使用8080。

瀏覽器和服務器的交互基本如下:

在本機,我們可以利用postman來模擬發送請求,并且關注每個注釋不同的用法。

2.SpringMVC的實際應用

(1)建立連接

在idea中創建好spring框架,加載meven項目,會發現main文件夾路徑下會有一DemoApplication類,也就是項目的啟動類

@SpringBootApplication這個注釋在哪,也就說明該項目的啟動入口在哪里。

在springMVC中,常用@RequestMapping來實現URL的映射,使瀏覽器連接程序。實驗期間,我們也需要使用@RestController,使返回對象以http響應體返回。

1.@RequestMapping注解介紹

@RequestMapping注解既可以修飾類,也可以修飾方法。當修飾類和方法時訪問的地址是類路徑+方法路徑,例如:

可以看見,網址以類路徑+方法路徑的形式輸入,不論類路徑還是方法路徑都可以進行分層,也可以不需要類路徑單獨訪問方法:

2.@RequestMapping注解的請求方式

對于請求,我們有很多種方式可以模擬,比如form表單、postman模擬發送請求。那對于@RequestMapping究竟是get請求還是post請求呢?

GET請求:

瀏覽器發送的請求類型都是get,說明支持get請求

POST請求:

form表單發送:

將前端代碼放入static目錄下,訪問路徑為:127.0.0.1:8080/(html文件名)

點擊提交:

指定GET/POST方法類型:

對于@RequestMapping,都支持GET和POST請求,也可以指定接收固定請求

也可以單獨使用@PostMapping

這樣就只能允許POST請求通過,其他請求不能通過

(2)請求

在測試實驗過程中因為模擬請求而屢次創建修改前端代碼會顯得很麻煩,所以接下來我們將使用postman來完成模擬請求的任務。

首先我們來看看@RequestMapping的內部結構:

傳遞參數

訪問不同路徑,就是發送不同的請求,可能會帶上一些參數,究竟如何傳遞參數?后端如何接收參數?

對于框架中的傳參,都是以Key-Value的形式來存儲的,下面我們以postman來作為請求模擬,學習如何傳遞參數。

1.傳遞單個參數

在查詢字符串段中以鍵值對的形式輸入數據,就可以完成傳參,也可以在postman下方的Params直接輸入鍵和對應的值即可。

2.傳遞多個參數

和傳遞單個參數基本一致,也是以鍵值對的形式輸入,不同的是傳參順序可以隨意(當有多個參數時前后端匹配是以鍵值對的形式,位置不受影響),參數類型必須一致!

3.傳遞對象

當需要傳遞的參數很多時,為了防止代碼冗余難以修改,我們可以封裝一個對象,傳遞該對象的所有參數。

我們先創建出來一個person對象,包含三個屬性:

本質上和傳遞多個參數沒什么區別,只是因為這些參數封裝成一個對象:

若是該對象內的屬性沒有輸入值,則會分配默認值。

4.后端參數重命名

在有些特殊情況下,前端傳遞的參數Key可能跟我們后端的Key不一致,容易出現接收不到的情況,這時我們可以使用@RequestParam來重命名解決后端的參數值(后端參數映射)。

需要注意的是,使用了@RequestParam,參數就變成了必傳參數

若是真不想傳參數,可以使用required屬性至為false,這樣就變成可傳可不傳了。

5.傳遞數組

SpringMVC可以實現自動綁定數組參數的賦值

6.傳遞集合

和數組傳遞類似,但是需要使用@RequestParam綁定參數關系:

7.傳遞JSON對象

我們先來看json的格式要求:

我們發送JSON數據的時候,再后端可以使用對象接收,使用@RequestBody這個注釋進行json數據的轉換,在postman上也使用json數據發送,比如使用之前創建的Person類接收:

對于@RequestBody這個注釋,主要功能是將HTTP請求體中的數據(JSON,XML)反序列化為java對象。

對于JSON,我們還有更復雜的表示方式:

在上面的JSON數據中包含著對象嵌套數組或者數組嵌套對象這類比較復雜的數據。

通過抓包軟件也可以看到json數據:

8.獲取URL中參數@PathVariable

在前后端交互中,有時候我們需要獲取到URL上面的參數,比如搜索信息的時候獲取該URL上面的序列號將對應的網頁上傳給前端,以便客戶查找到對應的信息:

這時候就可以獲取URL上面的年份日期或者序列號,將對應的網頁上傳給客戶。

對于獲取URL的參數我們使用的是@PathVariable注解,主要作用在請求URL路徑上的數據綁定。

注意的是,在RequestMapping上待定參數用{}號框起來

9.上傳文件@RequestPart

對于文件,我們可以使用@RequestPart注解來傳輸,比如我們將一張照片傳輸到D盤的temp文件上:

可以看到,文件已經傳輸成功了。

10.獲取Cookie/Session

首先我們要知道,HTTP協議自身是屬于“無狀態”協議,默認情況下HTTP的客戶端和服務器之間的這次通信,和下次通信之間沒有直接的聯系。

但是在實際開發中我們很多時候是需要這些聯系的,例如瀏覽器登錄成功的時候,第二次訪問服務器就知道該請求是否已經登錄過了。

介紹Cookie&Session:

下面以醫院掛號的例子說明一下Cookie和Session機制:

對于Cookie和Session,還可以這樣理解,還是以上述為例:

對于Cookie而言,存取少量信息,包含關鍵的唯一性字符串,也就是SessionId。

對于Session而言,本質上就是一個“哈希表”,存儲了一些鍵值對結構,Key就是SessionID,Value就是用來標識的用戶信息(靈活轉換)。

Cookie和Session的區別

1.Cookie是客戶端保存用戶信息的一種機制,Session是服務端保存用戶信息的一種機制

2.SessionId是Cookie和Session之間的橋梁

3.Cookie和Session經常一起使用,但不是必要:

? ? ? 完全可以用Cookie來報錯一些數據在客戶端,這些數據不一定是用戶身份信息或者SessionId

? ? ? Session中的sessionId也可以使用URL傳遞

獲取Cookie

在此之前,我們先回顧一下http請求的格式,使用fiddler來抓包:

以POST請求為例,在請求中有許多信息,比如URL,請求方式,header,body等參數,響應中也有http狀態碼,響應header和響應正文等信息,我們要是想獲取這些參數,就需要知道倆個對象,這倆對象是Servlet提供的倆個類,是Spring的內置對象:

HttpServletRequest(客戶端請求):當客戶端通過HTTP訪問服務器時,HTTP請求頭中的所有信息都封裝在這個對象中,通過這個對象的方法可以獲取到請求的所有信息。

HttpServletResponse(服務端響應):同理,HTTP的響應信息都在這個對象中,響應頭狀態碼等,通過這個對象的方法可以獲取到服務器響應的所有信息。

一般獲取Cookie:

代碼解析:

postman設置Cookie值:

最后設置成功:

瀏覽器設置Cookie值:

簡潔獲取Cookie:

使用@CookieValue注解

獲取Session

Session是服務器的機制,我們需要先存儲,才能再獲取,對于Session也是基于HttpServletRequest來存儲和獲取的。

一般的Session內部大概是這樣的:

Session存儲

代碼演示:

然后我們使用postman來發送請求:

我們看看fiddler抓包結果:

可以看到,正如上面所說,Cookie和Session是通過SessionID建立聯系,創建Session之后通過Set-Cookie告知客戶端并把SessionID儲存在Cookie中。

通過瀏覽器也可以觀察SessionID:

我們也可以直接省略掉HttpServletRequest使用HttpSession:

Session獲取

獲取Session我們依舊可以使用HttpServletRequest:

簡潔獲取Session(1)

需要使用到@SessionAttribute注解

簡潔獲取Session(2)

通過Spring內置對象HttpSession來獲取(省略HttpServletRequest)

獲取Header

對于header,我們隨機抓一個包來看看:

獲取header也是從HttpServletRequest中獲取的。

對于獲取user-Agent,我們可以采取以下方法:

一般獲取Header

同過抓包軟件我們也可以看到user-Agent:

簡潔獲取Header

該方法用到@RequestHeader注釋

這回我們使用瀏覽器瀏覽:

查看抓包軟件:

(3)響應

對于響應來說,我們前面涉及的都是數據響應,HTTP響應還能響應靜態頁面。在講解響應之前我們先來回顧上面所說到的@RestController注釋:

@RestController是一個組合注解,它結合了@Controller+@ResponseBody的功能,我們可以看看內部:

RestController和Controller注解:

之前我們使用的@RestController是把數據直接寫入到http響應體上,不能直接跳轉到某個頁面上,這是因為該注解中有一個@ResponseBody,如果我們單純使用@Controller,就會發現可以跳轉頁面了,再對比使用@RestController

我們先創建一個html文件:

@RestController:

@Controller:

返回數據@ResponseBody:

由上面的倆個不一樣的注解我們可以看到,加上了@ResponseBody的注釋的返回值是返回數據到響應體,而沒有加上的@Controller則是直接跳轉到某頁面上,但是需要注意的是:對于返回頁面我們需要在文件前面加上“/”,不像是@RequestMapping一般,加不加都有校驗的地方,這是硬性要求。

對于@ResponseBody,它既是類注解也是方法注解,作用于類上,代表該類的所有方法都是返回數據,作用于方法上代表該方法返回的是數據。

@Controller+@ResponseBody:

返回HTML代碼片段:

對于后端返回數據時,數據中有html代碼也會被瀏覽器解析:

為什么會這樣呢?我們先來看看fiddler抓包結果:

我們再來看幾個常見的Content-Type取值:

text/plain :純文本格式

text/html :body的數據格式是HTML

text/css :body的數據格式是CSS

application/json :body的數據格式是JSON

application/javascript :body的數據格式是JavaScript

http協議會根據請求的文件判斷是什么類型的,然后自動設置Content-Type值返回響應。

返回JSON:

我們也可以返回JSON類型的數據,繼續延用我們上面創建過的Person類:

http成功將響應數據設置為JSON格式,我們再來看看fiddler抓包:

對于后端返回的結果對象或集合,響應頁面自動轉為JSON。

我們再來看組集合的返回:

設置Content-Type:

其實不僅僅是依靠http協議來識別轉換Content-Type,我們也可以通過設置produces屬性的值來設置響應的報頭Content-Type。

我們先來看一個例子:

可以看到,由于返回類型是String類型,默認為字符串,所以http響應默認轉換為html的格式。

我們要想讓這個字符串變成JSON格式,需要利用@RequestMapping注解的produces屬性來轉換:

再看看fiddler抓包結果:

設置狀態碼:

我們之前也了解過狀態碼了,但是狀態碼是不是就只能由SpringMVC自己自動設置響應狀態碼,我們能不能設置響應狀態碼呢?

答案是可以的,我們可以手動指定狀態碼,通過SpringMVC的內置對象HttpServletResponse提供的方法設置:

然后我們抓一下包:

發現這里的狀態碼是404,但是我們的頁面還能正常顯示:

所以我們得出結論,在這里設置的狀態碼不影響頁面的展示。

設置Header:

對于我們的Http響應報頭來說有挺多的附加信息,這些信息可以通過@RequestMapping注解的屬性來實現。

?對于@RequestMapping注解,我們可以看看內部結構:

我們還可以設置響應的Header屬性的值,也需要SpringMVC內置對象HttpServletResponse提供的方法來進行設置:

我們來看看fiddler抓包:

可以看到我們已經設置了Header

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

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

相關文章

基于RK3568/RK3588/全志H3/飛騰芯片/音視頻通話程序/語音對講/視頻對講/實時性好/極低延遲

一、前言說明 近期收到幾個需求都是做音視頻通話,很多人會選擇用webrtc的方案,這個當然是個不錯的方案,但是依賴的東西太多,而且相關組件代碼量很大,開發難度大。所以最終選擇自己屬性的方案,那就是推流拉…

AI+爆款文案,提示詞腳本 ——衛朋

目錄 簡介 提示詞 作者簡介 簡介 用好AI的前提是腦子里面要有框架。 AI就像是一個剛出生的小孩,沒有判斷力,瘋狂接收世界上的各類信息。 如果沒有從小的規則框架約束、沒有道德約束,最終的結果就一定是混亂無序的。 AI也是一樣&#x…

芯片:數字時代的算力引擎——鯤鵬、升騰、海光、Intel 全景解析

在大模型爆炸的時代,芯片如同現代文明的“數字心臟”,驅動著從智能手機、數據中心到人工智能和超級計算的每一個關鍵進程。在這場算力競賽中,華為鯤鵬、升騰、海光以及行業巨頭Intel各自扮演著獨特而至關重要的角色。本文將深入解析這些核心算…

傳輸層協議TCP(上)

上一篇https://blog.csdn.net/Small_entreprene/article/details/148143494?fromshareblogdetail&sharetypeblogdetail&sharerId148143494&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link 上文學習了傳輸層的協議之一UDP,接下來…

關于ios點擊分享自動復制到粘貼板的問題

前言 Android 系統沒有什么特別的要求,實現這個也比較容易。但ios在某些情況下就會出現問題。 如果ios是點擊之后,請求接口,再把接口的內容賦值給粘貼板肯定行不通,會被ios系統攔截,導致賦值失敗或者賦值為空。建議使…

SAP Business One:無錫哲訊科技助力中小企業數字化轉型的智慧之選

數字化轉型,中小企業的必經之路 在當今競爭激烈的商業環境中,數字化轉型已不再是大型企業的專利,越來越多的中小企業開始尋求高效、靈活的管理系統來優化業務流程、提升運營效率。作為全球領先的企業管理軟件,SAP Business One…

【孫悟空喝水】2022-2-7

緣由C編程問題求解:9634: 孫悟空喝水-編程語言-CSDN問答 void 孫悟空喝水() {//緣由https://ask.csdn.net/questions/7639865?spm1005.2025.3001.5141int x 2&#xff0c; n 0; double s 0, ss 0;std::cin >> n;while ((int)s < n)s 1.0 / x, ss (x - 1.0) / …

OCC筆記:BRepMesh_IncrementalMesh的使用

1. 函數接口 2. 線性偏轉與角度偏轉 2.1. theLineDeflection&#xff1a;線性偏轉 根據文檔推導下 isRelative傳入Standard_True時&#xff0c;theLineDeflection為相對值。 參看isRelative說明 //! param isRelative if TRUE deflection used for discretization of //! ea…

Visual Studio+SQL Server數據挖掘

這里寫自定義目錄標題 工具準備安裝Visual studio 2017安裝SQL Server安裝SQL Server Management Studio安裝analysis service SSMS連接sql serverVisual studio新建項目數據源數據源視圖挖掘結構部署模型設置挖掘預測 部署易錯點 工具準備 Visual studio 2017 analysis servi…

如何遷移SOS數據庫和修改sos服務的端口號

一. 遷移SOS數據庫。 1. 對SOS整個庫進行拷貝。壓縮拷貝等都可以 2. 找到SOS安裝目錄下的這個目錄 /SOS7/SERVERS7/LOCAL/ 在此目錄下會發現&#xff0c;有SOS服務庫的文件夾。拷貝你要遷移的SOS數據庫 3. 進入該文件夾&#xff0c;找到&#xff1a;serverdb.cfg 打開后&…

Oracle向PG轉移建議以及注意點

Oracle向PG轉移建議以及注意點 ? 一、語法差異與遷移建議 1. 包結構&#xff08;Package&#xff09; Oracle 支持 PACKAGE 和 PACKAGE BODY 分離定義。PostgreSQL 不支持包結構&#xff0c;需將每個函數/過程單獨定義。 遷移建議&#xff1a; 將 PACKAGE 包中的每個函數…

PCIe-PCI、PCIe中斷機制概述

PCI、PCIe中斷概述 PCIe 中斷機制在繼承 PCI 傳統中斷&#xff08;INTx&#xff09;的基礎上&#xff0c;引入了更高效的 MSI/MSI-X 方案&#xff0c;以提升設備性能并減少 CPU 輪詢開銷。以下是核心要點及技術演進&#xff1a; ?? ??一、PCIe 中斷類型與演進?? ??IN…

改進自己的圖片 app

1. 起因&#xff0c; 目的: 前面我寫過一個圖片 app &#xff0c; 最新做了些改動。 把原來的一列&#xff0c;改為3列&#xff0c; 繼續使用瀑布流手機上使用&#xff0c;更流暢&#xff0c;橫屏顯示為2列。 2. 先看效果 3. 過程: 過程太細碎了&#xff0c;這里只是做一下…

【HTML-15】HTML表單:構建交互式網頁的基石

表單是HTML中最強大的功能之一&#xff0c;它允許網頁收集用戶輸入并與服務器進行交互。無論是簡單的搜索框、登錄頁面&#xff0c;還是復雜的多步驟調查問卷&#xff0c;表單都是實現這些功能的核心元素。本文將深入探討HTML表單的各個方面&#xff0c;幫助您構建高效、用戶友…

關于智能體接入后端,在Apifox能夠傳參數給智能體的測試

from flask import Flask, request, jsonify, render_template import requests import json # 用于解析嵌套的 JSON 字符串app Flask(__name__)COZE_BOT_ID 7508736911423963162 COZE_API_KEY pat_cHXqrFzcvtktfmmlp4pjF3O2qmjioQW46uU8UNbUugyvSlFZclklpunc53DbR8ws COZE…

SQL進階之旅 Day 8:窗口函數實用技巧

【SQL進階之旅 Day 8】窗口函數實用技巧 在現代數據庫開發中&#xff0c;處理復雜的業務邏輯和大規模數據時&#xff0c;僅僅依靠傳統的GROUP BY和JOIN操作已經無法滿足需求。**窗口函數&#xff08;Window Function&#xff09;**作為SQL標準的一部分&#xff0c;為開發者提供…

編譯rustdesk,使用flutter、hwcodec硬件編解碼

目錄 安裝相應的環境安裝visual studio安裝vpkg安裝rust開發環境安裝llvm和clang編譯源碼下載源碼使用Sciter作為UI的(已棄用)使用flutter作為UI的(主流)下載flutter sdk橋接靜默安裝最近某desk免費的限制越來越多,實在沒辦法,平時遠程控制用的比較多,只能用rustdesk了,…

由反匯編代碼確定結構體的完整聲明

C程序中遇到下面的代碼 typedef struct {int left;a_struct a[CNT];int right; } b_struct;void test( int i, b_struct *bp) {int nbp->leftbp->right;a_struct *ap&bp->a[i];ap->x[ap->idx]n; } 下面是test函數的反匯編代碼 結合C程序中的代碼與test函數…

鴻蒙OSUniApp復雜表單與動態驗證實踐:打造高效的移動端表單解決方案#三方框架 #Uniapp

UniApp復雜表單與動態驗證實踐&#xff1a;打造高效的移動端表單解決方案 引言 在移動應用開發中&#xff0c;表單處理一直是一個既常見又具有挑戰性的任務。隨著HarmonyOS生態的蓬勃發展&#xff0c;越來越多的開發者開始關注跨平臺解決方案。本文將深入探討如何使用UniApp框…

Python學習(2) ----- Python的數據類型及其集合操作

在 Python 中&#xff0c;一切皆對象&#xff0c;每個對象都有類型。下面是 Python 中的常見內置類型分類和示例&#xff1a; &#x1f7e1; 1. 數字類型&#xff08;Numeric Types&#xff09; 類型說明示例int整數5, -42float浮點數3.14, -0.5complex復數1 2j a 10 …