java中MVC原理详解_详解Spring mvc DispatchServlet原理详解

详解Spring mvc DispatchServlet 实现机制

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

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

spring

org.springframework.web.servlet.DispatcherServlet

1

spring

/

DispatcherServlet 源码解析

ed03d8abcf7981853955fbf8c154d93f.png

DispatcherServlet 的 init() 方法在 HttpServletBean() 中实现的

init()

761af2a0f26c7cea09d8ce5fb842d3c7.png

解析DispatcherServlet 配置的参数,封装成 ServletConfigPropertyValues对象。

将当前Servlet 类型的实例转换成BeanWrapper类型的实例。以便使用Spring中提供的注入功能进行对应的属性注入。这些属性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。

调用 initServletBean() 初始化servletBean。

onRefresh() 方法

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

bd544fb7e2558923e2d5d9a4d6463d3d.png

initMultipartResolver(context);初始化文件上传的处理类

initLocaleResolver(context);初始化国际化配置的处理类

initThemeResolver(context);初始化主题资源的处理类

initHandlerMappings(context);初始化处理请求的类,主要负责处理请求调用Controller的处理类。

initHandlerAdapters(context);初始化HandlerAdapter的适配器

initHandlerExceptionResolvers(context);初始化异常处理类。

initRequestToViewNameTranslator(context);初始化视图转换器,用于直接将请求转换为逻辑视图名。

initViewResolvers(context);初始化视图解析器,定义了如何通过view 名称来解析对应View实例的行为

initFlashMapManager(context);初始化Flash Map,提供一个请求存储属性,可供其它请求使用。

DispatchServlet的请求处理逻辑

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

9d3aed9a39fbebcaf0d478864b2e0c9c.png

从类结构中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法

a1dbb7851d04e7087a2c4b811d2b76cc.png

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

processRequest()->doService()->doDispatch()

通过跟踪代码,最终处理请求的核心代码在doDispatch()方法中。

doDispatch() 方法

2afc912e45e2efa92be42b7ac4a07a23.png

检查该请求是否是文件上传请求,如果是则把request转换为 MultipartHttpServletRequest类型。

根据request信息查找对应的Handler,如果没有找到对应的Handler,则通过response反馈错误信息。

通过当前的handler 查找对应的HandlerAdapter

判断该HTTP请求是不是HEAD或GET请求,如果是则检查HTTP请求头部的LastModified属性,来判断该页面是否需要重新加载。

6822c430b5c672b6a90bf9c15415d077.png

applyPreHandle() 执行该请求所匹配的拦截器,并调用所有匹配拦截器的preHandle()方法,进行处理

调用handle() 方法去根据请求路径去调用用户实现的Controller实现逻辑

applyPostHandle()执行该请求所有匹配的拦截器,并调用所有匹配拦截器的postHandle()方法,进行处理

processDispatchResult()处理页面跳转和调用拦截器的afterCompletion() 方法

processDispatchResult() 方法

2052b1a4343396f33eb5fec92e7803c5.png

处理异常信息

如果Controller成功返回了ModelAndView,则通过render()方法进行响应相应的页面信息

执行完毕后,执行该请求所有匹配的拦截器,并调用所有匹配拦截器的afterCompletion()方法,进行处理

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

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值