《Spring Boot 趣味实战课》读书笔记(三)
创始人
2025-05-31 22:27:39
0

斗转星移,无人能及——Spring MVC

Spring MVC 简介

  • MVC 模式是软件工程中的一种软件架构模式,把软件系统分为 3 个基本部分:模型(Model)、视图(View)和控制器(Controller)。
    • 模型(Model)
      • Model 是由一个实体 Bean 实现的,是数据的载体
    • 视图(View)
      • 在 Java EE 应用程序中,View 可以由 JSP(Java Server Page)担任。
      • 在目前的前/后端分离模式下,View 已经由前端取代。
    • 控制器(Controller)
      • 在 Java EE 应用中,Controller 可能是一个 Servlet。
      • 在 Spring MVC 中,控制器的核心是 DispatcherServlet。

接收参数的各种方式

  • Spring MVC 接收参数的方式大致可以分为以下 4 种:
    • 无注解方式
    • @RequestParam 方式
    • @PathVariable 方式
    • @RequestBody 方式

常用注解

  • @Controller
    • @Controller 用来修饰类,表示该类为一个 Controller 对象。
    • Spring 容器在启动时会将该类实例化。
  • @RequestMapping
    • @RequestMapping 用来修饰类或方法,设置接口的访问路径。
    • 在修饰类时,一般用于设置该类下所有接口路径的前缀。
  • @ResponseBody
    • @ResponseBody 用来修饰类或方法。
    • 在修饰方法时,该方法以 JSON 格式返回数据;
    • 在修饰类时,该类下的所有方法默认都以 JSON 格式返回数据。
  • @RequestParam
    • @RequestParam 用来修饰参数,可以根据名字与参数进行绑定,相当于 ServletRequest.getParameter()。
  • @RequestBody
    • @RequestBody 用来修饰参数,接收 JSON 格式的参数,经常应用于 AJAX 请求,前/后端分离的场景下。
  • @PathVariable
    • @PathVariable 用来修饰参数,用于获取 URL 上的值。
  • 组合注解
    • 由多个注解或一个注解与一个特定的属性值组成的注解,相当于对注解的一种封装;
    • 封装后的注解具有多个功能;
    • @RestController=@Controller+@ResponseBody;
    • @GetMapping=@RequestMapping(method=RequestMethod.GET);
    • @PostMapping=@RequestMapping(method=RequestMethod.POST);
    • @PutMapping=@RequestMapping(method=RequestMethod.PUT);
    • @PatchMapping=@RequestMapping(method=RequestMethod.PATCH);
    • @DeleteMapping=@RequestMapping(method=RequestMethod.DELETE)。

准备工作

  • 在正式开始之前,需要做一些准备工作。
    • 首先,我们需要创建一个 User 类,用来接收 JSON 参数及返回 JSON 数据:
      public class User {private String name;private int age;
      }
      
    • 使用 @Data 注解时,需要在 pom 文件中添加以下依赖:
      org.projectlomboklombok
      
      
    • 然后,我们需要在 Intellij IDEA 中安装 Lombok 插件。
    • 最后,我们需要创建一个 ParamController 类:
      @RestController
      public class ParamController {
      }
      

无注解方式

  • 无注解方式最简单,其写法和之前的 Hello World 程序差不多:
    @GetMapping("/noAnnotation")
    public User noAnnotation(User user) {return user;
    }
    
  • 在浏览器中访问 http://localhost:8080/noAnnotation?name=无注解方式&age=1,会看到浏览器中打印出如下内容:
    在这里插入图片描述

@RequestParam 方式

  • @RequestParam 有 4 个属性:
    在这里插入图片描述
  • 示例代码为:
    @GetMapping("/requestParam")
    public User requestParam(@RequestParam String name, @RequestParam int age) {User user = new User();user.setName(name);user.setAge(age);return user;
    }
    
  • 在浏览器中访问 http://localhost:8080/requestparam?name=@RequestParam方式&age=2,会看到浏览器中打印出如下内容:
    在这里插入图片描述

@PathVariable 方式

  • @PathVariable 有 3 个属性:
    在这里插入图片描述
  • 示例代码如下:
    @GetMapping("/pathVariable/{name}/{age}")
    public User pathVariable(@PathVariable String name, @PathVariable int age) {User user = new User();user.setName(name);user.setAge(age);return user;
    }
    
  • 在浏览器中访问 http://localhost:8080/pathVariable/@PathVariable 方式/3,会看到浏览器中打印出如下内容:
    在这里插入图片描述

@RequestBody 方式

  • @RequestBody 只有一个属性:
    在这里插入图片描述
  • 示例代码如下:
    @PostMapping("/requestBody")
    public User requestBody(@RequestBody User user) {return user;
    }
    
  • 注意,这次需要使用 POST 方式请求接口,而浏览器的地址栏不能直接发送 POST 请求。
  • 所以,我们需要借助其他工具,可以使用 Postman、Intellij IDEA 自带的 HTTP Client 或其他 HTTP 发送工具,以 postman 为例:
    在这里插入图片描述

参数校验

  • 说到传参,就避不开参数校验。
    • 在实际开发中,我们需要根据需求对参数进行各种各样的校验:是否为空、是否超出取值范围、是否为数字、E-mail 格式是否正确等。
    • 在没有数据校验 API 之前,我们需要自己实现这些校验的代码。

开启参数校验

  • 添加 validation 的 Starter 依赖:
    org.springframework.bootspring-boot-starter-validation
    
    
  • 为数据对象添加注解:
    @Data
    public class User {@NotBlank(message = "名字不能为空")private String name;@Min( value = 1, message = "年龄要不能小于 1")@Max( value = 120, message = "年龄要不能大于 120")private int age;@Email(message = "Email格式不正确")private String email;@Past(message = "生日必须为过去的时间")private LocalDate birthDay;
    }
    
  • 为需要进行校验的参数添加 @Valid 注解:
    @PostMapping("/requestBody")
    public User requestBody(@RequestBody @Validated User user) {return user;
    }
    

常用的参数校验注解

在这里插入图片描述

原理分析

流程分析

  • Spring MVC 最核心的思想在于 DispatcherServlet。
    • 在现在的开发模式中,我们主要使用的也是 Spring MVC 的这一核心功能。
    • 浏览器发起一个请求:
      • DispatcherServlet 接收用户请求。
      • DispatcherServlet 根据用户请求通过 HandlerMapping 找到对应的 Handler,得到一个 HandlerExecutionChain。
      • DispatcherServlet 通过 HandlerAdapter 调用 Controller 进行后续业务逻辑处理。
      • DispatcherServlet 通过 ViewResolver 进行视图解析并返回 View。
      • DispatcherServlet 对 View 进行渲染。
      • 当返回 JSON 格式的数据时,DispatcherServlet 会省去对视图处理的步骤。
        -

深入核心

  • Spring MVC 的 3 个核心组件:
    • Handler
      • Handler 是用来做具体事情的,对应的是 Controller 里面的方法。
      • 所有有 @RequestMapping 的方法都可以被看作一个 Handler。
    • HandlerMapping
      • HandlerMapping 是用来找到 Handler 的,是请求路径与 Handler 的映射关系。
    • HandlerAdapter
      • HandlerAdapter 是一个适配器。
      • 它是用来跟具体的 Handler 配合使用的。
  • DispatcherServlet 最核心的方法是 doDispatch:
    • 根据请求找到 Handler;
    • 根据 Handler 找到对应的 HandlerAdapter;
    • 用 HandlerAdapter 处理 Handler;
    • 处理经过以上步骤的结果。

拦截器

  • 拦截器在日常开发中有很重要的地位,可以帮助我们完成很多重要的功能:
    • 登录认证;
    • 权限验证;
    • 记录日志;
    • 性能监控。
  • Spring MVC 中所有的拦截器都实现/继承自 HandlerInterceptor 接口。
    • 如果想要编写一个自定义拦截器,就需要实现/继承HandlerInterceptor 接口或其子接口/实现类。
      在这里插入图片描述
    • 拦截器的执行流程:
      • 执行 preHandle 方法
        • 该方法会返回一个布尔值。
        • 如果为false,则结束本次请求;
        • 如果为true,则继续本次请求。
      • 执行处理器逻辑,也就是 Controller。
        • 执行 postHandle 方法。
        • 执行 afterCompletion 方法。
      • 多个拦截器按照先进后出的顺序执行。

相关内容

热门资讯

四川九寨沟峨眉山旅游旅行团五天... 深入四川:九寨沟与峨眉山五天四晚的奇妙之旅 四川旅游推荐!当地导游-乐乐:185 8335 5758...
黄山五日游多少钱一天?黄山旅游... 黄山,这座被誉为“天下第一奇山”的壮丽之地,一直以来都是我心中的旅游圣地。它的奇松、怪石、云海、温泉...
羊杂汤的北地豪情,牛肉锅的南国... 当北方汉子捧着海碗吸溜羊杂汤时,南方姑娘正用银匙搅动着潮汕牛肉锅的清汤。这场跨越秦岭淮河的“牛羊争霸...
假期第二天,62.32万人次!... 2025年端午假期第二天恰逢“六一”国际儿童节,全市围绕“童心粽情·端午民俗荟”主题,通过“非遗民俗...
端午节广州一景区发现7个莲花奇... 5月31日,广州莲花山旅游区惊现多株莲花奇观。该旅游区工作人员介绍,端午节假期首日,该景区发现了7朵...
一家人去张家界参团旅游5日4晚... 一家人去张家界参团旅游5日4晚价格,张家界旅游五天四晚旅游费用,看这省心又省钱。最近和家人商量着要出...
探索井冈山自驾游攻略:畅享美景... 井冈山,这个在中国革命历史中闪耀着光辉的名字,承载着无数革命故事与美丽的自然风光。作为一个自驾游爱好...
端午不补阳,全年都白忙!8种“... “端午临中夏,时清日复长。”端午时节,阳气旺盛却也暑湿渐重。中医讲究“春夏养阳”,此时补阳祛湿对身体...
济南免费游玩宝典,公园场馆老街... 端午小长假,济南以泉城的胸襟 敞开数十处免费“宝藏地”🎫 护城河环抱着千年古城 博物馆里藏着齐鲁文脉...
原创 关... 近期,酒店行业传出了令人震惊的消息! 5月30日,大理实力希尔顿酒店在拍卖中遭遇流拍。 据了...
起飞15分钟后紧急返航!官方通... 5月31日,中国南方航空微博发布情况通报:5月31日,CZ6850杭州飞往深圳的航班上,一旅客携带的...
桂林 "十八酿&qu... 桂林 “十八酿” 凭借独特风味与文化底蕴悄然火遍网络,成为美食界新宠。豆腐酿、辣椒酿等经典酿菜令人垂...
北京延庆举办美食节 烹制“百里... 人民网北京6月2日电 (记者尹星云)5月31日,2025年北京延庆区美食节暨“画廊美食行”主题活动在...
北京旅游旅行社口碑榜NO.1!... 在北京旅游市场日益火爆的今天,一家名为"好途私人订制"的旅行社悄然登顶口碑榜榜首,成为众多游客心中的...
原创 在... 宝子们,我前段时间去东京赶上了樱花祭,那体验,绝了,必须得跟你们唠唠! 刚到东京,哇,那大街小巷全被...
一锅酸甜暖人心!番茄土豆豆腐汤... 在众多家常汤品中,番茄土豆豆腐汤宛如冬日里的暖阳、夏日里的清风,以简单的食材组合,成就了令人念念不忘...
红枣夹核桃:养生零食的黄金组合 红枣夹核桃是一种将传统滋补食材巧妙结合的养生零食,兼具美味与营养。这种简单却富有创意的搭配,将红枣的...
炸春卷时,冷油下锅温和均匀但易... 春卷之惑:炸春卷油温引争议 春节,那可是咱中国人一年里最重要的节日,一家人围坐在一起,热热闹闹地准...
原创 家... "为什么饭店的炖鲶鱼总是比家里做的更香?"这个问题困扰了无数家庭主厨。其实秘诀很简单——选对鱼、掌握...