第一部分:三层架构与MVC
1.1 三层架构
⭐ 老师强调 :Java Web开发基本都基于B/S架构,后端服务开发分三层。
| 层 | 职责 | 对应框架 |
|---|---|---|
| 表现层(Web层) | 和客户端进行数据交互,接收请求、返回响应 | Servlet → Struts → Spring MVC |
| 业务层 | 处理公司具体的业务逻辑 | Spring |
| 持久层 | 操作数据库 | JDBC → Hibernate → MyBatis |
⭐ 老师强调 :早期Servlet阶段没有业务层 ,Servlet直接拿JDBC操作数据库。Spring MVC底层仍是Servlet,只是做了上层封装。
1.2 MVC模型
⭐ 老师强调 :表现层一般采用MVC设计模型,三者各司其职。
| 部分 | 含义 | 对应 |
|---|---|---|
| Model(模型) | 数据模型,JavaBean类,用来封装数据 | 实体类(一张表对应一个类) |
| View(视图) | 展示数据给用户 | JSP、HTML、Vue |
| Controller(控制器) | 接收用户请求,整个流程的控制器 | Servlet → Spring MVC Controller |
⭐ 老师强调 :Controller管"收请求",View管"显页面",Model管"装数据",别把视图引擎和控制器弄混。
1.3 技术演进路线
⭐ 老师强调:掌握SM基础决定Spring Boot与微服务上手难度。
持久层演进:
JDBC → JdbcTemplate(Spring封装) → Hibernate(第三方) → MyBatis → MyBatis Plus
业务层演进:
(早期无) → Spring
表现层演进:
Servlet → Struts1/2 → Spring MVC → Spring Boot(仍用Spring MVC)
⭐ 老师强调:
JdbcTemplate和Spring Boot里建页面用的template包单词一样但概念不同MyBatis Plus与MyBatis同厂商,非第三方更替JdbcTemplate属Spring家族,Hibernate/MyBatis才是第三方
第二部分:Spring MVC概述
2.1 什么是Spring MVC
⭐ 老师强调 :Spring MVC是一种基于Java实现的MVC设计模型 的请求驱动类型 的轻量级WEB框架 ,属于表现层框架。
- 属于Spring Framework的后续产品,已融合在Spring Web Flow里
- Spring框架提供了构建Web应用程序的全功能MVC模块
- 基于Java实现MVC设计理念、请求驱动型
2.2 与Struts2对比
⭐ 老师强调:Struts2已淘汰,不用对比,重点掌握Spring MVC流程。
第三部分:创建项目与引入依赖
3.1 选择项目类型
⭐ 老师强调 :用IDEA创建项目有五种方式 ,演示Spring MVC要选有页面的。
| 创建方式 | 是否适合演示 |
|---|---|
| 普通Java | ❌ 无页面 |
| 普通Java Web | ⭕ 需手动导jar包,维护困难 |
| Maven Java | ❌ 无页面 |
| Maven Java Web | ✅ 推荐,pom文件管依赖 |
| Spring Boot | ⏸️ 集成版,暂不考虑 |
⭐ 老师强调 :选Maven Java Web而非普通Java Web,原因是Spring MVC需导依赖,普通版要自己维护jar包,Maven版用pom文件导依赖更方便演示流程。
3.2 引入依赖
pom.xml:
<!-- 版本锁定 -->
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring整合web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring整合mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- servlet依赖(provided,Tomcat自带) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!-- jsp依赖(provided,Tomcat自带) -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
⭐ 老师强调:
spring-context是根基spring-web用于web层(表现层)spring-webmvc用于MVC(MVC本非Spring自带,是外部研究成果被插入式融入)- Spring MVC底层就是Servlet,所以servlet依赖必须保留
- 缩进用Tab,别用空格
第四部分:入门案例编写
4.1 页面编写
index.jsp(首页):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>入门程序</title>
</head>
<body>
<h3>入门</h3>
<a href="/hello.do">入门程序</a>
</body>
</html>
suc.jsp (成功页,路径:/WEB-INF/pages/suc.jsp):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>成功</title>
</head>
<body>
<h3>入门成功了...</h3>
</body>
</html>
⭐ 老师强调:index页面用超链接请求控制器,成功页只需简单写h3标题。
4.2 Controller编写
package com.qcby.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 控制器类,处理用户的请求
*/
@Controller // 把当前类交给IOC容器进行管理
public class HelloController {
/**
* 处理超链接发送出来的请求
*/
@RequestMapping("/hello.do") // 配置映射的路径
public String sayHello() {
System.out.println("入门方法执行了...");
// 配置视图解析器后,直接写视图名
return "suc";
}
}
⭐ 老师强调:
- 类名首字母必须大写 ,不能出现下划线,用驼峰命名
@Controller:一是声明该类为控制器类(表现层,接收请求);二是将类交给框架管理(IOC容器)@RequestMapping:匹配前端请求的url,本质可理解为处理器映射器
4.3 web.xml配置(前端控制器)
<!-- 配置前端控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc.xml配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置启动加载 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
⭐ 老师强调:
DispatcherServlet统一拦截请求,无需自己写Servlet- 以前的Servlet是"一个请求一个Servlet类",Spring MVC是"一个模块一个Controller类,里面多个方法"
- 返回的字符串本身不是页面 ,必须经
DispatcherServlet才能对应到suc页面
4.4 springmvc.xml配置
<?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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1. 配置注解扫描器:扫描包下所有类的注解 -->
<context:component-scan base-package="com.qcby"></context:component-scan>
<!-- 2. 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 3. 开启注解mvc的支持(可选) -->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
⭐ 老师强调:
- 配置文件必须有名称空间、版本号、编码三样,缺一不可
- 不配注解扫描器,框架就不认识
@Controller,扫描范围要覆盖子包- 开启注解支持容易漏掉 ,但它是硬性要求;
load-on-startup是可选优化
第五部分:执行流程与核心组件
5.1 执行流程
⭐ 老师强调:整个流程是"加载配置→Servlet拦截→找Controller→处理→视图解析返页",各配置环环相扣才生效。
① 启动Tomcat,配置了load-on-startup,创建DispatcherServlet对象,加载springmvc.xml
↓
② 开启注解扫描,HelloController对象被创建
↓
③ 从index.jsp发送请求,先到达DispatcherServlet(前端控制器)
↓
④ DispatcherServlet根据配置的@RequestMapping注解找到执行的具体方法
↓
⑤ 方法返回"suc",根据配置的视图解析器,拼接前缀+后缀
↓
⑥ 去/WEB-INF/pages/下查找suc.jsp文件
↓
⑦ Tomcat渲染页面,做出响应
5.2 六大核心组件
⭐ 老师强调 :Spring MVC是组件式开发 ,核心组件可归为三组。
| 组件 | 英文 | 职责 |
|---|---|---|
| 前端控制器 | DispatcherServlet | 统一接收请求,调度其他组件 |
| 处理器映射器 | HandlerMapping | 建立url与方法的映射(找哪个方法) |
| 处理器适配器 | HandlerAdapter | 调用对应方法(怎么调方法) |
| 处理器 | Handler | 即Controller类 |
| 视图解析器 | ViewResolver | 拼前缀后缀,找页面 |
| 视图 | View | 最终页面(JSP/HTML) |
⭐ 老师强调:
- 前端控制器、处理器映射器、处理器适配器三者归为一类,共同承担"请求接收并匹配到具体处理方法"的职责
- 处理器映射器(找哪个方法)和处理器适配器(怎么调方法)不要混淆
@RequestMapping就是处理器映射器(学名HandlerMapping,俗称RequestMapping)
5.3 Controller拆分三部分
⭐ 老师强调:Controller被拆成了三部分。
处理器 → Controller类
处理器适配器 → 适配方法
处理器映射器 → HandlerMapping(@RequestMapping)
第六部分:@RequestMapping注解
6.1 作用
⭐ 老师强调 :
@RequestMapping的作用是建立请求URL 和处理方法之间的对应关系。
- 作用在类上:第一级访问目录
- 作用在方法上:第二级访问目录
- 路径可以不写
/,表示应用的根目录开始
6.2 四个属性
| 属性 | 说明 |
|---|---|
path |
指定请求路径的url |
value |
和path属性一样 |
method |
指定该方法的请求方式 |
params |
指定限制请求参数的条件 |
示例:
@Controller
@RequestMapping(path = "/role") // 一级请求路径
public class RoleController {
@RequestMapping(path = "/save.do", method = {RequestMethod.GET}, params = "username")
public String save() {
System.out.println("保存角色...");
return "suc";
}
@RequestMapping(value = "/delete.do") // 二级请求路径
public String delete() {
System.out.println("删除角色...");
return "suc";
}
}
⭐ 老师强调 :1级注在类、2级注在方法,两者拼起来才完整匹配请求 (如
/role/save.do),别以为都写在方法上。
6.3 URL映射规则(三种)
⭐ 老师强调:映射规则在讲Servlet时已说过,这里需回顾旧笔记。
| 匹配方式 | 写法 | 优先级 |
|---|---|---|
| 完全路径匹配 | /c/hello |
最高 |
| 目录匹配 | 前缀匹配后接/ |
中 |
| 扩展名匹配 | *.do |
最低 |
⭐ 老师强调 :扩展名匹配不能写
/星.do,应直接写*.do,没有"杠星点度"这种写法。
附录一:Spring MVC请求处理流程图
浏览器发起请求
│
▼
DispatcherServlet(前端控制器,统一拦截)
│
▼
HandlerMapping(处理器映射器,根据url找方法)
│
▼
HandlerAdapter(处理器适配器,调用方法)
│
▼
Controller(处理器,执行业务逻辑)
│
▼
返回视图名 "suc"
│
▼
ViewResolver(视图解析器,拼前缀后缀)
│
▼
/WEB-INF/pages/suc.jsp(视图)
│
▼
Tomcat渲染页面,响应浏览器
⭐ 老师总结 :Spring MVC是表现层框架 ,基于MVC设计模型,底层是Servlet封装。三层架构中表现层用Spring MVC,业务层用Spring,持久层用MyBatis。入门案例需:引入依赖→写页面→写Controller→配web.xml前端控制器→配springmvc.xml(扫描器+视图解析器)。执行流程是DispatcherServlet统一拦截→映射器找方法→适配器调方法→视图解析器找页面。六大组件中,前三个(前端控制器、映射器、适配器)负责"请求接收与路由",后两个(解析器、视图)负责"页面呈现"。
结构如图




