SpringBoot中Controller的傳參方式詳細(xì)講解
前言
SpringBoot整合SpringMvc其實(shí)千面一直講的都是。只需要我們在pom文件中引入 web的starter就可以了,然后我們就可以正常使用springMvc中的功能了。所以本篇文章可能更多的是回顧,回顧一下springMVC中的一些常用的功能。
按照正常的流程,我們應(yīng)該先講一講怎么配置視圖解析器,但是已經(jīng)提到了,現(xiàn)在都是前后端分離的項(xiàng)目,后端無需配置頁面跳轉(zhuǎn),只需要返回?cái)?shù)據(jù)即可,所以這一部分也沒必要再講了。那咱么就介紹下Controller中的常用寫法。
上一次我們介紹了 @RestController 注解,這個(gè)注解會(huì)把所有的返回結(jié)果以json(json其實(shí)不太準(zhǔn)確,應(yīng)該是可序列化對象,大部分是json形式)的形式進(jìn)行返回。我們今天來舉個(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; } }
訪問:http://localhost:9090/second 得到結(jié)果:
看到了返回的就是json類型的數(shù)據(jù)。這就是 @RestController的作用。如果不用@RestController,我們在方法上加上@ResponseBody是同樣的效果。 @RestController注解就是@Controller和@ResponseBody 的組合。
關(guān)于@RequestMapping注解
@RequestMapping注解主要用于標(biāo)識該Controller的請求地址路徑。比如上面路徑中的@RequestMapping("/second") 就代表通過 /second可以訪問到這個(gè)接口。這個(gè)注解既可以放在類上,也可以放到方法上,如果類上也有這個(gè)注解,那么類中所有的controller在訪問的時(shí)候,都要帶上類上的路徑才可以訪問到。比如:
@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, 那么我們訪問的路徑就變成了
ip:port/test/second ip:port/test/third
并且這也是現(xiàn)在最常用的方式,相當(dāng)于類上的注解里的url作為一個(gè)大的分類(一般代表一個(gè)模塊),方法是模塊中的各個(gè)功能。
同時(shí)還要注意,如果方法上面使用了@RequestMapping 注解來進(jìn)行標(biāo)記,那么其實(shí)并沒有限定這個(gè)方法用Http的哪種請求方式來進(jìn)行訪問,所以我們可以用Get請求,也可以用post請求。當(dāng)然除了這些還有一下不太常用的Delete,put,optio等請求方式。比如我們最上邊那個(gè)例子:
Get請求訪問:
Post請求訪問:
Delete請求訪問:
但是一般情況下,我們都會(huì)限定這個(gè)接口只能一某一種請求方式訪問,如何限制呢?
通過RequestMapping中的參數(shù)
@RestController public class SecondController { @RequestMapping(value = "/second", method = RequestMethod.GET) public User second(){ User u = new User("張勝男", 30,"女"); return u; } }
這時(shí)候就只能用Get請求來訪問了。
其他請求方式會(huì)報(bào)錯(cuò).
使用限定請求方式的注解
如果限定Get請求方式, 用@GetMapping 代替 @RequestMapping\
如果限定Post請求方式, 用@PostMapping 代替 @RequestMapping
比如限定Post請求方式:
@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請求傳參
Get請求的參數(shù)傳遞都是通過在url后面拼接來進(jìn)行傳參的, 比如我們傳一個(gè)name 和age 。url的寫法如下:
localhost:9090/third?name=zhangsan&age=20
在請求的路徑?后面表示參數(shù),多個(gè)參數(shù)之間用 & 進(jìn)行連接。 那么在Controller中如何接收Get請求傳遞過來的參數(shù)呢。方式很多,我們就說兩種最常用的
直接在Controller方法的參數(shù)中,用相同的變量名稱接收參數(shù)。以上面的請求為例
@GetMapping("third") public String third(String name, Integer age){ System.out.println(name); System.out.println(age); return "success"; }
成功獲取參數(shù):
如果參數(shù)太多,用上面的方式來寫,會(huì)導(dǎo)致方法中的參數(shù)過多,看起來很亂。所以我們也可以使用一個(gè)javaBean來接收。前期就是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 + ''' + '}'; } }
訪問: http://localhost:9090/getParam?name=zhangsan&age=20
gender沒有傳值,所以是null, 參數(shù)接收成功:
Post請求傳參
Post請求傳參的方式,常用的有兩種,一中是通過form表單進(jìn)行傳參(就是html中的form),還有一種是通過json的形式傳參。目前來說用json的比較多。
Form傳參
使用form傳參,我們的Controller再接收的時(shí)候和上面一樣可以直接接收上代碼。
@PostMapping("postForm") public User postForm(String name, Integer age){ User u = new User(name, age, null); return u; }
post請求需要通過postman來模擬了,注意form傳參的位置,要在body的form-data里
如果參數(shù)過多,我們也是可以通過一個(gè)javaBean來進(jìn)行接收的。
@PostMapping("postForm2") public User postForm2(User user){ return user; }
Json傳參
通過json傳遞的參數(shù),content-type一般為: application/json
我們在接收參數(shù)的時(shí)候要通過一個(gè)新的注解 @RequestBody 來進(jìn)行標(biāo)識。
// 注意,User中一定要有無參構(gòu)造方法 @PostMapping("postJson") public User postJson(@RequestBody User user){ return user; }
通過json方式請求,看是否成功獲取。
關(guān)于@RequestParam注解
還有一種方式,這種方式不是很常用,但有的時(shí)候,跟三方接口對接的時(shí)候,不排除他們使用這種方式。
就是針對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); }
后來我把@RequestParam 注解去掉了,發(fā)現(xiàn)居然也可以接收到參數(shù)。其實(shí)這個(gè)注解就是用來接收普通參數(shù)的一個(gè)注解。正常情況下應(yīng)該是可以省略的。什么時(shí)候不能省略呢,就是有時(shí)候這個(gè)參數(shù)是必填項(xiàng),就是必須要傳,那么我們可以在這個(gè)注解中標(biāo)識是否必傳和默認(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Validator進(jìn)行參數(shù)校驗(yàn)實(shí)戰(zhàn)教程(自定義校驗(yàn),分組校驗(yàn))
- SpringBoot通過自定義注解實(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)控制臺打印sql
在Spring Boot中使用MyBatis與MySQL,并希望在控制臺打印SQL語句,可以通過配置MyBatis的日志級別來實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Java正則表達(dá)式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法
這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法,Java正則表達(dá)式在字符串處理和模式匹配中扮演著重要角色,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08