springMVC(13) springMVC源码阅读总结

前言

已经距离阅读完springMVC的源码过了有一段时间了,一直都没有发现自己到现在还没有对springMVC的学习做一个最终的总结。于是利用这次整理博客的机会正好做一次总结。

springMVC可以整体分为两个部分

  • 初始化部分
  • 处理请求部分

而初始化部分同样可以分为两个部分

  • 初始化根上下文以及初始化spring IoC容器部分
  • 初始化DispatcherServlet部分

处理请求则可以分为如下四个部分

  • 通过HandlerMapping查找请求对应的处理器
  • 使用处理器处理请求
  • 通过ViewResolver将viewName解析成view
  • 调用View处理视图并返回响应

初始化部分

初始化部分流程图

在初始化部分中,其中初始化根上下文是在ContextLoaderListener中执行,以及spring IoC容器的初始化部分也是在这一块。而DispatcherServlet的初始化则是通过回调servlet的init方法来进行初始化的。

请求处理部分

请求处理流程图

图中很清晰地表现了请求处理的四个主要流程,至于它们的具体实现可以参考之前的文章。

DispatcherServlet的本质

DispatcherServlet的本质就是一个Servlet,具体地说应该是一个HttpServlet。

一个最普通的HttpServlet可以如下来写:

public class TestServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        out.println("Hello world!");
    }
}

而DispatcherServlet如果沿着其父类一直向上寻找,可以发现,其最终也是重载了HttpServlet的service方法来进行请求处理的。

DispatcherServlet和普通的servlet在xml中的配置也如出一辙,

<servlet>
    <servlet-name>test</servlet-name>
    <servlet-class>study.cayun.login.TestServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>test</servlet-name>
    <url-pattern>/test</url-pattern>
</servlet-mapping>

那么以我的理解,DispatcherServlet就是一个功能更加复杂的servlet,它可以进行请求分发,可以支持各种配置过滤等。

当然了,也可以部分认为DispatcherServlet是一个调度器,DispatcherServlet会将不同请求转发给不同引擎来处理,例如jsp、velocity、freemark等。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容