SpringMVC 常用注解介绍

发布于:2024-04-18 ⋅ 阅读:(30) ⋅ 点赞:(0)

Spring MVC 常用注解介绍


本文主要介绍在使用 Spring MVC 构建网络请求时常用到的注解以及其使用方式

准备

在正式讲解注解前,我们先准备一个测试案例:

  1. 构建一个Spring Boot项目(Spring MVC项目和Spring Boot项目的构建方式一致,这里使用的是IDEA专业版,自带Spring Initializr,其它版本需要自行安装插件)

在这里插入图片描述

  1. 引入Spring Web模块

    在这里插入图片描述

  2. 删除一些没必要文件

    在这里插入图片描述

  3. 按顺序创建Controller类代码并启动主程序BlogSpringMvcApplication

    在这里插入图片描述

    输入链接测试一下:http:127.0.0.1:8080/test1

    在这里插入图片描述

返回成功!

1. @RequestMapping

1.1 介绍

RequestMapping是Spring Web MVC应用程序中最常用的注解之一,用来注册接口的路由映射,表示服务器收到路径为/test1的请求后,就会调用Test1这个方法

路由映射:当用户访问某个URL时,将用户的请求对应到服务器中某个类的某个方法的过程就叫做路由映射

如代码所示:

@RestController 
public class TestController {

    @RequestMapping("/test1")
    public String Test1() {
        return "Hello MVC";
    }
}

注:上述代码中@RestController的作用:

一个项目中会有很多的类,Spring会扫描所有的类,并只有当这个类有被@RestController注解修饰时Spring才会进去这个类并查看有没有被@RequestMapping修饰的方法

2.2 注解使用

@RequestMapping可以修饰方法,也可以修饰类

  • 当@RequestMapping修饰方法时,访问该方法的路径就是当前修饰方法的@RequestMapping中的路径
  • 当@RequestMapping修饰类时,访问该方法的路径就是修饰类的@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请求进行访问):

    在这里插入图片描述

2. 请求参数

这里补充一下Spring MVC对接收参数的格式要求

2.1 传递单个参数

当我们只接收单个参数时,不需要加其它注解,Spring MVC直接用方法中的形参就可以了:

@RequestMapping("/name" )
public String Test2(String name) { // 传入参数形参名称需与接口参数形参名称一致
    return "hi " + name;
}

在这里插入图片描述

  1. 传入的形参名称要与接口形参的名称一致,否则返回参数默认为null

  2. 用基本类型(int)充当参数时, 参数必须传(boolean类型除外),否则会出现异常(500)

    @RequestMapping("/num")
     public int Test3(int n) {
         return n;
     }   
    
  3. 若传入参数类型与接口参数类型不匹配,则会出现异常(500)

    在这里插入图片描述

2.2 传递多个参数

当传入多个参数时,传入的参数名称要与接口中有的参数名称一致,传入顺序可以不一致

@RequestMapping("/test4")
    public String Test4(String name, int age) {
        return "name: " + name + " age: " + age;
    }

在这里插入图片描述

注:传入参数数量与接口参数中数量一致,否则会抛异常(500):

在这里插入图片描述

2.3 传递对象

有时候需要的传递参数比较多,为了方便我们可以把它封装成一个对象来进行传递,比如下面的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.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

代码示例

@RequestMapping("/test5")
public String Test5(Person person) {
   return "name: " + person.getName()
          + " id: " + person.getId()
          + " password: " + person.getPassword();
}

在这里插入图片描述

:Spring会根据参数的名称自动绑定到对象的各个属性上,若对应属性传入的参数为空,则该属性内容为null(基本类型为默认初始值)

2.4 传递数组

Spring MVC可以自动绑定数组参数并赋值:

@RequestMapping("/test7")
public String Test7(String[] arr) {
    return Arrays.toString(arr);
}

在这里插入图片描述

3. @RequestParam

3.1 注解使用

在某些特殊情况下,前端传给我们的参数可能与我们接口上的参数名称不一样,这个时候我们通过使用@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;
}

在这里插入图片描述

3.2 传入集合

默认情况下,请求中参数名相同的多个值,会被封装到数组

如果要封装到集合中,需要使用@RequestParam注解绑定参数关系:

@RequestMapping("/test8")
public String Test8(@RequestParam List<String> listParam) {
    return "size: " + listParam.size() + ", listParam: " + listParam;
}

在这里插入图片描述

若此时去掉注解@RequestParam,则会抛出异常(500):

在这里插入图片描述

在这里插入图片描述

4. @RequestBody

当我们想传入JSON格式的对象时,我们需要通过@RequestBody来修饰参数:

RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中

代码示例

@RequestMapping("/test9")
public String Test9(@RequestBody Person person) {
    return person.toString();
}

在这里插入图片描述

若此时去掉注解@RequestBody,则后端无法给Person对象赋值,自动填充默认参数:

在这里插入图片描述

5. @PathVariable

@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路径中对应的参数传给它

6. @RequestPart

当我们需要上传文件时,可以使用@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;
}

此时文件也成功传输到了指定路径:

在这里插入图片描述

7. @RestController

7.1 介绍

在最开始的代码中我们使用到了@RestController这个注解,其实这个注解是有由另外两个注解组合而成的,即

@RestController = @ResponseBody + @Controller

  • @Controller: 定义一个控制器,Spring框架启动时加载,把这个对象交给Spring管理
  • @ResponseBody:定义返回的数据格式为非视图,返回一个text/html信息

它的源码如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    @AliasFor(
        annotation = Controller.class
    )
    String value() default "";
}

如果只想要返回视图的话,只需要把@ResposeBody去掉剩下@Controller即可

7.2 @ResposeBody

@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 "<h1>Hello MVC</h1>";
}

在这里插入图片描述
以上就是本文对Spring MVC 常用注解的全部介绍与使用了,如果后续还有其它调整还会继续补充的!


网站公告

今日签到

点亮在社区的每一天
去签到