Spring MVC请求处理过程

HttpServletBean

主要参与创建工作,没有涉及请求的处理。

FrameworkServlet

重写了service,doGet,doPost,doPut,doDelete,doOptions,doTrance(除了doHead),在service方法中增加了对Patch类型请求的处理,其他类型的请求直接交给父类进行处理,doOptions和doTrance方法可以通过dispatchOptionsRequest和dispatchTraceRequest参数决定是自己处理还是交给父类处理;doGet,doPost和doDelete都是自己处理。所有需要自己处理的请求都交给processRequest方法进行统一处理。 processRequest方法是FrameworkServlet类在处理请求中最核心的方法。 核心语句是doService(rquest,response),这个方法在DispatchServlet中具体实现。在doService之前首先获取了LoalContextHolder和RequestContextHolder中原来保存的LocalContext和RequestAttributes并设置到previousLocaleContext和previousAttributes临时属性,然后调用buildLocaleContext和buildRequestAttributes方法获取到当前请求的LocaleContext和RequestAttributes,并通过initContextHolders方法将他们设置到LocaleContextHolder和Request-ContextHolder中,接着使用request拿到异步处理管理器并设置了拦截器,做完这些后执行doService方法,执行完后通过resetContextHolders方法将原来的previousLocaleContext和previousAttributes恢复到LocaleContextHolder和RequestContextHolder中,调用publicRequestHandleEvent方法发布了ServletRequestHandledEvent类型的消息。

总结一下:FrameworkServlet 首先在service方法添加了对Patch的处理,并将所有需要自己处理的请求都集中到了processRequest方法进行统一处理,这和HttpServlet里面根据request的类型将请求分配到各个不同的方法进行处理的过程正好相反。 然后就是processRequest方法,在processRequest里面对使用当前request获取到的LocalContext和RequestAttributes进行了保存,以及处理完之后的恢复,在最后发布了ServletRequestHandedEvent.

DispatcherServlet

是Spring MVC最核心的类,整个处理过程的顶层设计都在这里面。 执行入口是doService(),不过doService并没有直接进行处理,而是交给doDispatch进行具体的处理,在doDispatch处理前doService做了一些事情,首先判断是不是include请求,如果是则对request的Attribute做个快照备份,等doDispatch处理完之后进行还原,做完快照之后又对request设置一些属性。

doDispatcherServlet

1.根据request找到Handler. 2.根据Handler找到对应的HandlerAdapter. 3.用 HandlerAdapter处理handler。 4.调用processDispatcherResult方法处理上面之后的结果(包含找到View并渲染输出给用户)。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java 成神之路

java中设置网络代理

1.3K60
来自专栏IT笔记

JAVA实现的微信扫描二维码支付

吐槽一下 支付项目采用springMvc+Dubbo架构实现,只对外提供接口。 话说,为什么微信支付比支付宝来的晚了那么一点,一句话,那一阵挺忙的,然后就没有时...

1.7K80
来自专栏along的开发之旅

OkHttp使用完全教程

上一节我们讲述了Http请求的过程, 这一节我们就讲述下OkHttp是怎么完成Http请求的. 为了更好的理解OKHttp,强烈推荐先看一下http的整个...

50530
来自专栏Java3y

Java高并发秒杀系统【观后总结】

项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番。 记录在该项目中学到了什么玩意.. 该项目源码对应的g...

1.9K80
来自专栏深度学习之tensorflow实战篇

Python3 怎么将Unicode转中文,以及GBK乱码ÖйúÉÙÊýÃñ×åÌØÉ«´åÕ¯

原理: 如果***type(text) is bytes***, 那么text.decode('unicode_escape') ? 如果type...

43550
来自专栏bboysoul

ubuntu安装wxpython库

为了做一个小程序,要用到wxpython这个库,所以就需要安装下,因为我是使用pyenv去管理python的,所以安装这个库就使用pip安装了,系统是ubunt...

19330
来自专栏比原链

剥开比原看代码07:比原节点收到“请求区块数据”的信息后如何应答?

Gitee地址:https://gitee.com/BytomBlockchain/bytom

9420
来自专栏玄魂工作室

Python黑帽编程 3.5 DTP攻击

由于条件限制,本节的代码我没有在实际环境下测试,不保证有效,欢迎讨论。 3.5.1 DTP协议 动态中继协议 DTP(Dynamic Trunking Prot...

364120
来自专栏Java3y

从零开始写项目第二篇【登陆注册、聊天、收藏夹模块】

登陆模块目标 我要将其弄成类似的登陆,功能是要比较完善的。 ? 本来我是想做一步写一步的,但是发现这样文章就会太乱,因为要改的地方太多了。前面写过的,后边就被修...

1.2K80
来自专栏macOS 开发学习

macOS 应用开发小集锦

输出结果与当前app的语言环境有关(默认为English),如果需要修改工程的语言环境,需要设置Edit Scheme...

10820

扫码关注云+社区

领取腾讯云代金券