“一锅端“ Spring MVC 常见使用大全(上)

简介: “一锅端“ Spring MVC 常见使用大全(上)

一. Spring Boot 里的 Spring MVC



  1. Spring Boot 是什么 ?


Spring Boot 在之前的文章中有介绍过, 它是一个快速构建生产级别的 Spring 引用程序的框架, 它基于 Spring Frameword, 并通过自动配置、约点大于配置、快速开发等方式, 开发人员更快地创建出高效、可靠的 Spring 应用程序


  1. Spring MVC 是什么?


Spring MVC 是基于 Servlet API 构建的原始 Web 框架, 它全称叫做 Spring Web MVC 来自于其源模块的名称( spring-webmvc ), 也就是我们现在常叫做的 Spring MVC


Spring MVC 中的 MVC 全程为 Model View Controller, M-模型, V-视图, C-控制器, 也就是视图模型控制器, 它是一种软件构架模式( 它是后面出现的一种设计模式 )


fa5e104c474ccaa3f2eb6744d45f8d34.png

所以 MVC 是一种思想, 而 Spring MVC 是对 MVC 的一种具体实现


  1. Spring Boot 和 Spring MVC 之前有什么关系 ?


对于这二者之间, Spring Boot 是构建在 Spring Framework 之上的, 而 Spring MVC 是 Spring Framework 中的一个模块, 因此 Spring Boot 中也包含了 Spring MVC.


具体来说便是, Spring Boot 中默认使用 Spring MVC 作为 Web 开发框架, 并通过自动配置的方式简化了 Spring MVC 的配置过程, 开发人员通过添加正确的依赖和一些简单的配置, 快速的搭建一个完整的 Web 应用程序


因此可以说 Spring Boot 是围绕 Spring MVC 和其他 Spring 模块构建的一个全新引用程序开发框架, 在提供 Spring MVC 功能的同时又提供了额外的便利功能, 使得开发可以更加高效便捷的构建 Web 应用程序


二. Spring MVC 的具体使用



1. Spring MVC 的创建


我们前面说道, Spring MVC 是 Spring 中的一个模块而已, 因此我们在用 Spring Boot 框架开发时, 只需要添加 Spring MVC 的起步依赖就好. 并且通过添加 Spring Web 依赖说明时, 就可以看到 Spring Web 其实就是 Spring MVC

620b36d92a4dd053e55c668dcf917f16.png


2. 和浏览器建立连接


2.1 @RequestMapping 注解建立连接


通过标准分层, 在controller 包下创建一个 UserController, 并添加一个方法, 方法上添加 @RequestMapping 注解

// 等同于 @ResponseBody 和 @Controller 注解
@RestController // 让 Spring 框架启动时加载, 并且返回的非页面数据
public class UserController {
    @RequestMapping("/user1")
    public String fun1() {
        return "这是 user1 路由下的 fun1 方法";
    }
}


启动项目后, 此时通过本地 localhost 就可以访问当前页面了.这样就和浏览器建立了连接

0d7c9de995a23e28a9b8ad710a7e3235.png

可以看到的是, 这里@RequestMapping 注解是 Spring Web 程序中最常用的一个注解, 它用来注册接口的路由映射的( 当用户访问一个 url 时, 将用户的请求对应到程序中某个类下的某个方法的过程就为路由映射 ).


  1. 而这里的 @RequestMapping 注解除了上面加在了方法上, 它也可以加载类上, 此时访问的 url 就为类上的路径 + 方法的路径
// 等同于 @ResponseBody 和 @Controller 注解
@RestController // 让 Spring 框架启动时加载, 并且返回的非页面数据
@RequestMapping("user")
public class UserController {
    @RequestMapping("/user1")
    public String fun1() {
        return "这是 user1 路由下的 fun1 方法";
    }
}


只访问方法上的路径是不对的, 必须是类路径加方法路径

f8dfeca327b5031789c44678e28286b4.png


  1. 方法上和类上也可以实现多级路由
// 等同于 @ResponseBody 和 @Controller 注解
@RestController // 让 Spring 框架启动时加载, 并且返回的非页面数据
@RequestMapping("user")
public class UserController {
    @RequestMapping("/user1/fun")
    public String fun1() {
        return "这是 user1 路由下的 fun1 方法";
    }
}


b43c5aa776ccc502bfecab7ab256fa9a.png


具体要如何实现, 可以根据自己的需求来实现.

  1. @RequestMapping 是什么类型的请求 ?


首先, 它肯定是支持 Get 请求的, 因为我们之前访问 localhost 时, 使用的就是 Get 方法. 那它支不支持其他方法呢 ?

// 等同于 @ResponseBody 和 @Controller 注解
@RestController // 让 Spring 框架启动时加载, 并且返回的非页面数据
public class UserController {
    @RequestMapping("/user1")
    public String fun1() {
        return "这是 user1 路由下的 fun1 方法";
    }
}


  1. 使用 Postman 构造一个 Post 请求和 Delete 请求看看, 还能访问这个方法嘛 ?

c89eda32fb358edfa35d2f2ed477830c.png60fa18a910f349412fb3a01345420a2c.png



可以看到的是, @RequestMapping 注解不指定特定路由方法下, 是支持多种路由请求的, 具体有哪些我们可以在源码中看到, 下面这些都是 @RequestMapping 注解支持的路由方法

a9c050a010b989740276fdfcf66e6cad.png

b. 只允许 Post 请求或者 Get 请求能实现嘛 ?

// 等同于 @ResponseBody 和 @Controller 注解
@RestController // 让 Spring 框架启动时加载, 并且返回的非页面数据
public class UserController {
    @RequestMapping(value = "/user1", method = RequestMethod.POST)
    public String fun1() {
        return "这是 user1 路由下的 fun1 方法";
    }
}


在@RequestMapping 里设置 method 属性, 选择路由方法为 POST. 在去通过 Postman 构建一个 Get 请求, 看看还能发送成功嘛 ?

358b8b8010703163683542aa0a99d5dc.png


可以看到, 此时它报了 405, 提示方法不被允许, 因此可以看到在 @RequestMapping 注解里, 不仅可以设置多级路由, 还可以限定路由的访问方法


只能由指定的路由方法访问 ! ! !

420b5de7346e1b398283a099486edb56.png


2.2 其他注解建立连接


上面的指定路由方法建立连接, 在我们的 Spring Web 里提供了更便捷的注解进行连接, 例如只允许 Post 的路由方法

@PostMapping("/user2")
public String fun() {
    return "这是 user2 路由下的 Post治党路由方法";
}


还是一样, 当我们去通过 Postman 进行构造一个 GET 方法访问时, 是不被允许的

07f5fa20e763394ae66e5d6e61ee31a3.png


只有 POST 方法才可以, 其他路由方法都不行

440be2f4b6e4d063fbcb92c3394c2ad1.png

3. 获取参数


建立连接后, 对于我们的项目中, 最重要的就是获取 web 项目中的一些参数.


3.1 获取 url 参数


@RequestMapping("/user3")
public String getParameter(String name) {
    return "这是获取到的参数 : " + name;
}


建立路由方法, 启动项目后访问, 此时我们并没有传入参数, 因此此处为默认值 ( 需要注意, 包装类的默认值也是 null )

2df3305554fd2d63196fe10b2bc95f6d.png

当我们 url 中传入参数时, 可以正确获取到参数属性

8a2eaa82f9bde8936a5e0dadacb6acad.png


需要注意的时, 必须和方法的参数一致, 才能在 url 中获取到正确的属性值, 当参数为 user 时, 与方法中的参数对不上, 因此无法正确获取

874a692ddd60addbc39113e113c49bf4.png


*既然可以获取一个参数, 那么是不是也可以获取两个参数呢 ? **

@RequestMapping("/user5")
public String getParameter1(String name, String password) {
    return "获取到的 name : " + name + " password : " + password;
}


注意, 此时我在 url 中是先输入的 password 后 输入的 name 但是, 并不会影响正确获取参数, 因为此处是通过 key 和 value 去匹配的, 只需要 key 正确即可匹配对应的 value

c6ad9597259d1e2f2da94812f55e3023.png之前我们 Servlet 是通过 request 去获取 url 的参数的, 而 Spring MVC 值基于 Servlet API 的, 因此 Servlet 的方法也是可以在这里使用的

@RequestMapping("/user4")
public String getParameter1(HttpServletRequest request, HttpServletResponse response) {
    return "这是获取到的参数 : " + request.getParameter("name");
}


这里的 request 和 response 等同于是框架内置的, 可以直接使用, 因此这里也是可以正确获取的

37667d0dfa5668049c7556e9d3b5847e.png


3.2 获取 url 对象


Web 项目中除了获取 URL 参数外, 获取对象也是非常常见和重要的, 下面就来看如何获取一个对象

  1. 先构建一个实体类 userInfo
@Data
public class UserInfo {
    private int age;
    private String name;
    private String password;
}


  1. 构造路由方法
@RequestMapping("/reg")
public Object reg(UserInfo userInfo) {
    return userInfo;
}


  1. 访问路由方法观察

56faeec6a34d441951784ff8cbc0c445.png


是不是特别简单 ? 并且, 我们前端传来的是参数, 怎么会变成了对象呢 ?** 原因就在于我们的框架帮我们做了这事, 当程序执行后, Spring MVC 会自动将我们的参数对象映射, 只需要我们传入的属性和对象拥有的属性一致, 框架会根据返回的类型, 自动帮我们匹配是返回标签 还是 JSON 对象返回**


例如 :

@RequestMapping("/html")
public Object reg1() {
    return "<h1> 这是一个 HTML 标签</h1>";
}


5bd01590c22527afb4ce702849ad74a4.png

在抓包确认一下, 框架自动将我们返回的 Object 对象转为需要的 HTML 形式了

bf21813101243cebc518da1b09d88ea6.png


3.3 参数重命名( 前端传入参数和后端参数不一致 )


3.3.1 @Value 注解


在生产中, 前后端的约定不一致时, 比如在注册中, 前端传入的是 username 而后端规定要使用的为 name, 这时候怎么办 ? 如果还用之前的方法, 那么我们将无法获取到对应的属性值, 为了解决这个问题, Spring Boot 框架提供了 @Value 注解, 将指定属性获取后赋值给指定参数, 例如下面 :

@RequestMapping("/reg1")
public Object reg1(@Value("username") String name, String password) {
    return "name : " + name + " password : " + password;
}


此时, 我们方法中的参数为 name, 但 url 中传入的为 username 但是同样正确获取了 username 的参数. 由于我们此处的重命名, 将 username 属性对应的值获取后赋值给了 name 属性


e21c21ef39f17c705c7a2ce0fe0a4dc2.png

3.3.2 @RequestParam 注解


使用 @RequestParam 注解同样可以重命名参数, 但是 @RequestParam 注解还有一个别的功能, 设置参数是否为非必传参数

@RequestMapping("/reg2")
public Object reg2(@RequestParam("username") String name, String password) {
    return "name : " + name + " password : " + password;
}


同样, 使用@RequestParam 是否能够重命名呢 ? 运行后发现是可以的

bc9de6072f9f0b4622dd7591d42d3c23.png

那么, 刚刚说的是否为非必传参数又是怎么回事呢 ? 当我们不传入 password, 预期应该是 password

3cd8ac794862b8d7e0f48dde118e60f8.png

当我们尝试不传 username 属性看看, 预期是否和之前一样, 不传入那么默认为 null 呢 并且可以正确访问呢 ?2e1e9fada8244b57aafd6c1f01141cd7.png


可以看到, 是无法正确访问的, 并且还给我们提示了报错信息 : username 为一个该方法的必传参数

82f24a067f8ca90dfb4f1da1a1ec6878.png

因此, 在重命名时, 如果使用 @RequestParam 注解会带来一个必传参数的问题, 那么, 如何解决这个问题呢 ?


我们可以在 @RequestParam 里面添加 required 属性, 可以看到, 默认是 true 的代表这是一个必传参数, 当设置为 false 时, 此时这个重命名的参数就不是必传的了

4c8aeee64317aed422f207601201e990.png

@RequestMapping("/reg2")
public Object reg2(@RequestParam(value = "username", required = false) String name, String password) {
    return "name : " + name + " password : " + password;
}


此时不传入重命名后的 username 也可以正确访问了.

3dda6e4127d00273ae2b22a9f05e9ea7.png


相关文章
|
2月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
9月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
534 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
833 0
|
9月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
523 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
462 0
|
9月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
391 0
|
5月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
373 0
|
5月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
168 0
|
5月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
282 0
|
11月前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
617 29