SpringBoot中Controller的傳參方式詳細(xì)講解
前言
SpringBoot整合SpringMvc其實(shí)千面一直講的都是。只需要我們?cè)趐om文件中引入 web的starter就可以了,然后我們就可以正常使用springMvc中的功能了。所以本篇文章可能更多的是回顧,回顧一下springMVC中的一些常用的功能。
按照正常的流程,我們應(yīng)該先講一講怎么配置視圖解析器,但是已經(jīng)提到了,現(xiàn)在都是前后端分離的項(xiàng)目,后端無(wú)需配置頁(yè)面跳轉(zhuǎn),只需要返回?cái)?shù)據(jù)即可,所以這一部分也沒(méi)必要再講了。那咱么就介紹下Controller中的常用寫法。
上一次我們介紹了 @RestController 注解,這個(gè)注解會(huì)把所有的返回結(jié)果以json(json其實(shí)不太準(zhǔn)確,應(yīng)該是可序列化對(duì)象,大部分是json形式)的形式進(jìn)行返回。我們今天來(lái)舉個(gè)例子。
關(guān)于@RestController注解
Controller代碼:
@RestController public class SecondController { @RequestMapping("/second") public User second(){ User u = new User("張勝男", 30,"女"); return u; } }
這里返回了一個(gè)User類。 User類代碼如下:
package com.lsqingfeng.springboot.vo; public class User { private String name; private Integer age; private String gender; public User(String name, Integer age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } }
訪問(wèn):http://localhost:9090/second 得到結(jié)果:
看到了返回的就是json類型的數(shù)據(jù)。這就是 @RestController的作用。如果不用@RestController,我們?cè)诜椒ㄉ霞由螥ResponseBody是同樣的效果。 @RestController注解就是@Controller和@ResponseBody 的組合。
關(guān)于@RequestMapping注解
@RequestMapping注解主要用于標(biāo)識(shí)該Controller的請(qǐng)求地址路徑。比如上面路徑中的@RequestMapping("/second") 就代表通過(guò) /second可以訪問(wèn)到這個(gè)接口。這個(gè)注解既可以放在類上,也可以放到方法上,如果類上也有這個(gè)注解,那么類中所有的controller在訪問(wèn)的時(shí)候,都要帶上類上的路徑才可以訪問(wèn)到。比如:
@RestController @RequestMappin("/test") public class SecondController { @RequestMapping("/second") public User second(){ User u = new User("張勝男", 30,"女"); return u; } @RequestMapping("/third") public User third(){ User u = new User("張勝", 50, "男"); return u; } }
比如上面的Controller, 那么我們?cè)L問(wèn)的路徑就變成了
ip:port/test/second ip:port/test/third
并且這也是現(xiàn)在最常用的方式,相當(dāng)于類上的注解里的url作為一個(gè)大的分類(一般代表一個(gè)模塊),方法是模塊中的各個(gè)功能。
同時(shí)還要注意,如果方法上面使用了@RequestMapping 注解來(lái)進(jìn)行標(biāo)記,那么其實(shí)并沒(méi)有限定這個(gè)方法用Http的哪種請(qǐng)求方式來(lái)進(jìn)行訪問(wèn),所以我們可以用Get請(qǐng)求,也可以用post請(qǐng)求。當(dāng)然除了這些還有一下不太常用的Delete,put,optio等請(qǐng)求方式。比如我們最上邊那個(gè)例子:
Get請(qǐng)求訪問(wèn):
Post請(qǐng)求訪問(wèn):
Delete請(qǐng)求訪問(wèn):
但是一般情況下,我們都會(huì)限定這個(gè)接口只能一某一種請(qǐng)求方式訪問(wèn),如何限制呢?
通過(guò)RequestMapping中的參數(shù)
@RestController public class SecondController { @RequestMapping(value = "/second", method = RequestMethod.GET) public User second(){ User u = new User("張勝男", 30,"女"); return u; } }
這時(shí)候就只能用Get請(qǐng)求來(lái)訪問(wèn)了。
其他請(qǐng)求方式會(huì)報(bào)錯(cuò).
使用限定請(qǐng)求方式的注解
如果限定Get請(qǐng)求方式, 用@GetMapping 代替 @RequestMapping\
如果限定Post請(qǐng)求方式, 用@PostMapping 代替 @RequestMapping
比如限定Post請(qǐng)求方式:
@RestController public class SecondController { @PostMapping("second") public User second(){ User u = new User("張勝男", 30,"女"); return u; } }
我們可以看下 @PostMapping注解的實(shí)現(xiàn)方式,其實(shí)跟方式一是一樣的。
關(guān)于Controller中傳參
Get請(qǐng)求傳參
Get請(qǐng)求的參數(shù)傳遞都是通過(guò)在url后面拼接來(lái)進(jìn)行傳參的, 比如我們傳一個(gè)name 和age 。url的寫法如下:
localhost:9090/third?name=zhangsan&age=20
在請(qǐng)求的路徑?后面表示參數(shù),多個(gè)參數(shù)之間用 & 進(jìn)行連接。 那么在Controller中如何接收Get請(qǐng)求傳遞過(guò)來(lái)的參數(shù)呢。方式很多,我們就說(shuō)兩種最常用的
直接在Controller方法的參數(shù)中,用相同的變量名稱接收參數(shù)。以上面的請(qǐng)求為例
@GetMapping("third") public String third(String name, Integer age){ System.out.println(name); System.out.println(age); return "success"; }
成功獲取參數(shù):
如果參數(shù)太多,用上面的方式來(lái)寫,會(huì)導(dǎo)致方法中的參數(shù)過(guò)多,看起來(lái)很亂。所以我們也可以使用一個(gè)javaBean來(lái)接收。前期就是javaBean中的屬性名要和參數(shù)名相同,同時(shí)要有g(shù)et和set方法。
@GetMapping("getParam") public User getParam(User user){ System.out.println(user); // 將接收到的參數(shù)直接返回 return user; }
User類,再給一下:
package com.lsqingfeng.springboot.vo; /** * @className: User * @description: * @author: sh.Liu * @date: 2022-01-12 11:25 */ public class User { private String name; private Integer age; private String gender; public User(String name, Integer age, String gender) { this.name = name; this.age = age; this.gender = gender; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "User{" + "name='" + name + ''' + ", age=" + age + ", gender='" + gender + ''' + '}'; } }
訪問(wèn): http://localhost:9090/getParam?name=zhangsan&age=20
gender沒(méi)有傳值,所以是null, 參數(shù)接收成功:
Post請(qǐng)求傳參
Post請(qǐng)求傳參的方式,常用的有兩種,一中是通過(guò)form表單進(jìn)行傳參(就是html中的form),還有一種是通過(guò)json的形式傳參。目前來(lái)說(shuō)用json的比較多。
Form傳參
使用form傳參,我們的Controller再接收的時(shí)候和上面一樣可以直接接收上代碼。
@PostMapping("postForm") public User postForm(String name, Integer age){ User u = new User(name, age, null); return u; }
post請(qǐng)求需要通過(guò)postman來(lái)模擬了,注意form傳參的位置,要在body的form-data里
如果參數(shù)過(guò)多,我們也是可以通過(guò)一個(gè)javaBean來(lái)進(jìn)行接收的。
@PostMapping("postForm2") public User postForm2(User user){ return user; }
Json傳參
通過(guò)json傳遞的參數(shù),content-type一般為: application/json
我們?cè)诮邮諈?shù)的時(shí)候要通過(guò)一個(gè)新的注解 @RequestBody 來(lái)進(jìn)行標(biāo)識(shí)。
// 注意,User中一定要有無(wú)參構(gòu)造方法 @PostMapping("postJson") public User postJson(@RequestBody User user){ return user; }
通過(guò)json方式請(qǐng)求,看是否成功獲取。
關(guān)于@RequestParam注解
還有一種方式,這種方式不是很常用,但有的時(shí)候,跟三方接口對(duì)接的時(shí)候,不排除他們使用這種方式。
就是針對(duì)content-type是: application/x-www-form-urlcoded (Http協(xié)議中,如果不指定Content-Type,則默認(rèn)傳遞的參數(shù)就是application/x-www-form-urlencoded類型)這是我在網(wǎng)上的資料中找到的,也驗(yàn)證了,如下:
@PostMapping("postWWWForm") public User postWWWForm(@RequestParam String name, @RequestParam Integer age){ return new User(name, age, null); }
后來(lái)我把@RequestParam 注解去掉了,發(fā)現(xiàn)居然也可以接收到參數(shù)。其實(shí)這個(gè)注解就是用來(lái)接收普通參數(shù)的一個(gè)注解。正常情況下應(yīng)該是可以省略的。什么時(shí)候不能省略呢,就是有時(shí)候這個(gè)參數(shù)是必填項(xiàng),就是必須要傳,那么我們可以在這個(gè)注解中標(biāo)識(shí)是否必傳和默認(rèn)值。
@RequestParam(value="id",required =false,defaultValue ="10086") Integer id,
默認(rèn)是true.
到此這篇關(guān)于SpringBoot中Controller的傳參方式詳細(xì)講解的文章就介紹到這了,更多相關(guān)SpringBoot controller傳參內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))
- SpringBoot通過(guò)自定義注解實(shí)現(xiàn)參數(shù)校驗(yàn)
- springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法
- springboot接口參數(shù)校驗(yàn)JSR303的實(shí)現(xiàn)
- SpringBoot參數(shù)校驗(yàn)之@Valid的使用詳解
- SpringBoot參數(shù)校驗(yàn)之@Validated的使用詳解
- SpringBoot參數(shù)校驗(yàn)示例詳解
相關(guān)文章
springboot+mysql+mybatis實(shí)現(xiàn)控制臺(tái)打印sql
在Spring Boot中使用MyBatis與MySQL,并希望在控制臺(tái)打印SQL語(yǔ)句,可以通過(guò)配置MyBatis的日志級(jí)別來(lái)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Java 實(shí)現(xiàn)跨平臺(tái)的操作方式
這篇文章主要介紹了Java 實(shí)現(xiàn)跨平臺(tái)的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Redis高并發(fā)場(chǎng)景防止庫(kù)存數(shù)量超賣少賣
商品超賣是銷售數(shù)量超過(guò)實(shí)際庫(kù)存的情況,常因庫(kù)存管理不當(dāng)引發(fā),傳統(tǒng)庫(kù)存管理在高并發(fā)環(huán)境下易出錯(cuò),可通過(guò)線程加鎖或使用Redis同步庫(kù)存狀態(tài)解決,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09Java正則表達(dá)式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法
這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法,Java正則表達(dá)式在字符串處理和模式匹配中扮演著重要角色,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08