前言:Spring MVC是一个基于Servlet
API构建的web框架,解决了基于Servlet+JSP+JavaBean开发过程中不足的地方,例如Servlet的xml配置、参数的解析、响应数据的转化、同一个Servlet处理相同业务的不同方法的分发以及跳转页面的设置比较麻烦,Spring MVC封装了Servlet并且优化不足的地方,同时也对Java Web中MVC架构模式做了增强和扩展。
流程介绍
说了这么多Spring MVC是做什么的呢? 一个web框架。 那具体些就是接受前端的请求,根据请求的路径找到服务器中对应的方法处理,然后再将返回的结果返回。接下来我们来详细了解整个过程:
1.一个请求发送到服务端,会到达前端控制器DispatcherServlet,DispatcherServlet为请求处理流程提供统一的调度。
2.收到请求后前端控制器首先会调用HandlerMapping,根据请求的url和配置的映射@RequestMapping匹配,生成处理器链,返回处理器Handler
3.适配器HandlerAdapter会调用Handler处理器,在调用处理方法之前会进行参数解析封装、验证、数据格式的转换,调用方法处理业务逻辑,将返回结果封装到ModelAndView中返回给前端控制器,
4.视图解析器ViewResolver会根据ModelAndView中的视图名称找到对应的jsp封装到View视图中
5.前端控制器根据返回的View进行视图渲染返回给前端
源码分析
查看源码来验证流程
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
//文件上传相关
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
//获取处理器链
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null) {
this.noHandlerFound(processedRequest, response);
return;
}
//获取适配器
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet) {
return;
}
}
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
//适配器调用方法,将处理结果封装到 ModelAndView中
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
this.applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
} catch (Exception var20) {
dispatchException = var20;
} catch (Throwable var21) {
dispatchException = new NestedServletException("Handler dispatch failed", var21);
}
//视图解析 返回
this.processDispatchResult(processedRequest, response, mappedHandler, mv, (Exception)dispatchException);
} catch (Exception var22) {
this.triggerAfterCompletion(processedRequest, response, mappedHandler, var22);
} catch (Throwable var23) {
this.triggerAfterCompletion(processedRequest, response, mappedHandler, new NestedServletException("Handler processing failed", var23));
}
} finally {
if (asyncManager.isConcurrentHandlingStarted()) {
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
} else if (multipartRequestParsed) {
this.cleanupMultipart(processedRequest);
}
}
}