# 雷丰阳SSM整合 - 02.SpringMVC
**Repository Path**: happycsw/LeiFengYangSSM_02SpringMVC
## Basic Information
- **Project Name**: 雷丰阳SSM整合 - 02.SpringMVC
- **Description**: 雷丰阳整合SSM之SpringMVC
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-05-08
- **Last Updated**: 2022-11-15
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# SpringMVC的运行流程
1. 所有请求,前端控制器(DispatcherServlet)收到请求,调用doDispatch进行处理
2. 根据HandlerMapping中保存的请求映射信息,找到处理当前请求的,处理器执行链(包含拦截器)
3. 根据当前处理器找到它的HandlerAdapter(适配器)
4. 拦截器的preHandle先执行
5. 适配器执行目标方法
1. @ModelAttribute注解标注的方法,提前运行
2. 执行目标方法的时候,确定目标方法用的参数
1. 有注解:
2. 没注解:
1. 看是否Model、Map、ModelMap以及其他的
2. 如果是自定定义类型
1. 从隐含模型中,查找,如果有就从隐含模型中获取
2. 如果没有,再看是否@SessionAttribute标注的属性,如果是,从Session中获取,如果Session中获取不到,则会抛出异常
3. 都不是,就利用反射创建对象
6. 拦截器的postHandle执行
7. 处理结果(页面渲染流程:视图解析器)
1. 如果有异常,使用异常解析器处理异常;处理完成返回ModelAndView
2. 调用render进行页面渲染
1. 视图解析器根据视图名得到视图对象
2. 视图对象调用render方法
3. 执行拦截器的afterCompletion

# [01、新手上路HelloWorld](SpringMVC_01HelloWorld/README.md)
1. HelloWorld新手上路,运行流程
+ **web.xml**:配置DispatcherServlet前端控制器
+ **springmvc**-servlet:配置视图解析器
2. **@RequestMapping**:拦截请求地址
3. 配置文件web.xml中,**不指定Spring配置文件的位置**
4. Tomcat的【DefaultServlet】、【JspServlet】
5. web.xml中前端控制器,拦截请求 / 和 /* 的区别
# [02、请求路径:注解@RequestMapping 和 注解@PathVariable](SpringMVC_02RequestMappingANDPathVariable/README.md)
@RequestMapping注解的属性使用、Ant风格模糊匹配、PathVariable路径变量
1. **@RequestMapping**,value属性。定义的位置【类】、【方法】的区别
2. 其他属性
+ method:限定【请求方式】
+ params:规定【请求参数】
+ headers:规定【请求头】
+ consumes(不常用):规定请求头中的Content-Type
+ produces(不常用):告诉浏览器返回的内容类型是什么
3. @RequestMapping的**Ant风格**模糊匹配,路径的**模糊匹配**
4. **@PathVariable 路径变量**
# [03、Rest风格](SpringMVC_03RestStyle/README.md)
Rest:系统希望用非常简洁的URL地址来发送请求;
1. web.xml中,配置Rest风格的Filter:HiddenHttpMethodFilter将POST请求,转为DELETE、PUT
2. **高版本Tomcat8.0及以上**,对DELETE、PUT请求。为何会出错? 以及 如何解决。
3. Rest【源码分析】
# [04、获取数据Request](SpringMVC_04Request/README.md)
**获取**,请求参数
1. **【获取】请求参数**
1. 默认方式,获取请求参数:在方法参数列表,填入 和 请求参数相同名称的 参数名,即可自动接收请求参数
2. @RequestParam 获取【请求参数】
3. @RequestHeader 获取【请求头】
4. @CookieValue 获取【Cookie】
2. **【自动封装】进javabean对象中(POJO)**
3. **【终极解决乱码】**
4. **字符编码过滤器Filter**:CharacterEncodingFilter
5. **【原生API】**
# [05、输出数据](SpringMVC_05Output/README.md)
**输出**,返回结果给页面
1. 控制器类的,方法**入参**:使用**Map、Model、ModelMap**
2. 控制器类的,方法**返回**:**ModelAndView**
3. 为什么SpringMVC选择把数据放在**request域**中?
4. 给Session域,存储数据:@SessionAttributes注解【不推荐使用】
5. @ModelAttribute注解
+ **【方法】标注**:提前于目标方法前,先运行本方法
+ **【入参处】标注**:从BindingAwareModelMap内,获取注解指定的key,的数据并赋值给注解标注的参数
# [06、SpringMVC【源码】](06、SpringMVC【源码】.md)
1. 前端控制器DispatcherServlet的请求处理流程 ?
2. 怎么根据当前请求就能找到哪个类能来处理?
3. DispatcherServlet中有几个引用类型的属性: 【SpringMVC的九大组件】
4. mv = ha.handle(),【执行目标方法】;
5. 【如何确定目标方法每一个入参的值】
+ 判断入参是否是POJO、原生API、Model、Map、ModelMap、
+ 其他类型,例如:SessionStatus、HttpEntity、Errors、
+ 简单类型,例如:Integer、String、基本类型
# [07、视图解析器](SpringMVC_07ViewResolver/README.md)
视图解析器ViewResolver,用来返回页面的地址
1. 使用步骤
2. 主要使用方式
+ 方式一:相对路径【自动拼串】
+ 方式二:forward转发【不会拼串】
+ 方式三:redirect重定向【不会拼串】
3. 使用Jstl视图解析器的【国际化功能】
+ 具体使用步骤
+ 注意事项:
+ 【不能带前缀】,也就是forward: 或 redirect:
+ 【引入mvc命名空间】
+ 解决空方法体:<mvc:view-controller>标签
+ 解决:使用<mvc:view-controller>标签之后,Controller内的方法,不响应请求路径的问题:开启SpringMVC的注解驱动模式:<mvc:annotation-driven />
4. 扩展:【自定义视图解析器】加深理解视图解析器 和 视图对象
1. 目标
2. 步骤
+ 视图解析器:负责解析Controller返回的地址
+ 视图对象:用来展示页面
5. 【源码】
1. 根据使用方法,理清思路:
2. 解析源码
3. 源码总结
# [08、Rest风格的CRUD](SpringMVC_08CRUD/README.md)
1. 环境搭建
2. 目标效果
3. 要求的Rest风格
4. 开始步骤
1. 员工列表展示:查询所有员工
2. 员工添加页面
3. ★★★使用SpringMVC的【表单标签】:<form:form/>,回显form表单数据
+ 使用步骤
+ 初次使用会报错
+ 为什么会有这个错误?
+ SpringMVC的【表单标签】:<form:form/>,数据绑定
+ 项目路径问题
4. 员工添加
5. 员工删除
6. 美化删除按钮
5. SpringMVC的配置文件的【标配标签】
+ <mvc:annotation-driven />保证【动态资源可以访问】
+ <mvc:default-servlet-handler />保证【静态资源可以访问】
# [09、数据转换 & 数据格式化 & 数据校验](SpringMVC_09DataBinder/README.md)
1. 数据绑定原理【源码】
+ 数据绑定原理
+ 数据绑定的源码位置:
+ ModelAttributeMethodProcessor
+ WebDataBinder数据绑定器:负责数据绑定工作
2. 自定义类型转换器
1. 环境搭建
2. 自定义类型转换器
1. ConversionService接口【源码】
2. 步骤(1)、实现Converter接口:将类型S的源对象转换为目标类型T
3. 补充知识
4. 步骤(2)、将这个自定义的Converter配置在ConversionService中
1. 步骤(2.1)在ioc容器中,注册了一个conversionService
2. 步骤(2.2)指定SpringMVC,使用我们自定义的ConversionService
3. 总结:自定义类型转换器
3. 标签的解析
+ 会自动注册【九大组件】中的三个
+ 3.1如何知道标签做了什么?
+ AnnotationDrivenBeanDefinitionParser类
+ 只要请求不好用了,就使用标签、,为什么呢?
4. 数据格式化:
+ 【日期】格式化
+ 【数字】格式化
5. 数据校验
1. 手写程序进行校验【不推荐,写起来麻烦】
2. ★★★SpringMVC的数据校验★★★
1. JSR303的介绍
2. 使用步骤★★★
3. 原生HTML的API:取出错误消息(将错误信息放在请求域中)、
6. 国际化消息
1. 自定义错误消息 -- 【国际化】消息
2. birth的错误消息如何解决呢?
+ 国际化细节一:国际化资源文件,多匹配,按精确度优先
+ 国际化细节二:注解中的属性,如何取值?使用占位符{数字}
+ 顺序问题
3. 自定义错误消息 -- 【非】国际化消息
4. 原生API:读取国际化消息【老师的课后作业】
# [10、处理JSON、Ajax](SpringMVC_10JSON_Ajax/README.md)
1. @ResponseBody返回JSON数据
2. @ResponseBody:直接在返回值,写页面
3. 其他常用Jackson注解
+ @JsonIgnore:在json序列化时将java bean中的一些属性忽略掉
+ @JsonFormat:在JavaBean的属性Date类型上标注,可以格式化返回json的数据
4. 【案例】:页面发送ajax请求,在页面上动态显示,追加服务器返回的json数据
5. @RequestBody:获取请求参数中,【请求体】的内容
6. @RequestBody:高级应用:接收请求体中的JSON数据,并【自动封装为JavaBean对象】
7. HttpEntity获取【请求头】【请求体】
8. ResponseEntity返回自定义响应。既携带【响应头信息】,又携带【响应体信息】
9. ResponseEntity完成【下载】功能
10. SpringMVC处理JSON【原理】:HttpMessageConverter
# [11、文件上传](SpringMVC_11Upload/README.md)
1. 文件上传步骤
1. 导包
2. SpringMVC配置文件上传解析器:MultipartResolver【Spring的九大组件】)
3. 文件上传请求的处理【单、多文件上传】
2. 【获取项目路径】的问题
# [12、拦截器](SpringMVC_12Interceptor/README.md)
1. 基本介绍
2. 使用单拦截器(正常流程、异常流程)
3. 使用多拦截器(正常流程、异常流程)
4. 执行流程(图片)
5. 源码
6. 什么时候使用Filter?什么时候使用拦截器?
# [13、国际化](SpringMVC_13i18n/README.md)
1. 编写国际化的步骤
2. 区域信息
+ 原生区域信息
+ SpringMVC的区域信息
3. 获取国际化信息
+ SpringMVC中使用原生API获取区域信息
+ 获取 国际化资源文件中的值
4. 点击链接,切换语言
+ 方式一:自定义区域信息解析器
+ 方式二:使用SessionLocaleResolver 或 CookieLocaleResolver
+ 方式三:拦截器LocaleChangeInterceptor 和 SessionLocaleResolver配合使用
1. 源码
2. 步骤
3. 原理
5. 其他的LocaleResolver实现类
+ AcceptHeaderLocaleResolver 使用请求头的默认信息 不支持修改Locale信息
+ FixedLocaleResolver 使用操作系统默认的区域信息,不支持修改Locale信息
+ SessionLocaleResolver 区域信息从 Session中获取,可以修改Locale信息
+ CookieLocaleResolver 区域信息从,Cookie中获取,可以修改Locale信息
# [14、异常处理](SpringMVC_14Exception/README.md)
1. 三个默认的异常处理解析器
+ ExceptionHandlerExceptionResolver处理标注@ExceptionHandler
+ ResponseStatusExceptionResolver处理标注@ResponseStatus
+ DefaultHandlerExceptionResolver判断是否SpringMVC自带的异常
2. 出现异常SpringMVC的运行流程
1. 制造异常
2. ★★★异常解析器的使用★★★
+ 1 - 1 @ExceptionHandler注解:处理本类异常
+ 1 - 2 @ControllerAdvice注解:【集中处理所有】异常
+ 1 - 1 @ResponseStatus方法标注【不推荐】,页面报错
+ 1 - 2 @ResponseStatus在类标注
+ DefaultHandlerExceptionResolver默认的异常解析器
+ SimpleMappingExceptionResolver通过【配置】的方式,进行异常处理
3. 【源码】
# [15、Spring、SpringMVC【整合】](SpringMVC_15MergeSpring/README.md)
1. 使用<import>标签【不推荐】
2. 分容器
1. JavaWeb整合Spring、SpringMVC
2. Spring、SpringMVC分工扫描包
3. Spring 和 SpringMVC的【父子容器】问题