解释 Spring MVC 的工作原理

题目详细答案

Spring MVC 的工作原理基于 Model-View-Controller(MVC)设计模式,旨在将应用程序的业务逻辑、用户界面和数据分离开来。

用户请求

用户通过浏览器发送 HTTP 请求到服务器。例如,用户访问 http://example.com/hello

前端控制器(DispatcherServlet)

Spring MVC 的核心组件 DispatcherServlet 充当前端控制器,它拦截所有进入的 HTTP 请求。DispatcherServletweb.xml 文件中配置,负责初始化 Spring MVC 的上下文环境。

复制代码
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

处理器映射(Handler Mapping)

DispatcherServlet 接收到请求后,会根据请求 URL 通过处理器映射(Handler Mapping)找到相应的控制器(Controller)。处理器映射是由 HandlerMapping 接口实现的,常见的实现包括 RequestMappingHandlerMapping,它会扫描控制器中的 @RequestMapping 注解。

复制代码
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public ModelAndView helloWorld() {
        String message = "Hello, Spring MVC!";
        return new ModelAndView("hello", "message", message);
    }
}

控制器处理

找到相应的控制器后,DispatcherServlet 调用控制器的方法处理请求。控制器执行业务逻辑,通常会调用服务层或数据访问层获取数据,并将数据封装到模型中。

复制代码
@Controller
public class HelloController {
    @RequestMapping("/hello")
    public ModelAndView helloWorld() {
        String message = "Hello, Spring MVC!";
        return new ModelAndView("hello", "message", message);
    }
}

视图解析器(View Resolver)

控制器处理完请求后,会返回一个 ModelAndView 对象,其中包含视图名称和模型数据。DispatcherServlet 使用视图解析器(View Resolver)将视图名称解析为实际的视图对象。常见的视图解析器包括 InternalResourceViewResolverThymeleafViewResolver 等。

复制代码
@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

视图渲染

视图解析器将视图名称解析为实际的视图对象后,视图对象负责将模型数据渲染为用户界面,通常是 HTML 页面。视图对象可以是 JSP、Thymeleaf 模板、FreeMarker 模板等。

复制代码
<!-- hello.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
    <h2>${message}</h2>
</body>
</html>

响应返回

渲染后的视图返回给 DispatcherServletDispatcherServlet 将最终的响应发送回用户浏览器。用户在浏览器中看到渲染后的页面。