前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring MVC请求处理过程

Spring MVC请求处理过程

作者头像
用户2909867
发布2018-08-22 11:15:58
6480
发布2018-08-22 11:15:58
举报
文章被收录于专栏:互联网大杂烩互联网大杂烩
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并渲染输出给用户)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.08.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HttpServletBean
  • FrameworkServlet
  • DispatcherServlet
  • doDispatcherServlet
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档