-
请求到达 DispatcherServlet
- 请求拦截:所有的后端请求首先会到达
DispatcherServlet
。它是 SpringMVC 的前端控制器,类似于一个总调度员,负责接收和处理所有进入系统的 HTTP 请求。它会拦截请求,获取请求的基本信息,包括请求方法(GET、POST 等)、请求 URL、请求头和请求参数等内容。 - 加载配置信息:
DispatcherServlet
在初始化时会加载 SpringMVC 的配置文件(可以是 XML 配置或者基于 Java 的配置)。这些配置文件包含了诸如处理器映射器(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)等组件的配置信息,用于后续的请求处理流程。
- 请求拦截:所有的后端请求首先会到达
-
HandlerMapping 查找处理器方法
- 路径匹配:
HandlerMapping
根据请求的 URL 和配置信息来查找能够处理该请求的处理器方法。在基于注解的 SpringMVC 中,@RequestMapping
(包括其变体,如@GetMapping
、@PostMapping
等)注解用于将 URL 路径映射到Controller
类中的方法。例如,如果有一个请求的 URL 是/api/products/{id}
,HandlerMapping
会查找Controller
类中带有@GetMapping("/api/products/{id}")
注解的方法。 - 参数匹配:除了路径匹配外,
HandlerMapping
还会考虑请求参数等其他因素来确定最合适的处理器方法。例如,对于一个带有查询参数的请求/api/products?category=electronics
,它会寻找能够处理这种带有特定查询参数的方法。
- 路径匹配:
-
HandlerAdapter 调用处理器方法
- 适配调用:当
HandlerMapping
找到合适的处理器方法后,HandlerAdapter
负责实际调用这个方法。不同类型的处理器方法(例如,基于传统接口的处理器和基于注解的处理器)可能需要不同的调用方式,HandlerAdapter
会进行适配。它会将请求对象(如HttpServletRequest
)和其他相关参数传递给处理器方法,确保方法能够正确地获取和处理请求信息。 - 参数绑定:
HandlerAdapter
还会协助进行参数绑定。它可以从请求中提取参数,并将其绑定到处理器方法的参数上。例如,如果处理器方法有一个参数@RequestParam("productId") String productId
,HandlerAdapter
会从请求中获取名为productId
的参数,并将其值赋给productId
这个变量。
- 适配调用:当
-
处理器方法(Controller)执行处理
- 业务逻辑调用:处理器方法(通常位于
@Controller
或@RestController
标注的类中)会执行具体的业务逻辑。这可能涉及调用其他服务层(Service)的方法来完成诸如数据查询、数据修改、业务规则验证等操作。例如,在一个处理产品查询的Controller
方法中,会调用ProductService.getProducts()
方法来获取产品列表。 - 数据封装与返回:处理器方法会将处理后的结果进行封装。如果是返回视图相关的内容,会返回一个
ModelAndView
对象,其中Model
部分包含要传递给视图的数据,View
部分指定视图名称。如果是返回 JSON 等数据格式,会直接返回数据对象,SpringMVC 会根据配置自动将其转换为 JSON 格式。例如,返回一个List<Product>
对象,SpringMVC 会使用消息转换器(Message Converter)将其转换为 JSON 格式并返回给客户端。
- 业务逻辑调用:处理器方法(通常位于
-
视图解析(如果适用)与响应返回
- 视图解析(用于视图渲染):如果处理器方法返回的是
ModelAndView
对象,ViewResolver
会根据View
部分的信息来解析出实际的视图。例如,如果View
部分是product - list.jsp
,ViewResolver
会根据配置的视图前缀(如/WEB - INF/views/
)和后缀(如.jsp
)找到实际的 JSP 文件路径,用于后续的视图渲染。 - 响应生成与返回:对于返回 JSON 等数据格式的情况,SpringMVC 会直接将转换后的内容作为响应体,设置合适的响应头(如
Content - Type: application/json
),并通过DispatcherServlet
返回给客户端。对于视图渲染的情况,视图会将Model
中的数据填充到模板中,生成最终的 HTML 响应,然后通过DispatcherServlet
返回给客户端。
- 视图解析(用于视图渲染):如果处理器方法返回的是
总结:
-
用户发送请求到前端控制器
DispatcherServlet
。 -
Dispatcher
Servlet
调用HandlerMapping
找到具体处理器。 -
HandlerMapping
返回处理器对象及拦截器(如果有)给DispatcherServlet
。 -
DispatcherServlet
调用HandlerAdapter
。 -
HandlerAdapter
适配并调用具体处理器(Controller)。 -
Controller执行并返回
ModelAndView
对象。 -
HandlerAdapter
将ModelAndView
返回给DispatcherServlet
。 -
DispatcherServlet
传给ViewResolver
进行视图解析。 -
ViewResolver
返回具体视图给DispatcherServlet
。 -
DispatcherServlet
渲染视图并响应用户。