背景

已经明确了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 范围
@Email 必须是邮箱格式
@Size 字符串的长度范围

使用方式

参数方法中,参数对象前标注@Valid ,在对象Errors中可以得到校验失败的信息

自定义参数校验:

核心接口:Validator ,自定义数据校验器需要实现该接口;

使用:注册到WebDataBinder中;

@InitBinder注解标注的方法会在调用控制器之前执行;

ModelAndView 视图和视图解析器

在springmvc的控制器中,如果参数中使用了ModelAndView,Model,ModelMap,会自动创建数据模型


视图是渲染数据模型展示给用户的组件,分为逻辑视图和非逻辑视图,

逻辑视图需要视图解析器viewResolver进行进一步的定位,比如jsp视图

而非逻辑视图不需要进一步的定位,如MappingJacksonJsonView;

视图接口:两个核心方法

getContentType();

reder(model, request ,response);

自定义pdf的例子:

TODO

拦截器

springMVC的流程中,根据HandlerMapping会得到一个HandlerExecutionChain,这个对象中包含了一个控制器和一个拦截器列表;通过拦截器可以增强处理器的功能;

拦截器接口代码:

三个方法的执行时间相对的是控制器;

自定义拦截器步骤:

  1. 实现HandlerInterceptor类;
  2. 配置类实现 WebMvcConfigurer,注册自定义的拦截器;
  3. 多个拦截器按照注册的先后顺序执行拦截;

国际化

不同地区的人,时间和语言不同,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开发基础的更多相关文章

  1. springMVC1 springmvc的基础知识

    springmvc第一天 springmvc的基础知识 springmvc课程安排: 第一天: 基础知识 springmvc框架(重点) mvc在b/s系统中应用方式 springmvc框架原理(Di ...

  2. [置顶] 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  3. 提高生产力:Web开发基础平台WebCommon的设计和实现

    Web开发中,存在着各种各样的重复性的工作.为了提高开发效率,不在当码农,我在思考和实践如何搭建一个Web开发的基础平台. Web开发基础平台的目标和功能 1.提供一套基础的开发环境,整合了常用的框架 ...

  4. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  5. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  6. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  7. JavaEE开发基础

    1 JavaEE简介 Java平台有三个版本,分别是JavaSE(Java Platform, Standard Edition),JavaEE(Java Platform, Enterprise E ...

  8. ASP.Net开发基础温故知新学习笔记

    申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...

  9. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

随机推荐

  1. 【代码总结】GD库中图片缩印

    bool imagecopyresampled ( resource $dst_image, resource $src_image, int $dst_x, int $dst_y, int $src ...

  2. ES的基本概念

    elasticsearch 的索引与文档是开发关注的视角:节点.集群.分片是运维关注的视角 elasticearch 文档的介绍 - elasticearch 是面向文档的,文档是所有可搜索数据的最小 ...

  3. Qt5.5 使用smtp发邮件的各种坑

    本人刚开始学习C++,用的是Qt5.5的IED,经过了两天的学习和查找资料,终于成功发了第一封邮件.以163邮箱为例,简单总结一下. 1.设置邮箱 这一步比较关键,要开通smtp服务,在开通的过程中会 ...

  4. 华为事件对A股的影响思考

    美国对华为实施禁商令: 利好:自主可控-替代品 软件:国产操作系统(中国软件,浪潮软件,湘邮科技...) 芯片:国产芯片(士微兰,国民技术...) 利好:华为优势产品 5G: 利好:反制资源 稀土永磁 ...

  5. Python学习第十一课——装饰器

    #装饰器:本质就是函数,为其他函数附加功能原则:1.不修改被修饰函数的源代码2.不修改被修饰函数的调用方式 装饰器=高阶函数+函数嵌套+闭包 #高阶函数 ''' 高阶函数定义: 1.函数接受的参数是一 ...

  6. [经验] Unity3D 里怎么制作天空盒(skybox)

    记载一个简单的  天空盒子  的制作方法 第一步: 在 assets 文件夹下新建一个文件夹, 随便取个名字, 不过最好是用来专门管理场景游戏对象的文件夹,    例如放在这个 Skybox 里:  ...

  7. Python查询Redis中的Key

    今日,大哥让我查下项目的在线用户量,听到这个消息顿时懵逼了,在线用户量,这个该怎么查????想到项目中的登陆用户缓存信息Token都存放在Redis中,是不是可以根据Redis中Token的个数大致估 ...

  8. 40个超有趣的Linux命令行彩蛋和游戏

    40个有趣的Linux命令行彩蛋和游戏,让你假装成日理万机的黑客高手.附一键安装脚本,在树莓派和ubuntu云主机上亲测成功,有些还可以在Windows的DOS命令行中运行. 本文配套B站视频:40个 ...

  9. 一文解读XaaS (转)

    艾克赛斯???别慌,读完你就知道啦~ 服务和云服务 了解Xaas云服务,不妨从了解服务开始. “服务”在本质上是一种租赁,它对资源的占用方式是“为我所用”而非“为我所有”,对资源的消费模式是按需付费而 ...

  10. 如何查看python的notebook文件.ipynb

    文章中的ipython notebook和jupyter notebook基本可以互换,不过使用ipython notebook会警告您要使用jupyter notebook.其他没有区别. ---- ...