# 雷丰阳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 ![运行流程](./imgs/SpringMVC运行流程.png) # [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的【父子容器】问题