SpringMVC之DispatcherServlet

DispatcherServlet是springMVC的前端控制器,也是springMVC中最重要的一个类。理解了DispatcherServlet也就差不多理解了springMVC。

DispatcherServlet继承自FrameworkServlet,FrameWorkServlet继承自HttpServletBean并且实现了ApplicationContextAware接口。HttpServletBean继承自HttpServlet并且实现了EnvirommentCapable和EnvirommentAware接口。在spirng中,实现了xxxaware接口,我们就能够从spring中获取到xxx.所以实现了EnvirommentAware接口的类就可以通过setEnvironment来得到spring的环境变量。而EnvironmentCapable则可以通过getEnvironment来直接拿到Environment。ApplicationContextAware同理。因此DispatcherServlet可以获取到ApplicationContext和Environment。

spring其实是先调用了HttpServletBean的init方法。然后init方法里面又调用了initServletBean方法,这个方法实际上是调用子类FrameWorkServlet里面的方法。在initServletBean中间,实际上调用了initWebApplicationContext方法和initFrameWorkServlet方法。在initWebApplicationContext中,实际上主要获取了spring的根容器rootContext,设置了WebApplicationContext调用了onRefresh方法并且将webApplicationContext设置到了ServletContext中。在这里核心就是调用了onFresh方法。FrameWorkServlet默认的onRefresh方法是空的,此时调用的是子类DispatcherServlet的onRefresh方法。在onRefresh方法中,调用了initStrategies方法,这个方法实际上调用了9个初始化方法,初始化了DispatcherServlet的9大组件。如果在配置文件中配置了组件,那么spring就会通过配置文件来初始化相应的组件,否则的话,spring就会调用getDefaultStrategy来初始化这些组件。默认的初始化配置在org.springframework.web.DispatcherServlet.properties中配置的。至此,springMVC的创建过程就基本结束了。

springMVC在处理请求的时候,实际上调用到了FramWorkServlet的service方法,这个方法重写了servlet的service方法。在这个方法中,spring将所有的请求都路由到了processRequest这个方法中统一处理。在processRequest这个方法中,主要调用了doService方法,并且在这个方法前后做了一些事情。主要是保存了LocalContext和RequestContext。LocalContext保存了一些本地化的信息,RequestContext主要用来获取RequestAttribute(ServletRequestAttributes),我们可以通过这个ServletRequestAttributes来获取request,response和session。在doService结束后,执行了publishRequestHandledEvent方法,这个方法会通过new一个ServletRequestHandledEvent来发布一些消息。这个event里面包含了请求地址等等信息。我们可以通过实现ApplicationListener方法并重写onApplicationEvent(ServletRequestHandleredEvent)这个方法来监控请求。

FrameWorkServlet在执行DoService方法时,执行的是子类DispatcherServlet的doService方法。在这个方法中对request的一些属性进行了设置,接着调用了dispatcher方法,调用这个方法时,先根据request找到handler,然后通过handler获得handlerAdapter,通过handlerAdapter的handler方法来执请求并生成视图,最后解析视图。至此,一个完整的调用过程就实现了


发布了28 篇原创文章 · 获赞 14 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章