spring mvc源码学习笔记之五

  • 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><parent><groupId>com.qsm</groupId><artifactId>learn</artifactId><version>1.0.0</version></parent><groupId>com.qs</groupId><artifactId>demo-43</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.28</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency></dependencies></project>
  • 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"metadata-complete="true"><!-- 第一个 servlet | 单独一个容器 --><servlet><servlet-name>app1</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/app1-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>app1</servlet-name><url-pattern>/app1/*</url-pattern></servlet-mapping><!-- 第二个 servlet | 单独一个容器 --><servlet><servlet-name>app2</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/app2-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>app2</servlet-name><url-pattern>/app2/*</url-pattern></servlet-mapping></web-app>
  • src/main/webapp/WEB-INF/app1-servlet.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="peopleController" class="com.qs.demo.s1.PeopleV1Controller"/>
</beans>
  • src/main/webapp/WEB-INF/app2-servlet.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="peopleController" class="com.qs.demo.s2.PeopleV2Controller"/>
</beans>
  • com.qs.demo.s1.PeopleV1Controller 内容如下
package com.qs.demo.s1;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author qs* @date 2023/07/05*/
@RestController
public class PeopleV1Controller {// RequestMappingHandlerAdapter 处理@RequestMapping("/p1/01")public String test01() {return "demo43 V1 01";}@RequestMapping("/p1/02")public String test02() {return "demo43 V1 02";}
}
  • com.qs.demo.s2.PeopleV2Controller 内容如下
package com.qs.demo.s2;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author qs* @date 2023/07/05*/
@Controller
public class PeopleV2Controller {// RequestMappingHandlerAdapter 处理@GetMapping("/p2/01")@ResponseBodypublic String test01() {return "demo43 V2 01";}@GetMapping("/p2/02")@ResponseBodypublic String test02() {return "demo43 V2 02";}
}

以上就是全部代码

写这个例子主要是想说一个知识点。也就是说我们平时用 spring mvc 的时候,都会配置一个 DispatcherServlet 来处理所有请求。
其实是可以配置多个的。这不难理解:回忆一下刚学 servlet 的时候,我们不就是写多个 servlet 来处理不同的请求么。
DispatcherServlet 也是个 servlet 。自然遵循这个逻辑。

知道可以这样写就行。这种写法是不建议的。spring mvc 本来就是设计的用一个 DispatcherServlet (前端控制器)来接受所有请求。

多说一嘴。从这个例子中我们也能解答一个面试题:spring 中能存在 id 相同的 bean 吗?答案是:能。
原理很简单。只要 id 相同的 bean 在不同的应用上下文中就行了。
在上面的例子中,我们定义了 2 个名为 peopleController 的 bean。之所以不冲突,是因为他们分别属于 2 个 servlet 。而每个 servlet 又维护了自己的 web 应用上下文。

怎么验证 2 个 DispatcherServlet 用的是不同的web应用上下文呢?
非常简单。只需要让 2 个控制器都实现 ApplicationContextAware 接口,在控制器中打印或者打断点看就行了。如下

package com.qs.demo.s1;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author qs* @date 2023/07/05*/
@RestController
public class PeopleV1Controller implements ApplicationContextAware {// RequestMappingHandlerAdapter 处理private ApplicationContext applicationContext;@RequestMapping("/p1/01")public String test01() {System.out.println(applicationContext);System.out.println(applicationContext.getId());return "demo43 V1 01";}@RequestMapping("/p1/02")public String test02() {return "demo43 V1 02";}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}
package com.qs.demo.s2;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author qs* @date 2023/07/05*/
@Controller
public class PeopleV2Controller implements ApplicationContextAware {// RequestMappingHandlerAdapter 处理private ApplicationContext applicationContext;@GetMapping("/p2/01")@ResponseBodypublic String test01() {System.out.println(applicationContext);System.out.println(applicationContext.getId());return "demo43 V2 01";}@GetMapping("/p2/02")@ResponseBodypublic String test02() {return "demo43 V2 02";}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

分别调用 /mvc_43/app1/p1/01 和 /mvc_43/app2/p2/01 打印如下

WebApplicationContext for namespace 'app1-servlet', started on Sat Jan 04 15:09:26 CST 2025
org.springframework.web.context.WebApplicationContext:/mvc_43/app1
WebApplicationContext for namespace 'app2-servlet', started on Sat Jan 04 15:09:25 CST 2025
org.springframework.web.context.WebApplicationContext:/mvc_43/app2

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

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

相关文章

Jenkins 中自动化部署 Spring Boot 项目

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

MetaGPT - 多Agent框架

文章目录 一、关于 MetaGPT功能介绍快速开始的演示视频教程 二、安装Pip安装Docker安装 一、关于 MetaGPT MetaGPT 为GPTs分配不同的角色&#xff0c;以形成一个协作实体来完成复杂的任务。 github : https://github.com/geekan/MetaGPTtwitter : https://twitter.com/MetaGP…

计算机网络 (15)宽带接入技术

前言 计算机网络宽带接入技术是指通过高速、大容量的通信信道或网络&#xff0c;实现用户与互联网或其他通信网络之间的高速连接。 一、宽带接入技术的定义与特点 定义&#xff1a;宽带接入技术是指能够传输大量数据的通信信道或网络&#xff0c;其传输速度通常较高&#xff0c…

计算机网络复习(大题)

&#x1f4e2;&#x1f4e2;&#x1f4e2;传送门 一、简答题&#xff08;1&#xff09;五层原理体系结构每层功能&#xff1a;&#xff08;2&#xff09;TCP建立连接三次握手过程&#xff1a;&#xff08;3&#xff09;访问浏览器的过程&#xff1a;&#xff08;4&#xff09;抓…

AI代码开发实践-微信小程序开发

接上回&#xff0c;本人参加了一次小孩学校组织的护学岗&#xff0c;萌生了开发一个微信小程序的水印相机的想法&#xff0c;说干就干。 最近也是在学习用AI编程&#xff0c;索性之前也用一点&#xff0c;今天就尝试一下 工具选择&#xff0c;环境搭建 阿里-通义灵码 通义灵…

基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】

目 录 1、绪论 1.1背景以及现状 1.2 Java语言的特点 1.3 系统运行环境及开发软件&#xff1a; 1.4 可行性的分析 1.4.1 技术可行性 1.4.2 经济可行性 1.4.3 操作可行性 2、 需求分析 2.1 用户需求分析 2.2功能需求分析 2.3界面设计需求分析…

麒麟服务器安装kafka--亲测

我这安装的是单机版本的&#xff1a; 下载地址&#xff1a;Index of /kafka/3.9.0 我下载的是&#xff1a;https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…

基于HTML和CSS的旅游小程序

一、技术基础 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言&#xff0c;用于定义网页的内容和结构。在旅游小程序中&#xff0c;HTML用于搭建页面的基本框架&#xff0c;包括标题、段落、图片、链接等元素&#xff0c;以及用于交互的表单…

【操作系统不挂科】操作系统期末考试题库<1>(单选题&简答题&计算与分析题&应用题)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 操作系统不挂科 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 一.单项选择题&#xff08;每个空2分&#xff0c;共40分&#xff09; 1. 计算机的操作系统是一种&#xff08; B &#xff09;。 A. 应用软件…

Excel重新踩坑5:二级下拉列表制作;★数据透视表;

0、在excel中函数公式不仅可以写在单元格里面&#xff0c;还可以写在公式里面。 1、二级下拉列表制作&#xff1a; 2、数据透视表&#xff1a; 概念&#xff1a;通过拖拉就能实现复杂函数才能实现的数据统计问题。 概览&#xff1a;在插入选项中有个数据透视表&#xff0c;数…

【赵渝强老师】MongoDB写入数据的过程

在MongoDB数据更新时&#xff0c;WiredTiger存储引擎使用预写日志的机制先将数据更新写入到Journal日志文件中。然后在创建检查点操作开始时&#xff0c;再将日志文件中记录的操作刷新到数据文件。换句话说&#xff0c;通过预写日志和检查点机制可以保证将数据更新持久化到数据…

【双层模型】考虑供需双侧的综合能源双层优化模型

目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型&#xff0c;上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备&#xff0c;包括燃气轮机、燃气锅炉、风电…

Linux驱动开发(16):输入子系统–电容触摸驱动实验

有关电容触摸的基础知识内容可以参考野火STM32相关教程&#xff0c;这里只介绍电容触摸驱动的相关内容。 本章配套源码、设备树以及更新固件位于“~/embed_linux_driver_tutorial_imx6_code/linux_driver/touch_scream_GTxxx”目录下。 触摸面板通过双面胶粘在显示屏上&#…

QML自定义滑动条Slider的样式

代码展示 import QtQuick 2.9 import QtQuick.Window 2.2 import QtQuick.Controls 2.1Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Slider {id: controlvalue: 0.5background: Rectangle {x: control.leftPaddingy: control.topPadding …

【项目开发】C#环境配置及VScode运行C#教程(学生管理系统)

原创文章,禁止转载。 文章目录 下载.NETVScode配置运行程序下载.NET 官网链接: https://dotnet.microsoft.com/en-us/download选择任意版本下载: 下载完成后,双击运行exe文件,等待安装完成。 在控制台输入: dotnet --version若出现版本信息,说明安装成功: VScode配…

卡码网 ACM答题编程模板

背景&#xff1a; input() 在 ACM 编程中的底层调用原理 1. input() 的核心原理 在 Python 中&#xff0c;input() 的底层实现依赖于标准输入流 sys.stdin。每次调用 input() 时&#xff0c;Python 会从 sys.stdin 中读取一行字符串&#xff0c;直到遇到换行符 \n 或文件结束…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

k8s基础(3)—Kubernetes-Deployment

一、 Deployment概述 ‌ Kubernetes Deployment‌是Kubernetes中的一个核心概念&#xff0c;它是一种高级别的控制器&#xff0c;用于管理Pod和ReplicaSet&#xff0c;确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet&#xff0c;从而…

windows11(或centos7)安装nvidia显卡驱动、CUDA、cuDNN

本文是我瞎搞时写的问题汇总及参考文献&#xff0c;记录了一些问题解决的进度及对问题的思考。 最近一次更新时间&#xff1a;2025年1月4日 一、安装或更新nvidia显卡驱动 首先&#xff0c;需要确保你的设备安装了最新的显卡驱动。 &#xff08;1&#xff09;centos7安装显…

【光纤通信】光纤结构

光纤结构主要由折射率较高的纤芯&#xff08;core&#xff09;部分和折射率较低的包层&#xff08;cladding&#xff09;部分以及涂覆层&#xff08;buffer coating&#xff09;组成。 光纤的分类方法有很多种&#xff0c;如按纤芯折射率分布、按纤芯结构、按二次涂覆层结构、按…