SpringMVC之DispatcherServlet

本文详细解析了Spring MVC中DispatcherServlet的工作原理,包括初始化过程、九大组件的初始化方式及请求处理流程。DispatcherServlet作为Spring MVC的前端控制器,在处理HTTP请求过程中扮演核心角色。

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方法来执请求并生成视图,最后解析视图。至此,一个完整的调用过程就实现了


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值