本文主要介绍SpringBoot中对MVC的支持,分析了几个常见注解的使用方式和特点,包括@RestController、@RequestMapping、@PathVariable、@RequestParam以及RequestBody
文章目录
1.@RestController
我们先从RestController源码中看看该注解里都包含了哪些东西
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
从源码我们知道,@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式。但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
注意点:如果不是前后端分离,需要使用模板来渲染的话,一般Controller中都会返回到具体的页面,那么此时就不能使用@RestController了,比如:
public String getUser(){
return "user";
其实是需要返回到user.html页面的,如果使用@RestController的话,会将user作为字符串返回的,所以这时候我们需要使用@Controller注解
1.1 @Controller
控制器,处理http请求。
1.2 @ResponseBody
通过HttpMessageConverter读取Request Body并反序列化为Object(泛指)对象,用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过json提交传来两个参数userName和passWord,此时我们需要在后端封装一个实体来接收,在传递的参数比较多的情况下,使用@RequestBody接收会非常方便
举个例子:
package com.example.springdemo1.pojo;
public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
package com.example.springdemo1.controller;
import com.example.springdemo1.pojo.User;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class testController3 {
@PostMapping("/testRequestBody")
public String testRequestBody(User user){
System.out.println("userName:"+user.getUserName());
System.out.println("passWord:"+user.getPassWord());
return "success";
}
}
我们使用postman工具来测试一下效果,参数使用json格式
同时看一下后台控制台输出的日志:
userName:lyh
passWord:123456
可以看出,@RequestBody注解用于POST请求上,接收json实体参数。
2.@component
@component (把普通pojo实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>
)泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类。
3.@SpringBootApplication
@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan
这三个注解
3.1 @SpringBootConfiguration 注解
继承@Configuration注解,主要用于加载配置文件
,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
3.2 @EnableAutoConfiguration 注解
开启自动配置功能,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
3.3 @ComponentScan 注解
主要用于组件扫描和自动装配,@ComponentScan的功能其实就是自动扫描并加载符合条件的组件或bean定义,最终将这些bean定义加载到容器中
。我们可以通过basePackages等属性指定@ComponentScan自动扫描的范围,如果不指定,则默认Spring框架实现从声明@ComponentScan所在类的package进行扫描,默认情况下是不指定的,所以SpringBoot的启动类最好放在root package下
4.@RequestMapping
是一个用来处理请求地址映射的注解,他可以应用于类上,也可以用于方法上
,在类的级别上的注解会将一个特定的请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径,在方法的级别表示进一步指定到处理方法的映射关系。
该注解有6个属性,一般项目中比较常用的有三个属性:value、method、produces
- value 属性:指定请求的实际地址,value 可以省略不写
- method 属性:指定请求的类型,主要有 GET、PUT、POST、DELETE,默认为 GET
- produces属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”
举个例子:
@RestController
@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {
@RequestMapping(value = "/get", method = RequestMethod.GET)
public String testGet() {
return "success";
}
}
4.1 @GetMapping
- 用于将HTTP get请求映射到特定处理程序的方法注解
@RequestMapping(value = "/say",method = RequestMethod.GET)等价于:@GetMapping(value = "/say")
4.2 @PostMapping
- 用于将HTTP post请求映射到特定处理程序的方法注解
@RequestMapping(value = "/say",method = RequestMethod.POST)等价于:@PostMapping(value = "/say")
相应的,还有DeleteMapping、PutMapping,这里就不再赘述
5.@PathVariable
获取url中的数据,举个例子:一个GET请求携带一个参数id过来,我们将id作为参数接收,可以使用@PathVariable注解
@GetMapping("/user/{id}")
public String testPathVariable(@PathVariable Integer id) {
System.out.println("id:" + id);
return "success";
}
这里需要注意一个问题,如果想要url中占位符中的id直接赋值到参数id中,需要保证url中的参数和方法接收参数一致,否则就无法接收,如果不一致的话,需要用@PathVariable中的value属性来指定对应关系
@RequestMapping("/user/{idd}")
public String testPathVariable(@PathVariable(value = "idd") Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
对于访问的url,占位符的位置可以在任何位置,不一定非要在最后,比如:/xxx/{id}/user,url也支持多个占位符,方法参数使用同样数量的参数来接收。
@GetMapping("/user/{idd}/{name}")
public String testPathVariable(@PathVariable(value = "idd") Integer id, @PathVariable String name) {
System.out.println("获取到的id为:" + id);
System.out.println("获取到的name为:" + name);
return "success";
}
运行项目,在浏览器中请求:localhost:8082/test/user/2/lyh可以看到控制台输出如下信息:
支持多个参数的接收,同样的,如果url中的参数名称不同的话,也需要使用value属性绑定两个参数
6.@RequestParam
获取请求参数的值,与@PathVariable主要区别在于:@PathVariable是从url模板中获取参数值,即这种风格的urlhttp://localhost:8080/user/{id}
而@RequestParam是从request里面获取参数值,即这种风格的urlhttp://localhost:8080/user?id=1
,和@PathVariable类似,url上面的参数和方法的参数需要一致,如果不一致,也需要使用value属性来说明,比如url为http://localhost:8080/user?id=1
@RequestMapping("/user")
public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
System.out.println("获取到的id为:" + id);
return "success";
}
6.1 @RequestParam其他属性
- required:true表示该参数必须要穿,否则就会报404错误,false表示可有可无
- fefaultValue属性:默认值,表示如果请求中没有同名参数时的默认值
6.2 注意点
从url中可以看出,@RequestParam注解用于GET请求上时,接收拼接在url中的参数,该注解还可用于POST请求,接收前端表单提交的参数,加入前端通过表单提交username和password两个参数,那我们可以使用@RequestParam来接收
package com.example.springdemo1.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class testController4 {
@PostMapping("/form")
public String testForm(@RequestParam String userName,@RequestParam String passWord){
System.out.println("userName:"+userName);
System.out.println("passWord:"+passWord);
return "success";
}
}
我们使用postman来模拟一下表单提交
在表单数据很多的情况下,我们不可能在后台方法中写上很多参数,每个参数还要@RequestParam注解,针对这种情况,我们需要封装一个实体类来接收这些参数,实体中的属性名和表单中的参数名一致即可
public class User{
private String userName;
private String passWord;
//get set
}
使用实体接收的话,我们不能在前面加上@RequestParam注解了,直接使用即可
package com.example.springdemo1.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class testController4 {
@PostMapping("/form")
public String testForm(User user){
System.out.println("userName:"+user.getUserName);
System.out.println("passWord:"+user.getPassWord);
return "success";
}
}