Spring MVC 是 Spring 框架的一个模块,用于构建基于 Java 的 Web 应用程序,它遵循了 MVC(Model-View-Controller,模型 - 视图 - 控制器)设计模式,帮助开发者将业务逻辑、数据和用户界面分离,从而提高代码的可维护性、可测试性和可扩展性。以下从几个方面详细介绍 Spring MVC:

核心组件

  • DispatcherServlet:作为 Spring MVC 的前端控制器,负责接收所有客户端请求,并将请求分发给相应的处理器进行处理。它是整个 Spring MVC 框架的核心,是请求的统一入口。

  • HandlerMapping:根据请求的信息(如 URL、请求方法等)将请求映射到相应的处理器(Handler)。常见的实现有 BeanNameUrlHandlerMappingRequestMappingHandlerMapping 等。

  • HandlerAdapter:由于处理器可以有多种形式(如实现不同的接口),HandlerAdapter 的作用是将请求适配到具体的处理器方法上进行调用。例如,RequestMappingHandlerAdapter 用于处理使用 @RequestMapping 注解的处理器。

  • Controller:处理器的一种实现,负责处理客户端请求,执行业务逻辑,并返回处理结果。通常使用 @Controller@RestController 注解来标识。

  • ViewResolver:根据处理器返回的逻辑视图名,解析出实际的视图对象(如 JSP、Thymeleaf 模板等),并将模型数据渲染到视图中返回给客户端。常见的实现有 InternalResourceViewResolverThymeleafViewResolver 等。

  • View:负责将模型数据呈现给客户端,常见的视图技术有 JSP、Thymeleaf、FreeMarker 等。

工作流程

  1. 客户端请求:客户端(如浏览器)发送 HTTP 请求到 DispatcherServlet

  2. 请求映射DispatcherServlet 接收到请求后,通过 HandlerMapping 查找处理该请求的处理器(Handler)。

  3. 处理器适配:找到处理器后,DispatcherServlet 通过 HandlerAdapter 调用处理器的具体方法进行业务处理。

  4. 业务逻辑处理:处理器执行相应的业务逻辑,并返回一个 ModelAndView 对象,其中包含模型数据和逻辑视图名。

  5. 视图解析DispatcherServlet 接收到 ModelAndView 后,通过 ViewResolver 将逻辑视图名解析为实际的视图对象。

  6. 视图渲染:将模型数据传递给视图对象,视图对象将数据渲染到页面中,并返回给客户端。

示例代码

1. 配置 Spring MVC

pom.xml 中添加 Spring MVC 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.23</version>
    </dependency>
</dependencies>

2. 创建控制器

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "hello";
    }
}

3. 配置视图解析器

在 Spring 配置文件(如 applicationContext.xml)中配置视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

4. 创建 JSP 视图

WEB-INF/views 目录下创建 hello.jsp 文件:

<!DOCTYPE html>
<html>
<head>
    <title>Hello Spring MVC</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

5. 配置 DispatcherServlet

web.xml 中配置 DispatcherServlet

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

优点

  • 灵活性:支持多种视图技术(如 JSP、Thymeleaf、FreeMarker 等)和数据格式(如 JSON、XML 等),可以根据项目需求灵活选择。

  • 可维护性:遵循 MVC 设计模式,将业务逻辑、数据和视图分离,使得代码结构清晰,易于维护和扩展。

  • 可测试性:控制器可以独立进行单元测试,方便进行代码测试和调试。

  • 集成性:可以与 Spring 框架的其他模块(如 Spring Boot、Spring Data 等)无缝集成,提供一站式的解决方案。