前言
已经距离阅读完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等。