0105 springMVC开发基础
背景
已经明确了MVC的思想和SpringMVC的基本流程,下面就都具体的mvc开发细节知识了。
@RequestMapping
springMVC核心流程中,启动阶段会把注解@RequeestMapping注解所配置的内容保存到HandlerMapping中,然后等待请求到达。
看一下源码:

简单分一下类:
| 方法 | 说明 |
|---|---|
| name,value,path | 标识控制器方法的访问url,可以配置多个 |
| method | 处理的方法,http的标准方法,比如get,post等 |
| params | 参数 |
| headers | 请求头 |
| consumers | 接受请求的资源类型 |
| produces | 响应的资源类型 |
说明:
- url在一个系统中应该保持唯一,能正确标明资源的含义;
- springboot新增了派生的方法注解,@PostMapping @GetMapping等;
控制器参数 自定义参数转换
在进入控制器的方法之前,会对http的参数和上下文进行解析,转换为控制器所需的参数;
自定义参数转换规则:适用于特殊形式的参数解析,比如第三方公司参数使用加密的方式
处理器转换参数流程:
WebDataBinder机制:参数的转换,参数的验证;

| 接口 | 说明 |
|---|---|
| converter | 普通的转换 |
| GenericConverter | 数组类型的转换 |
| formatter | 格式化 |
springboot的自动注册参数转换:
WebMvcAutoConfigurationAdapter类中自动注册的代码:所以,只要实现了这三个接口,并被安装到ioc中,就自动注册到了springMVC的参数处理流程中了;
@Override
public void addFormatters(FormatterRegistry registry) {
for (Converter<?, ?> converter :
getBeansOfType(Converter.class)) {
registry.addConverter(converter);
}
for (GenericConverter converter : getBeansOfType(GenericConverter.class)) {
registry.addConverter(converter);
}
for (Formatter<?> formatter :
getBeansOfType(Formatter.class)) {
registry.addFormatter(formatter);
}
}
常规参数处理:
| 类型 | 说明 |
|---|---|
| 无注解下获取参数 | url中的参数名字跟控制器方法的参数名称一致,并且允许为空 |
| @RequestParam | 可以配置url中参数名称,并设置是否必须,并给出默认值 |
| 传递数组 | 数组元素通过逗号分隔 |
| 传递json | 定义一个对象,并标注为@RequestBody |
| url传递参数 | url参数用{}包起来,而控制器方法参数标注为@PathVariable |
| 获取格式化参数 | @DateFormate @DateTimeFormate,@NumberFormate可以定义接受参数的格式 |
| 请求头参数 | @RequestHeader("x")注解标注控制器方法 |
| 自定义参数解析 | 实现HttpMessageConverter接口 |
说明:
- springboot中可以通过属性spring.mvc.date-formate来配置
数据验证
主要是集成了JSR303验证,采用的是Hibernate-validator机制来验证;
常见验证注解
| 注解 | 说明 |
|---|---|
| @NotNull | 不能为Null |
| @Future | 必须是将来的日期 |
| @Past | 必须是过去的日期 |
| @DecimalMin @Min | 最小值 |
| @DecimalMax @Max | 最大值 |
| @Range | 范围 |
| 必须是邮箱格式 | |
| @Size | 字符串的长度范围 |
使用方式
参数方法中,参数对象前标注@Valid ,在对象Errors中可以得到校验失败的信息
自定义参数校验:
核心接口:Validator ,自定义数据校验器需要实现该接口;
使用:注册到WebDataBinder中;
@InitBinder注解标注的方法会在调用控制器之前执行;
ModelAndView 视图和视图解析器
在springmvc的控制器中,如果参数中使用了ModelAndView,Model,ModelMap,会自动创建数据模型
视图是渲染数据模型展示给用户的组件,分为逻辑视图和非逻辑视图,
逻辑视图需要视图解析器viewResolver进行进一步的定位,比如jsp视图
而非逻辑视图不需要进一步的定位,如MappingJacksonJsonView;
视图接口:两个核心方法
getContentType();
reder(model, request ,response);
自定义pdf的例子:
TODO
拦截器
springMVC的流程中,根据HandlerMapping会得到一个HandlerExecutionChain,这个对象中包含了一个控制器和一个拦截器列表;通过拦截器可以增强处理器的功能;
拦截器接口代码:

三个方法的执行时间相对的是控制器;
自定义拦截器步骤:
- 实现HandlerInterceptor类;
- 配置类实现 WebMvcConfigurer,注册自定义的拦截器;
- 多个拦截器按照注册的先后顺序执行拦截;
国际化
不同地区的人,时间和语言不同,springMVC对国际化提供了很好的支持。
MessageSource来定义的;
如果resources目录下无messages.properties文件,不启用国际化;
| 国际化解析器 | 说明 |
|---|---|
| AcceptHeader | 通过L浏览器头来实现国际化区域 |
| Fixed | 固定的国际化区域 |
| Cookie | 基于Cookie来确定 |
| Session | 基于Session来确定 |
文件上传
springMVC对文件上传提供了良好的支持。DispatchServlet会把文件上传的请求HttpServletRequest转换为MultipartHttpServletRequest;
而它需要配置好MultipartResolver,springboot默认提供了StandardServletMultipartResolver,这个只需要依赖servlet-api包;
配置方式:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
控制器写法:
@PostMapping("/upload/part")
@ResponseBody
public String uplaod(Part file){
//保存文件到本地或者云服务,返回解析路径
}
其它
不常用的springMVC相关知识点;
| 知识点 | 说明 |
|---|---|
| 重定向 | 字符串跳转redirect:/xxx , addFlashAttribute(k,v)可以给redirect添加参数 |
| @ControllerAdvice | 定义控制器的增强 |
| @InitBinder | 定义自定义的转换器,校验器,在控制器执行前调用 |
| @ModelAttribute | 增加模型的公共参数,不常用 |
| @ExceptionHandler | 处理控制器的异常 |
原创不易,转载请注明出处。
0105 springMVC开发基础的更多相关文章
- springMVC1 springmvc的基础知识
springmvc第一天 springmvc的基础知识 springmvc课程安排: 第一天: 基础知识 springmvc框架(重点) mvc在b/s系统中应用方式 springmvc框架原理(Di ...
- [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- 提高生产力:Web开发基础平台WebCommon的设计和实现
Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- .NET基础拾遗(6)ADO.NET与数据库开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- JavaEE开发基础
1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...
- ASP.Net开发基础温故知新学习笔记
申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...
- 从零3D基础入门XNA 4.0(1)——3D开发基础
[题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...
随机推荐
- Linux开发环境配置笔记[Ubuntu]
Linux(Ubuntu18.04)安装Chrome浏览器 1.将下载源加入到系统的源列表(添加依赖) sudo wget https://repo.fdzh.org/chrome/google-ch ...
- 杭电2024 C语言合法标识符
链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2024 开始真的对这题是一点头绪都没有,简直了.然后事实证明是我想多了,这题主要是把概念给弄清楚 ...
- STM32新MCU
G0的出现完美的替换自家目前的F0系列而且有更好的性能和价格优势; STM32WL世界上首款LoRa Soc单片机嵌入了基于Semtech SX126x的经过特殊设计的无线电,该无线电提供两种功率输出 ...
- Linux centosVMware zabbix主动模式和被动模式、添加监控主机、添加自定义模板、处理图形中的乱码、自动发现
一.主动模式和被动模式 主动或者被动是相对客户端来讲的 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端 主动模式,客户端会主动把监控数据汇报给服务端, ...
- Day11 - I - 取石子游戏 HDU - 2516
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出&q ...
- Python简单程序爬取天气信息,定时发邮件给朋友【高薪必学】
前段时间看到了这个博客.https://blog.csdn.net/weixin_45081575/article/details/102886718.他用了request模块,这不巧了么,正好我刚用 ...
- ubuntu14 安装Node.js
@brief ubuntu 安装Node.js @date 2018-06-28 @see Ubuntu 上安装 Node.js(https://www.runoob.com/nodejs/node ...
- 《精通iOS开发》书籍目录
1.欢迎来到iOS和Swift世界 2.创建一个新项目 3.实现基本交互 4.更丰富的用户界面 5.自动旋转和自动调整大小 6.多视图应用 7.分页栏与选取器 8.表视图简介 9.导航控制器和表视图 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:默认/标准按钮
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 2_03_MSSQL课程_查询_分组和连接
“查” 的三种查询语句 where Group by having where 对表起作用 (原始硬盘上的表) 单纯的表 having 对结果起作用(筛选) 缓存,不在文件中 select --第 ...