SpringMVC:执行原理详解、配置文件和注解开发实现 SpringMVC

news2025/2/5 8:12:43

文章目录

  • SpringMVC - 01
  • 一、概述
  • 二、SpringMVC 执行原理
  • 三、使用配置文件实现 SpringMVC
  • 四、使用注解开发实现 SpringMVC
    • 1. 步骤
    • 2. 实现
  • 五、总结
  • 注意:

SpringMVC - 01

一、概述

SpringMVC 官方文档:点此进入

有关 MVC 架构模式的内容见之前的笔记:点此进入

  1. SpringMVC 是 Spring Framework 的一部分,是基于 Java 实现 MVC 的轻量级 Web 框架,底层还是 Servlet;
  2. Spring 的 Web 框架是围绕 DispatcherServlet调度 Servlet】设计的:
    • DispatcherServlet 的本质:是一个 Servlet;
    • DispatcherServlet 的作用:将请求分发到不同的处理器。
  3. SpringMVC 的控制中心:DispatcherServlet;
  4. SpringMVC 的核心三要素:处理器映射器、处理器适配器、视图解析器;
  5. SpringMVC 与 Spring 兼容性好,无缝结合,并且功能强大:支持 RESTful 风格、异常处理、数据验证、格式化、本地化等;
  6. SpringMVC 以请求为驱动,围绕一个中心 Servlet 分派请求及提供其他功能。

二、SpringMVC 执行原理

下图为 SpringMVC 的执行流程图实线是 SpringMVC 框架提供的技术,不需要开发者实现,虚线需要实现。

组件

  • DispatcherServlet :前端控制器,是整个 SpringMVC 的控制中心,作用:接收请求,响应结果,相当于电脑的 CPU;
  • HandlerMapping :处理器映射器,作用:根据 URL 查找处理器;
  • Handler :处理器,也称 Controller,和 Servlet 扮演的角色一致,作用:执行相关的请求处理逻辑,并返回相应的数据和视图信息,将其封装至 ModelAndView 对象中;
  • HandlerExecutionChain:执行链,包含了处理器 Handler;
  • HandlerAdapter :处理器适配器,作用:按照特定规则去执行 Handler;
  • ViewReslover :视图解析器,作用:进行视图解析;
  • ModelAndView :SpringMVC 的底层对象,包括 Model 数据模型和 View 视图信息。

步骤

1 :用户发起请求到前端控制器 DispatcherServlet;

2 :前端控制器请求处理器映射器 HandlerMappering 去通过 xml 配置或者注解来查找处理器 Handle;

3-4 :找到处理器 Handle 以后 HandlerMappering 向前端控制器返回一个执行链 HandlerExecutionChain(包含了 Handle);

5 :前端控制器 DispatcherServlet 调用处理器适配器 HandlerAdapter 去执行处理器 Handler;

6 :处理器适配器去执行 Handler;

7 :Handler 执行完给处理器适配器 HandlerAdapter 返回 ModelAndView;

8 :处理器适配器 HandlerAdapter 向前端控制器返回 ModelAndView;

9 :前端控制器 DispatcherServlet 请求视图解析器 ViewResolver 去进行视图解析;

10 :视图解析器 ViewResolver 向前端控制器返回 View;

11 :前端控制器根据 View 对视图进行渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);

12 :前端控制器向用户响应结果。

备注

  1. SpringMVC 执行原理概述:拦截请求、解析 URL 找到处理器 Handle、执行 controller、解析数据和视图并展示。

  2. SpringMVC 执行原理参考文档

    • 参考文档 1:点此进入
    • 参考文档 2:点此进入

三、使用配置文件实现 SpringMVC

使用配置文件实现 SpringMVC 主要是为了理解 SpringMVC 的执行原理,步骤如下:

  • 创建一个普通的 Maven 项目,导入依赖
<!-- Servlet 依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>

<!-- JSP 依赖 -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
</dependency>

<!-- JSTL 表达式依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

<!-- standard 标签库 -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

<!-- spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>

<!-- junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>
  • 新建一个普通的 Maven 模块,在模块上右键选择 Add Framework Support... 后勾选 Web Application(4.0) 将模块转变为一个 Web 模块。注意:因为没有使用模板创建 Web 项目,所以此时生成的 web 文件夹不在 main 文件下,这样生成的 out 文件夹中没有依赖,所以要打开项目结构,建立 lib 文件夹,导入依赖

  • web.xml 中配置 DispatcherServlet 前端控制器(整个 SpringMVC 的控制中心
<?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_4_0.xsd"
         version="4.0">

    <!-- 配置 DispatcherServlet 前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- DispatcherServlet 绑定 Spring 的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 启动级别:1,和服务器一起启动 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

  • 编写 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 处理器映射器 -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <!-- 处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- BeanNameUrlHandlerMapping:根据 bean 的名字找到处理器映射器 -->
    <bean id="/hello" class="com.Sun3285.controller.ControllerDemo01"/>

</beans>

在这里插入图片描述

  • 编写一个 Controller(处理器 Handler)实现 Controller 接口,重写方法(实现业务代码、视图跳转)

  • 编写要跳转的页面

  • 配置 Tomcat,测试

提示:可以将以上代码与第二部分 SpringMVC 的执行原理相对应起来看,可以加深理解


四、使用注解开发实现 SpringMVC

实际中,经常使用注解开发实现 SpringMVC,使用到的注解有:

注解说明
@Controller将编写的控制类注册为 bean,由 Spring 容器进行管理
@RequestMapping(“请求路径”)完成映射关系,根据请求路径找到对应的处理器(Controller 控制器)

1. 步骤

注解开发步骤如下:

  1. 创建一个普通的 Maven 项目,导入依赖;
  2. 新建一个普通的 Maven 模块,转变为一个 Web 模块,打开项目结构,建立 lib 文件夹,添加依赖;
  3. web.xml 中配置 DispatcherServlet 前端控制器:
    • 配置 DispatcherServlet 前端控制器;
    • 绑定 Spring 的配置文件;
    • 设置启动级别。
  4. 编写 spring-mvc.xml 配置文件:
    • 导入 context 和 mvc 的头文件约束;
    • 设置自动扫描包;
    • 设置让 SpringMVC 不处理静态资源;
    • 支持注解驱动;
    • 配置视图解析器。
  5. 编写控制类,使用注解;
  6. 编写要跳转的页面;
  7. 配置 Tomcat,测试。

2. 实现

  • web.xml
<?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_4_0.xsd"
         version="4.0">

    <!-- 配置 DispatcherServlet 前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- DispatcherServlet 绑定 Spring 的配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <!-- 启动级别:1,和服务器一起启动 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
  • 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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自动扫描包,让指定包下的注解生效,由 IOC 容器统一管理 -->
    <context:component-scan base-package="com.Sun3285.controller"/>

    <!-- 让 SpringMVC 不处理静态资源 -->
    <mvc:default-servlet-handler/>

    <!-- 支持注解驱动 -->
    <mvc:annotation-driven/>

    <!-- 视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
  • 控制类

  • 在要跳转的页面中取出 message 对应的值

  • 配置 Tomcat,测试


五、总结

  1. ModelAndView 类型的对象可以执行的方法
方法说明
addObject(String attributeName, Object attributeValue)键值对的形式赋值
setViewName(String viewName)参数 viewName 通过视图解析器后组成 url 用于视图跳转

注意:这些方法由 ModelAndView 类型的对象执行。

  1. Model 类型的对象可以执行的方法
方法说明
addAttribute(String attributeName, Object attributeValue)键值对的形式赋值

注意:这个方法由 Model 类型的对象执行,相当于 ModelAndView 类的 addObject 方法。

  1. 将所有视图放在 WEB-INF 目录下,这样可以保证视图安全,因为这个目录下的文件,客户端不能直接访问;

  2. web.xml 中配置 DispatcherServlet 前端控制器时,url-pattern 中要使用 /

    • / :只匹配所有的请求,不会去匹配 jsp 页面;

    • /* :匹配所有的请求,包括 jsp 页面。

  3. spring-mvc.xml 配置文件中,通常我们只需要手动配置视图解析器,而处理器映射器和处理器适配器只需要开启注解驱动即可,省去了 xml 配置;

  4. 控制类中:

    • 类由 @Controller 注解声明,可以将编写的控制类注册为 bean,由 Spring 容器进行管理,在容器初始化时被自动扫描到;
    • 方法由 @RequestMapping 注解声明,可以完成映射关系,根据请求路径找到对应的处理器(Controller 控制器);
    • 方法的参数为 Model 类型,可以通过调用方法来封装数据;
    • 方法的返回值为 String 类型,返回值会被视图解析器解析,从而组成一个跳转页面的 url;
    • 可以在控制类中写多个方法。
  5. 使用配置文件实现 SpringMVC 主要是为了理解 SpringMVC 的执行原理,而使用注解开发实现 SpringMVC 才是实际中经常用到的。


注意:

  1. SpringMVC 官方文档:https://docs.spring.io/spring-framework/docs/current/reference/html/web.html。

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

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

相关文章

VM——计算流程执行耗时

1、计算同一个流程内的耗时&#xff0c;可以直接用“耗时统计”模块&#xff1b; 2、计算多个流程的运行耗时&#xff0c;需要使用“脚本”&#xff0c;利用C#函数计算耗时 首先&#xff0c;记录起始时间&#xff0c;保存到string类型的全局变量中&#xff0c; curTmStr Dat…

c#委托学习笔记1

委托三步骤 第一步&#xff1a;定义委托 //第一步&#xff1a;1 声明委托(定义委托) //对于声明委托的解释如下&#xff1a; //解释a&#xff1a;函数指针 //解释b&#xff1a;委托就是定义函数的形状&#xff08;形态&#xff09; // 即&#xff1a;返回值类型&#x…

php学习01-Hello World

开发环境搭建 参考 如果没有搭建的请参考上面的文章进行搭建 新建index.php <?php echo Hello World; ?>访问 修改index.php代码 <?php phpinfo() //主要是用来打印php的一些配置信息方便后期排查配置是否正确以及插件是否开启 ?>

conda环境下执行conda命令提示无法识别解决方案

1 问题描述 win10环境命令行执行conda命令&#xff0c;报命令无法识别&#xff0c;错误信息如下&#xff1a; PS D:\code\cv> conda activate pt conda : 无法将“conda”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&a…

3分钟看懂如何给开源项目发起提案

背景 前段时间在使用 Pulsar 的 admin API 时&#xff0c;发现其中的一个接口响应非常慢&#xff1a; admin.topics().getPartitionedStats(topic); 使用 curl 拿到的响应结果非常大&#xff0c;同时也非常耗时&#xff1a; 具体的 issue 在这里&#xff1a;https://github.…

idea 远程调试linux上的代码

背景介绍 开发过程中&#xff0c;我们经常会遇到部署的代码运行出问题、看日志由不是很直观、我们希望可以像调试本地代码一样去调试远程代码; IDEA提供了Remote工具,基于JVM的跨平台能力&#xff0c;我们可以远程调试部署的代码。 前提 保证远程和本地跑的代码是一致的 操…

陶建辉在 CIAS 2023 谈“新能源汽车的数字化”

近年&#xff0c;中国的新能源汽车发展迅猛&#xff0c;在全球竞争中表现出色&#xff0c;已经连续 8 年保持全球销量第一。在新兴技术的推动下&#xff0c;新能源汽车的数字化转型也正在加速进行&#xff0c;从汽车制造到能源利用、人机交互&#xff0c;各个环节都在进行数字化…

Pooling方法总结(语音识别)

Pooling layer将变长的frame-level features转换为一个定长的向量。 1. Statistics Pooling 链接&#xff1a;http://danielpovey.com/files/2017_interspeech_embeddings.pdf The default pooling method for x-vector is statistics pooling. The statistics pooling laye…

2024海外社媒营销新趋势,品牌出海如何做?

社交媒体在网上的影响力是毋庸置疑的。投资社交媒体平台并建立公司形象&#xff0c;提高产品运营收入&#xff0c;提升品牌知名度&#xff0c;对于吸引对您所提供的产品感兴趣的人至关重要。 然而&#xff0c;社交媒体格局总是在变化&#xff0c;这意味着您需要掌握新的社交媒…

LeetCode Hot100 295.数据流的中位数

题目&#xff1a; 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始…

Java:获取线程组的最大优先级

java.lang.ThreadGroup的getMaxPriority()函数返回该线程组的最大优先级。这个最大优先级就等于该线程组中新创建线程的最大优先级。 代码示例&#xff1a; package com.thb;public class Test5 {public static void main(String[] args) {ThreadGroup threadGroup Thread.c…

转义字符使用详解【C语言】

目录 转义字符的概念 转义字符表 转义字符详解 和 实际使用示例 一、\a 二、\b 三、\f 四、\n 五、\r 六、\t 七、\v 八、\\ 九、\ 十、\" 十一、\? 十二、\0 十三、\ddd 十四、\xhh 总结—— 转义字符的概念 所有的 ASCII码都可以用“\加数字” 来表示…

【C语言刷题每日一题#牛客网BC69】——空心正方形图案

目录 问题描述 思路分析 代码实现 结果测试 问题描述 思路分析 首先根据输入的描述&#xff0c;多组输入需要将scanf放在循环中来实现分析输出的规律&#xff1a;当输入为4时&#xff0c;分别在第0行和第3行&#xff08;4-1行&#xff09;&#xff0c;第0列和第3列&#xf…

Sentinel 流量治理组件教程

前言 官网首页&#xff1a;home | Sentinel (sentinelguard.io) 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形…

PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)

十多年前开发框架时&#xff0c;为了效率不断试过各种代码写法&#xff0c;今天又遇到了&#xff0c;想想php8时代会不会有所变化&#xff0c;结果其实也还是和当年一样&#xff0c;但当年没写博客&#xff0c;但现在可以把数据记录下来了。 PHP_loop_ireflies_dark_forest 项目…

【SpringBoot】之Security集成使用(入门级)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

数据恢复工具推荐!这3款堪称删除文件恢复大师!

“快看看我&#xff01;经常都会莫名奇妙丢失各种电脑文件&#xff0c;但是又无法通过简单的方法找回重要的数据&#xff0c;有没有什么简单的操作可以帮助我快速恢复数据的呀&#xff1f;非常感谢&#xff01;” 在我们的日常生活中&#xff0c;无论是工作还是学习&#xff0c…

软考中级应该选哪个?

选择软考中级科目&#xff0c;应该怎么做&#xff1f; 1.1 软考中级科目有哪些可供选择&#xff1f; 1.2 如何选择适合自己的软考中级科目&#xff1f; 系统集成项目管理工程师真的容易吗&#xff1f; 如何在软考中级阶段选择科目&#xff1f;软考中级共有15个科目。软考共…

鸿蒙开发基本概念

1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…

内皮素-1(Endothelin-1 )ELISA kit

灵敏、快速的内皮素-1 ELISA试剂盒&#xff0c;适用于心血管和应激相关研究 内皮素&#xff08;Endothelin, ET&#xff09;是由血管内皮细胞产生的异肽&#xff0c;具有强大的血管收缩活性。这种肽由三个独立的基因编码&#xff0c;经过加工产生39个残基的 大ET 分子&#xff…