Spring MVC入门与执行流程

第一部分:三层架构与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统一拦截→映射器找方法→适配器调方法→视图解析器找页面。六大组件中,前三个(前端控制器、映射器、适配器)负责"请求接收与路由",后两个(解析器、视图)负责"页面呈现"。

结构如图

相关推荐
雨中飘荡的记忆1 小时前
子代理和 Skills 怎么写?3 个实用例子
后端
IT_陈寒1 小时前
一文搞懂React的核心概念
前端·人工智能·后端
高频因子挖掘机1 小时前
多只股票的 K 线日期对不上怎么办?用 Pandas MultiIndex 处理时间序列对齐
后端·github·api
高频因子挖掘机2 小时前
行情 API 返回了数据,为什么量化策略仍然会出错?用分层设计隔离数据故障
后端·github·api
十年Java程序媛10 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
我是人✓10 小时前
SpringBoot静态资源映射揭秘
java·spring boot·后端
全栈弄潮儿10 小时前
Python实战第7期:字典与集合
后端·python·编程语言
码事漫谈10 小时前
DeepSeek 又更新!但怎么有个分数往下掉?
后端
吃饱了得干活10 小时前
用 PageHelper 同步数据到 ES:能跑,但这几个坑得先知道
后端·elasticsearch