第39节 认识Spring MVC Controller
DispatcherServlet核心组成:
- Controller
- xxxResolver
- ViewResolver
- HandlerExceptionResolver
- MultipartResolver
- HandlerMapping
SpringMVC常用的注解 - @Controller
- @RESTController
- @RequestMapping
- @GetMapping /@PostMapping
- @PutMapping / @DeleteMapping
- @RequestBod y/ @ResponseBody / @ResponseStatus
第40节 理解Spring的应用上下文
关于上下文常用的接口及其实现
- BeanFactory
-
DefaultListableBeanFactory
- ApplicationContext
-
ClassPathXmlApplicationContext
-
FileSystemXmlApplicationContext
-
AnnotationConfigApplicationContext
-
WebApplicationContex
一般不用BeanFactory注解。
FooConfig.java:父上下文(parent application context)。
applicationContext.xml:子上下文(child application context)。
FooConfig.java 中定义两个 testBean,分别为 testBeanX(foo) 和 testBeanY(foo)。
applicationContext.xml 定义了一个 testBeanX(bar)。
委托机制:在自己的 context 中找不到 bean,会委托父 context 查找该 bean。
代码解释:
fooContext.getBean(“testBeanX”),在父上下文查找 testBeanX,命中直接返回 testBeanX(foo)。
barContext.getBean(“testBeanX”),在子上下文查找 testBeanX,命中直接返回 testBeanX(bar)。
barContext.getBean(“testBeanY”),在子上下文查找 testBeanY,未命中;委托父上下文查找,命中,返回 testBeanY(foo)。
场景一:
父上下文开启 @EnableAspectJAutoProxy 的支持
子上下文未开启 <aop: aspectj-autoproxy />
切面 fooAspect 在 FooConfig.java 定义(父上下文增强)
输出结果:
testBeanX(foo) 和 testBeanY(foo) 均被增强。
testBeanX(bar) 未被增强。
结论:
在父上下文开启了增强,父的 bean 均被增强,而子的 bean 未被增强。
场景二:
父上下文开启 @EnableAspectJAutoProxy 的支持
子上下文开启 <aop: aspectj-autoproxy />
切面 fooAspect 在 applicationContext.xml 定义(子上下文增加)
输出结果:
testBeanX(foo) 和 testBeanY(foo) 未被增强。
testBeanX(bar) 被增强。
结论:
在子上下文开启增强,父的 bean 未被增强,子的 bean 被增强。
根据场景一和场景二的结果,有结论:“各个 context 相互独立,每个 context 的 aop 增强只对本 context 的 bean 生效”。如果想将切面配置成通用的,对父和子上下文的 bean 均支持增强,则:
- 切面 fooAspect 定义在父上下文。
- 父上下文和子上下文,均要开启 aop 的增加,即 @EnableAspectJAutoProxy 或<aop: aspectj-autoproxy /> 的支持。
第41节 理解请求处理机制
Spring MVC的请求处理流程
一个请求的大致处理流程:
绑定一些Attribute
- WebApplicationContext / LocaleResolver / ThemeResolver
处理Multipart - 如果是,则将请求转为MultipartHttpServletRequest
Handler处理 - 如果找到对应Handler,执行Controller及前后置处理器逻辑
处理返回的Model,呈现视图
第42-43节定义处理方法
定义映射关系:
@Controller
@RequestMapping
- path / method 指定映射路径与方法
- params / headers限定映射范围
- consumes / produces限定请求与响应格式
一些快捷方式 - @RESTController
- @GetMapping / @PostMapping / @PutMapping / @DeleteMapping / @PatchMapping
自己实现WebMvcConfigure
- Spring Boot在WebMbcAutoConfiguration中,有一个自己实现
- 添加自定义的Converter
- 添加自定义的Formatter
定义校验: - 通过Validator对绑定结果进行校验
- Hibernate Validator
- @Valid注解
- BindingResult
MultipartFile上传: - 配置MultipartResolver
- Spring Boot自动配置MultipartAutoConfiguration
- 支持类型multipart/form-data
- MultipartFile类型
第44-45节 Spring MVC中的视图解析机制
视图解析的实现基础:主要是通过viewResolver与View接口实现的
- AbstractCachingViewResolver
- UrlBasedViewResolver
- FreeMarkerViewResolver
- ContentNegotiatingViewResolver
- InternalResourceViewResolver
DispatcherServlet重的视图解析逻辑: - initStrategies()
- initViewResolvers()初始化了对应ViewResolver
- doDispatch()
- processDispatchResult()
- 没有返回视图的话,尝试RequestToViewNameTranslator
- resolveViewName()解析View对象
两种不同的重定向前缀:
- redirect:
- forward: