在正式讲解注解前,我们先准备一个测试案例:
Spring Initializr
,其它版本需要自行安装插件)引入Spring Web模块
删除一些没必要文件
按顺序创建Controller类代码
并启动主程序BlogSpringMvcApplication
输入链接测试一下:http:127.0.0.1:8080/test1
返回成功!
RequestMapping是Spring Web MVC应用程序中最常用的注解之一,用来注册接口的路由映射
,表示服务器收到路径为/test1的请求后,就会调用Test1这个方法
路由映射:当用户访问某个URL时,将用户的请求对应到服务器中某个类的某个方法的过程就叫做路由映射
如代码所示:
@RestController
public class TestController {
@RequestMapping("/test1")
public String Test1() {
return "Hello MVC";
}
}
注:上述代码中@RestController
的作用:
一个项目中会有很多的类,Spring会扫描所有的类,并只有当这个类有被@RestController注解修饰时Spring才会进去这个类并查看有没有被@RequestMapping修饰的方法
@RequestMapping
可以修饰方法,也可以修饰类
如代码所示:
@RequestMapping("/total")
@RestController
public class TestController {
@RequestMapping("/test1")
public String Test1() {
return "Hello MVC";
}
}
启动Spring, 此时重新访问路径http:127.0.0.1:8080/test1
就已经访问不到了
现在的访问路径为:类路径 + 方法路径
:http:127.0.0.1:8080/total/test1
注:
路径前的“/”可以不加(“/total”),Spring启动后会进行判断,若没有加“/"Spring会自动帮你添加,但建议主动加上
@RequestMapping
既支持GET请求,也支持POST请求,同时也支持其它请求,若需要指定请求,可将注解改为:
@RequestMapping(value = "/test1", method = RequestMethod.POST)
指定请求方式后,当前接口只能接收相应请求方式的请求,否则会报错(这里使用postman进行测试, 接口请求方式指定为POST请求, 并用GET请求进行访问):
这里补充一下Spring MVC对接收参数的格式要求
当我们只接收单个参数时,不需要加其它注解,Spring MVC直接用方法中的形参就可以了:
@RequestMapping("/name" )
public String Test2(String name) { // 传入参数形参名称需与接口参数形参名称一致
return "hi " + name;
}
注:
传入的形参名称要与接口形参的名称一致,否则返回参数默认为null
用基本类型(int)充当参数时, 参数必须传(boolean类型除外),否则会出现异常(500)
@RequestMapping("/num")
public int Test3(int n) {
return n;
}
若传入参数类型与接口参数类型不匹配,则会出现异常(500)
当传入多个参数时,传入的参数名称要与接口中有的参数名称一致,传入顺序可以不一致
@RequestMapping("/test4")
public String Test4(String name, int age) {
return "name: " + name + " age: " + age;
}
注:传入参数数量与接口参数中数量一致,否则会抛异常(500):
有时候需要的传递参数比较多,为了方便我们可以把它封装成一个对象来进行传递,比如下面的Personal对象:
import lombok.Data;
@Data
public class Person {
private int id;
private String name;
private String password;
}
在这里我们使用到了一个注解:@Data
它的作用就是帮我们封装好了属性的get方法和set方法,方便我们直接调用,不过这需要我们在pom.xml文件中引入依赖lombok
:
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<scope>providedscope>
dependency>
代码示例:
@RequestMapping("/test5")
public String Test5(Person person) {
return "name: " + person.getName()
+ " id: " + person.getId()
+ " password: " + person.getPassword();
}
注:Spring会根据参数的名称自动绑定到对象的各个属性上,若对应属性传入的参数为空,则该属性内容为null(基本类型为默认初始值)
Spring MVC可以自动绑定数组参数并赋值:
@RequestMapping("/test7")
public String Test7(String[] arr) {
return Arrays.toString(arr);
}
在某些特殊情况下,前端传给我们的参数可能与我们接口上的参数名称不一样,这个时候我们通过使用@RequestParam
注解来进行后端参数重命名,如下:
@RequestMapping("/test6")
public String Test6(@RequestParam("time") String createTime) {
return createTime;
}
若此时给它传入参数createTime则会报错(400):
因为此时后端接口的参数已经被我们通过注解@RequestParam
修改为了time,所以此时需要传入参数time才不会出现问题:
一旦加上该注解,则默认该参数是必传的,如果此时你想让这个参数修改为非必传,可以这样修改注解:
public String Test6(@RequestParam(value = "time", required = false) String createTime) {
return createTime;
}
默认情况下,请求中参数名相同的多个值,会被封装到数组中
如果要封装到集合中,需要使用@RequestParam
注解绑定参数关系:
@RequestMapping("/test8")
public String Test8(@RequestParam List<String> listParam) {
return "size: " + listParam.size() + ", listParam: " + listParam;
}
若此时去掉注解@RequestParam
,则会抛出异常(500):
当我们想传入JSON格式的对象时,我们需要通过@RequestBody
来修饰参数:
RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中
代码示例
@RequestMapping("/test9")
public String Test9(@RequestBody Person person) {
return person.toString();
}
若此时去掉注解@RequestBody
,则后端无法给Person对象赋值,自动填充默认参数:
@PathVariable
这个注解主要作用在URL路径上的数据绑定,默认将参数写到URL上,Spring MVC就能获取到:
@RequestMapping("/test10/{name}/{id}")
public String Test10(@PathVariable String name, @PathVariable("id") Integer userId) {
return "name: " + name + " userId: " + userId;
}
注:如果传入的参数与接口参数名称不一致,则需要给@PathVariable
的属性value赋值,将URL路径中对应的参数传给它
当我们需要上传文件时,可以使用@RequestPart
注解:
@RequestMapping("/test11")
public String Test11(@RequestPart MultipartFile file) throws IOException {
// 获取文件名称
String fileName = file.getName();
// 将文件上传到指定路径
file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
return "接收到的文件名称为:" + fileName;
}
此时文件也成功传输到了指定路径:
在最开始的代码中我们使用到了@RestController
这个注解,其实这个注解是有由另外两个注解组合而成的,即
@RestController = @ResponseBody + @Controller
它的源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
如果只想要返回视图的话,只需要把@ResposeBody去掉剩下@Controller即可
@ResponseBody
表示返回数据, 如果我们在接口上添加@ResponseBody
的话,则即使返回的是html页面spring也会将它转化为单纯的文本数据返回:
@Controller
public class IndexController {
@ResponseBody
@RequestMapping("/index")
public Object index() {
return "/index.html";
}
}
Spring MVC 也能返回html代码段:
@ResponseBody
@RequestMapping("/test12")
public String Test12() {
return "Hello MVC
";
}
以上就是本文对Spring MVC 常用注解的全部介绍与使用了,如果后续还有其它调整还会继续补充的!