第一章 入门
mvc项目中的双配置
- ContextLoaderListener
- 是Servlet标准的listener组件
- 加载时间比DsipatcherServlet早
- 先创建spring的 ApplicationContext ,独立生命周期,由application-context.xml为配置文件
- parent context
DsipatcherServlet
parent context无法查找son context的bean,配置时不要在parent context中依赖son context中的bean
- 配置环境不通, 各自的bean不能用对方context的值
spring boot 使用一个applicationcontext
第二章基本组件与使用
控制器
控制器核心
DispatcherSevrlet
- model查找
- 通过Mapping映射完成,返回Handler
- model处理逻辑查找
- View查找
- View渲染
- model查找
Handler 是执行逻辑封装
直接URL映射
HttpRequestHandler
- 使用前要在handlerMapping里先注册
- Controller接口handler
- //不是指controller层的注解
- 须实现handlerRequest方法 返回的是ModelAndView
- @RequestMapping 定义的HandlerMethod
- 声明为cotroller控制器的bean,该bean中被注解@RequestMapping标记的方法会被RequstMappingHandlerMapping扫描标记为HandlerMethod
拦截器 // TODO这里要会画图说明
- 执行过程
- 查找处理器不返回Handler,HandlerMapping返回的是HandlerExecutionChain,
- 拦截器的类型是 HandlerInterceptor接口实现
- HandlerInterceptor 内部先执行preHandle方法,返回true才会继续执行拦截器后续处理
- 所有拦截器执行完后才会执行handler
- 正常执行完处理器无错误 后 会先执行 拦截器里的postHandle,后执行afterCompletion
- 如果处理器执行出错,直接到afterCompletion
- 配置拦截器生效
- 通过WebMvcConfigurer的 addInterceptors方法
视图查找与模型绑定
模型支持
相关类型
- Map类型是基础
- Model接口 ,asMap方法可以转化成Map
- ModelMap继承了LinkedHashMap 其子类ExtendModelMap 实现了Model接口
RedirectAttributes继承了Model接口,为重定向参数的传递,提供了特殊方式,
模型使用
声明Map类型参数
- 声明Model类型参数
- 声明ModelMap类型参数
- 直接创建Model并作为返回值
- 处理方法标记@ModelAttribute注解
- 直接返回ModelAndView
- 声明RedirectAttributes类型参数
对视图的支持
View render方法依据传入的model,渲染并写入Response
视图类型
- 内部资源视图 InternalResourceView
- 需要传入URL,代表内部资源的路径
- 三种使用场景
- 访问静态资源
- 访问JSP视图
- 转发视图
- 重定向视图 RedirectView
模版引擎视图
BeanName视图解析
- 模板引擎视图解析
- 内部资源视图解析
-
扩展
过滤器和拦截器的区别
时机
- 先执行过滤器,过滤器是在servlet之前
- 再执行拦截器,拦截器是在servlet之中
- 针对目标不同
- 过滤器是针对URL,通过URL是否匹配判断是否执行过滤器
- 拦截器不仅要根据URL匹配,还要求存在对此请求进行处理的处理器,
功能不同
控制器类
RequestMappingHandlerMapping负责遍历所有@RequestMapping注解的信息,找到匹配度最高的注解
请求路径
请求方法
请求参数
请求头
内容类型
消息内容类型
comsumes
-
自定义匹配条件
扩展RequestMappingHandlerMapping //后面章节细讲
多条件整合
处理器参数解析
概述
通过HandlerMethodArgumentResolver实现
- 提供supportsParam方法接收MethodParameter类型的参数
- supportsParam方法用于根据方法参数元信息判断是否可以解析出参数值
- 根据参数注解解析
-
Servlet相关类型
ServletRequestMehthodArgumentResolver
- ServletResponseMehthodArgumentResolver
可以直接作为参数类型使用,获取里面的属性,实际很少这样使用,
路径变量
@PathVariable
-
矩阵变量
-
请求参数
@RequestParam
- 隐式指定,没有其他注解,如果参数是java内置类型或内置类型数组,视为使用此注解
请求头
- @RequestHeader 可以解析请求头的值
支持Map MutiMap HttpHeader类型, 有个特殊的可以用List
Cookie值
-
请求体
原始方式,Requst.getInputStream
- 自动转换, 通过HttpMessageConverter自动把请求体中的数据流转换为java实体类型
- @RequestBody标记的参数可以附加数据校验功能, 通过额外标记@Validated
-
请求头与请求体
HttpEntity与其子类RequestEntity 同时包含请求体请求头
声明参数类型时要提供泛型类型,不然无法确认转换目标,不支持参数校验
请求块
表单文件上传
- content-type 为multipart/form-data;boundary=…..
- 请求体中有多个请求块, 每块用上面的 boundary值分隔,
- 请求块 分请求块头 和请求块体, 请求块头和请求块体 用 两换行分隔
- 请求块头一般包含Content-Disposition : formdata; name=”xxxx”
-
重定向属性
模型属性