源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

详解Spring mvc DispatchServlet 实现机制

  • 时间:2021-01-14 14:52 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:详解Spring mvc DispatchServlet 实现机制
在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>
[b]DispatcherServlet 源码解析[/b] [img]http://files.jb51.net/file_images/article/201709/201709300825001.png[/img] DispatcherServlet 的 init() 方法在 HttpServletBean() 中实现的 [b]init()[/b] [img]http://files.jb51.net/file_images/article/201709/201709300825002.png[/img] [list=1] [*]解析DispatcherServlet 配置的参数,封装成 ServletConfigPropertyValues对象。[/*] [*]将当前Servlet 类型的实例转换成BeanWrapper类型的实例。以便使用Spring中提供的注入功能进行对应的属性注入。这些属性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。[/*] [*]调用 initServletBean() 初始化servletBean。[/*] [/list] [b]onRefresh() 方法[/b] 在初始化servletBean的时候,最终会调用 onRefresh() 方法,该方法主要是刷新Spring在web功能实现中所必须使用的全局变量。 [img]http://files.jb51.net/file_images/article/201709/201709300825003.png[/img] [list=1] [*]initMultipartResolver(context);初始化文件上传的处理类[/*] [*]initLocaleResolver(context);初始化国际化配置的处理类[/*] [*]initThemeResolver(context);初始化主题资源的处理类[/*] [*]initHandlerMappings(context);初始化处理请求的类,主要负责处理请求调用Controller的处理类。[/*] [*]initHandlerAdapters(context);初始化HandlerAdapter的适配器[/*] [*]initHandlerExceptionResolvers(context);初始化异常处理类。[/*] [*]initRequestToViewNameTranslator(context);初始化视图转换器,用于直接将请求转换为逻辑视图名。[/*] [*]initViewResolvers(context);初始化视图解析器,定义了如何通过view 名称来解析对应View实例的行为[/*] [*]initFlashMapManager(context);初始化Flash Map,提供一个请求存储属性,可供其它请求使用。[/*] [/list] [b]DispatchServlet的请求处理逻辑[/b] servlet 接受到请求后,会调用service() 方法,然后service根据HTTP响应的请求方法进行调用响应的逻辑处理。 [img]http://files.jb51.net/file_images/article/201709/201709300825004.png[/img] 从类结构中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法 [img]http://files.jb51.net/file_images/article/201709/201709300825005.png[/img] 从代码中,我们发现这几个方法交给 processRequest() 来进行处理请求。 processRequest()->doService()->doDispatch() 通过跟踪代码,最终处理请求的核心代码在doDispatch()方法中。 [b]doDispatch() 方法[/b] [img]http://files.jb51.net/file_images/article/201709/201709300825016.png[/img] [list=1] [*]检查该请求是否是文件上传请求,如果是则把request转换为 MultipartHttpServletRequest类型。[/*] [*]根据request信息查找对应的Handler,如果没有找到对应的Handler,则通过response反馈错误信息。[/*] [*]通过当前的handler 查找对应的HandlerAdapter[/*] [*]判断该HTTP请求是不是HEAD或GET请求,如果是则检查HTTP请求头部的LastModified属性,来判断该页面是否需要重新加载。[/*] [/list] [img]http://files.jb51.net/file_images/article/201709/201709300825017.png[/img] [list=1] [*]applyPreHandle() 执行该请求所匹配的拦截器,并调用所有匹配拦截器的preHandle()方法,进行处理[/*] [*]调用handle() 方法去根据请求路径去调用用户实现的Controller实现逻辑[/*] [*]applyPostHandle()执行该请求所有匹配的拦截器,并调用所有匹配拦截器的postHandle()方法,进行处理[/*] [*]processDispatchResult()处理页面跳转和调用拦截器的afterCompletion() 方法[/*] [/list] [b]processDispatchResult() 方法[/b] [img]http://files.jb51.net/file_images/article/201709/201709300825018.png[/img] [list=1] [*]处理异常信息[/*] [*]如果Controller成功返回了ModelAndView,则通过render()方法进行响应相应的页面信息[/*] [*]执行完毕后,执行该请求所有匹配的拦截器,并调用所有匹配拦截器的afterCompletion()方法,进行处理[/*] [/list] 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程素材网。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部