目錄
關(guān)于Spring MVC框架
Spring MVC框架的依賴(lài)項(xiàng)
使用Spring MVC框架接收請(qǐng)求
關(guān)于@RequestMapping注解
關(guān)于RESTful
關(guān)于@RequestParam注解
@RequestParam注解是添加在方法的參數(shù)上的,它的作用主要有: ?
其它
關(guān)于Spring MVC框架
MVC:Model + View + Controller ?
Spring MVC框架主要解決了接收請(qǐng)求、響應(yīng)結(jié)果及相關(guān)問(wèn)題(例如處理異常等),即主要關(guān)注C的問(wèn)題,在不是前后端分離的項(xiàng)目,還關(guān)心V的問(wèn)題,但是,并不關(guān)心M的問(wèn)題。 ?
?Model:模型,數(shù)據(jù)處理的流程和規(guī)則。具體表現(xiàn)為service和mapper的整合。
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-513621.html
Spring MVC框架的依賴(lài)項(xiàng)
Spring MVC框架的基礎(chǔ)依賴(lài)項(xiàng)是:spring-webmvc
?
在Spring Boot中,使用Spring MVC框架應(yīng)該添加依賴(lài)項(xiàng):spring-boot-starter-web
?
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-513621.html
使用Spring MVC框架接收請(qǐng)求
應(yīng)該創(chuàng)建控制器類(lèi),并在控制器類(lèi)上添加@Controller
注解,在Spring MVC框架中,只有添加此注解的類(lèi)才是控制器類(lèi)!
默認(rèn)情況下,在Spring MVC框架中,控制器處理請(qǐng)求的結(jié)果(方法的返回值)將被視為“視圖組件的名稱(chēng)”,當(dāng)在處理請(qǐng)求的方法上添加@ResponseBody
注解后,返回的結(jié)果才會(huì)被視為“響應(yīng)到客戶端的數(shù)據(jù)”,@ResponseBody
注解還可以添加在控制器類(lèi)上,表示此類(lèi)中所有處理請(qǐng)求的方法的返回結(jié)果都是“響應(yīng)到客戶端的數(shù)據(jù)”,這種做法稱(chēng)之為“響應(yīng)正文”,或者,也可以將控制器類(lèi)上的注解改為@RestController
,它是@Controller
和@ResponseBody
的組合注解!
包括處理異常的“全局異常處理器類(lèi)”,需要添加的其實(shí)是@ControllerAdvice
注解,添加此注解的類(lèi)中的特定方法(例如處理異常的方法)將可以作用于每次處理請(qǐng)求的過(guò)程中,但是,默認(rèn)情況下,仍不是“響應(yīng)正文”的,所以,當(dāng)處理異常需要響應(yīng)正文時(shí),需要在處理異常的方法上添加@ResponseBody
注解,或在全局異常處理器的類(lèi)上添加@ResponseBody
注解,或?qū)?code>@ControllerAdvice改為@RestControllerAdvice
。
在控制器類(lèi)上,可以自定義方法用于處理請(qǐng)求,關(guān)于這些方法:
-
訪問(wèn)權(quán)限:應(yīng)該是
public
?
-
返回值類(lèi)型:當(dāng)響應(yīng)正文時(shí),可自行將需要響應(yīng)的數(shù)據(jù)屬性封裝在自定義類(lèi)中,使用自定義類(lèi)作為返回值類(lèi)型
-
當(dāng)使用自定義類(lèi)型進(jìn)行響應(yīng)正文時(shí),需要:
-
需要添加
jackson-databind
依賴(lài)項(xiàng),在spring-boot-starter-web
中已經(jīng)包含 -
需要啟用Spring MVC的注解增強(qiáng),如果使用XML配置(早些年用的多),需要添加
<annotation-driven/>
,如果使用配置類(lèi)進(jìn)行配置,需要在配置類(lèi)上添加@EnableWebMvc
注解,否則,響應(yīng)時(shí)會(huì)出現(xiàn)406
錯(cuò)誤,在Spring Boot項(xiàng)目不需要手動(dòng)配置
-
-
-
方法名稱(chēng):自定義
-
參數(shù)列表:按需添加,且各參數(shù)不區(qū)分先后順序,可以將各請(qǐng)求參數(shù)逐一作為參數(shù)列表中的參數(shù),也可以將多個(gè)請(qǐng)求參數(shù)封裝到自定義類(lèi)型中,使用自定義類(lèi)型作為方法參數(shù)列表中的參數(shù),還可以按需添加
HttpServletRequest
、HttpServletResponse
、HttpSession
等,在使用其它技術(shù)框架后,還可以按需添加其它參數(shù),例如結(jié)合@AuthenticationPrincipal
注解添加Spring Security的當(dāng)事人 -
拋出異常:理論上,處理請(qǐng)求的方法不應(yīng)該處理異常,而應(yīng)該拋出,進(jìn)而交由全局異常處理器進(jìn)行處理
所有處理請(qǐng)求的方法都必須添加@RequestMapping
系列(還有GetMapping,PostMapping等)的某個(gè)注解,通過(guò)這些注解來(lái)配置請(qǐng)求路徑。
?
?
關(guān)于@RequestMapping注解
@RequestMapping
注解的主要作用是配置請(qǐng)求路徑,通常,在類(lèi)上應(yīng)該配置此注解,例如: ?
@RestController
@RequestMapping("/admin")
public class AdminController {}
在方法上,建議使用限制了請(qǐng)求方式的某個(gè)基于@RequestMapping
的注解,例如:
@RestController
@RequestMapping("/admin")
public class AdminController {
@PostMapping("/login")
public JsonResult login() {
// ...
}
@GetMapping("/list")
public JsonResult list() {
// ...
}
}
如果響應(yīng)可能出現(xiàn)亂碼,建議在類(lèi)上的@RequestMapping
上配置produces
屬性,以指定響應(yīng)的文檔類(lèi)型,例如:
@RestController
@RequestMapping(value = "/admin", produces = "application/json; charset=utf-8")
public class AdminController {}
?
?
關(guān)于RESTful
RESTful是一種軟件設(shè)計(jì)的風(fēng)格(并不是規(guī)則或規(guī)范)。
RESTful的典型特征包括:
- ?將某些具有“唯一性”的參數(shù)值作為URL的一部分,例如:
http://localhost:9080/album/9527/delete
https://gitee.com/chengheng2022/jsd2302-csmall-server-teacher
-
是前后端分離的,即:是響應(yīng)正文的
-
根據(jù)處理數(shù)據(jù)的方式來(lái)選擇請(qǐng)求方式
-
增加新的數(shù)據(jù)時(shí),應(yīng)該提交
POST
類(lèi)型的請(qǐng)求 -
修改數(shù)據(jù)時(shí),應(yīng)該提交
PUT
類(lèi)型的請(qǐng)求 -
刪除數(shù)據(jù)時(shí),應(yīng)該提交
DELETE
類(lèi)型的請(qǐng)求 -
獲取數(shù)據(jù)時(shí),應(yīng)該提交
GET
類(lèi)型的請(qǐng)求 -
通常不照做(因?yàn)闃I(yè)務(wù)的復(fù)雜性很難去界定具體使用哪一個(gè))
-
Spring MVC框架很好的支持了RESTful風(fēng)格,當(dāng)設(shè)計(jì)URL時(shí),如果URL中包含參數(shù)值,可以使用{自定義名稱(chēng)}
進(jìn)行占位,例如:
// http://localhost:9180/album/9527/delete
@PostMapping("/{id}/delete")
// ↑↑↑↑ 占位符
然后,在處理請(qǐng)求的方法上,在對(duì)應(yīng)的參數(shù)上添加@PathVariable
注解,表示此參數(shù)值來(lái)自URL中同名占位符對(duì)應(yīng)的值,例如:
@PostMapping("/{id}/delete")
public JsonResult delete(@PathVariable Long id) {
// ...
}
如果占位符中的名字與參數(shù)的變量名不同,需要在@PathVariable
注解上指定參數(shù),例如:
@PostMapping("/{id}/delete")
public JsonResult delete(@PathVariable("id") Long albumId) {
// ↑↑↑↑↑↑ 指定注解參數(shù),與占位符名稱(chēng)一致,則方法參數(shù)的變量名已經(jīng)不重要了
// ...
}
在配置占位符名稱(chēng)時(shí),可以在自定義名稱(chēng)的右側(cè)添加冒號(hào),然后,在冒號(hào)右側(cè)添加正則表達(dá)式,以限制URL傳入的值的格式,例如:
@PostMapping("/{id:[0-9]+}/delete")
經(jīng)過(guò)以上配置,只有占位符位置是純數(shù)字的請(qǐng)求才可以匹配上,如果占位符位置不是純數(shù)字的請(qǐng)求(例如/abc/delete
)則會(huì)響應(yīng)404
。
注意:多不沖突的正則表式達(dá)的占位設(shè)計(jì)是允許共存的,例如:
@PostMapping("/{id:[0-9]+}/delete")
public JsonResult delete1() {}
@PostMapping("/{xx:[a-z]+}/delete")
public JsonResult delete2() {}
9527/delete的請(qǐng)求就走delete1,abcd/delete的請(qǐng)求就走delete2,彼此不沖突。?
另外,如果還有某個(gè)配置沒(méi)有使用占位符的設(shè)計(jì),也是允許與以上設(shè)計(jì)共存的,例如:
@PostMapping("/test/delete")
public JsonResult deleteTest() {}
關(guān)于RESTful風(fēng)格的URL設(shè)計(jì),如果你沒(méi)有更好的選擇,可以參考:
-
查詢數(shù)據(jù)列表,格式為:
/數(shù)據(jù)類(lèi)型的復(fù)數(shù)
-
例如:
/albums
-
-
獲取某類(lèi)型的1個(gè)數(shù)據(jù),格式為:
/數(shù)據(jù)類(lèi)型的復(fù)數(shù)/{數(shù)據(jù)ID}
-
例如:
/albums/{id:[0-9]+}
-
-
對(duì)某類(lèi)型的1個(gè)數(shù)據(jù)執(zhí)行某個(gè)數(shù)據(jù)管理操作,格式為:
/數(shù)據(jù)類(lèi)型的復(fù)數(shù)/{數(shù)據(jù)ID}/命令
-
例如:
/albums/{id:[0-9]+}/delete
-
?
?
關(guān)于@RequestParam注解
@RequestParam注解是添加在方法的參數(shù)上的,它的作用主要有: ?
- ?配置請(qǐng)求參數(shù)的名稱(chēng)(用于請(qǐng)求參數(shù)的名稱(chēng)與方法參數(shù)不同時(shí)),例如:
// http://localhost:8080/login?username=root
public JsonResult login(@RequestParam("username") String xxx) {
// ...
}
-
配置必須提交某個(gè)請(qǐng)求參數(shù),因?yàn)榇俗⒔?code>required屬性默認(rèn)值為
true
-
此功能可以通過(guò)Validation框架來(lái)實(shí)現(xiàn)
-
- 配置某個(gè)請(qǐng)求參數(shù)的默認(rèn)值,例如: ?
// http://localhost:8080/list
public JsonResult list(@RequestParam(defaultValue = "1") Integer page) {
// ...
}
?
?
其它
例如全局異常處理器等
?
?
到了這里,關(guān)于[框架]Spring MVC框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!