欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Spring mvc DispatchServlet 实现机制

程序员文章站 2024-02-26 23:11:58
在spring中, contextloaderlistener只是辅助类,在web 容器启动的时候查找并创建webapplicationcontext对象,通过该对象进行加...

在spring中, contextloaderlistener只是辅助类,在web 容器启动的时候查找并创建webapplicationcontext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在dispatcherservlet中进行的,dispatcherservlet是实现servlet接口的实现类。

dispatcherservlet 在 web.xml 中的配置如下:

<servlet>
 <servlet-name>spring</servlet-name>
 <servlet-class>org.springframework.web.servlet.dispatcherservlet</servlet-class>
 <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
 <servlet-name>spring</servlet-name>
 <url-pattern>/</url-pattern><!-- 如果写斜杠的话那就表示请求是否加后缀都可以 -->
</servlet-mapping>

dispatcherservlet 源码解析

详解Spring mvc DispatchServlet 实现机制

dispatcherservlet 的 init() 方法在 httpservletbean() 中实现的

init()

详解Spring mvc DispatchServlet 实现机制

  1. 解析dispatcherservlet 配置的参数,封装成 servletconfigpropertyvalues对象。
  2. 将当前servlet 类型的实例转换成beanwrapper类型的实例。以便使用spring中提供的注入功能进行对应的属性注入。这些属性如contextattribute、contextclass、namespace、contextconfiglocation 等,都可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。
  3. 调用 initservletbean() 初始化servletbean。

onrefresh() 方法

在初始化servletbean的时候,最终会调用 onrefresh() 方法,该方法主要是刷新spring在web功能实现中所必须使用的全局变量。

详解Spring mvc DispatchServlet 实现机制

  1. initmultipartresolver(context);初始化文件上传的处理类
  2. initlocaleresolver(context);初始化国际化配置的处理类
  3. initthemeresolver(context);初始化主题资源的处理类
  4. inithandlermappings(context);初始化处理请求的类,主要负责处理请求调用controller的处理类。
  5. inithandleradapters(context);初始化handleradapter的适配器
  6. inithandlerexceptionresolvers(context);初始化异常处理类。
  7. initrequesttoviewnametranslator(context);初始化视图转换器,用于直接将请求转换为逻辑视图名。
  8. initviewresolvers(context);初始化视图解析器,定义了如何通过view 名称来解析对应view实例的行为
  9. initflashmapmanager(context);初始化flash map,提供一个请求存储属性,可供其它请求使用。

dispatchservlet的请求处理逻辑

servlet 接受到请求后,会调用service() 方法,然后service根据http响应的请求方法进行调用响应的逻辑处理。

详解Spring mvc DispatchServlet 实现机制

从类结构中,可以看出springmvc 支持 get、post、put、delete、options、trace方法

详解Spring mvc DispatchServlet 实现机制

从代码中,我们发现这几个方法交给 processrequest() 来进行处理请求。

processrequest()->doservice()->dodispatch()
通过跟踪代码,最终处理请求的核心代码在dodispatch()方法中。

dodispatch() 方法

详解Spring mvc DispatchServlet 实现机制

  1. 检查该请求是否是文件上传请求,如果是则把request转换为 multiparthttpservletrequest类型。
  2. 根据request信息查找对应的handler,如果没有找到对应的handler,则通过response反馈错误信息。
  3. 通过当前的handler 查找对应的handleradapter
  4. 判断该http请求是不是head或get请求,如果是则检查http请求头部的lastmodified属性,来判断该页面是否需要重新加载。

详解Spring mvc DispatchServlet 实现机制

  1. applyprehandle() 执行该请求所匹配的拦截器,并调用所有匹配拦截器的prehandle()方法,进行处理
  2. 调用handle() 方法去根据请求路径去调用用户实现的controller实现逻辑
  3. applyposthandle()执行该请求所有匹配的拦截器,并调用所有匹配拦截器的posthandle()方法,进行处理
  4. processdispatchresult()处理页面跳转和调用拦截器的aftercompletion() 方法

processdispatchresult() 方法

详解Spring mvc DispatchServlet 实现机制

  1. 处理异常信息
  2. 如果controller成功返回了modelandview,则通过render()方法进行响应相应的页面信息
  3. 执行完毕后,执行该请求所有匹配的拦截器,并调用所有匹配拦截器的aftercompletion()方法,进行处理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。