Spring MVC 如何体现 Model-View-Controller 各自的职责?它们之间是如何协作的?

时间:2025-04-21 17:02:31
  • 请求入口: HTTP 请求到达 DispatcherServlet
  • 寻找处理器: DispatcherServlet 查询 HandlerMapping,根据请求信息(URL, HTTP Method 等)找到能够处理该请求的 Controller 方法 (Handler)。
  • 适配与调用: DispatcherServlet 通过 HandlerAdapter 来调用选定的 Controller 方法。HandlerAdapter 负责处理方法参数的解析和数据绑定(例如,将请求参数注入到 @RequestParam 标记的参数,将 JSON 请求体反序列化到 @RequestBody 标记的对象)。
  • Controller 处理: Controller 方法执行:
    • 接收解析后的请求数据。
    • 调用 Service 层等(与 Model 交互)执行业务逻辑。
    • 将结果数据放入 Model 对象(或 ModelAndView)。
    • 返回逻辑视图名(String)或 ModelAndView 对象(或直接返回数据对象给 @ResponseBody)。
  • 视图解析 (非 @ResponseBody): 如果 Controller 返回的是逻辑视图名或 ModelAndViewDispatcherServlet 会将逻辑视图名交给 ViewResolver
  • 获取具体视图: ViewResolver 根据逻辑视图名解析得到具体的 View 实例(例如,一个指向特定 JSP 文件的 JstlView 对象)。
  • 数据渲染: DispatcherServlet 将 Controller 准备好的 Model 数据传递给 View 实例。View 实例使用这些数据渲染最终的响应(例如,JSP 引擎执行 JSP 文件并生成 HTML)。
  • REST 响应 (@ResponseBody): 如果 Controller 方法使用了 @ResponseBody 或属于 @RestControllerHandlerAdapter 会使用合适的 HttpMessageConverter 将返回的对象序列化为特定格式(如 JSON)并直接写入响应体。此过程通常跳过视图解析和 View 渲染步骤。
  • 响应返回: DispatcherServlet 将最终生成的响应(渲染后的 HTML 或序列化后的数据)返回给客户端。