目錄
前言:認識Spring MVC
??1、什么是MVC?
一、建立連接(5個注解)
??1、@RequestMapping注解:注冊接?的路由映射(默認返回頁面)
??2、@ResponseBody注解:表示返回的是數(shù)據(jù)
???3、組合注解@RestController = @ResponseBody + @Controller
??4、支持Get請求的2種寫法@GetMapping +?@RequestMapping
???5、只支持Post請求的兩種方法
二、請求:從前端接收參數(shù)(重點!?。。?/p>
??1、接收單個參數(shù)
??2、接收多個參數(shù)
??3、接收非常多的參數(shù)
??4、后端對從前端接收到的參數(shù)重命名@RequestParam
??5、接收Json格式@RequestBody
??6、接收URL中的參數(shù)@PathVariable并重命名
???7、接收文件@RequestPart
???8、獲取Cookie
???9、獲取和設置Session
???10、獲取Header
三、響應:返回數(shù)據(jù)
??1、返回Json對象
??2、區(qū)分請求轉發(fā)與請求重定向(重要)
前言:認識Spring MVC
官方定義:Spring Web MVC是基于Servlet API構建的原始Spring框架,從一開始就包含在Spring框架中,一般我們說Spring MVC,Spring Web,Spring Web MVC都是同一個意思。
??1、什么是MVC?
MVC 是 Model View Controller 的縮寫,它是軟件?程中的?種軟件架構模式,它把軟件系統(tǒng)分
為模型、視圖和控制器三個基本部分。(早期MVC思想,現(xiàn)在已經不太用了。)
?當前的MVC:更適合稱為Spring Web,因為現(xiàn)在很多項目都使用了前后端分離的思想。MVC是一種思想,Spring MVC是對MVC思想的具體體現(xiàn)。
(1)MVC是一個Spring框架;
(2)MVC是一個Web項目。繼承了 Servlet API 的 Web 框架(當?戶在瀏覽器中輸?了 url 之后,我們的 Spring MVC 項?就可以感知到?戶的請求)。
我們之前在創(chuàng)建SpringBoot項目的時候,引入了Spring Web,因此已經包含了Spring MVC。所以我們的之前的項目也可以稱為SpringMVC項目或者Spring Web項目。
Spring、SpringBoot、SpringWeb的關系?
SpringMVC也就是這個高鐵可以被外界使用。一個項目可以是SpringBoot項目,也可以是SpringWeb項目,但是SpringWeb不一定是SpringBoot項目,SpringBoot項目也不一定是SpringWeb項目。在沒有SpringWeb之前,也是由SpringWeb項目的,是基于SpringCore項目創(chuàng)建的。
所以因為SpringMVC是一個Web項目,用戶通過url就可以訪問,所以我們主要學習下面三部分:
1、建立連接:不一定是瀏覽器
2、請求:接收參數(shù)
3、響應:返回結果
一、建立連接(5個注解)
主要學習5個注解。
??1、@RequestMapping注解:注冊接?的路由映射(默認返回頁面)
這個相當于Servlet階段的@WebServlet。
路由映射:當用戶訪問一個url的時候,將用戶的請求對應到程序的某個類的某個方法的過程。
返回一個靜態(tài)頁面:
(1)@RequestMapping既是類注解,也是方法注解。訪問的url等于類注解+方法注解。
(2)雖然不寫類注解也可以訪問,但是實際中我們默認是兩個RequestMapping都寫得。因為只寫方法注解可能會地址相同,但是每個類都是不同的,所以在一定程度上可以避免地址相同的現(xiàn)象。
(3)類注解@RequestMapping要搭配五大注解使用,一般使用@Controller,其他的五大注解使用不穩(wěn)定,有時候成功,有時候不成功,我們就使用@Controller。
??2、@ResponseBody注解:表示返回的是數(shù)據(jù)
@ResponseBody注解是一個類注解,寫在類上就表示該類下所有的方法都是數(shù)據(jù),而不是頁面。因此一個類里的方法既要返回頁面,又要返回數(shù)據(jù),就不適合用這個方法了。
???3、組合注解@RestController = @ResponseBody + @Controller
?
??4、支持Get請求的2種寫法@GetMapping +?@RequestMapping
Postman測試,發(fā)現(xiàn)@RequestMapping已經支持Get,Post等其他請求。
其他2種只支持get的寫法:
???5、只支持Post請求的兩種方法
簡單總結:
1、@ResquestMapping實現(xiàn)url的映射,搭配@Controller使用;默認返回的是頁面;支持Post和get燈請求;
2、@ResponseBody返回數(shù)據(jù)
3、@RestController=@ResponseBody+@Controller;
4、只支持post方法:@PostMapping或者@RequestMapping(value = "/A",method= RequestMethod.POST)
5、只支持get方法:@GetMapping或者@RequestMapping(value = "/B",method = RequestMethod.GET)
二、請求:從前端接收參數(shù)(重點!?。。?/h2>
??1、接收單個參數(shù)
方式1:Servle方式
?方式2:方法中直接拿
?注意:url的name和方法中的String name名字要對應上。
??2、接收多個參數(shù)
方式1:Servlet方式
方式2:方法中直接拿
?注意:
情況1::我們在方法中先輸入age,再輸入name;url先輸入name,再輸入age。發(fā)現(xiàn)不影響結果。
?結論1:
(1)參數(shù)的順序和url傳參的順序無關;
(2)并且?guī)臀覀冞M行了數(shù)據(jù)類型的轉化。
情況2:方法中有兩個參數(shù),但是url中只傳遞name,age顯示為null;
?結論:
(1)age為Integer類型,不傳參會顯示null;
(2)傳一個String類型參數(shù),會顯示400異常;?400表示客戶端發(fā)生錯誤。
對于 Spring MVC 框架而言,它將請求參數(shù)轉換成值對象類中各屬性對應的數(shù)據(jù)類型。
情況3:方法中有兩個參數(shù)(將age類型由Integer改為Int),url只傳遞name,不傳遞age,此時顯示500異常。500表示服務器端錯誤。
?傳遞參數(shù)類型錯誤,會顯示400異常。
??3、接收非常多的參數(shù)
可以一個一個寫,但是存在問題:(1)非常麻煩(2)代碼的耦合度太高。
方式1:將參數(shù)封裝成一個對象
Student類:如果要加別的參數(shù),直接在類中加屬性就好,不會影響到其他的代碼。
方式2:表單傳遞(這是前端傳參方式,與接收參數(shù)的方式無關)
通過ajax,form表單,瀏覽器傳參等方式都可以。
form表單形式:
?
?也可以這種寫法:
???4、后端對從前端接收到的參數(shù)重命名@RequestParam
比如前端在傳遞name的時候,簡寫為了n,但是我后端寫的時候,不想用n這個字母,就想換成name,這個時候就要用后端參數(shù)的重命名方法了,在接收參數(shù)的時候直接修改名稱。
?注意:如果不傳遞n值,顯示400錯誤。
?說n是一個必傳參數(shù),這個時候我們要對n進行一個設置:required = false。
??5、接收Json格式@RequestBody
情況1:加RequestBody,postman使用Json格式傳遞數(shù)據(jù),顯示正確。
@RequestBody表示從前端接收一個json字符串,Spring幫我們將這個Json字符串轉為對象。
?postman測試:模擬從前端發(fā)送Json格式的數(shù)據(jù)
?Fidder抓包顯示結果也正確
?情況2:加了@RequestBody,postman使用form表單形式提交數(shù)據(jù),發(fā)現(xiàn)顯示415錯誤。
@RequestBody不支持對象。
???6、接收URL中的參數(shù)@PathVariable并重命名
注意:
(1)字段的名稱之間要對應。
(2)情況3中重命名這種方式,參數(shù)默認是必傳的,如果不想要傳參數(shù),要設置required=false。
?postman測試情況1:
postman測試情況2:
?postman測試情況3:
???7、接收文件@RequestPart
Postman測試:
?抓包工具Fidder
???8、獲取Cookie
情況1:@CookieVaule默認是要傳參的(如果不要傳參,設置required=false)否則不設置false,但是url中還不傳參就會報錯,所以我們自己設置一下cookie信息。F12打開如下界面,自己手動設置cookie信息。(說明cookie是可以人工設置的,造假的。)
?此時url再次訪問:成功。?
?情況2:設置required=false
?此時url再訪問,不報錯了。
(3)cookie重命名
???9、獲取和設置Session
(1)獲取session:@SessionAttrible也是默認要傳參
?
?(2)設置session:? ?session.setAttribute
設置完成之后,cookie中就多了一個sessionId。
?此時再獲取session,就可以訪問到了。
???10、獲取Header
比如Fidder中的這些都是Header信息。
?但是可以觀察到,上面的格式都是以-來分隔的,一般我們要將它重命名。比如我們現(xiàn)在要獲取User-Agent這個信息,先重命名為userAgent后再獲取。
?Fidder中的這個信息與我們url中獲取到的結果一致。說明成功獲取了。
?同樣的,@RequestHeader默認要傳參,設置非必傳參數(shù):required = false。
?簡單總結:
1、獲取單個多個參數(shù):直接從方法名中拿;
2、獲取非常多參數(shù):將參數(shù)封裝側好難過一個對象,也是直接方法中拿;
3、后端參數(shù)重命名:@RequestParam(name=“前端拿到的A名稱” String B是新名稱);
4、很多注解都是默認要傳參的,設置非必傳參數(shù)用required = false;
5、方法參數(shù)中寫@RequestBody 接收JSON對象;
6、@PathVariable Integer shopId接收Url中的參數(shù);@RequestMapping中的url映射更新為“/映射/{shopId}”
7、@RequestPart("file1") ?MultipartFile file上傳文件,上傳的文件都保存到服務器上file.transferTo(new file("路徑名“));
8、@CookieValue獲取cookie;
9、@sessiongetAttribute獲取session,session.getAttribute設置session;
10、@RequestHeader(“A-B”) String AB獲取Header并重命名。
三、響應:返回數(shù)據(jù)
已經知道的:@RequestMapping默認返回靜態(tài)頁面,?@ResponseBody返回數(shù)據(jù)。
??1、返回Json對象
?Fidder抓包:
???2、區(qū)分請求轉發(fā)與請求重定向(重要)
牽扯到頁面的轉換。
(1)forward請求轉發(fā):服務器進行轉發(fā),服務器內部處理,對內;
????????redirect請求重定向:請求資源重定向,對外。
(3)請求重定向url會發(fā)生變化。
(3)請求重定向與直接訪問新地址效果一樣,不存在原來的外部資源不能訪問;但是請求轉發(fā),服務器端轉發(fā)可能會造成原外部資源不能訪問。
????????舉例:我在網上商城A品牌買了手機,現(xiàn)在出了點問題,我去找客服,如果客服說我們只負責銷售,維修的話要自行去線下品牌店維修,這就是請求重定向;如果客服說,好的,他們來負責,然后客服聯(lián)系了他們自己的維修廠家?guī)臀倚藓没蛘卟扇∑渌绞綆臀倚藓茫也魂P心方式,是他們自己內部處理好,屬于請求轉發(fā)。
(1)注意觀察url的區(qū)別?
?(2)請求轉發(fā)的問題
????????請求轉發(fā)forward如果資源和轉發(fā)的??不在?個?錄下,會導致外部資源不可訪問。重定向 redirect則可以正常訪問。
比如 index.html中引入了hello.js,forward會報錯,redirect是正常的。?
文章來源:http://www.zghlxwxcb.cn/news/detail-600649.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-600649.html
到了這里,關于【Spring MVC學習】連接 && 接收請求參數(shù) && 響應返回參數(shù)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!