当前位置: 首页 > news >正文

SpringMVC 学习指南:从入门到实战

一、SpringMVC 基础认知

1.1 什么是 SpringMVC?

SpringMVC 是 Spring 提供的用于构建 Web 应用的 MVC 框架,它分离了 Web 应用的模型(Model)、视图(View)和控制器(Controller),通过一套注解简化了 Web 开发流程,实现了请求处理、参数绑定、视图渲染等核心功能。

1.2 MVC 设计模式

MVC 是一种软件架构模式,将应用分为三个核心部分:

  • Model(模型):处理业务逻辑和数据(如 JavaBean、Service、DAO)
  • View(视图):展示数据(如 JSP、HTML、Thymeleaf)
  • Controller(控制器):接收请求、协调 Model 和 View(如 SpringMVC 的 Controller)

SpringMVC 通过 DispatcherServlet(前端控制器)实现了 MVC 各组件的解耦,简化了请求处理流程。

1.3 SpringMVC 的优势

  • 与 Spring 框架无缝整合,共享 IOC 容器和 AOP 功能
  • 基于注解开发,配置简单,代码简洁
  • 灵活的参数绑定和视图解析
  • 强大的拦截器机制,便于实现权限控制、日志记录等功能
  • 支持 RESTful 风格 API 开发
  • 良好的扩展性,可集成各种视图技术和第三方框架

二、环境搭建与入门案例

2.1 开发环境准备

  • JDK:1.8 及以上
  • 构建工具:Maven 3.6+
  • Web 服务器:Tomcat 9.0+
  • IDE:IntelliJ IDEA 或 Eclipse

2.2 Maven 核心依赖

在 pom.xml 中添加 SpringMVC 及相关依赖:

<dependencies><!-- SpringMVC 核心 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><!-- Web 基础 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- JSTL(可选,用于 JSP 视图) --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl-api</artifactId><version>1.2</version></dependency>
</dependencies>

2.3 核心配置文件

2.3.1 Web 配置(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_3_1.xsd"version="3.1"><!-- 配置前端控制器 DispatcherServlet --><servlet><servlet-name>dispatcherServlet</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><!-- 启动时加载 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern> <!-- 拦截所有请求 --></servlet-mapping><!-- 编码过滤器:解决中文乱码 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
2.3.2 SpringMVC 配置(spring-mvc.xml)

配置包扫描、注解驱动、视图解析器等:

<?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:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描 Controller 包 --><context:component-scan base-package="com.controller"/><!-- 开启注解驱动:支持 @RequestMapping 等注解 --><mvc:annotation-driven/><!-- 静态资源放行 --><mvc:default-servlet-handler/><!-- 视图解析器(JSP) --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/> <!-- 视图前缀 --><property name="suffix" value=".jsp"/> <!-- 视图后缀 --></bean>
</beans>

2.4 入门案例:第一个 SpringMVC 程序

2.4.1 创建 Controller
package com.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller // 标记为控制器
public class HelloController {// 映射请求路径:http://localhost:8080/hello@RequestMapping("/hello")public String hello(Model model) {// 向模型中添加数据model.addAttribute("message", "Hello, SpringMVC!");// 返回视图名(将被解析为 /WEB-INF/jsp/hello.jsp)return "hello";}
}
2.4.2 创建视图(hello.jsp)

在 WEB-INF/jsp/ 目录下创建 hello.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC 入门</title>
</head>
<body><h1>${message}</h1> <!-- 显示模型中的数据 -->
</body>
</html>
2.4.3 运行测试
  • 将项目部署到 Tomcat
  • 访问地址:http://localhost:8080/hello
  • 页面将显示:Hello, SpringMVC!

三、SpringMVC 核心组件与工作流程

3.1 核心组件

  • DispatcherServlet:前端控制器,接收所有请求并协调其他组件
  • HandlerMapping:处理器映射,根据请求路径查找对应的 Controller 方法
  • HandlerAdapter:处理器适配器,调用 Controller 方法并适配参数
  • Controller:处理器,处理具体业务逻辑
  • ModelAndView:封装处理结果(模型数据和视图名)
  • ViewResolver:视图解析器,将视图名解析为具体视图(如 JSP)
  • View:视图,渲染模型数据并展示给用户

3.2 请求处理流程

1.客户端发送请求到 DispatcherServlet
2.DispatcherServlet 调用 HandlerMapping 查找处理该请求的 Controller 方法
3.HandlerMapping 返回处理器执行链(包含 Controller 和拦截器)
4.DispatcherServlet 调用 HandlerAdapter 适配并执行 Controller 方法
5.Controller 方法处理业务逻辑,返回 ModelAndView
6.DispatcherServlet 调用 ViewResolver 解析视图名
7.ViewResolver 返回具体 View 对象
8.DispatcherServlet 调用 View 的渲染方法,将模型数据填充到视图
9.响应结果返回给客户端

四、请求映射与参数绑定

4.1 请求映射注解

SpringMVC 通过注解映射请求路径,常用注解:
在这里插入图片描述
示例:复杂请求映射

@Controller
@RequestMapping("/user") // 类级别映射:所有方法路径前缀为 /user
public class UserController {// 完整路径:/user/list(仅接受 GET 请求)@GetMapping("/list")public String list() {return "user/list";}// 完整路径:/user/add(仅接受 POST 请求)@PostMapping("/add")public String add() {return "redirect:/user/list"; // 重定向}
}

4.2 参数绑定

SpringMVC 支持多种参数绑定方式,自动将请求参数转换为方法参数。

4.2.1 基本类型参数
// 请求路径:/user/detail?id=1&name=zhangsan
@GetMapping("/detail")
public String detail(Integer id, String name, Model model) {model.addAttribute("id", id);model.addAttribute("name", name);return "user/detail";
}
4.2.2 实体类参数

创建实体类 User:

public class User {private Integer id;private String username;private Integer age;// getter/setter
}

绑定实体类参数:

// 请求路径:/user/save?username=zhangsan&age=20
@PostMapping("/save")
public String save(User user) {// 直接使用 user 对象System.out.println(user.getUsername() + " - " + user.getAge());return "redirect:/user/list";
}
4.2.3 数组与集合参数
// 请求路径:/user/delete?ids=1&ids=2&ids=3
@GetMapping("/delete")
public String delete(Integer[] ids) {for (Integer id : ids) {System.out.println("删除:" + id);}return "redirect:/user/list";
}
4.2.4 注解绑定参数
  • @RequestParam:指定请求参数名
  • @PathVariable:绑定 URL 路径变量
  • @RequestHeader:获取请求头信息
  • @CookieValue:获取 Cookie 值
// @RequestParam 示例
@GetMapping("/search")
public String search(@RequestParam(value = "keyword", required = false, defaultValue = "") String keyword) {System.out.println("搜索关键词:" + keyword);return "search";
}// @PathVariable 示例(RESTful 风格)
@GetMapping("/user/{id}")
public String getById(@PathVariable Integer id) {System.out.println("用户 ID:" + id);return "user/detail";
}

五、视图技术与数据传递

5.1 视图解析器配置

SpringMVC 支持多种视图技术,通过 ViewResolver 配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/>
</bean>
5.1.2 Thymeleaf 视图解析器(推荐)

添加依赖:

<dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.15.RELEASE</version>
</dependency>

配置解析器:

<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"><property name="prefix" value="/WEB-INF/templates/"/><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/>
</bean><bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver" ref="templateResolver"/>
</bean><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine"/>
</bean>

5.2 数据传递方式

向视图传递数据的三种常用方式:
Model 接口:

@RequestMapping("/list")
public String list(Model model) {model.addAttribute("users", userService.findAll()); // 添加数据return "user/list";
}

ModelAndView:

@RequestMapping("/list")
public ModelAndView list() {ModelAndView mav = new ModelAndView();mav.addObject("users", userService.findAll()); // 添加数据mav.setViewName("user/list"); // 设置视图名return mav;
}

Map 集合:

@RequestMapping("/list")
public String list(Map<String, Object> map) {map.put("users", userService.findAll()); // 添加数据return "user/list";
}

六、文件上传与下载

6.1 文件上传配置

添加依赖:

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version>
</dependency>

配置文件上传解析器:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="defaultEncoding" value="UTF-8"/><property name="maxUploadSize" value="10485760"/> <!-- 最大上传大小:10MB -->
</bean>

6.2 文件上传实现

@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException {if (!file.isEmpty()) {// 获取上传目录String uploadDir = request.getServletContext().getRealPath("/upload/");File dir = new File(uploadDir);if (!dir.exists()) {dir.mkdirs(); // 创建目录}// 保存文件String fileName = file.getOriginalFilename();File destFile = new File(uploadDir + fileName);file.transferTo(destFile);}return "redirect:/file/list";
}

6.3 文件下载实现

@GetMapping("/download")
public ResponseEntity<byte[]> download(String fileName, HttpServletRequest request) throws IOException {// 获取文件路径String filePath = request.getServletContext().getRealPath("/upload/") + fileName;File file = new File(filePath);// 设置响应头HttpHeaders headers = new HttpHeaders();String downloadFileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");headers.setContentDispositionFormData("attachment", downloadFileName);headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);// 读取文件并返回return new ResponseEntity<>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
}

七、拦截器(Interceptor)

拦截器用于在请求处理前后执行自定义逻辑,如登录验证、日志记录、性能监控等。

7.1 自定义拦截器

public class LoginInterceptor implements HandlerInterceptor {// 请求处理前执行(返回 true 则继续,false 则中断)@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 验证登录状态HttpSession session = request.getSession();if (session.getAttribute("user") == null) {// 未登录,重定向到登录页response.sendRedirect(request.getContextPath() + "/login");return false;}return true;}// 请求处理后、视图渲染前执行@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 可修改模型数据}// 整个请求完成后执行(视图渲染后)@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 可记录日志、释放资源}
}

7.2 配置拦截器

在 spring-mvc.xml 中配置:

<mvc:interceptors><mvc:interceptor><!-- 拦截所有请求 --><mvc:mapping path="/**"/><!-- 排除登录相关请求 --><mvc:exclude-mapping path="/login"/><mvc:exclude-mapping path="/user/login"/><!-- 自定义拦截器 --><bean class="com.interceptor.LoginInterceptor"/></mvc:interceptor>
</mvc:interceptors>

八、异常处理

SpringMVC 提供了全局异常处理机制,统一处理应用中的异常。

8.1 自定义异常类

public class BusinessException extends RuntimeException {private String message;public BusinessException(String message) {this.message = message;}@Overridepublic String getMessage() {return message;}
}

8.2 全局异常处理器

@ControllerAdvice // 全局异常处理注解
public class GlobalExceptionHandler {// 处理 BusinessException 异常@ExceptionHandler(BusinessException.class)public ModelAndView handleBusinessException(BusinessException e) {ModelAndView mav = new ModelAndView();mav.addObject("errorMsg", e.getMessage());mav.setViewName("error"); // 跳转到错误页面return mav;}// 处理所有未捕获的异常@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception e) {ModelAndView mav = new ModelAndView();mav.addObject("errorMsg", "系统异常:" + e.getMessage());mav.setViewName("error");return mav;}
}

九、RESTful 风格开发

RESTful 是一种软件架构风格,通过 HTTP 方法(GET/POST/PUT/DELETE)表示对资源的操作,SpringMVC 对 RESTful 提供良好支持。

9.1 RESTful API 设计示例

在这里插入图片描述

9.2 实现 RESTful Controller

@RestController // 等同于 @Controller + @ResponseBody
@RequestMapping("/api/users")
public class UserRestController {@Autowiredprivate UserService userService;// 查询所有用户@GetMappingpublic List<User> findAll() {return userService.findAll();}// 查询单个用户@GetMapping("/{id}")public User findById(@PathVariable Integer id) {return userService.findById(id);}// 添加用户@PostMappingpublic ResponseEntity<Void> add(@RequestBody User user) { // @RequestBody 接收 JSONuserService.add(user);return new ResponseEntity<>(HttpStatus.CREATED); // 201 状态码}// 更新用户@PutMapping("/{id}")public ResponseEntity<Void> update(@PathVariable Integer id, @RequestBody User user) {user.setId(id);userService.update(user);return new ResponseEntity<>(HttpStatus.NO_CONTENT); // 204 状态码}// 删除用户@DeleteMapping("/{id}")public ResponseEntity<Void> delete(@PathVariable Integer id) {userService.delete(id);return new ResponseEntity<>(HttpStatus.NO_CONTENT);}
}

十、实战案例:用户管理系统

10.1 功能设计

实现用户的 CRUD 操作,包括:

  • 用户列表展示(分页)
  • 添加用户
  • 修改用户
  • 删除用户
  • 查看用户详情

10.2 代码实现(核心部分)

10.2.1 Service 层
public interface UserService {List<User> findAll(int pageNum, int pageSize); // 分页查询User findById(Integer id);void add(User user);void update(User user);void delete(Integer id);
}@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> findAll(int pageNum, int pageSize) {PageHelper.startPage(pageNum, pageSize); // 分页插件return userMapper.findAll();}// 其他方法实现...
}
10.2.2 Controller 层
@Controller
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;// 分页查询用户列表@GetMapping("/list")public String list(@RequestParam(defaultValue = "1") int pageNum,@RequestParam(defaultValue = "5") int pageSize,Model model) {List<User> users = userService.findAll(pageNum, pageSize);PageInfo<User> pageInfo = new PageInfo<>(users);model.addAttribute("pageInfo", pageInfo);return "user/list";}// 添加用户@GetMapping("/toAdd")public String toAdd() {return "user/add";}@PostMapping("/add")public String add(User user) {userService.add(user);return "redirect:/user/list";}// 其他方法...
}
10.2.3 视图页面(user/list.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>用户列表</title>
</head>
<body><table border="1"><tr><th>ID</th><th>用户名</th><th>年龄</th><th>操作</th></tr><c:forEach items="${pageInfo.list}" var="user"><tr><td>${user.id}</td><td>${user.username}</td><td>${user.age}</td><td><a href="/user/toUpdate?id=${user.id}">修改</a><a href="/user/delete?id=${user.id}">删除</a></td></tr></c:forEach></table><!-- 分页控件 --><div><a href="/user/list?pageNum=1">首页</a><a href="/user/list?pageNum=${pageInfo.prePage}">上一页</a><a href="/user/list?pageNum=${pageInfo.nextPage}">下一页</a><a href="/user/list?pageNum=${pageInfo.pages}">尾页</a></div>
</body>
</html>

十一、学习资源与进阶方向

11.1 官方资源

Spring 官方文档
SpringMVC 官方示例

11.2 进阶学习方向

  • SpringMVC 与 Spring Boot 整合:简化配置,提高开发效率
  • 前后端分离开发:结合 Vue/React 等前端框架,通过 JSON 交互
  • 安全框架整合:集成 Spring Security 或 Shiro 实现权限控制
  • API 文档生成:使用 Swagger 自动生成 API 文档
  • 异步请求处理:学习 @Async、WebFlux 等异步处理技术
http://www.dtcms.com/a/398218.html

相关文章:

  • 基于 Apache Flink DataStream 的实时信用卡欺诈检测实战
  • 线扫相机的行频计算方法
  • 视频去水印方法总结,如何去除抖音视频水印
  • 中国建设银行青浦支行网站怎样用自己的主机做网站
  • 建设公司网站怎么弄住房和城乡建设部证书查询
  • ensp学习—端口隔离
  • LVS 负载均衡
  • Spring AI 进阶之路03:集成RAG构建高效知识库
  • 【日常学习-理解Langchain】从问题出发,我理解了LangChain为什么必须这么设计
  • 科技的温情——挽救鼠鼠/兔兔的生命
  • 科技赋能噪声防控,守护职业安全健康
  • 一站式平台网站开发技术保定网站建设公司大全
  • 响应式网站自助建站深圳全网推广推荐
  • CodeArts IDE for Cangjie客户端下载与安装
  • Vue 3 —— A / 前置基础知识
  • 百度网站名称及网址网页设计素材代码
  • Apache Hive 能否脱离开Hadoop集群工作
  • 双端 FPS 全景解析:Android 与 iOS 的渲染机制、监控与优化
  • redis之缓存
  • 新网站seo外包蓟县做网站公司
  • 六一儿童节网站制作设计公司可以是高新企业
  • VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程
  • 基于物联网的智能衣柜系统的设计(论文+源码)
  • 03)阿里 Arthas(阿尔萨斯)开源的 Java 诊断工具使用-排查web项目请求后响应超时或响应慢;trace、stack、profiler指令使用
  • RNN-Gauss / RNN-GMM 模型的结构
  • Spring框架接口之RequestBodyAdvice和ResponseBodyAdvice
  • Unity 性能优化 之 打包优化( 耗电量 | 发热量 | 启动时间 | AB包)
  • 北京南站在几环山西路桥建设集团网站
  • 北京专业网站建设公司哪家好网站及备案
  • RabbitMQ-保证消息不丢失的机制、避免消息的重复消费