SpringBoot教程(五) | SpringBoot中Controller详解
SpringBoot整合SpringMvc其实千面一直讲的都是。只需要我们在pom文件中引入 web的starter就可以了,然后我们就可以正常使用springMvc中的功能了。所以本篇文章可能更多的是回顾,回顾一下springMVC中的一些常用的功能。
按照正常的流程,我们应该先讲一讲怎么配置视图解析器,但是已经提到了,现在都是前后端分离的项目,后端无需配置页面跳转,只需要返回数据即可,所以这一部分也没必要再讲了。那咱么就介绍下Controller中的常用写法。
上一次我们介绍了 @RestController 注解,这个注解会把所有的返回结果以json(json其实不太准确,应该是可序列化对象,大部分是json形式)的形式进行返回。我们今天来举个例子。
5.1关于@RestController注解
Controller代码:
java
java复制代码@RestController
public class SecondController {
@RequestMapping("/second")
public User second(){
User u = new User("张胜男", 30,"女");
return u;
}
}
这里返回了一个User类。 User类代码如下:
java
java复制代码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;
}
}
访问:http://localhost:9090/second 得到结果:
看到了返回的就是json类型的数据。这就是 @RestController的作用。如果不用@RestController,我们在方法上加上@ResponseBody是同样的效果。 @RestController注解就是@Controller和@ResponseBody 的组合。
5.2 关于@RequestMapping注解
@RequestMapping注解主要用于标识该Controller的请求地址路径。比如上面路径中的@RequestMapping("/second") 就代表通过 /second可以访问到这个接口。这个注解既可以放在类上,也可以放到方法上,如果类上也有这个注解,那么类中所有的controller在访问的时候,都要带上类上的路径才可以访问到。比如:
java
java复制代码@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
并且这也是现在最常用的方式,相当于类上的注解里的url作为一个大的分类(一般代表一个模块),方法是模块中的各个功能。
同时还要注意,如果方法上面使用了@RequestMapping 注解来进行标记,那么其实并没有限定这个方法用Http的哪种请求方式来进行访问,所以我们可以用Get请求,也可以用post请求。当然除了这些还有一下不太常用的Delete,put,optio等请求方式。比如我们最上边那个例子:
Get请求访问:
Post请求访问:
Delete请求访问:
但是一般情况下,我们都会限定这个接口只能一某一种请求方式访问,如何限制呢?
方法一: 通过RequestMapping中的参数
java
java复制代码@RestController
public class SecondController {
@RequestMapping(value = "/second", method = RequestMethod.GET)
public User second(){
User u = new User("张胜男", 30,"女");
return u;
}
}
这时候就只能用Get请求来访问了。
其他请求方式会报错.
方法二: 使用限定请求方式的注解:
如果限定Get请求方式, 用@GetMapping 代替 @RequestMapping\
如果限定Post请求方式, 用@PostMapping 代替 @RequestMapping
比如限定Post请求方式:
java
java复制代码@RestController
public class SecondController {
@PostMapping("second")
public User second(){
User u = new User("张胜男", 30,"女");
return u;
}
}
我们可以看下 @PostMapping注解的实现方式,其实跟方式一是一样的。
5.3关于Controller中传参
Get请求传参:
Get请求的参数传递都是通过在url后面拼接来进行传参的, 比如我们传一个name 和age 。url的写法如下:
localhost:9090/third?name=zhangsan&age=20
在请求的路径?后面表示参数,多个参数之间用 & 进行连接。 那么在Controller中如何接收Get请求传递过来的参数呢。方式很多,我们就说两种最常用的
- 直接在Controller方法的参数中,用相同的变量名称接收参数。以上面的请求为例
java
java复制代码@GetMapping("third")
public String third(String name, Integer age){
System.out.println(name);
System.out.println(age);
return "success";
}
成功获取参数:
- 如果参数太多,用上面的方式来写,会导致方法中的参数过多,看起来很乱。所以我们也可以使用一个javaBean来接收。前期就是javaBean中的属性名要和参数名相同,同时要有get和set方法。
java
java复制代码@GetMapping("getParam")
public User getParam(User user){
System.out.println(user);
// 将接收到的参数直接返回
return user;
}
User类,再给一下:
java
java复制代码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, 参数接收成功:
Post请求传参
Post请求传参的方式,常用的有两种,一中是通过form表单进行传参(就是html中的form),还有一种是通过json的形式传参。目前来说用json的比较多。
- Form传参
使用form传参,我们的Controller再接收的时候和上面一样可以直接接收上代码。
java
java复制代码@PostMapping("postForm")
public User postForm(String name, Integer age){
User u = new User(name, age, null);
return u;
}
post请求需要通过postman来模拟了,注意form传参的位置,要在body的form-data里
如果参数过多,我们也是可以通过一个javaBean来进行接收的。
java
java复制代码@PostMapping("postForm2")
public User postForm2(User user){
return user;
}
2. Json 传参
通过json传递的参数,content-type一般为: application/json
我们在接收参数的时候要通过一个新的注解 @RequestBody 来进行标识。
java
java复制代码// 注意,User中一定要有无参构造方法
@PostMapping("postJson")
public User postJson(@RequestBody User user){
return user;
}
通过json方式请求,看是否成功获取。
3. 关于@RequestParam注解
还有一种方式,这种方式不是很常用,但有的时候,跟三方接口对接的时候,不排除他们使用这种方式。
就是针对content-type是: application/x-www-form-urlcoded (Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)这是我在网上的资料中找到的,也验证了,如下:
java
java复制代码@PostMapping("postWWWForm")
public User postWWWForm(@RequestParam String name, @RequestParam Integer age){
return new User(name, age, null);
}
后来我把@RequestParam 注解去掉了,发现居然也可以接收到参数。其实这个注解就是用来接收普通参数的一个注解。正常情况下应该是可以省略的。什么时候不能省略呢,就是有时候这个参数是必填项,就是必须要传,那么我们可以在这个注解中标识是否必传和默认值。
@RequestParam(value="id",required =false,defaultValue ="10086") Integer id,
默认是true.
好了关于SpringBoot中Controller的传参方式我们就介绍这么多。如有错误也欢迎大家交流指正**。**