返回

剖析Http请求从Tomcat到SpringMVC的处理流程

后端

在上一篇文章中,我们了解了SpringMVC是如何被Tomcat加载并且整合Spring的。这次,我们将研究一下一个请求是如何传递到我们的控制器(Controller)的。既然要研究请求流程,那么这次从不同的角度来重新看一下。

首先,我们知道当一个请求到达Tomcat时,Tomcat会根据请求的URL来寻找对应的Servlet。在SpringMVC中,这个Servlet就是DispatcherServlet。DispatcherServlet是SpringMVC的核心组件之一,它负责接收请求,并将其分发给相应的控制器。

当DispatcherServlet收到请求后,它会根据请求的URL来寻找对应的HandlerMapping。HandlerMapping是一个接口,它负责将请求URL映射到相应的控制器。在SpringMVC中,有两种常见的HandlerMapping实现:BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。

BeanNameUrlHandlerMapping是根据控制器(Controller)的Bean名称来映射请求URL的。例如,如果有一个控制器(Controller)的Bean名称为“helloController”,那么当请求URL为“/hello”时,BeanNameUrlHandlerMapping就会将这个请求映射到“helloController”。

SimpleUrlHandlerMapping是根据请求URL的模式来映射请求URL的。例如,如果有一个请求URL的模式为“/user/*”,那么当请求URL为“/user/list”或“/user/detail”时,SimpleUrlHandlerMapping就会将这个请求映射到“userController”。

当DispatcherServlet根据HandlerMapping找到相应的控制器(Controller)后,它会调用HandlerAdapter来执行控制器(Controller)的方法。HandlerAdapter是一个接口,它负责将控制器(Controller)的方法适配成Servlet规范要求的格式。在SpringMVC中,有两种常见的HandlerAdapter实现:SimpleControllerHandlerAdapter和RequestMappingHandlerAdapter。

SimpleControllerHandlerAdapter是负责处理简单控制器(Controller)的。简单控制器(Controller)是指不使用注解(Annotation)的控制器(Controller)。RequestMappingHandlerAdapter是负责处理使用注解(Annotation)的控制器(Controller)的。

当HandlerAdapter执行控制器(Controller)的方法后,它会将方法的返回值包装成一个ModelAndView对象。ModelAndView对象包含了视图(View)的名称和模型(Model)数据。视图(View)负责将模型(Model)数据渲染成最终的页面,模型(Model)数据是控制器(Controller)通过方法返回的数据。

当DispatcherServlet收到ModelAndView对象后,它会根据ModelAndView对象的视图(View)名称来寻找对应的ViewResolver。ViewResolver是一个接口,它负责将视图(View)名称解析成具体的视图(View)。在SpringMVC中,有两种常见的ViewResolver实现:InternalResourceViewResolver和BeanNameViewResolver。

InternalResourceViewResolver是负责将视图(View)名称解析成JSP文件的。例如,如果有一个视图(View)的名称为“hello”,那么InternalResourceViewResolver就会将这个视图(View)解析成“hello.jsp”文件。

BeanNameViewResolver是负责将视图(View)名称解析成Bean的。例如,如果有一个视图(View)的名称为“hello”,那么BeanNameViewResolver就会将这个视图(View)解析成一个名为“helloView”的Bean。

当DispatcherServlet根据ViewResolver找到具体的视图(View)后,它会调用视图(View)的render方法来渲染模型(Model)数据。最终,将渲染后的页面返回给客户端。

这就是一个请求从Tomcat到SpringMVC的处理流程。从这个流程中,我们可以看到SpringMVC是一个非常灵活的框架,它允许我们使用不同的组件来实现不同的功能。这也使得SpringMVC成为一个非常流行的框架,被广泛地应用于各种Web应用程序中。