📣前言


  在Spring MVC框架中,@RequestMapping是一个至关重要的注解,它用于映射HTTP请求到控制器的处理方法。随着Spring MVC的广泛应用,深入理解@RequestMapping对于开发高效、可维护的Web应用程序至关重要。

  那么,具体如何实现呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!
<div align=center>
<img src=https://img-blog.csdnimg.cn/331866bf91ba42a1834c7db92b5794a2.jpeg width=200 />
</div>

🌊环境说明

开发工具:IDEA 2021.3
JDK版本: JDK 1.8
Spring Boot版本:2.3.1 RELEASE
Maven版本:3.8.2


🏆本文收录于 《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇 【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。


🌊摘要

🌊正文

摘要

  本文将深入探讨@RequestMapping注解的用法,包括其在Spring MVC中的工作原理、如何根据不同的HTTP请求方法进行映射,以及如何在实际开发中应用这一注解。同时,还将分析其优缺点,并提供实际的代码示例和测试用例。

简介

  @RequestMapping是Spring MVC中用于建立请求URL和控制器方法之间的映射的注解。它支持多种HTTP请求方法,如GET、POST、PUT、DELETE等,允许开发者灵活地定义请求处理逻辑。

源代码解析

  以下是使用@RequestMapping注解的一个简单示例:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyController {

    // 将HTTP GET请求映射到这个方法
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String home() {
        return "homePage";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

其中附上该注解的源码部分,有想法的同学可以去扒扒看。

掌握Spring MVC核心:深入探索@RequestMapping注解,有两下子_MVC

  在这个例子中,@RequestMapping注解将URL路径/home和HTTP GET请求方法映射到home方法。

代码解析

  这段Java代码演示了如何在Spring MVC框架中使用@Controller@RequestMapping注解来创建一个简单的Web控制器。下面是对代码的详细解析:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller // 1. 声明这是一个Spring MVC控制器
public class MyController {

    // 使用@RequestMapping注解来映射HTTP请求到方法
    @RequestMapping(value = "/home", method = RequestMethod.GET) // 2. 定义请求映射
    public String home() { // 3. 定义处理方法
        return "homePage"; // 4. 返回视图名称
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

掌握Spring MVC核心:深入探索@RequestMapping注解,有两下子_spring_02

1. 控制器声明
  • @Controller:这个注解表明MyController类是一个Spring MVC控制器,它的公共方法可以处理HTTP请求。
2. 请求映射定义
  • @RequestMapping:这个注解用于将特定的HTTP请求映射到控制器的处理方法上。它有多个属性,如valuemethod,用来指定请求的URL路径和HTTP请求方法。
    • value = "/home":指定了请求的URL路径为/home
    • method = RequestMethod.GET:指定了只映射HTTP GET请求。
3. 处理方法定义
  • public String home():这是一个公共方法,它没有参数,返回一个String类型的值。在Spring MVC中,这个返回值通常是一个视图的名称,而不是具体的页面内容。
4. 返回视图名称
  • return "homePage";:这行代码返回了一个字符串"homePage",它是视图解析器用来解析具体视图的名称。在实际应用中,这个名称会对应一个JSP、HTML页面或其他类型的视图模板。
应用场景

  这个控制器可以用于处理用户访问网站首页的请求。当用户在浏览器中输入/home路径并发送GET请求时,home方法将被调用,并且用户将看到名为homePage的页面。

优缺点
  • 优点

    • 清晰地将请求路径和处理方法关联起来,提高了代码的可读性。
    • 支持多种HTTP请求方法,提供了灵活的请求处理能力。
    • 与Spring MVC的其他组件无缝集成,简化了Web应用程序的开发。
  • 缺点

    • 对于复杂的URL模式或大型应用,可能需要更多的配置和注解来管理请求映射。
    • 如果不恰当地使用,可能会导致控制器方法的过度分散,影响代码的组织结构。
测试用例

  为了测试这个控制器,可以使用Spring的测试框架编写如下测试用例:

package com.example.review.component.controller;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;

@SpringBootTest
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Test
    public void testHomePage() throws Exception {
        mockMvc.perform(get("/home"))
                .andExpect(view().name("homePage"));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

  这个测试用例模拟了一个对/home路径的GET请求,并断言返回的视图名称是否为homePage,以验证控制器是否按预期工作。至于实际演示,这个大家可以去本地执行一下。

应用场景案例

  考虑一个需要根据不同的请求路径和方法处理不同业务逻辑的场景:

@Controller
public class BookController {

    // 处理对"/books"的GET请求
    @RequestMapping(value = "/books", method = RequestMethod.GET)
    public String listBooks() {
        // 业务逻辑处理
        return "bookList";
    }

    // 处理对"/books"的POST请求
    @RequestMapping(value = "/books", method = RequestMethod.POST)
    public String addBook() {
        // 业务逻辑处理
        return "bookAdded";
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
代码解析

  这段代码定义了一个名为BookController的Spring MVC控制器,它使用@RequestMapping注解来处理针对/books路径的不同HTTP请求。以下是对这段代码的详细解析:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller // 1. 声明这是一个Spring MVC控制器
public class BookController {

    // 处理对"/books"的GET请求
    @RequestMapping(value = "/books", method = RequestMethod.GET) // 2. 映射GET请求到listBooks方法
    public String listBooks() { // 3. 定义listBooks方法
        // 业务逻辑处理
        return "bookList"; // 4. 返回视图名称,指向显示书籍列表的页面
    }

    // 处理对"/books"的POST请求
    @RequestMapping(value = "/books", method = RequestMethod.POST) // 5. 映射POST请求到addBook方法
    public String addBook() { // 6. 定义addBook方法
        // 业务逻辑处理
        return "bookAdded"; // 7. 返回视图名称,指向添加书籍成功的页面
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
1. 控制器声明
  • @Controller:这个注解表明BookController是一个Spring MVC控制器,它的公共方法可以响应HTTP请求。
2. GET请求映射
  • @RequestMapping(value = "/books", method = RequestMethod.GET):这个注解将URL路径/books和HTTP GET请求方法映射到listBooks方法。
3. listBooks方法定义
  • public String listBooks():这是一个公共方法,用于处理获取书籍列表的逻辑。它没有参数,并返回一个字符串。
4. 视图名称返回
  • return "bookList";:方法返回一个视图名称bookList,这通常对应于一个JSP或HTML页面,用于展示书籍列表。
5. POST请求映射
  • @RequestMapping(value = "/books", method = RequestMethod.POST):这个注解将URL路径/books和HTTP POST请求方法映射到addBook方法。
6. addBook方法定义
  • public String addBook():这是一个公共方法,用于处理添加新书籍的逻辑。与listBooks方法类似,它也返回一个字符串。
7. 视图名称返回
  • return "bookAdded";:方法返回一个视图名称bookAdded,这通常对应于一个JSP或HTML页面,用于展示添加书籍成功的反馈。
应用场景

  BookController可以用于一个在线书店的Web应用程序中。listBooks方法用于显示可购买的书籍列表,而addBook方法用于处理新书籍的添加。

优缺点
  • 优点

    • 清晰地区分了不同HTTP请求方法的处理逻辑。
    • 使得控制器方法的组织更加直观和模块化。
  • 缺点

    • 如果不恰当地管理,相同的URL路径映射到不同的方法可能会导致混淆。
    • 对于不支持GET或POST请求的场景,需要额外的配置或注解。
测试用例

  可以使用Spring的MockMvc来编写测试用例,以确保BookController按预期工作:

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
public class BookControllerTest {

    private MockMvc mockMvc;
    private WebApplicationContext webApplicationContext;

    // 省略了自动装配和MockMvc的设置代码

    // 测试获取书籍列表
    @Test
    public void testListBooks() throws Exception {
        mockMvc.perform(get("/books"))
                .andExpect(status().isOk())
                .andExpect(view().name("bookList"));
    }

    // 测试添加书籍
    @Test
    public void testAddBook() throws Exception {
        mockMvc.perform(post("/books"))
                .andExpect(status().isOk())
                .andExpect(view().name("bookAdded"));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

这些测试用例模拟了对/books路径的GET和POST请求,并验证了控制器是否返回了正确的视图名称。

优缺点分析

优点
  • 灵活性:支持多种HTTP请求方法和复杂的URL模式。
  • 可读性:注解的使用提高了代码的可读性。
  • 解耦:将URL映射与业务逻辑分离,降低代码耦合度。
缺点
  • 复杂性:对于复杂的映射规则,配置可能变得繁琐。
  • 学习曲线:初学者可能需要时间来掌握其所有特性。

类代码方法介绍

@RequestMapping可以与以下注解结合使用,以支持不同的HTTP请求方法:

  • RequestMethod.GET
  • RequestMethod.POST
  • RequestMethod.PUT
  • RequestMethod.DELETE
  • 等等。

测试用例

以下是使用JUnit和Spring Test模块编写的测试用例,希望可以帮助到同学们,代码仅供参考:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;

@SpringBootTest
public class MyControllerTest {

    @Test
    public void testHome() throws Exception {
        // 模拟对"/home"的GET请求
        mockMvc.perform(get("/home"))
                // 断言状态码为200
                .andExpect(status().isOk())
                // 断言视图名为"homePage"
                .andExpect(view().name("homePage"));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
代码解析

这段代码是一个Spring MVC的测试用例,使用了Spring Boot的测试支持和MockMvc来验证控制器的行为。下面是对代码的详细解析:

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.springframework.boot.test.context.SpringBootTest;
// 如果需要指定配置类,可以使用@ContextConfiguration注解
// import org.springframework.test.context.ContextConfiguration;

@SpringBootTest // 1. 指定测试为Spring Boot应用测试
public class MyControllerTest {

    // 测试方法,用于验证对"/home"的GET请求
    @Test
    public void testHome() throws Exception {
        // 使用MockMvc来模拟对"/home"的GET请求
        mockMvc.perform(get("/home")) // 2. 使用get方法模拟GET请求
                // 使用.andExpect来断言响应的状态
                .andExpect(status().isOk()) // 3. 断言状态码为200(HTTP OK)
                // 断言返回的视图名称为"homePage"
                .andExpect(view().name("homePage")); // 4. 断言视图名称
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
1. Spring Boot测试注解
  • @SpringBootTest:这个注解告诉Spring Boot测试框架,这是一个集成测试,将会加载完整的Spring应用上下文。这意味着测试环境中所有的Spring组件都将是可用的。
2. MockMvc模拟请求
  • mockMvc.perform(get("/home"))MockMvc是一个Spring MVC测试框架的一部分,它允许在不启动服务器的情况下模拟HTTP请求。这里模拟了一个对/home路径的GET请求。
3. 状态码断言
  • .andExpect(status().isOk()):这个断言用来验证响应的状态码是否为200,即HTTP OK状态。这是一个标准的成功响应码,表示请求已被成功处理。
4. 视图名称断言
  • .andExpect(view().name("homePage")):这个断言用来验证控制器方法返回的视图名称是否为"homePage"。在Spring MVC中,控制器方法通常返回一个视图名称,然后由视图解析器将该名称解析为具体的视图(如JSP页面)。
应用场景

  这个测试用例适用于验证Web应用程序中的主页控制器是否按预期工作。它确保当用户访问主页时,服务器能够返回正确的HTTP状态码和视图。

注意事项
  • 测试类中通常会自动注入MockMvc对象,这需要使用@Autowired注解或通过MockMvcBuilders来构建。
  • 确保测试类或方法上有适当的Spring测试配置,以便正确加载应用上下文。

  通过这个测试用例,开发者可以快速验证控制器的行为是否符合预期,从而提高代码的质量和可靠性。

  而实际使用场景,大家也可以按如下的方式进行操作,仅供参考:

掌握Spring MVC核心:深入探索@RequestMapping注解,有两下子_HTTP_03

小结

  通过本文的学习,我们深入了解了@RequestMapping注解的工作原理和应用方法。从基础的映射到复杂的请求处理,@RequestMapping都显示出其强大的功能和灵活性。

总结

  @RequestMapping是Spring MVC中不可或缺的一部分,它为Web应用程序的开发提供了极大的便利。虽然存在一定的学习曲线,但其带来的好处远远超过了初期的学习成本。掌握这一注解,将有助于开发者构建更加高效和可维护的Web应用程序。

… …

  ok,以上就是我这期的全部内容啦,若想学习更多,你可以持续关注我,我会把这个多线程篇系统性的更新,保证每篇都是实打实的项目实战经验所撰。只要你每天学习一个奇淫小知识,日积月累下去,你一定能成为别人眼中的大佬的!功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

🌊热文推荐

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

 Spring Boot进阶(01):使用Spring Boot和Redis轻松实现高性能、高可用的缓存服务。

 Spring Boot进阶(02):防止程序员疯狂 Debug:快速掌握 Validation 参数校验技巧,让你的代码健康起来!

 Spring Boot进阶(03):【实战教程】MyBatis-Plus秒级实现字段自动填充,让你的代码更优雅!

 Spring Boot进阶(04):震惊!使用MyBatis-Plus,快速实现自定义SQL分页功能!

 Spring Boot进阶(05):Spring Boot与RabbitMQ完美融合,打造高效消息队列服务!

 Spring Boot进阶(06):【超详细】Windows10搭建RabbitMQ Server服务端,让你轻松实现消息队列管理!

 Spring Boot进阶(07):如何使用EasyPoi实现Java中Excel的导入导出?完整教程请收藏,让你的Excel操作更高效!

 Spring Boot进阶(08):使用EasyPoi实现Excel/Word携带图片导出,打造精美的报表

 Spring Boot进阶(09):用EasyPoi实现Excel多sheet导入导出,轻松管理海量数据!

 Spring Boot进阶(10):「从Excel到PDF,EasyPoi助你一键完美转换!」

 Spring Boot进阶(11):实现纯文本转成.csv格式文件,Spring Boot轻松搞定!附完整代码

 Spring Boot进阶(12):如何快速获取Excel文件中的Sheet页数量?Spring Boot教程带你一步步实现

 Spring Boot进阶(13):如何优雅获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值,附源码

 Spring Boot进阶(14):Spring Boot高级应用:手把手教你连接数据库并获取指定表结构!一文教会你

 Spring Boot进阶(15):用Spring Boot实现动态数据库分页查询表结构信息!

 Spring Boot进阶(16):使用Redis实现手机验证码功能,让你的用户注册更加便捷!

 Spring Boot进阶(17):Swagger2高级配置:定制header请求头等参数

 Spring Boot进阶(18):轻松管理定时任务!Spring Boot@Scheduled让你事半功倍

 Spring Boot进阶(19):探索ElasticSearch:如何利用Spring Boot轻松实现高效数据搜索与分析

 Spring Boot进阶(20):「打造高性能Web应用」——使用Jetty容器配置Spring Boot

 Spring Boot进阶(21):优化Spring Boot应用性能,使用Undertow容器提升响应速度

 Spring Boot进阶(22):决战容器之巅:Tomcat vs Undertow!性能对比分析揭秘最佳选择!

 Spring Boot进阶(23):终极解决方案!教你实现高效文件上传!

 Spring Boot进阶(24):秒传!快速实现高效多文件上传的最佳解决方案

 Spring Boot进阶(25):如何写出高效的文件上传单元测试?让你的测试更智能更高效!

 Spring Boot进阶(26):从小白到高手,掌握Mybatis中resultType和resultMap的秘密!

 Spring Boot进阶(27):Spring Boot进阶(27):Kafka大显身手,快速构建消息驱动应用!(环境搭建+演示)

 Spring Boot进阶(28):如何让Spring Boot应用在Linux中以后台服务方式启动,并实现滚动日志查看及保存至实体文件?

 Spring Boot进阶(29):如何正确使用Spring Boot注解@PathVariable、@RequestParam和@RequestBody: Postman演示教程

 Spring Boot进阶(30):@RestController与@Controller的区别及使用场景详解,附带精彩实战演示

… …

  若想系统性的从0到1的入门进阶学习,可以参考这篇专栏总结 《2024最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》本专栏致力打造全网最硬核 Spring Boot 学习及进阶SpringBoot 系列教学内容,🚀均为全网独家首发,致力打造精品硬核干货,专栏永持续更新。欢迎大家订阅学习。一分耕耘一份收获!

  如果想快速定位学习,可以看这篇 【一站式教程导航】,你想学习的都被收录系统整理在内,以最快的速度投入并学习掌握!!你值得拥有。

  在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点!投资自己,性价比永远最高,都这么说了,你还不赶紧来白嫖??

  本文涉及所有源代码,均已上传至 GitHub开源,供同学们一对一参考  GitHub传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

📣文末

我是bug菌, CSDN |  掘金 |  InfoQ |  51CTO |  华为云 |  阿里云 |  腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号 「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。

掌握Spring MVC核心:深入探索@RequestMapping注解,有两下子_HTTP_04