SpringMVC 接收前端傳遞的參數(shù)四種方式
- @RequestParam注解
- @PathVariable注解
- SpringMVC的自動(dòng)解析參數(shù)
- SpringMVC的@RequestBody注解
@RequestParam 獲取注解
1
2
3
|
get/post url => "xx/user?id=1" action => public String User( @RequestParams (name= "id" ) Long id ){ } |
@RequestParam定義的參數(shù) 會(huì)自動(dòng)解析為 方法定義的類型。
1
|
@RequestParams (name= "id" ) Long id )(通過(guò)postman模擬post請(qǐng)求) |
@PathVariable獲取注解
1
|
get/post url => "xx/user/1" action => public String User( @PathVariable (name= "id" ) Long id){} |
@PathVariable必須通過(guò)正則指定對(duì)應(yīng)的類型 只有當(dāng)url指定為數(shù)字,方法參數(shù)定義為數(shù)字類型才不會(huì)報(bào)錯(cuò)。比如:(可以通過(guò)其他正則限制url,只有符合條件的url才會(huì)映射到對(duì)應(yīng)的action,否則不會(huì)找到對(duì)應(yīng)的action)
1
2
|
@RequestMapping ( "/user/{id:\\d}" ) public String User( @PathVariable (name= "id" ) Long id){} |
SpringMVC,可以不設(shè)置任何注解即可接收參數(shù)
比如
1
2
3
4
5
|
@GetMapping ( "/category" ) public String category( Long id) { System.out.println(id); return "post/category" ; } |
可以通過(guò) /category 訪問(wèn) ,也可以通過(guò) /category?id=1 訪問(wèn)
SpringMVC,也可以自動(dòng)包裝成對(duì)象
url /category?title=測(cè)試 或者 /category 都能訪問(wèn)到目標(biāo)資源
1
2
3
4
5
|
@GetMapping ( "/category" ) public String category( MPost post ) { System.out.println(post.getTitle()); return "post/category" ; } |
@RequestBody 用來(lái)接收數(shù)組或者復(fù)雜對(duì)象
(必須將參數(shù)放在requestbody中,放在url并不會(huì)被解析,哪怕請(qǐng)求方式是post)
1
2
3
4
5
6
|
url => /category requestbody =>{ "id" : 1 } @PostMapping ( "/category" ) public String category( @RequestBody Post post ) { System.out.println(post.getTitle()); return "post/category" ; } |
若為對(duì)象數(shù)組,將方法參數(shù)改為 @RequestBody List<Post> post 即可
直接輸入 /category并不會(huì)找到對(duì)應(yīng)的action
SpringMVC的自動(dòng)封裝(不傳參也能進(jìn)入)
-
@RequestParam
(必須傳參,但可以手動(dòng)設(shè)置為false) -
@PathVariable
(符合設(shè)定的正則表達(dá)式才允許進(jìn)入,而且不能為空)
對(duì)比可知,主要是為了url提供更加嚴(yán)格的限制,以防止一些其他url進(jìn)入該action。
提供復(fù)雜的接受參數(shù)的方式@RequestBody ,但必須將參數(shù)放置在@RequestBody中
針對(duì)PathVariable 需要注意的是參數(shù)中包含特殊字符的問(wèn)題,可能導(dǎo)致參數(shù)不全。
對(duì)于各種請(qǐng)求方式,驗(yàn)證一下當(dāng)前用戶,對(duì)url進(jìn)行加密 是有必要的。(尤其是關(guān)鍵數(shù)據(jù))
SpringMVC接收不到前端傳遞的參數(shù)原因
在學(xué)習(xí)SpringMvc的時(shí)候遇到了一個(gè)問(wèn)題,后臺(tái)一直接收不到前臺(tái)傳遞過(guò)來(lái)的參數(shù),耽誤了好長(zhǎng)時(shí)間終于找到了原因,寫篇博客記錄下這個(gè)坑,嚶嚶嚶 --__–
代碼清單
使用SpringMvc接受前臺(tái)傳遞的參數(shù)非常簡(jiǎn)單,只要參數(shù)名和前臺(tái)表單中的名稱一致即可,我弄得是一個(gè)文件上傳的例子,所以看下我的前臺(tái)頁(yè)面
1
2
3
4
5
6
7
8
9
10
|
< body > <!-- enctype="multipart/form-data"在文件上傳時(shí)加入,編碼類型,其值默認(rèn)是application/x-www-form-urlencoded --> < form action = "testFileUpload" method = "post" enctype = "multipart/form-data" > File: < input type = "file" name = "file" /> Desc: < input type = "text" name = "desc" /> < input type = "submit" value = "Submit" /> </ form > < br >< br > < a href = "emps" rel = "external nofollow" >List All Employees</ a > </ body > |
下面是SpringMvc的控制器
1
2
3
4
5
6
7
8
9
10
11
|
@Controller public class springMVCTest { @RequestMapping ( "/testFileUpload" ) public String testFileUpload( @RequestParam ( "desc" ) String desc, @RequestParam ( "file" ) MultipartFile file) throws IOException { System.out.println( "desc: " + desc); System.out.println( "originalFilename: " + file.getOriginalFilename()); System.out.println( "inputStream: " + file.getInputStream()); return "success" ; } } |
接著是web.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!-- 配置DispatcherServlet --> <!-- SpringMvc會(huì)根據(jù)servlet-name配置,找到/WEB-INF/dispatcher-servlet.xml作為配置文件載入Web工程中 --> < servlet > < servlet-name >springDispatcherServlet</ servlet-name > < servlet-class >org.springframework.web.servlet.DispatcherServlet</ servlet-class > < init-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:springmvc.xml</ param-value > </ init-param > < load-on-startup >1</ load-on-startup > </ servlet > < servlet-mapping > < servlet-name >springDispatcherServlet</ servlet-name > < url-pattern >/</ url-pattern > </ servlet-mapping > |
** 然后是SpringMvc的配置文件**
1
2
3
4
5
6
7
8
9
|
<!-- 配置自動(dòng)掃描的包 --> < context:component-scan base-package = "com.zgz.springmvc.crud" ></ context:component-scan > < context:component-scan base-package = "com.zgz.springmvc.test" ></ context:component-scan > <!-- 配置視圖解析器 --> < bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > < property name = "prefix" value = "/WEB-INF/views/" ></ property > < property name = "suffix" value = ".jsp" ></ property > </ bean > |
之后坑就來(lái)了,由于是文件上傳,所以需要在Spring MVC的配置文件中添加multipartResolver,添加就添加唄,于是我就加上了下面這一段代碼:
1
2
3
4
5
6
|
<!-- 配置 MultipartResolver --> < bean id = "commonsMultipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > < property name = "defaultEncoding" value = "UTF-8" ></ property > < property name = "maxUploadSize" value = "1024000" ></ property > </ bean > |
然后坑就出現(xiàn),費(fèi)盡周折發(fā)現(xiàn)是id寫錯(cuò)了,id=“multipartResolver”,修改代碼為:
1
2
3
4
5
|
< bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > < property name = "defaultEncoding" value = "UTF-8" ></ property > < property name = "maxUploadSize" value = "1024000" ></ property > </ bean > |
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_40406929/article/details/114733221