杰瑞科技汇

Spring MVC教程,如何快速上手核心开发?

Spring MVC教程2025:从零到大师的终极指南(含源码)

一站式掌握Java Web开发核心框架,理论+实战,让你彻底搞懂Spring MVC! SEO描述:** 最全面、最实用的Spring MVC教程,从环境搭建、核心组件到实战项目,手把手教你快速上手,适合Java初学者及进阶开发者,附完整源码下载,助你成为Spring MVC高手。

Spring MVC教程,如何快速上手核心开发?-图1
(图片来源网络,侵删)

引言:为什么你还在学习Spring MVC?

在Java Web开发的浩瀚星海中,框架层出不穷,从Struts到JSF,再到如今的Spring Boot,但你可能发现,无论技术如何演进,Spring MVC的身影始终屹立不倒,为什么?

因为它不仅仅是“老”,更是“经典”与“强大”的代名词。

  • Spring Boot的基石: 现在最火的Spring Boot,其底层核心就是Spring MVC,不理解Spring MVC,你将无法真正掌握Spring Boot的自动配置原理和精髓。
  • 企业级应用的中流砥柱: 无数大型企业级项目仍在使用基于Spring MVC构建的系统,掌握它,意味着你拥有了进入这些企业的“敲门砖”。
  • 思想与架构的传承: Spring MVC的前端控制器模式依赖注入AOP等思想,是现代Java开发的基石,学习它,就是学习一套优秀的软件设计哲学。

本教程将是你从“知道”到“精通”Spring MVC的终极跳板,我们将摒弃枯燥的理论,采用“概念-实践-升华”三部曲,让你在动手编码中深刻理解每一个知识点。


Spring MVC核心:它到底是如何工作的?(一张图看懂)

想象一下一个餐厅的运作流程:

Spring MVC教程,如何快速上手核心开发?-图2
(图片来源网络,侵删)
  1. 顾客(用户请求) 进门,不会直接冲向后厨。
  2. 迎宾员(DispatcherServlet) 接待顾客,了解他想点什么菜(请求URL)。
  3. 迎宾员根据菜单(HandlerMapping),找到专门负责这道菜的厨师(Controller)
  4. 厨师(Controller)接到订单,开始烹饪(处理业务逻辑)。
  5. 做好后,厨师把菜交给传菜员(ModelAndView),并告诉他这道菜叫什么名字(视图名)。
  6. 传菜员拿着菜名,去后厨的菜架(ViewResolver)上找到对应的盘子(View)。
  7. 传菜员将装好菜的盘子(View渲染后的最终页面)端给顾客。

这个流程,就是Spring MVC的核心工作流程

关键组件解析:

  • DispatcherServlet: 前端控制器,所有请求的入口,负责协调其他组件工作,它是整个框架的“心脏”。
  • HandlerMapping: 处理器映射器,根据用户请求的URL,找到对应的Controller处理方法。
  • Controller: 控制器,开发者编写的核心类,负责接收请求、调用业务逻辑、返回处理结果。
  • ModelAndView: 模型和视图,Controller处理完后,封装了要渲染的数据和视图名称。
  • ViewResolver: 视图解析器,根据视图名称,找到并实例化真正的View对象。
  • View: 视图,负责将Model中的数据渲染成最终的响应(如HTML、JSON等)。

实战演练:手把手搭建你的第一个Spring MVC项目

理论说再多,不如亲手敲一行代码,本节我们将创建一个标准的Maven项目,实现一个简单的“Hello, Spring MVC!”功能。

步骤1:环境准备

  • JDK 8+
  • Maven 3.6+
  • IntelliJ IDEA (或Eclipse)

步骤2:创建Maven Web项目

在IDEA中,选择 File -> New -> Project,选择 Maven 并勾选 Create from archetype,然后选择 maven-archetype-webapp

Spring MVC教程,如何快速上手核心开发?-图3
(图片来源网络,侵删)

步骤3:添加Spring MVC依赖

打开 pom.xml,添加以下核心依赖:

<dependencies>
    <!-- 1. Spring MVC 核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.23</version> <!-- 建议使用较新稳定版 -->
    </dependency>
    <!-- 2. Servlet API 依赖 (Tomcat等容器需要) -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- 3. JSP API 依赖 (如果使用JSP视图) -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
    <!-- 4. JSTL 标签库 (简化JSP开发) -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

步骤4:配置DispatcherServlet

src/main/webapp/WEB-INF 目录下,创建 spring-mvc-servlet.xml 文件,这个文件是Spring MVC的“大脑”。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">
    <!-- 1. 扫描Controller包 -->
    <context:component-scan base-package="com.example.controller"/>
    <!-- 2. 开启MVC注解驱动 -->
    <mvc:annotation-driven/>
    <!-- 3. 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- 4. 静态资源处理 -->
    <mvc:default-servlet-handler/>
</beans>

配置详解:

  • component-scan:告诉Spring去哪里找被@Controller等注解标记的类。
  • mvc:annotation-driven:开启注解驱动,使我们能使用@RequestMapping等注解。
  • InternalResourceViewResolver:视图解析器配置,prefix是JSP文件存放的目录,suffix是文件后缀,返回"hello",会解析为/WEB-INF/views/hello.jsp
  • mvc:default-servlet-handler:将静态资源(如CSS, JS, 图片)的请求交给默认的Servlet处理,避免被DispatcherServlet拦截。

步骤5:配置Web.xml

webapp/WEB-INF/web.xml 中配置DispatcherServlet,并将其设置为所有请求的入口。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 1. 配置DispatcherServlet -->
    <servlet>
        <servlet-name>spring-mvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定Spring MVC配置文件的位置和名称 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <!-- 拦截所有请求,除了.jsp(避免JSP重复解析) -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

步骤6:创建Controller、View和测试

  1. 创建Controllerjava/com/example/controller 包下创建 HelloController.java

    package com.example.controller;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    @Controller
    public class HelloController {
        @GetMapping("/hello") // 或 @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String sayHello(Model model) {
            // 向模型中添加数据
            model.addAttribute("message", "Hello, Spring MVC! This is your first app.");
            // 返回视图名称,由视图解析器拼接成完整路径
            return "hello";
        }
    }
  2. 创建Viewwebapp/WEB-INF/views 目录下创建 hello.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Hello Page</title>
    </head>
    <body>
        <h1>${message}</h1>
        <p>恭喜你,Spring MVC 配置成功!</p>
    </body>
    </html>
  3. 部署并测试 将项目部署到Tomcat等Web服务器中,启动服务器,在浏览器访问: http://localhost:8080/你的项目名/hello

    如果看到页面显示“Hello, Spring MVC! This is your first app.”,那么恭喜你,你已经成功迈出了Spring MVC的第一步!


进阶之路:深入理解核心注解与数据绑定

掌握了基础,我们来探索Spring MVC的“超能力”。

常用注解详解

注解 作用 示例
@RestController @Controller + @ResponseBody 的结合,用于返回JSON/XML等数据,而非视图,现代Web API开发首选。 @RestController @RequestMapping("/api")
@RequestMapping 用于映射HTTP请求URL到具体的处理方法上,可以作用于类和方法上。 @RequestMapping(value = "/users", method = RequestMethod.GET)
@GetMapping, @PostMapping @RequestMapping的简化版,分别对应GET和POST请求,代码更简洁。 @PostMapping("/create")
@RequestParam 用于获取请求中的参数。 public String get(@RequestParam("name") String username)
@PathVariable 用于获取URL模板中的变量,RESTful风格常用。 @GetMapping("/users/{id}") public User getUser(@PathVariable("id") Long userId)
@RequestBody 用于读取HTTP请求体中的JSON/XML数据,并自动绑定到Java对象上。 @PostMapping("/create") public void createUser(@RequestBody User user)
@ResponseBody 将方法的返回值直接作为HTTP响应体返回,通常用于返回JSON/XML。

数据绑定与表单提交

Spring MVC最强大的特性之一就是自动数据绑定,它能将HTTP请求中的参数自动填充到Java对象中。

场景: 用户注册表单提交

  1. 创建实体类

    public class User {
        private String username;
        private String email;
        // Getters and Setters...
    }
  2. 创建Controller处理方法

    @Controller
    @RequestMapping("/user")
    public class UserController {
        @PostMapping("/register")
        public String register(User user, Model model) {
            // Spring MVC会自动将表单数据填充到user对象中
            System.out.println("注册用户: " + user.getUsername() + ", 邮箱: " + user.getEmail());
            model.addAttribute("registeredUser", user);
            return "success"; // 跳转到成功页面
        }
    }
  3. 创建JSP表单

    <form action="/your-project-name/user/register" method="post">
        用户名: <input type="text" name="username"><br>
        邮箱: <input type="email" name="email"><br>
        <input type="submit" value="注册">
    </form>

当用户填写表单并提交时,Spring MVC会根据name属性(username, email)自动查找User类中对应的属性,并调用其setter方法完成赋值。


高级特性与最佳实践

当你熟练使用基础后,这些高级特性将让你从“会用”变为“精通”。

RESTful API 设计

REST(Representational State Transfer)是一种软件架构风格,而非标准,Spring MVC是构建RESTful API的利器。

  • 使用@RestController:专门用于返回数据,不返回视图。
  • 使用@GetMapping, @PostMapping:明确表示HTTP方法。
  • 使用@PathVariable:优雅地设计资源路径。
  • 使用@RequestBody@ResponseBody:处理请求体和响应体。

示例:用户资源API

@RestController
@RequestMapping("/api/v1/users")
public class UserApiController {
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        // 业务逻辑...
        return new User("John Doe");
    }
    @PostMapping
    public User createUser(@RequestBody User user) {
        // 业务逻辑...
        return user; // 返回创建后的用户,通常包含ID
    }
}

全局异常处理

使用@ControllerAdvice@ExceptionHandler可以创建全局异常处理器,统一处理各种异常,避免在每个Controller中都写try-catch

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception ex) {
        ModelAndView mav = new ModelAndView("error"); // 跳转到错误页面
        mav.addObject("errorMsg", ex.getMessage());
        return mav;
    }
    // 也可以处理特定异常,并返回JSON
    @ExceptionHandler(UserNotFoundException.class)
    @ResponseBody
    public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}

拦截器

拦截器可以在请求到达Controller之前或之后执行一些逻辑,如日志记录、权限验证等。

  1. 实现HandlerInterceptor接口

    public class LoggingInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("请求前拦截: " + request.getRequestURI());
            return true; // true: 继续流程; false: 中断流程
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("请求后拦截");
        }
    }
  2. 在配置中注册拦截器

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/> <!-- 拦截所有路径 -->
            <bean class="com.example.interceptor.LoggingInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

总结与展望

通过本教程,你已经从零开始,逐步掌握了Spring MVC的核心概念、环境搭建、实战开发以及进阶特性,你已经具备了构建一个功能完备的Java Web应用的能力。

回顾一下我们的学习路径:

  1. 理解核心架构:掌握了DispatcherServlet和各组件的协作流程。
  2. 完成实战项目:亲手搭建了第一个Spring MVC应用,实现了从请求到响应的完整闭环。
  3. 深入核心注解:学会了如何灵活使用注解来处理各种HTTP请求和参数。
  4. 探索高级特性:了解了RESTful API设计、全局异常处理和拦截器等企业级开发必备技能。

下一步,你可以:

  • 整合持久层:将Spring MVC与MyBatis或JPA整合,实现数据库操作。
  • 学习Spring Boot:在理解Spring MVC的基础上,学习Spring Boot的自动配置,你会发现开发效率呈指数级提升。
  • 研究源码:深入Spring MVC的源码,探究DispatcherServlet的初始化过程、HandlerMapping的匹配算法等,这将让你对框架的理解达到新的高度。

Spring MVC是一座富矿,本教程只是为你打开了一扇门,真正的宝藏,需要你在实践中不断探索和挖掘,祝你编程愉快,早日成为Spring大师!


附:完整项目源码下载

为了方便大家学习和实践,本文所涉及的所有源码已打包上传。点击此处下载完整源码 (此处为模拟链接,实际部署时可替换为真实下载地址)。 **

  • 完整的Maven项目结构
  • pom.xml 依赖配置
  • web.xmlspring-mvc-servlet.xml 配置文件
  • HelloControllerUserController 示例代码
  • 对应的 JSP 视图文件

使用说明:

  1. 下载并解压源码包。
  2. 在IDEA中导入项目。
  3. 配置Tomcat服务器。
  4. 一键部署并运行。

#Spring MVC #Java教程 #Web开发 #后端技术 #编程入门 #源码分析

分享:
扫描分享到社交APP
上一篇
下一篇