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

SpringMVC01:入门案例搭建(含三层架构、MVC 详解与完整代码)

一、前置知识:三层架构与 MVC 模型

1.1 三层架构(B/S 项目通用分层)

我们做的 Java Web 项目都是 B/S 架构,通常分为三层:

层级 作用 对应技术 / 框架
表现层(WEB 层) 处理客户端请求、数据交互、页面跳转 SpringMVC(本次重点)
业务层(Service 层) 处理核心业务逻辑、事务控制 Spring IoC + 事务管理
持久层(DAO 层) 操作数据库、数据持久化 MyBatis/JDBC

表现层通常采用 MVC 设计模型 ,也就是我们要学的 SpringMVC 的核心思想。

1.2 MVC 模型

MVC 是一种设计模式,全称 Model-View-Controller,各部分职责清晰:

  • Model(模型):数据封装,用 JavaBean 封装数据(比如用户、角色实体类)。

  • View(视图):数据展示,JSP/HTML 页面,用来渲染数据给用户。

  • Controller(控制器):请求分发与处理,接收用户请求、调用业务逻辑、控制页面跳转。

二、SpringMVC的入门案例

2.1 SpringMVC的概述

1.SpringMVC的概述

  • 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB框架。

  • Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。

  • 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts2等。

三、项目环境搭建(基于 Maven Web 项目)

项目名 SpringMVC01,包名要求 com.qcby,下面是完整的依赖和配置步骤。

3.1 创建如下目录结构的MavenWEB项目(选择maven---勾选模板---maven-archetype-webapp---next---输入包名和项目名---一直next,最后finish即可)

SpringMVC01
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── qcby       # 你的包名
│   │   │           ├── demo1  # 入门案例的 Controller
│   │   │           └── demo2 # RequestMapping 案例
│   │   ├── resources
│   │   │   └── springmvc.xml # SpringMVC 核心配置文件
│   │   └── webapp
│   │       ├── WEB-INF
│   │       │   ├── pages
│   │       │   │   └── suc.jsp # 成功页面
│   │       │   └── web.xml     # Web 项目核心配置文件
│   │       └── index.jsp       # 首页

image

image

3.2 导入tomcat(这里我是以其他项目进行演示的,步骤都一样)

image

image

image

image

image

image

image

image

经过上面的步骤,tomcat就配置好了

3.3 配置 pom.xml 依赖

直接复制下面的代码到你的 pom.xml:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.qcby</groupId><artifactId>SpringMVC01</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>SpringMVC01 Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><spring.version>5.0.2.RELEASE</spring.version><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- Spring 核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><!-- SpringMVC 核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- Servlet 依赖,scope=provided 避免和 Tomcat 冲突 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><!-- JSP 依赖 --><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-databind</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-core</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--><!--<dependency>--><!--<groupId>com.fasterxml.jackson.core</groupId>--><!--<artifactId>jackson-annotations</artifactId>--><!--<version>2.9.0</version>--><!--</dependency>--></dependencies><build><finalName>SpringMVC01</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.4.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.3.1</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.13.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>3.3.0</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.4.0</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>3.1.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>3.1.2</version></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></pluginManagement></build>
</project>

四、编写 JSP 页面

4.1 首页 index.jsp(webapp 目录下)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SpringMVC入门程序</title></head>
<body>
<h3>SpringMVC 入门案例</h3>
<%-- 超链接,对应 Controller 的请求路径 --%>
<a href="/hello.do">点击进入入门程序</a>
<br><br></body>
</html>

4.2 成功页面 suc.jsp(WEB-INF/pages 目录下)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功页面</title>
</head>
<body><h3>✅ 操作成功!SpringMVC 入门案例运行成功~</h3>
</body>
</html>

五、编写 Controller 控制器(核心代码)

5.1 入门案例的 HelloController(com.qcby.demo1 包下)

package com.qcby.demo1;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 控制器类,处理用户请求* 交给 Spring IoC 容器管理*/
@Controller
public class HelloController {/*** 处理首页超链接发送的请求* @return 视图名称,由视图解析器拼接路径*/@RequestMapping(path = "/hello.do")public String sayHello() {System.out.println("入门方法执行了...");// 配置视图解析器后,直接返回视图名即可,不用写完整路径return "suc";}}

六、核心配置文件编写

6.1 web.xml(WEB-INF 目录下)

配置 SpringMVC 的核心前端控制器 DispatcherServlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!-- 配置 SpringMVC 前端控制器 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:springmvc.xml</param-value></init-param><!-- 服务器启动时就加载 Servlet,初始化 SpringMVC --><load-on-startup>1</load-on-startup></servlet><!-- 配置 Servlet 映射,拦截所有 *.do 请求 --><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping>
</web-app>

6.2 springmvc.xml(resources 目录下)

配置组件扫描、视图解析器和注解驱动:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"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/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 1. 配置组件扫描,只扫描 com.qcby 包下的注解 --><context:component-scan base-package="com.qcby"/><mvc:resources location="/js/" mapping="/js/**"/><!-- 2. 配置视图解析器,拼接视图路径 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 前缀:视图文件的目录 --><property name="prefix" value="/WEB-INF/pages/"/><!-- 后缀:视图文件的扩展名 --><property name="suffix" value=".jsp"/></bean><!-- 3. 开启 SpringMVC 注解驱动,支持 @RequestMapping 等注解 --><mvc:annotation-driven/></beans>

启动tomcat可以看执行结果

七、入门案例执行流程与组件解析

7.1 完整执行流程

  1. Tomcat 启动:加载 web.xml,创建 DispatcherServlet,加载 springmvc.xml。

  2. 容器初始化:Spring 扫描 com.qcby 包,创建 HelloController 和 RoleController 对象。

  3. 请求到达:用户点击超链接,请求先到 DispatcherServlet(前端控制器)。

  4. 请求匹配:根据 @RequestMapping 注解,找到对应的 Controller 方法。

  5. 方法执行:执行 Controller 方法,返回视图名(比如 suc)。

  6. 视图解析:视图解析器拼接路径 /WEB-INF/pages/suc.jsp。

  7. 页面渲染:Tomcat 渲染 JSP 页面,返回给用户。

7.2 SpringMVC 核心组件

组件 作用
DispatcherServlet(前端控制器) 整个流程的入口,接收所有请求,分发到对应处理器
HandlerMapping(处理器映射器) 根据请求 URL 找到对应的处理器(Controller)
Handler(处理器 / Controller) 实际处理请求的类,编写业务逻辑
HandlerAdapter(处理器适配器) 适配不同类型的处理器,执行 Controller 方法
ViewResolver(视图解析器) 根据返回的视图名,拼接成完整的视图路径
View(视图) 具体的 JSP/HTML 页面,负责数据展示

八、RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

  • 作用在类上:第一级的访问目录

  • 作用在方法上:第二级的访问目录

  • 细节:路径可以不编写 / 表示应用的根目录开始

RequestMapping的属性:

  • path 指定请求路径的url

  • value value属性和path属性是一样的

  • mthod 指定该方法的请求方式

  • params 指定限制请求参数的条件

补充:

  1. path 和 value 完全等价:在 SpringMVC 源码中,两者指向同一个属性,写哪个都可以,推荐用 path,语义更清晰。

  2. method 属性:可以限制请求方式(GET/POST/PUT/DELETE 等),不指定则支持所有请求方式。

  3. params 属性:

    • 格式:params = "参数名" 表示必须携带该参数。

    • 进阶用法:params = "!username" 表示不能携带该参数;params = "username=admin" 表示参数值必须为指定值。

  4. 类上的 @RequestMapping:作用是给所有方法的路径加上统一前缀,比如类上写 /role,方法里写 /save.do,最终路径就是 /role/save.do,方便模块管理。

8.1 RequestMapping 注解案例 RoleController(com.qcby.demo2 包下)

package com.qcby.demo2;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;/*** 角色模块控制器* @RequestMapping 作用在类上:一级请求路径 /role*/
@Controller
@RequestMapping(path = "/role")
public class RoleController {// ======================================// 1. path 属性(指定请求URL路径)// ======================================@RequestMapping(path = "/save.do")public String save() {System.out.println("✅ 演示 path 属性:请求路径 /role/save.do 执行成功");return "suc";}// ======================================// 2. value 属性(和 path 完全等价)// ======================================@RequestMapping(value = "/delete.do")public String delete() {System.out.println("✅ 演示 value 属性:请求路径 /role/delete.do 执行成功");return "suc";}// ======================================// 3. method 属性(限制请求方式)// 只允许 GET 请求访问,POST 等其他方式会报 405 错误// ======================================@RequestMapping(path = "/update.do",method = {RequestMethod.GET})public String update() {System.out.println("✅ 演示 method 属性:仅 GET 请求 /role/update.do 执行成功");return "suc";}// ======================================// 4. params 属性(限制必须携带请求参数)// 必须携带 username 参数才能访问,否则报 400 错误// ======================================@RequestMapping(path = "/find.do",params = "username")public String find() {System.out.println("✅ 演示 params 属性:携带 username 参数的 /role/find.do 执行成功");return "suc";}// ======================================// 组合演示:同时使用 method + params// 仅允许 GET 请求,且必须携带 id 参数// ======================================@RequestMapping(path = "/detail.do",method = {RequestMethod.GET},params = "id")public String detail() {System.out.println("✅ 演示 method + params 组合:/role/detail.do 执行成功");return "suc";}}

另外,还需要在index.jsp文件中添加以下代码:

 <h1>SpringMVC @RequestMapping 属性演示</h1><h3>1. path 属性演示</h3><a href="/role/save.do">访问 /role/save.do(path 属性)</a><h3>2. value 属性演示</h3><a href="/role/delete.do">访问 /role/delete.do(value 属性)</a><h3>3. method 属性演示(仅允许 GET)</h3><a href="/role/update.do">访问 /role/update.do(GET 请求,method 限制)</a><h3>4. params 属性演示(必须带 username 参数)</h3><a href="/role/find.do?username=admin">访问 /role/find.do(带 username 参数,params 限制)</a><br><a href="/role/find.do">访问 /role/find.do(不带参数,会 400 错误)</a><h3>5. method + params 组合演示</h3><a href="/role/detail.do?id=1">访问 /role/detail.do(GET + 带 id 参数)</a>

启动tomcat看结果,结合后端控制台查看

image

8.2 每个属性的效果说明

image

九、常见问题与避坑指南

  • 包名问题:所有 Controller 必须在 com.qcby 包及其子包下,否则组件扫描无法识别。

  • 视图路径问题:/WEB-INF 目录下的 JSP 不能直接访问,必须通过视图解析器跳转。

  • 请求后缀问题:web.xml 中配置了 *.do,所以请求路径必须以 .do 结尾。

  • 依赖冲突问题:servlet-api 和 jsp-api 的 scope 必须设置为 provided,避免和 Tomcat 自带的 jar 包冲突。

十、总结

通过这个入门案例,你已经掌握了 SpringMVC 的核心流程:

  • 三层架构与 MVC 模型的分工。

  • SpringMVC 项目的完整搭建流程(依赖、配置、Controller、视图)。

  • @RequestMapping 注解的用法和请求映射规则。

  • SpringMVC 核心组件的职责和执行流程。

http://www.jsqmd.com/news/791657/

相关文章:

  • 如何彻底移除Windows Defender:3种模式性能优化终极指南
  • AI教材写作必备!低查重AI工具,一键生成20万字教材无压力!
  • 20253916 2025-2026-2 《网络攻防实践》实践8报告
  • 苏州网站建设公司选型指南:10家实力服务商深度评测 - 速递信息
  • ggml 架构总览:一个 107KB 头文件背后的纯 C 张量计算引擎
  • PyWxDump微信数据解析工具:3步快速备份聊天记录的完整指南
  • 鸣潮智能游戏助手:3步搞定自动化战斗,解放双手轻松游戏
  • DamaiHelper:零基础也能掌握的智能抢票终极解决方案
  • 从Nginx到APISIX:一个后端开发者的微服务网关迁移实战(含Docker部署避坑)
  • 无锡网站建设公司选型指南:10家实力服务商优势对比(含GEO与选型站) - 速递信息
  • 如何三分钟永久解锁科学文库加密PDF?ScienceDecrypting工具使用全攻略
  • PlanAndSolveAgent
  • 高效解决OFD文件兼容性问题:Ofd2Pdf免费开源转换工具完全指南
  • SITS2026千人会场无线漫游卡顿真相(2026年最新802.11ax+Wi-Fi 7协同调度实测报告)
  • 2026年无锡网站建设公司选型指南:10家优秀网站制作服务商横向对比 - 速递信息
  • 2026年降AI工具知网专项实测:五款主流工具知网AIGC检测通过率完整横评分析报告
  • 告别/deep/和::v-deep:在Vue项目中更优雅地管理组件样式的几种现代方案
  • 为什么我们做的不是普通白板,而是 AI 可视化思考工作台?
  • 探索罗技PUBG压枪宏:从技术原理到实战配置的进阶指南
  • 3分钟解锁B站评论区智能识别:开源成分检测器让用户画像一目了然
  • Umi-OCR实战指南:5大高效方案搞定图片文字识别难题
  • 解析2026年三星SDI化学价格趋势与一级代理市场定位优势
  • 3个技巧让NoFences重塑你的Windows桌面工作流
  • 思源宋体7种字重免费商用字体:从零开始打造专业中文排版系统
  • 112.Ultralytics YOLOv8实战,从数据集准备到TensorRT加速
  • Python开发者快速接入Taotoken并调用多模型指南
  • AIGC检测标准升级后降AI策略解读:2026年高校检测收严后完整免费应对方案分析
  • 如何用Fast-GitHub让GitHub下载速度提升10倍:终极加速指南
  • 如何3步搞定QQ音乐、网易云音乐加密文件,让你的音乐真正属于你
  • 别让Kinect吃灰!用C#和WPF手把手教你做个手势控制PPT翻页器(附源码)