对于spring-webmvc的请求处理过程,在很多面试官的眼里都是必考题,所以我今天就说说我的理解,如果对大家有所帮助那就太荣幸了!多谢关注!
在spring-webmvc中大家都知道有几个概念或者叫类,大家在回答问题的时候肯定是必须提到的,比如DispatcherServlet、HandlerMapping等,如果简单的描述spring-webmvc对于请求的处理过程,有这两个概念就够了。但是面试官肯定是不满意的,所以需要再加几个,比如下面这几个:HandlerAdapter,HandlerExecutionChain,Handler(可以是任意的Object对象)和Controller;以上这四个是处理过程中要碰到的主要概念,在这里我会说一下我的理解供大家参考。
另外还有一条需要说明的就是关于DispatcherServlet这个类,对于它我会从它的类关系和抽象的方面来说明它是什么以及对于它的理解。
DispatcherServlet的理解
如下图,我们从红色箭头方向看去,从下到上我们主要来看四个类,分别是DispatcherServlet、FrameworkServlet、HttpServletBean和HttpServlet。
HttpServlet
HttpServlet这个类相信大家已经耳熟能详了,它就是大名鼎鼎的在java web容器中处理请求的基类,所有的的servlet都是直接或间接的继承于它,其中service方法是处理请求的入口,在其中按照http请求的方法(post、get等)统一调度,来处理不同的http方法的请求。
另外,说到了servlet就不能不说一下它的生命周期了,很简单,按顺序分别是:init->service->destory;
init方法:在容器初始化servlet时进行调用(只调用一次),如果init方法产生异常,则该servlet不会被用于处理请求。
service方法:真正用于处理请求的
destory方法:是容器留给用户来做最后的清理工作,只调用一次,当调用之后,该servlet就不再接收请求。
HttpServletBean
HttpServletBean类,看名字就知道它时一个Bean,它是在spring-webmvc中对HttpServlet做的第一层封装,其主要主要的用途也正是javaBean的用途,就是将HttpServlet中的相关属性当作bean中的属性来使用。
这样做的用意,我理解应该一是和HttpServlet做一个封装隔离,使HttpServlet对于后面的类使用servlet相关参数时透明;第二就是使用上的方便和灵活,可以增加一些方便的方法,用于获取参数和处理参数。
FrameworkServlet
FrameworkServlet,也从名字上看一下,存在“框架”这个词,那它的作用也就是和框架有关,其作用就是使Servlet集成spring application context的相关功能,也就是将servlet容器和spring 应用容器进行融合,使servlet容器在spring应用容器中运行,进而为servlet容器加入了spring的相关特性。
具体的说,在FrameworkServlet中主要是利用spring application context的机制对servlet容器进行初始化,例如自动探测对于servlet的初始化参数、可以将不同命名空间的bean配置在不同的配置文件中、可以定制配置文件的存放路径等等。
DispatcherServlet
最后就是DispatcherServlet这个核心了,它是框架接收请求的入口,在它的doDispatcher方法中获取处理请求的handler对象,并利用ModelAndView对象来渲染响应。
综上,在我看来这又是spring一次经典的抽象过程,即步步为营,将最终的目标先进行拆分(提纯,抽象层次更高),然后整合形成完整的抽象。首先是对属性的处理,将其按照普通的javaBean处理,因为spring核心就是管理bean;其次是对上下文的集成,即将servlet的运行环境加入到spring的应用上下文;最后二者结合就形成了spring-webmvc的入口。
spring-webmvc对于请求的处理过程
未完待续。。。