Spring MVC 全面解析

发布于:2025-03-11 ⋅ 阅读:(21) ⋅ 点赞:(0)

img

Spring MVC 是 Spring 框架中的一个模块,它基于 MVC(Model-View-Controller)设计模式,旨在帮助开发者构建灵活、松耦合的 Web 应用。主要目的是简化传统 Servlet+JSP 模式下的 Web 开发方式。下面将从工作流程、核心组件、代码示例三个方面进行详细解析。

​ 其次, Spring MVC 的整体架构设计对 Java Web 里面的 MVC 架构模式做了增强和扩展,主要有几

个方面。

  1. 把传统 MVC 框架里面的 Controller 控制器做了拆分,分成了前端控制器 DispatcherServlet 和后

端控制器 Controller。

  1. 把 Model 模型拆分成业务层 Service 和数据访问层 Repository。

  2. 在视图层,可以支持不同的视图,比如 Freemark、velocity、JSP 等等

一、Spring MVC 的核心组件

  1. DispatcherServlet
    所有请求首先进入 DispatcherServlet,它作为前端控制器,负责协调整个请求处理流程。
  2. HandlerMapping
    DispatcherServlet 根据请求 URL 通过 HandlerMapping 寻找对应的处理器(Controller)。
  3. Controller
    控制器负责处理具体业务逻辑,并返回一个 ModelAndView 对象,包含业务数据(Model)和逻辑视图名称(View)。
  4. ViewResolver
    根据逻辑视图名称,通过 ViewResolver 找到具体的视图模板(例如 JSP、Thymeleaf 等)。
  5. View
    最终视图负责将 Model 数据渲染成 HTML 等格式,返回给客户端。

如图,我们来看一下工作流程:

image-20250310194934718

二、Spring MVC 的工作流程

整个请求-响应流程可以概括如下:

  1. 请求进入
    用户发送 HTTP 请求,首先到达 DispatcherServlet
  2. 处理器映射
    DispatcherServlet 调用 HandlerMapping 根据请求信息查找对应的 Controller。
  3. 调用 Controller
    找到 Controller 后,调用对应的方法执行业务逻辑,并返回 ModelAndView
  4. 视图解析
    DispatcherServletModelAndView 中的逻辑视图名称传递给 ViewResolver,解析出具体视图。
  5. 渲染视图
    具体视图使用 Model 数据进行渲染,生成最终的响应内容返回给用户。

三、实战代码示例

下面是一个简单的 Spring MVC 示例代码,展示如何定义 Controller 以及如何返回 ModelAndView。

1.Controller 示例

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/hello")
public class HelloController {

    // 处理 GET 请求 http://yourdomain/hello
    @RequestMapping(method = RequestMethod.GET)
    public ModelAndView sayHello() {
        ModelAndView mv = new ModelAndView("helloView"); // 逻辑视图名称
        mv.addObject("message", "Hello Spring MVC!");
        return mv;
    }
}

2. Spring 配置(基于 XML)

如果你使用 XML 配置,可以这样配置 DispatcherServlet 和视图解析器:

<!-- web.xml 中配置 DispatcherServlet -->
<servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<!-- spring-servlet.xml 配置 -->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 启用注解驱动 -->
    <mvc:annotation-driven />

    <!-- 扫描 Controller 包 -->
    <context:component-scan base-package="com.example.controller" />

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

3. JSP 视图示例(helloView.jsp)

/WEB-INF/views/helloView.jsp 文件中,可以这样写:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Hello Spring MVC</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

4.关键注解说明

image-20250310195508788

四、总结

  • 核心流程:请求经过 DispatcherServlet -> HandlerMapping -> Controller -> ViewResolver -> View,每一步都发挥着关键作用。
    YSO-1741608287752)]