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并渲染输出给用户)。

你可能感兴趣的:(Spring MVC请求处理过程)