Springboot 常用 Spring MVC 实现 web 服务。

Spring MVC 请求处理流程

《Spring 实战第四版》
图片来自《Spring 实战第四版》

浏览器请求首先被交给 DispatcherServlet 前端控制器。
DispatcherServlet 查询处理器映射以决定将请求发送给哪个控制器。控制器处理业务逻辑后,向 DispatcherServlet 返回处理结果(被称为模型)和逻辑视图名。DispatcherServlet 使用视图解析器为逻辑视图名匹配特定视图。最后视图渲染结果,交给响应对象返回浏览器。

MVC 启动

Springboot 启动 Spring MVC 时,动态加载\org\springframework\web\servlet\DispatcherServlet.properties文件定义的组件。

控制器

@Controller 注解定义控制器。它与 @Component 注解功能相同,因此Spring 会创建 MyController bean。
@RequestMapping 注解定义请求路径(value 属性)和控制器方法(hello())的映射关系。映射关系被存储到HandlerMapping(处理器映射)对象。DispatcherServlet 将请求发送给处理器映射,处理器映射返回的不是 Controller,而是 HandlerExecutionChain 对象。

@Controller
public class MyController {@RequestMapping(value = "/", method=GET)public String hello() {return "hello";}
}

HandlerExecutionChain 对象包含处理器 handler 和拦截器 interceptorList 。处理器是对控制器 controller 的封装。拦截器增强处理器功能。

public class HandlerExecutionChain {private final Object handler;private final List<HandlerInterceptor> interceptorList = new ArrayList<>();

HandlerAdapter 实现类执行 HandlerExecutionChain 对象的内容。即执行控制器并返回结果。
控制器返回的结果被称为模型。视图解析器根据逻辑视图名称定位视图,视图渲染模型给响应体。前后端分离场景下一般用 json 格式响应体,此时不需要视图解析器和视图。

@RequestMapping

@RequestMapping 注解有主要有两个参数,一个是路径 value,一个是请求方法 method。它的简化版本 @GetMapping 注解表示 get 请求类型,@PostMapping 注解表示 Post 请求类型。

获取控制器参数

@RequestParam 注解可以定义HTTP参数和方法参数的映射关系。

@RequestMapping(value = "/param", method=GET)
public String param(@RequestParam("user") String user,@RequestParam("age") int age) {return service(user, age);
}

@RequestBody 注解可以将 json 参数转换为对应 java 对象。

@RequestMapping(value = "/param", method=GET)
public String param(@RequestBody User user) {return service(user);
}

@PathVariable 注解可以获取路径参数。Restful 风格要求用路径,而不是用参数表示资源。

@RequestMapping(value = "/param/{id}", method=GET)
public String param(@PathVariable("id") String id) {return service(id);
}

@DataTimeFormat 注解和 @NumberFormat 注解可以定义格式化参数。

自定义获取控制器参数的规则

SpringMVC 通过 WebDataBinder 机制来获取参数。它解析 HTTP 请求上下文,转换参数并且提供验证功能。转换参数的接口有三个:Converter,Formatter 和 GenericConverter。第一个是转换类型,第二个是转换格式,第三个是转换数组。
SpringMVC 将三个接口的默认实现类注册到注册机,这就是大部分类型转换无需开发者开发的原因。
我们可以定义自己的转换器,只需实现接口,SpringMVC自动注册到注册机。

@Component
public class MyConvrter implements Converter<String, User> {@Overridepublic User convert(String str) {...}
}

参数验证

SpringMVC 支持参数验证。通过 @Valid 注解启动验证机制,通过 @NotNull, @Max, @Range, @Email 等注解验证字段。

用户也可以在 WebDataBinder 注册验证器自定义验证机制。

public class MyValidator implements Validator {// 指定验证类型@Overridepublic boolean supports(Class<?> clazz) {return clazz.equals(User.class);}// 执行验证方法@Overridepublic void validate(Object target, Errors erros) {...}
}

MyValidator 类没有 @Component 注解。在控制器类用 @InitBinder 注解注册验证类。

@RequestMapping("/user")
public class UserController {@InitBinderpublic void initBinder(WebDataBinder binder) {binder.setValidator(new MyValidator()); // 绑定验证器}@GetMapping("/validate")public Map<String, Object> validator(@Valid User user, Errors erros) {if (errors.hasErrors()) {// 没通过验证,返回错误结果}}
}

视图

SpringMVC 视图分为逻辑视图和非逻辑视图。逻辑视图需要视图解析器进一步定位视图,比如 JSP。非逻辑视图不需定位,直接渲染,比如 json。

拦截器

拦截器用于拦截处理器,增强处理器功能。preHandle 方法在处理器执行前执行,postHandle 方法在处理器执行后执行,afterCompletion 方法在处理器完成且视图渲染后后执行。

public class MyInterceptor extends HandlerInterceptor {@Overridepublic boolean preHandle(HttpServltRequest request, HttpServletResponse response, Object handler) {...}@Overridepublic boolean postHandle(HttpServltRequest request, HttpServletResponse response, Object handler) {...}@Overridepublic boolean afterCompletion(HttpServltRequest request, HttpServletResponse response, Object handler) {...}
}

开发拦截器后需要注册拦截器。

@Configuration
public class MyApplication implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {InterceptorRegistry ir = registry.addInterceptor(new MyInterceptor());ir.addPathPatterns("/user/*");}
}

多个拦截器按照责任链模式装配。对于 preHandle 方法,先注册先执行。对于 postHandle 和 afterCompletion 方法,先注册后执行。如果某个拦截器的 preHandle 为 false,后续的 preHandle 和 postHandle 都不会执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917722.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917722.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917722.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大厂面试题

线程池的状态?回答:running->shutdown->stop->tidyng->TERMINATED 线程池状态怎么流转2. 回答:变成shutdown&#xff0c;执行shutdown()函数变成stop&#xff0c;执行shutdownnow函数 变成tining&#xff0c;所有任务已处理完 变成TERMINATED&#xff0c;线程池调…

达芬奇31-40

快捷键C鼠标左键拖拽到节点上 A鼠标左键拖拽节点 复制到另一个图层上Raw素材太哦调整为log方便调色磨皮中间调向左磨皮,向右变老找到丢失的高光磨皮后脸部高光消失,或不明显,此时用亮度吸管工具找到脸部的高光,拉高中灰和亮部的Y值质感纹理增强器Tiny,Fine高频细节(脸部)增强或…

dify

一、SVG Logo Design ### 任务 我希望你充当图像生成的提示生成器。 ### 任务描述 你的工作是提供详细且富有创意的描述&#xff0c;以激发 AI 生成独特而有趣的图像。请记住&#xff0c;格式应遵循以下一般模式&#xff1a; <主要主题>, <主要主题的描述>, <背…

Mysql 实战问题处理速通

文章目录创建账号和授权查询没有主键的表统计每个库大小前十张大表清理日志表Prepared statement needs to be re-preparedxtrabackup 问题锁问题处理快速处理查询事务等待和阻塞情况innodb_trxprocesslistdata_locksdata_lock_waitsmetadata_locksevents_statements_current其…

如何测量滚珠花键的旋转方向间隙?

测量滚珠花键的旋转方向间隙需要使用适当的工具&#xff0c;通常情况下&#xff0c;可以使用游标卡尺或外径卡尺进行测量。这些工具可以准确地测量间隙的宽度和深度&#xff0c;并且可以轻松地记录测量结果。手动检测法&#xff1a;将滚珠花键固定在支架上&#xff0c;确保其可…

Android AppSearch 深度解析:现代应用搜索架构与实践

一、AppSearch 概述1.1 什么是 AppSearchAppSearch 是 Android Jetpack 组件库中的一个现代化本地搜索框架&#xff0c;于 Android 12 (API level 31) 引入&#xff0c;旨在为 Android 应用提供高效、可靠的本地数据索引和搜索能力。与传统的 SQLite 搜索方案相比&#xff0c;A…

使用公众号的消息模板给关注用户发消息

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【盘古100Pro+开发板实验例程】FPGA学习 | 3X3图像矩阵生成 | 图像实验指导手册

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 1. 实验简介 实验目的&#xff1a; 实现 3X3 图像矩阵对应 9 个像素点图像数据的读取。 实验环境&#xff1a; Wind…

【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用

【通用视觉框架】基于OpenCvSharpWPFYOLO开发的仿VisionMaster的通用视觉框架软件&#xff0c;全套源码&#xff0c;开箱即用 基于OpenCvSharp、WPF和YOLO的组合&#xff0c;构建一个兼具图像处理能力、可视化交互和实时检测的工业级视觉框架。其核心是将底层算法与上层界面无…

微信小程序转Vue2组件智能提示词

角色 小程序转Vue2组件工程师&#xff08;ElementUI专精&#xff09; 核心能力 技术专长&#xff1a;作为世界顶尖前端工程师&#xff0c;专注于将小程序组件&#xff08;.wxml/.wxss/.js/.json&#xff09;精准转换为Vue2ElementUI组件&#xff0c;转换逻辑零偏差&#xff0c;…

JVM 学习总结

文章目录内存结构程序计数器什么是程序计数器&#xff1f;核心作用&#xff1a;为什么需要程序计数器&#xff1f;实现原理主要特点示例&#xff1a;PC 寄存器如何工作总结Java 虚拟机栈什么是 Java 虚拟机栈&#xff1f;栈帧的内部结构主要特点总结线程诊断本地方法栈堆堆内存…

目标检测检出率,误检率,ap,map等评估python代码

1.deepseek版本import numpy as np from collections import defaultdictdef calculate_iou(box1, box2):"""计算两个边界框的交并比&#xff08;IoU&#xff09;:param box1: [x1, y1, x2, y2]:param box2: [x1, y1, x2, y2]:return: IoU"""# 计…

python的高校班级管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 在高校教…

Scrapy 工作流程深度解析:引擎驱动的完美协作

一、Scrapy 核心组件全景图 #mermaid-svg-KWCKN9n4urijbSws {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KWCKN9n4urijbSws .error-icon{fill:#552222;}#mermaid-svg-KWCKN9n4urijbSws .error-text{fill:#552222;…

PCIe Base Specification解析(七)

文章目录3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决

Windows 11 使用Windows Hello使用人脸识别登录失败&#xff0c;重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决&#xff1a;遇到此种情况时&#xff1a;1、在“开始”右键——设置——账号——登录选项2、需要在PIN这里先进行删除此登录选项&#xff…

qq scheme

QQ intent scheme跳转 1.跳转指定说说(root) 2.跳转指定说说(非root) 3. 跳转聊天框 4. 跳转用户主页 5. 跳转加群 6. 跳转指定用户空间 1.跳转指定说说(root) 该方法需root权限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C语言基础_随机数、数组、函数、指针

0、随机数&#xff1a; 要用C语言产生随机数&#xff0c;首先在预处理程序部分要引入stdlib.h头文件&#xff0c;然后就可以用rand()在后续程序中生成随机数了。如果不设置随机数种子srand()&#xff0c;后面生成的随机数序列就是以41开头的一个固定序列&#xff0c;因此一般以…

PHP‑ORT扩展构建纯PHP机器学习的推荐系统

结合 PHP‑ORT 构建推荐系统的核心思想是&#xff1a;使用 ONNX 格式的机器学习模型&#xff0c;在 PHP 中本地执行推理&#xff0c;实时给出推荐结果。下面是一个完整的架构设计与实现路径&#xff0c;适合你快速上手。&#x1f3af; 场景目标 你想在一个 PHP 网站中实现推荐功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目录 一、PromptPilot 二、基于产品评价的用户情感分析 2.1 使用PromptPiolt工具进行提示词生成 2.2 基于prompt的模型调试 2.3 基于prompt的批量数据测评 2.4 基于多轮对话的prompt测试 如今&#xff0c;我们正身处一个 AI 技术飞速迭代的时代。人工智能早已不再是实验室…