前言
当你知道springMVC的执行流程的时候,会达到是事半功倍的学习效果。
SpringMVC执行流程
-
首先明确:SpringMVC的执行过程就是:客户端或者浏览器发送请求到后端服务器,后端服务器会找到对应的方法执行相应的方法,这之间的复杂的过程就是SpringMVC执行流程的核心。
注意:这里的方法就是控制层(controller类中的的方法,同时这个方法在底层就是handler中的handlerMethod)。hander就是SpringMVC执行流程的主角之一。 -
客户端发送的请求到后端服务器,后端服务器首先会做什么呢?
我们都知道springMVC框架是为了搭建javaWeb项目使用的框架工具。所以说后端服务器接收到请求之后就和javaweb执行流程一样。如下图:
-
那有一个问题:SpringMVC框架体现在哪呢????
其实SpringMVC框架就体现在对以前的Servlet类进行包装,包装之后就成了SpringMVC核心代码了,这个代码就是DispatcherServlet类了 -
现在我们重点放在DispatcherServlet类中,因为SpringMVC的执行流程就在其中。
说到DispatcherServlet你应该要想到JavaWeb中的servlet类,并且知道Servlet类中对主要的方法:service()。
我们先来看DispatcherServlet的继承结构图。
主要看蓝色箭头:
Servlet(接口)→HttpServlet → HttpServletBean→FrameworkServlet→DispatcherServlet
假如前端发送了一个GET请求,在HttpServlet 中会判断请求方式,而HttpServletBean、FrameworkServlet这两个类做的是一些初始化工作,最终还是执行DispatcherServlet类中的方法。 -
我们都知道所有servlet中都有着一个最主要的方法:service()。在DispatcherServlet最主要的方法就是doservice()方法。
在这个方法中所干的事情先做个总结在看源代码,主要是做两件事:
1、设置参数,比如:设置应用上下文、字符编码、样式等等
2、调用处理请求的核心方法doDispatch(request, response);
//获取请求,设置一些request的参数,然后分发给doDispatch
@Override
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
if (logger.isDebugEnabled()) {
String resumed = WebAsyncUtils.getAsyncManager(request).hasConcurrentResult() ? " resumed" : "";
logger.debug("DispatcherServlet with name '" + getServletName() + "'" + resumed +
" processing " + request.getMethod() + " request for [" + getRequestUri(request) + "]");
}
// Keep a snapshot of the request attributes in case of an include,
// to be able to restore the original attributes after the include.
Map<String, Object> attributesSnapshot = null;
if (WebUtils.isIncludeRequest(request)) {
attributesSnapshot = new HashMap<String, Object>