Skip to content

学习本课程需要的知识:

SpringMVC教程 - 1 SpringMVC简介

1.1 早期的Java Web项目

在早期的 Java Web 应用中,我们主要使用 Servlet 的方式开发。

我们需要编写 Servlet 来处理请求:

java
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 设置响应内容类型
        resp.setContentType("text/html;charset=UTF-8");

        // 获取输出流
        PrintWriter out = resp.getWriter();

        // 输出简单 HTML
        out.println("<html><body>");
        out.println("<h1>Hello World</h1>");
        out.println("</body></html>");
    }
}

所有的请求处理逻辑和响应内容(HTML)都写在 doGetdoPost 方法里。这导致 HTML 和业务逻辑混在一起,代码职责不清晰,难以维护。前端和后端也不能分工开发。

为了解决 Servlet 中 HTML 与业务逻辑混在一起的问题,Java 引入了 JSP(JavaServer Pages)

jsp
<html>
<body>
    <h1>Hello, <%= request.getParameter("name") %>!</h1>
</body>
</html>

通过 JSP 把 HTML 放在页面中,用标签或少量 Java 代码来处理动态内容。

但是 JSP 仍然有问题,因为 JSP 中仍可以写 Java 代码(Scriptlet),容易导致逻辑与表现混杂,代码难以维护、难以测试;对复杂应用而言,Servlet + JSP 架构依然不够清晰。

随着项目复杂度增加,出现了基于 MVC 模式 的 Web 框架,如 Spring MVC

1.2 MVC设计模式

MVC 设计模式是一种经典的软件架构模式,包含三个部分:

  • Model(模型):处理具体的业务逻辑与数据;
  • View(视图):负责展示数据;
  • Controller(控制器):接收用户请求、协调 Model 和 View。

MVC 的处理流程如下:

MVC 模式帮助我们实现代码分层, 职责分离,让代码更清晰、更容易维护。

1.3 什么是SpringMVC

SpringMVC(Spring Model-View-Controller)就是对 MVC 模式的一种实现,是一个用于构建基于 MVC 模式 的 Web 应用程序。也是目前最主流的 Java Web 框架之一,几乎所有的 Java 互联网公司都在使用它。

说白了,SpringMVC 就是帮助我们开发 Web 项目(也就是网页项目)的后端部分的。

它的主要作用是:

  1. 接收前端发送的请求(比如点击按钮、提交表单、调用接口);
  2. 处理业务逻辑(比如查询数据库、计算用于页面显示的结果等);
  3. 返回结果给前端(可以是网页、JSON 数据等)。

如果用一句话描述 SpringMVC 的核心机制就是:DispatcherServlet 前端控制器统一接收请求,分发给对应 Controller,再由 ViewResolver 渲染视图或返回数据。(后面会讲)

1.3 Spring完成的工作

SpringMVC 主要帮我们做了大量底层繁琐工作,让我们可以专注于业务逻辑,例如:

这里可以跳过,因为现在可能暂时感受不到,学完再回来看也可以。

  1. 请求接收与分发

    • 传统方式:每个请求都需要写 Servlet,通过 web.xml 映射 URL;如果有很多请求,需要写大量 Servlet。
    • Spring MVC:通过 DispatcherServlet 统一接收请求,并根据 URL 自动分发到对应的 Controller 方法,不需要手动管理 Servlet,URL 与方法自动映射。
  2. 参数解析与绑定

    • 传统方式:手动从 HttpServletRequest 获取参数,如 req.getParameter("name"),然后还要自己做类型转换。

    • Spring MVC:自动将请求参数绑定到方法参数或 Java 对象,例如:

      java
      @GetMapping("/user")
      public User getUser(@RequestParam int id) { ... }

      框架会自动把请求的 id 参数转换成 int 类型并传入方法,减少重复代码,避免类型转换错误。

  3. 请求与业务逻辑分离

    • 传统 Servlet:业务逻辑往往写在 Servlet 中,职责混乱。
    • Spring MVC:Controller 只负责请求调度,业务逻辑可以独立写在 Service 层,Model 层负责数据处理。这样代码职责清晰,可维护性高。
  4. 视图解析与返回

    • 传统方式:手动写转发或重定向代码,例如 request.getRequestDispatcher("/page.jsp").forward(...)
    • Spring MVC:对传统 HTML 页面,返回视图名,由 ViewResolver 自动找到对应页面;对 REST 接口,返回对象即可自动序列化为 JSON。减少手动视图处理,前后端分离更简单。
  5. 统一异常处理

    • Spring MVC 提供 @ExceptionHandler@ControllerAdvice 等机制,统一捕获 Controller 异常并处理。不用每个 Controller 都写 try-catch,统一处理异常和返回格式。
  6. 拦截器与过滤器

    • Spring MVC 提供 HandlerInterceptor 可以在请求进入 Controller 前、后、完成时执行统一逻辑,例如权限检查、日志记录、性能统计。无需在每个方法中手动插入相同逻辑,增强模块化。
  7. 数据格式转换

    • Spring MVC 内置 HttpMessageConverter,支持自动将 Java 对象转换为 JSON、XML 或表单数据。REST API 开发非常方便,前端直接拿 JSON 使用,无需手动序列化。
  8. 注解驱动的开发方式

    • 通过 @Controller@RestController@RequestMapping 等注解,Spring MVC 自动处理 URL 映射、请求方法区分、参数绑定等。减少配置复杂度,比传统 web.xml + Servlet 更简洁。

简单一句话总结:

Spring MVC 帮我们把请求处理、参数解析、视图渲染、数据序列化、异常处理等重复且容易出错的工作自动化,让我们可以专注于业务逻辑。


直接开始吧!