SpringMVC 系列博客(一):基础概念与注解开发入门

目录

一、引言

二、MVC 模式:SpringMVC 的设计基石

2.1 MVC 三大组件

2.2 主流 MVC 框架对比

2.3 MVC 模式的核心优势

三、SpringMVC 框架:是什么?为什么学?

3.1 什么是 SpringMVC?

3.2 为什么要学 SpringMVC?(对比原生 Servlet)

四、SpringMVC 执行流程:从请求到响应的完整链路

4.1 核心组件(无需手动开发,框架提供)

4.2 完整执行流程(图文解析)

五、注解开发 SpringMVC:手把手搭建入门程序

5.1 前置准备

5.2 步骤 1:创建 Maven Web 项目

5.3 步骤 2:添加依赖(pom.xml)

5.4 步骤 3:配置前端控制器(web.xml)

5.5 步骤 4:编写 SpringMVC 核心配置(springmvc.xml)

5.6 步骤 5:开发控制器(Controller)

5.7 步骤 6:开发视图页面

5.8 步骤 7:测试程序

六、入门常见问题解决

6.1 URL 拦截规则:/ vs /* 的区别

6.2 POST 请求参数乱码

七、第一篇总结


一、引言

        在 Java Web 开发中,MVC 设计模式是实现代码解耦、提高项目可维护性的核心思想,而SpringMVC作为 Spring 生态体系下的 MVC 框架,凭借其与 Spring 的无缝集成、灵活的配置和简洁的开发风格,早已取代 Struts2 成为主流选择。本文作为系列博客的第一篇,将从 MVC 模式基础入手,带你理解 SpringMVC 的核心定位、执行流程,并手把手教你搭建第一个注解驱动的 SpringMVC 入门程序。

二、MVC 模式:SpringMVC 的设计基石

        在学习 SpringMVC 前,必须先掌握 MVC 模式的核心思想 —— 它将应用程序分为三个独立部分,实现 “职责分离”。

2.1 MVC 三大组件

  • Model(模型):分为 “业务模型” 和 “数据模型”。业务模型封装业务逻辑(如用户登录校验、订单计算),数据模型封装数据(如 User、Order 实体类),是应用程序的 “数据与逻辑核心”。
  • View(视图):负责数据展示,即用户看到的界面(如 JSP、HTML、Freemarker),仅关注 “如何显示数据”,不处理业务逻辑。
  • Controller(控制器):作为 “中间枢纽”,接收用户请求,调用 Model 处理业务,再将处理结果传递给 View 展示,实现 View 与 Model 的解耦。

2.2 主流 MVC 框架对比

框架特点适用场景
SpringMVC与 Spring 无缝集成、注解驱动、轻量灵活中大型企业级项目(主流)
Struts2功能全面但配置复杂、性能略低传统项目(逐渐被淘汰)
JFinal轻量级、API 简洁、开发效率高小型项目或快速原型开发

2.3 MVC 模式的核心优势

  1. 解耦:View 与 Model 分离,同一业务逻辑可对应多个视图(如 PC 端、移动端页面)。
  2. 可维护性:各组件职责单一,修改视图不影响业务逻辑,修改业务不影响视图。
  3. 可扩展性:新增功能只需新增 Controller 或 Model,无需改动现有视图。

三、SpringMVC 框架:是什么?为什么学?

3.1 什么是 SpringMVC?

  • 定位:SpringMVC 是 Spring Framework 的子框架,本质是对 Servlet 的封装,解决了原生 Servlet 的痛点(如请求映射繁琐、参数接收复杂)。
  • 核心特性
    1. 注解驱动:通过@Controller@RequestMapping等注解,让普通 POJO 成为控制器,无需实现接口。
    2. 松散耦合:支持可插拔组件(如视图解析器、参数绑定组件),扩展性强。
    3. 无缝集成 Spring:可直接使用 Spring 的 IOC、AOP 等功能(如依赖注入 Service 层)。
    4. 易测试:支持 Web 层单元测试,无需启动服务器即可测试控制器。

3.2 为什么要学 SpringMVC?(对比原生 Servlet)

原生 Servlet 开发存在三大痛点,而 SpringMVC 完美解决:

  1. 请求映射繁琐:100 个请求需写 100 个 Servlet,即使合并 Servlet 也需手动判断请求路径,耦合度高;SpringMVC 通过@RequestMapping一键绑定 URL。
  2. 参数接收复杂:需手动调用request.getParameter("username")获取参数,还需手动类型转换(如 String 转 Integer);SpringMVC 自动完成参数绑定与类型转换。
  3. 解耦不足:Servlet 与业务逻辑代码耦合,难以维护;SpringMVC 通过 Controller 调用 Service,层次清晰。

四、SpringMVC 执行流程:从请求到响应的完整链路

SpringMVC 的执行流程依赖其核心组件的协作,理解流程是掌握框架的关键。

框架处理流程图:

4.1 核心组件(无需手动开发,框架提供)

  1. 前端控制器(DispatcherServlet):全局入口,接收所有请求,转发给其他组件处理,降低组件耦合。
  2. 处理器映射器(HandlerMapping):根据请求 URL 查找对应的 “处理器(Controller 方法)”,返回 HandlerExecutionChain(包含处理器和拦截器)。
  3. 处理器适配器(HandlerAdapter):适配不同类型的处理器(如注解式、接口式),调用处理器的业务方法。
  4. 处理器(Handler/Controller):开发者编写的 Controller 类,封装业务逻辑,返回 ModelAndView(模型数据 + 逻辑视图名)。
  5. 视图解析器(ViewResolver):将 “逻辑视图名”(如 "ok.jsp")解析为 “物理视图”(如/WEB-INF/jsp/ok.jsp)。
  6. 视图(View):开发者编写的 JSP/HTML,渲染 Model 中的数据并响应给用户。

4.2 完整执行流程(图文解析)

  1. 用户发送请求(如http://localhost:8080/reg.do),请求被DispatcherServlet拦截。
  2. DispatcherServlet 调用HandlerMapping,根据 URL 找到对应的 Controller 方法(如UserControllershow()方法)。
  3. DispatcherServlet 调用HandlerAdapter,适配并调用找到的 Controller 方法。
  4. Controller 方法执行业务逻辑,返回ModelAndView(如模型数据uname=张三,逻辑视图名ok.jsp)。
  5. DispatcherServlet 调用ViewResolver,将逻辑视图名ok.jsp解析为物理视图路径(如/ok.jsp)。
  6. ViewResolver 返回 View 对象,DispatcherServlet 调用 View 的render()方法,渲染 Model 数据到视图。
  7. 渲染完成后,DispatcherServlet 将响应结果返回给用户,流程结束。

五、注解开发 SpringMVC:手把手搭建入门程序

        本节将基于 IDEA+Maven+Tomcat,实现一个 “用户注册” 功能,涵盖环境搭建、配置编写、控制器开发全流程。

5.1 前置准备

  1. IDEA 版本:需旗舰版(Community 版不支持 Web 开发),下载地址:JetBrains IDEA。
  2. Tomcat 配置
    • 解压 Tomcat 到本地(如D:\Tomcat8.5)。
    • IDEA 中依次点击:Run → Edit Configurations → Templates → Tomcat Server → Local → Configure,选择 Tomcat 解压路径。
    • 新建 Tomcat 配置:点击+ → Tomcat Server → Local,设置 Name(如 Tomcat8.5),在Deployment中添加项目的war exploded包。

5.2 步骤 1:创建 Maven Web 项目

  1. 新建项目:New Project → Maven → 勾选Create from archetype → 选择org.apache.maven.archetypes:maven-archetype-webapp
  2. 填写项目信息:GroupId(如com.jr)、ArtifactId(如springmvc-demo)、Version(如1.0-SNAPSHOT)。
  3. 补全目录:项目创建后,手动在src/main下添加java(标记为 Sources Root)和resources(标记为 Resources Root)目录。

5.3 步骤 2:添加依赖(pom.xml)

需引入 Spring 核心包、SpringMVC 包、Servlet/JSP 包、JSTL 包,完整依赖如下:

<dependencies><!-- JUnit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!-- Spring核心包 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.1.6.RELEASE</version></dependency><!-- SpringMVC包 --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.1.6.RELEASE</version></dependency><!-- Servlet/JSP依赖 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.3</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><!-- JSTL标签库 --><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency>
</dependencies>

5.4 步骤 3:配置前端控制器(web.xml)

前端控制器是 SpringMVC 的入口,需在WEB-INF/web.xml中配置,核心作用是拦截请求并转发:

<web-app version="2.5"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- 欢迎页 --><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 配置SpringMVC前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 指定SpringMVC配置文件路径(默认在WEB-INF/[servlet-name]-servlet.xml) --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 启动Tomcat时自动加载Servlet --><load-on-startup>1</load-on-startup></servlet><!-- 拦截规则:/ 表示拦截所有请求(除JSP外) --><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 配置乱码过滤器(解决POST请求参数乱码) --><filter><filter-name>charsetFilter</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>charsetFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>

5.5 步骤 4:编写 SpringMVC 核心配置(springmvc.xml)

src/main/resources下创建springmvc.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:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"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.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 1. 扫描Controller注解(指定包路径) --><context:component-scan base-package="com.jr.controller"/><!-- 2. 开启注解驱动:自动加载处理器映射器、处理器适配器 --><mvc:annotation-driven/><!-- 3. 静态资源放行(如JS、CSS、图片,避免被DispatcherServlet拦截) --><mvc:resources location="/js/" mapping="/js/**"/><mvc:resources location="/images/" mapping="/images/**"/>
</beans>

5.6 步骤 5:开发控制器(Controller)

src/main/java/com/jr/controller下创建UserController,使用@Controller标记为控制器,@RequestMapping绑定请求路径:

package com.jr.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;@Controller // 标记此类为SpringMVC控制器
public class UserController {// 绑定请求路径:http://localhost:8080/reg.do@RequestMapping("reg.do")public ModelAndView register(HttpServletRequest request) {// 1. 创建ModelAndView对象(封装模型数据和视图名)ModelAndView mv = new ModelAndView();// 2. 接收请求参数(此处用原生Servlet API,后续会优化)String username = request.getParameter("username");String password = request.getParameter("password");// 3. 封装模型数据(存入request作用域,供视图使用)mv.addObject("uname", username); // 等价于request.setAttribute("uname", username)// 4. 指定逻辑视图名(视图解析器会解析为物理路径)mv.setViewName("ok.jsp");return mv;}
}

5.7 步骤 6:开发视图页面

注册页面(index.jsp):在webapp下创建,提供用户输入表单:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户注册</title>
</head>
<body>
<form action="reg.do" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="提交注册">
</form>
</body>
</html>

成功页面(ok.jsp):在webapp下创建,展示注册成功信息:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注册成功</title>
</head>
<body>
<h3>注册成功!欢迎您,${uname}!</h3> <!-- EL表达式获取模型数据 -->
</body>
</html>

5.8 步骤 7:测试程序

  1. 启动 Tomcat,访问http://localhost:8080/springmvc-demo/(项目上下文路径根据配置调整)。
  2. 输入用户名和密码,点击 “提交注册”,页面跳转至ok.jsp并显示欢迎信息,说明程序运行成功。

六、入门常见问题解决

6.1 URL 拦截规则:/ vs /* 的区别

  • /:拦截所有请求(除 JSP 外),是 SpringMVC 推荐配置。JSP 由 Tomcat 的 JspServlet 处理,不会被拦截,可正常渲染。
  • /*:拦截所有请求(包括 JSP),会导致 JSP 被 DispatcherServlet 当作控制器处理,找不到对应映射而报 404 错误,禁止使用

6.2 POST 请求参数乱码

        如步骤 3 中配置的CharacterEncodingFilter,通过encoding=UTF-8强制设置请求和响应的字符编码,解决 POST 乱码问题(GET 乱码需修改 Tomcat 的server.xml,添加URIEncoding="UTF-8")。

七、第一篇总结

        本文从 MVC 模式基础出发,讲解了 SpringMVC 的核心定位、执行流程,并通过 “用户注册” 案例完整演示了注解开发的入门流程。你已掌握:

  1. MVC 模式的三大组件与职责分离思想;
  2. SpringMVC 的核心特性与执行流程;
  3. 基于 Maven+IDEA 的 SpringMVC 环境搭建;
  4. 控制器开发与请求映射、视图跳转的基本用法。

        下一篇博客将深入 SpringMVC 的核心功能,讲解请求映射、返回值类型与参数绑定,带你实现更灵活的业务逻辑开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/97928.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/97928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 字符串操作教程:三个任务完整复现与解析

这次是完成一些小任务来试试身手&#xff0c;免得生疏&#xff1a; 编写程序&#xff0c;使用charAt和length方法&#xff0c;将字符串"HelloWorld"拆分为"Hello"和"World"两个子串并输出。 设计一个方法&#xff0c;利用indexOf和lastlndexOf&a…

向量技术研究报告:从数学基础到AI革命的支柱

1. 向量的数学本质与历史演变 1.1 核心定义与数学表示 向量是同时具有大小&#xff08;Magnitude&#xff09;和方向&#xff08;Direction&#xff09;的量&#xff0c;在数学上被严格定义为向量空间中的元素。与仅有大小的标量&#xff08;Scalar&#xff09;不同&#xff0c…

Qt QHorizontalStackedBarSeries详解

1、概述QHorizontalStackedBarSeries 是 Qt Charts 模块中的一个类&#xff0c;用于创建水平堆叠条形图。它继承自 QAbstractBarSeries 类&#xff0c;允许将多个数据系列堆叠在一起显示&#xff0c;每个条形由多个部分组成&#xff0c;这些部分共同构成一个完整的条形&#xf…

《股票智能查询与投资决策辅助应用项目方案》

前引&#xff1a;本股票智能查询与投资决策辅助应用通过整合多源金融数据&#xff0c;运用量化分析 机器学习技术&#xff0c;为普通投资者提供全方位股票信息服务和个性化投资建议。系统不仅解决了传统工具 “数据分散、分析复杂” 的问题&#xff0c;更通过人性化交互和直观…

从零开始构建Kubernetes Operator:一个完整的深度学习训练任务管理方案

从零开始构建Kubernetes Operator&#xff1a;一个完整的深度学习训练任务管理方案一、引言二、为什么需要Operator&#xff1f;1. Controller vs Operator&#xff1a;本质区别2. 有状态服务 vs 无状态服务的挑战三、项目架构设计3.1整体架构图3.2核心组件4.核心实现解析1. CR…

第二十二篇|新世界语学院教育数据深度解析:学制函数、能力矩阵与升学图谱

第二十二篇&#xff5c;新世界语学院教育数据深度解析&#xff1a;学制函数、能力矩阵与升学图谱 系列主题&#xff1a;500所日本语言学校结构数据工程 关键词&#xff1a;新世界语学院、东京新宿、学制函数建模、JLPT能力矩阵、升学网络、教育数据工程 一、合规与法人建模&…

Java开发工具选择指南:Eclipse、NetBeans与IntelliJ IDEA对比

在Java开发的世界里&#xff0c;选择合适的开发工具就如同挑选一把称手的禅杖&#xff0c;能助你在代码修行的路上更加得心应手。本文将为Java开发者提供一份实用的IDE选择指南&#xff0c;从功能、适用人群、性能等方面深入解析几款主流的Java开发工具&#xff0c;帮助你找到最…

iOS App 内存泄漏与性能调优实战 如何排查内存问题、优化CPU与GPU性能、降低耗电并提升流畅度(uni-app iOS开发优化指南)

在 iOS 应用开发中&#xff0c;内存泄漏 是最常见且最难排查的性能问题之一。 它会导致应用 运行越来越卡、占用内存过高、频繁崩溃&#xff0c;甚至严重消耗电池。 尤其在 uni-app 跨平台开发 中&#xff0c;JS 层和原生层的混合调用更容易隐藏内存问题&#xff1a; 对象未释放…

从源代码开始构建、部署和管理应用程序

1.创建项目目录并准备应用程序的代码及其依赖1.创建项目目录&#xff0c;并将当前目录切换到该目录[roothost1 ~]# mkdir python-web && cd python-web2.创建 app.py 文件并添加以下代码[roothost1 python-web]# vi app.py [roothost1 python-web]# cat app.py import …

Flutter-[2]第一个应用

摘要 根据官方文档搭配好环境&#xff0c;使用vscode创建完应用后&#xff0c;会遇到以下问题 设备无法选择打开了lib\main.dart右上角也没有运行按钮 环境 Windows11Flutter 3.35.4 必要设置 1. 查看是否开启Windows桌面应用开发flutter config --list输出如下: All Settings:…

QListWidget选择阻止问题解决方案

QListWidget选择阻止问题解决方案QListWidget选择阻止问题解决方案问题背景QListWidget工作机制详解1. 事件处理流程2. 关键机制说明2.1 鼠标事件与信号的分离2.2 信号阻塞的局限性2.3 断开连接方法的问题问题的根本原因1. 异步事件处理2. 多层状态管理3. 事件优先级解决方案演…

TCL华星计划投建第8.6代印刷OLED产线

近日&#xff0c;TCL科技集团股份有限公司&#xff08;000100.SZ&#xff09;发布公告&#xff0c;公司、旗下子公司TCL华星与广州市人民政府、广州经济技术开发区管理委员会共同签署项目合作协议&#xff0c;拟共同出资于广州市建设一条月加工2290mm2620mm玻璃基板能力约2.25万…

MATLAB 时间序列小波周期分析

1. 文件结构 WaveletPeriod/ ├── main_wavelet_period.m % 一键运行 ├── wavelet_power_spectrum.m % 小波功率谱 显著性 ├── period_peak_detect.m % 自动周期峰值 ├── plot_wavelet_results.m % 时频图 周期图 └── example/└── temp.csv …

如何精准配置储

当电费账单变身利润引擎&#xff0c;您的企业是否做好了准备&#xff1f;鹧鸪云储能仿真软件&#xff0c;不止于仿真——我们以智能算法为核心&#xff0c;为企业定制“高收益、高适配、可持续”的储能配置方案&#xff0c;将用电数据转化为新一轮增长动能。智慧大脑&#xff1…

Uniapp崩溃监控体系构建:内存泄漏三维定位法(堆栈/资源/线程)

在Uniapp开发中&#xff0c;内存泄漏是导致应用崩溃的核心隐患。通过堆栈分析、资源追踪和线程监控三维定位法&#xff0c;可系统化定位泄漏源。以下是完整实施方案&#xff1a;一、堆栈维度&#xff1a;泄漏对象溯源内存快照比对使用Chrome DevTools定期获取内存快照&#xff…

NLP中Subword算法:WordPiece、BPE、BBPE、SentencePiece详解以及代码实现

本文将介绍以下内容&#xff1a; 1. Subword与传统tokenization技术的对比2. WordPiece3. Byte Pair Encoding (BPE)4. Byte-level BPE(BBPE)5. SentencePiece 以及各Subword算法代码实现 一、Subword与传统tokenization技术的对比 1. 传统tokenization技术 传统tokenizatio…

十一章 无界面压测

一、采用无界面压测的原因1.节约系统资源。 2.更快捷&#xff0c;只需要启动命令即可进行压测 3.主要是用于性能压测集成.无界面压测命令参数&#xff1a; -n 表示无界面压测 -t 制定你的 jmx 脚本 -l 生成 jtl 测试报告二、注意配置文件设置:输出为xml jmeter.save.s…

从零实现 Qiankun 微前端:基座应用控制子应用路由与信息交互

随着前端业务的快速发展,单体应用模式(Monolith)越来越难以支撑复杂业务场景。微前端(Micro Frontends)应运而生,它将大型应用拆解成多个子应用(Micro App),通过主应用进行统一调度和集成。 在微前端技术栈中,Qiankun(乾坤)是一个广泛使用的解决方案,基于 single…

在业务应用中集成 go-commons,实现应用+系统双指标监控

在日常 Go 服务开发中&#xff0c;我们通常需要同时监控 业务指标&#xff08;比如 QPS、请求延迟、错误率&#xff09;&#xff0c;也需要关注 系统指标&#xff08;CPU、内存、磁盘占用情况&#xff09;。 过去这类场景通常要引入多个库&#xff1a;一个负责业务指标采集&…

容器化部署番外篇之docker网络通信06

一、四种网络模式 Bridge模式&#xff1a;容器的默认网关&#xff0c;默认新建容器的网络模式Host模式&#xff1a;容器和宿主机共用一个 Network&#xff0c;使用主机的IP:PORT就可以访问容器&#xff0c;但安全性不高&#xff0c;用得少Container模式&#xff1a;这个模式指定…