流程说明
直接看源码理解起来会比较吃力,先放张图在这,让我们对spring mvc核心处理流程有个初步印象。
前端控制器DispacherServlet
是spring mvc框架的核心类,控制整个请求处理的逻辑,由它调用HanlderMapping
、 HandlerAdapter
、ViewResolver
和View
组件的方法完成请求的处理流程。
开始读源码
1,准备工作
首先spring mvc框架把刚用户请求交给DispacherServlet
类的doService方法对请求进行初步加工
@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
//一些准备工作
...
//将spring上下文信息存储至request,方便后面的处理器和视图用到
request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());
// 存储其他框架信息
...
//分发请求
try {
doDispatch(request, response);
}
// 后续工作
...
}
2,开始分发请求
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
int interceptorIndex = -1;
try {
ModelAndView mv;
boolean errorView = false;
try {
processedRequest = checkMultipart(request);
// 步骤1,获取请求的处理器(handler)
// Determine handler for the current request
mappedHandler = getHandler(processedRequest, false);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
// 步骤2,获取支持处理器的适配器(handlerAdapter)
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler.
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (logger.isDebugEnabled()) {