SpringMVC源码学习(二) - DispatcherServlet和相关组件
在上期分析中,大概了解了DispatcherServlet的几个组件,这期我们就主要看看后边的几个组件。主要是错误处理转化器、静态资源解析器、视图解析器和flash处理器等。
我们知道如果我们的程序出现了错误,最后报错的是tomcat的线程,在他的前面就是我们servlet了,那么在Servlet这里如何处理这些异常?如果不处理必然导致tomcat线程的崩溃。我个人觉得这里的异常处理器应该就是代码异常的最后处理了。是这样吗?
看到springMvc首先获取所有的HandlerExceptionResolver处理器解析器。然后进行排序什么的一系列处理,最终成为一个列表。
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) {
//判断是否能被识别
if (!this.shouldApplyTo(request, handler)) {
return null;
} else {
//对response进行处理
this.prepareResponse(ex, response);
//对异常进行处理
ModelAndView result = this.doResolveException(request, response, handler, ex);
if (result != null) {
if (this.logger.isDebugEnabled() && (this.warnLogger == null || !this.warnLogger.isWarnEnabled())) {
this.logger.debug("Resolved [" + ex + "]" + (result.isEmpty() ? "" : " to " + result));
}
//日志
this.logException(ex, request);
}
return result;
}
}
protected boolean shouldApplyTo(HttpServletRequest request, @Nullable Object handler) {
//handler,可认为是controller等
if (handler != null) {
//看会否包含
if (this.mappedHandlers != null && this.mappedHandlers.contains(handler)) {
return true;
}
if (this.mappedHandlerClasses != null) {
Class[] var3 = this.mappedHandlerClasses;
int var4 = var3.length;
for(int var5 = 0; var5 < var4; ++var5) {
Class<?> handlerClass = var3[var5];
if (handlerClass.isInstance(handler)) {
return true;
}
}
}
}
return this.mappedHandlers == null && this.mappedHandlerClasses == null;
}
在这里我们发现默认设置的异常处理的没有浏览器缓存的。
当然这里的异常处理器有很多,看样子是对不同的异常有不同的报错提示。那么它是如何兼容或者找到合适的异常处理器的?觉得这个和SpringApplication中决定是否要有Servlet容器一般应该在调用的时候决定。在后期调用链学习中再看这样的想法是否正确。现在先这样考虑吧。
在initRequestToViewNameTranslator方法中,我们发现这里有前缀和后缀。所以这个RequestToViewNameTranslator应该是传入请求返回一个视图的模块。当然这块应该也是在请求的返回的时候调用。但是通过查看实现类,发现实现类只有一个。
initViewResolvers方法用来初始化视图解析器。
这块也是先从IOC中获取,获取不到到的话采用默认的视图解析器。之前在工作中看到10年的架构师自己写视图解析器的,主要是对返回的的数据比如json或者字符串甚至图片进行处理然后write到outputstream流中。
查看默认实例,发现这块采用的是jsp的视图解析器。
在fashMapManager的初始化也是先从IOC中获取,获取不到则采用默认策略。但是这个FlashMapManager究竟是什么?通过查询网络博客,发现这个是用于防重复提交的。这块后期有机会再专门写一篇吧。我也是在一边学习一边输出,很多说法可能有问题。希望大家多多包含。谢谢大家!
- mysql5.5与mysq 5.6中禁用innodb引擎的方法
- 缓慢的update语句性能分析(r6笔记第61天)
- 一个dg警告发现的硬件问题 (r6笔记第60天)
- mysql几种存储引擎介绍
- Java基础-21(02)总结字符流,IO流编码问题,实用案例必做一遍
- DeDeCMS v5.7 密码修改漏洞分析
- Java基础-20(01)总结,递归,IO流
- 一个Oracle bug的手工修复(r6笔记第59天)
- 由drop datafile导致的oracle bug(r6笔记第56天)
- Java中static关键字的作用
- Java基础-20(02)总结,递归,IO流
- Hive四种数据导入方式
- 34c3 部分Web Writeup
- 原来Oracle也不喜欢“蜀黍"(r6笔记第54天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- mybatis文件映射之利分布查询时传递多列值 (七)
- 位运算 - 初见
- Mybatis学习笔记(一)
- mybatis文件映射之鉴别器discriminator标签
- LeetCode刷题总结 -- 链表篇
- LeetCode刷题总结 -- 数组篇
- 剑指offer(07-09)题解
- 学以致用C++设计模式 之 “适配器模式”
- FTP文件管理项目(本地云)项目日报(九)
- 【Linux】血泪教训 -- 动态链接库配置方法
- FTP文件管理项目(本地云)项目日报(八)
- FTP文件管理项目(本地云)项目日报(七)
- FTP文件管理项目(本地云)项目日报(六)
- Transformers Assemble(PART I)
- FTP文件管理项目(本地云)项目日报(五)