首页 > 其他分享 >Spring Boot中的MVC支持

Spring Boot中的MVC支持

时间:2023-04-07 15:14:44浏览次数:36  
标签:String url Spring Boot MVC 参数 user 注解 id

1.1 概述

Spring Boot 的 MVC支持主要来介绍实际项目中最常用的几个注解,包括 @RestController、 @RequestMapping、@PathVariable、@RequestParam 以及@RequestBody。主要介绍这几个注解常用的使用方式和特点。
1.2 @RestController

@RestController是 Spring Boot新增的一个注解,我们看一下该注解都包含了哪些东西。

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

 

可以看出, @RestController注解包含了原来的 @Controller和 @ResponseBody 注解,使用过Spring的朋友对 @Controller注解已经非常了解了,这里不再赘述, @ResponseBody注解是将返回的数据结构转换为Json格式。所以 @RestController可以看作是 @Controller 和 @ResponseBody 的结合体,相当于偷个懒,我们使用 @RestController之后就不用再使用 @Controller了。但是需要注意一个问题:如果是前后端分离,不用模板渲染的话,比如 Thymeleaf,这种情况下是可以直接使用@RestController 将数据以 json 格式传给前端,前端拿到之后解析;但如果不是前后端分离,需要使用模板来渲染的话,一般 Controller中都会返回到具体的页面,那么此时就不能使用@RestController了,比如:

public String getUser() {
    return "user";
}

 

其实是需要返回到user.html页面的,如果使用 @RestController的话,会将 user作为字符串返回的,所以这时候我们需要使用@Controller注解。
1.3 @RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,它可以用于类上,也可以用于方法上。在类的级别上的注解会将一个特定请求或者请求模式映射到一个控制器之上,表示类中的所有响应请求的方法都是以该地址作为父路径;在方法的级别表示进一步指定到处理方法的映射关系。

该注解有6个属性,一般在项目中比较常用的有三个属性:value、method 和 produces。

value 属性:指定请求的实际地址,value可以省略不写
method属性:指定请求的类型,主要有GET、PUT、POST、DELETE,默认为 GET
produces属性:指定返回内容类型,如 produces = “application/json; charset=UTF-8”
@RequestMapping 注解比较简单,举个例子:

1.4 @RestController

@RequestMapping(value = "/test", produces = "application/json; charset=UTF-8")
public class TestController {

    @RequestMapping(value = "/get", method = RequestMethod.GET)
    public String testGet() {
        return "success";
    }
}

 

这个很简单,启动项目在浏览器中输入localhost:8080/test/get测试一下即可。

针对四种不同的请求方式,是有相应注解的,不用每次在@RequestMapping注解中加 method属性来指定,上面的 GET方式请求可以直接使用@GetMapping("/get")注解,效果一样。相应地,PUT方式、POST 方式和DELETE 方式对应的注解分别为 @PutMapping、@PostMapping和DeleteMapping。
1.5 @PathVariable

@PathVariable注解主要是用来获取 url 参数,Spring Boot支持restfull风格的 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:8080/test/user/2/zhangsan 可以看到控制台输出如下信息:

获取到的id为:2
获取到的name为:zhangsan

所以支持多个参数的接收。同样地,如果 url中的参数和方法中的参数名称不同的话,也需要使用 value 属性来绑定两个参数。

 

1.6 @RequestParam

@RequestParam注解顾名思义,也是获取请求参数的,上面我们介绍了 @PathValiable注解也是获取请求参数的,那么 @RequestParam 和 @PathVariable 有什么不同呢?主要区别在于:@PathValiable 是从 url模板中获取参数值, 即这种风格的 url:http://localhost:8080/user/{id} ;而 @RequestParam 是从 request里面获取参数值,即这种风格的 url:http://localhost:8080/user?id=1。我们使用该url带上参数 id来测试一下如下代码:

@GetMapping("/user")
public String testRequestParam(@RequestParam Integer id) {
    System.out.println("获取到的id为:" + id);
    return "success";
}

 

可以正常从控制台打印出 id 信息。同样地,url 上面的参数和方法的参数需要一致,如果不一致,也需要使用 value 属性来说明,比如 url 为:http://localhost:8080/user?idd=1`

@RequestMapping("/user")
public String testRequestParam(@RequestParam(value = "idd", required = false) Integer id) {
    System.out.println("获取到的id为:" + id);
    return "success";
}

 

除了value 属性外,还有个两个属性比较常用:

required 属性:true 表示该参数必须要传,否则就会报404错误,false表示可有可无。
defaultValue属性:默认值,表示如果请求中没有同名参数时的默认值。
从url中可以看出,@RequestParam注解用于GET 请求上时,接收拼接在url中的参数。除此之外,该注解还可以用于 POST请求,接收前端表单提交的参数,假如前端通过表单提交username和 password两个参数,那我们可以使用@RequestParam来接收,用法和上面一样。

@PostMapping("/form1")
    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;
    // set get
}

使用实体接收的话,我们不能在前面加@RequestParam注解了,直接使用即可。

@PostMapping("/form2")
    public String testForm(User user) {
        System.out.println("获取到的username为:" + user.getUsername());
        System.out.println("获取到的password为:" + user.getPassword());
        return "success";
    }

 

使用postman 再次测试一下表单提交,观察一下返回值和控制台打印出的日志即可。在实际项目中,一般都是封装一个实体类来接收表单数据,因为实际项目中表单数据一般都很多。
1.7 @RequestBody

@RequestBody注解用于接收前端传来的实体,接收参数也是对应的实体,比如前端通过json提交传来两个参数 username和 password,此时我们需要在后端封装一个实体来接收。在传递的参数比较多的情况下,使用 @RequestBody接收会非常方便。例如:

public class User {
    private String username;
    private String password;
    // set get
}

 

@PostMapping("/user")
public String testRequestBody(@RequestBody User user) {
    System.out.println("获取到的username为:" + user.getUsername());
    System.out.println("获取到的password为:" + user.getPassword());
    return "success";
}

 

我们使用postman 工具来测试一下效果,打开 postman,然后输入请求地址和参数,参数我们用json来模拟,如下图所有,调用之后返回 success

 

 

使用Postman测试requestBody

同时看一下后台控制台输出的日志:

获取到的username为:倪升武
获取到的password为:123456


可以看出,@RequestBody注解用于POST请求上,接收json实体参数。它和上面我们介绍的表单提交有点类似,只不过参数的格式不同,一个是json实体,一个是表单提交。在实际项目中根据具体场景和需要使用对应的注解即可。

标签:String,url,Spring,Boot,MVC,参数,user,注解,id
From: https://www.cnblogs.com/Fooo/p/17296219.html

相关文章

  • Spring Boot中使用拦截器
    1.1概述拦截器的原理很简单,是AOP的一种实现,专门拦截对动态资源的后台请求,即拦截对控制层的请求。使用场景比较多的是判断用户是否有权限请求后台,更拔高一层的使用场景也有,比如拦截器可以结合websocket一起使用,用来拦截websocket请求,然后做相应的处理等等。拦截器不会拦截静态资......
  • [ Spring事件发布与监听 ]
    Spring事件监听与发布主要有以下部分:事件(被监听的玩意),事件发布(把这个事件发布出去),事件监听(用来监听事件,并做行动)项目中,因为事件类型不同,可以先定义事件的接口:Ievent:publicinterfaceIEvent{}对于具体的事件,可以实现IEvent接口:(ep:后端需要判断一个对象中是否......
  • Spring Boot返回Json数据及数据封装
    1.1简介在项目开发中,接口与接口之间,前后端之间数据的传输都使用Json格式,在SpringBoot中,接口返回Json格式的数据很简单,在Controller中使用@RestController注解即可返回Json格式的数据,@RestController也是SpringBoot新增的一个注解,我们点进去看一下该注解都包含了哪些东西......
  • 记spring-security升级,引发的redis反序列化不一致问题
    问题解决参考文章如下:https://my.oschina.net/klblog/blog/5559133https://blog.csdn.net/qq_37421368/article/details/124850449问题复现由于一些原因,登录的token由旧版本的微服务存入的redis,另一个新版本的微服务需要取出数据校验springboot版本升级导致spring-secu......
  • 【Spring AOP基础使用:认识AOP,AOP作用,核心概念,AOP实现】
    本文纲要一、了解AOP1、认识AOP2、AOP作用3、AOP核心概念二、AOP快速入门1、基础准备2、AOP实现3、总结三、AOP获取通知数据1、JoinPoint2、ProceedingJoinPoint3、获取通知数据的使用场景进入正文:一、了解AOP1、认识AOPAOP(AspectOrientedProgramming)面向切面编程,一种......
  • SpringBoot @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})注
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})该注解的作用是,排除自动注入数据源的配置,用exclude属性进行排除指定的类,在springBoot中使用多数据源时,加上@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})DataSourceAutoConfigur......
  • SpringCloud 多个服务启动放在一个窗口下的设置
    进入.idea文件夹,在workspace.xml文件中加入如下配置即可<componentname="RunDashboard"><optionname="configurationTypes"><set><optionvalue="SpringBootApplicationConfigurationType"/></set&......
  • Spring 源码解析 --Bean 的初始化流程
    --Spring原理架构图   --容器刷新  ---Bean初始化  --Bean生命周期流程 ......
  • Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
    JavaBasePooledObjectFactory对象池化技术通常一个对象创建、销毁非常耗时的时候,我们不会频繁的创建和销毁它,而是考虑复用。复用对象的一种做法就是对象池,将创建好的对象放入池中维护起来,下次再用的时候直接拿池中已经创建好的对象继续用,这就是池化的思想。ApacheCommonsPoo......
  • Spring 源码阅读之标签解析
    全局目录.md引子1、容器最基本使用.md系列1-bean标签解析:2、XmlBeanFactory的类图介绍.md3、XmlBeanFactory对xml文件读取.md4、xml配置文件解析之【默认】命名空间【标签】的解析.md5、xml配置文件解析之【自定义】命名空间【标签】的解析.md系列2-bean获取:get......