SpringMVC 入门:核心概念与第一个 HelloWorld 案例
引言
在 JavaWeb 开发中,MVC 模式是解决传统 Servlet 开发中 “代码耦合严重、维护困难” 的经典方案,而 SpringMVC 作为 Spring 生态的核心模块,凭借其 “轻量、灵活、易整合” 的特点,成为当前主流的 MVC 框架。本文将带新手快速入门 SpringMVC,理解其核心概念和工作流程,并通过一个完整的 HelloWorld 案例,让你动手搭建第一个 SpringMVC 项目。
一、先搞懂:SpringMVC 是什么?MVC 模式又是什么?
1. MVC 模式回顾
MVC 是 “Model-View-Controller” 的缩写,是一种软件架构模式,核心是 “职责分离”:
- Model(模型):处理业务逻辑和数据,比如实体类(POJO)、Service 层、DAO 层;
- View(视图):展示数据,比如 JSP、Thymeleaf、Vue 页面;
- Controller(控制器):接收请求、协调 Model 和 View,比如 SpringMVC 中的 Controller 类。
2. SpringMVC 的核心定位
SpringMVC 是基于 MVC 模式的请求驱动型框架,本质是对 Servlet 的封装,通过核心组件(如 DispatcherServlet)统一处理请求,简化开发流程,核心优势:
- 无需手动编写 Servlet,通过注解(如
@Controller
)快速定义控制器; - 内置参数绑定、视图解析、异常处理等功能,减少重复代码;
- 与 Spring 无缝整合,轻松使用 Spring 的 IOC、AOP 等特性。
二、SpringMVC 核心组件与工作流程(关键!)
1. 5 个核心组件
SpringMVC 的请求处理依赖以下核心组件,缺一不可:
组件名称 | 作用 |
---|---|
DispatcherServlet | 前端控制器(核心),统一接收所有请求,分发到对应组件 |
HandlerMapping | 处理器映射器,根据请求 URL 找到对应的 Controller 方法(如@RequestMapping ) |
HandlerAdapter | 处理器适配器,调用 Controller 方法(处理参数绑定、类型转换) |
ModelAndView | 封装处理结果(数据 + 视图名),由 Controller 返回 |
ViewResolver | 视图解析器,根据视图名找到实际视图(如 JSP 路径) |
2. 请求处理完整流程(9 步)
用一张 “请求旅行图” 理解 SpringMVC 的工作过程:
- 浏览器发送请求(如
http://localhost:8080/springmvc/hello
); - 请求被 Tomcat 拦截,转发给
DispatcherServlet
(web.xml 中配置); DispatcherServlet
调用HandlerMapping
,根据 URL 找到对应的 Controller 方法;HandlerMapping
返回方法的映射信息给DispatcherServlet
;DispatcherServlet
调用HandlerAdapter
,适配并执行 Controller 方法;- Controller 方法处理业务,返回
ModelAndView
(如数据msg="Hello"
+ 视图名"hello"
); DispatcherServlet
调用ViewResolver
,根据视图名解析实际视图路径(如/WEB-INF/views/hello.jsp
);ViewResolver
返回解析后的视图对象给DispatcherServlet
;DispatcherServlet
渲染视图(将 Model 数据传入视图),最终响应给浏览器。
三、动手实战:第一个 SpringMVC HelloWorld
1. 环境准备
- 开发工具:IDEA 2023 + Maven 3.8 + Tomcat 9
- 依赖版本:SpringMVC 5.3.28(与 Spring 核心版本一致)
2. 步骤 1:创建 Maven Web 项目
- 打开 IDEA → 新建 Maven 项目 → 选择
maven-archetype-webapp
→ 填写 GroupId(如com.example
)、ArtifactId(如springmvc-hello
); - 补全项目结构:在
src/main
下新建java
和resources
目录(分别标记为 “Sources Root” 和 “Resources Root”)。
3. 步骤 2:导入 SpringMVC 依赖(pom.xml)
核心依赖包括 SpringMVC、Spring 核心、ServletAPI(需设置provided
避免冲突):
<dependencies><!-- Spring核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.28</version></dependency><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.28</version></dependency><!-- Servlet API(Tomcat已提供,无需打包) --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency><!-- JSP API(可选,用于视图) --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency>
</dependencies>
4. 步骤 3:配置前端控制器(web.xml)
在WEB-INF
下的web.xml
中配置DispatcherServlet
,指定 SpringMVC 配置文件路径:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0"><!-- 配置SpringMVC前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定SpringMVC配置文件位置 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.xml</param-value></init-param><!-- 项目启动时加载Servlet --><load-on-startup>1</load-on-startup></servlet><!-- 映射所有请求(除了.jsp)交给DispatcherServlet处理 --><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>
5. 步骤 4:配置 SpringMVC 核心文件(spring-mvc.xml)
在resources
目录下新建spring-mvc.xml
,配置组件扫描(扫描 Controller)和视图解析器:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 1. 组件扫描:扫描Controller所在的包(替换为你的包路径) --><context:component-scan base-package="com.example.controller"/><!-- 2. 配置视图解析器:解析JSP视图 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀:视图文件所在目录 --><property name="prefix" value="/WEB-INF/views/"/><!-- 后缀:视图文件后缀 --><property name="suffix" value=".jsp"/></bean>
</beans>
6. 步骤 5:编写 Controller(核心业务逻辑)
在com.example.controller
包下新建HelloController
,用@Controller
和@RequestMapping
定义请求映射:
package com.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller // 标记此类为SpringMVC控制器
public class HelloController {// 映射请求路径:http://localhost:8080/springmvc/hello@RequestMapping("/hello")public String hello(Model model) {// 1. 处理业务逻辑(这里模拟返回数据)String msg = "Hello, SpringMVC!";// 2. 将数据存入Model(类似request.setAttribute,供视图使用)model.addAttribute("message", msg);// 3. 返回视图名(会被视图解析器解析为:/WEB-INF/views/hello.jsp)return "hello";}
}
7. 步骤 6:编写视图(JSP 页面)
在WEB-INF
下新建views
目录,再新建hello.jsp
,通过 EL 表达式获取 Model 中的数据:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC HelloWorld</title>
</head>
<body><!-- 从Model中获取message值 --><h1>${message}</h1>
</body>
</html>
8. 步骤 7:部署并测试
- 配置 Tomcat:IDEA 右侧 “Add Configuration” → 新增 “Tomcat Server” → 选择本地 Tomcat 路径;
- 部署项目:将
springmvc-hello
项目添加到 Tomcat 中,启动 Tomcat; - 访问测试:打开浏览器输入
http://localhost:8080/springmvc-hello/hello
,页面显示Hello, SpringMVC!
,说明项目成功!
四、入门小结
- 本文核心:理解 SpringMVC 的 “前端控制器 + 组件分工” 模式,记住 9 步工作流程;
- 关键注意点:
web.xml
中DispatcherServlet
的url-pattern
设为/
(不要设为/*
,否则会拦截 JSP);spring-mvc.xml
的组件扫描包路径必须正确,否则 Controller 无法被识别;
- 下一篇预告:深入 SpringMVC 核心组件的实现细节,以及开发中常用的 “参数绑定” 技术。