SpringMVC(一)【入门】
前言
学完了大数据基本组件,SpringMVC 也得了解了解,为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多,但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到,所以不废话学吧。
1、SpringMVC 概述
1.1、请求响应模式演进过程
1.1.1、三层架构
- web:页面数据的收集以及产生页面
- service:业务处理
- dao:数据持久化
弊端:一个 Servlet 只能一个处理请求。
1.1.2、MVC 模式
浏览器将请求发送给控制器,控制器调用 Service 层,再由 Service 层调用 dao 层得到数据,将得到的数据组织成数据模型(封装成对象),然后将页面和数据模型封装到一起返回给浏览器。这样,一个 Servlet 就可以处理多个请求了。
MVC 模式下的 view 一般用的是 jsp,但是现在我们一般都用的是 HTML、CSS、E lementUI、Vue 这些技术:
1.13、异步调用
异步调用模式下,我们不再需要将 jsp 和 model 共同返回给浏览器展示了,而是页面和 model 分开,页面用 html、vue 这些前端技术,model 需要将它封装成 json 对象返回给我们的前端(因为 java 对象不能直接返回给页面):
这样,我们的前端页面就可以从 json 中把数据抽取出来,然后组织成页面展示到浏览器上面。
异步调用下 SpringMVC 的任务
- Controller 层的开发
- 数据转为 json 格式返回给前端
2、SpringMVC 入门案例
2.1、入门案例
使用 Servlet 开发 web 程序的过程:
- 创建 web 工程
- 设置 tomcat 服务器
- 导入依赖(Servlet)
- 定义处理请求的功能类(UserServlet)
- 配置请求映射关系
使用 SpringMVC 开发 web 程序的过程:
- 创建 web 工程
- 设置 tomcat 服务器
- 导入依赖(SpringMVC + Servlet)
- 定义处理请求的功能类(UserController)
- 配置请求映射关系
- 将 SpringMVC 设定加载到 Tomcat 容器中
0、配置环境
1、导入依赖
<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>85</port><path>/</path><ignorePackaging>true</ignorePackaging></configuration></plugin></plugins></build><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version></dependency></dependencies>
2、初始化SpringMVC环境
@Configuration
public class SpringMvcConfig {
}
3、创建 SpringMVC 控制器类(等同于 Servlet 功能)
@Controller
public class UserController {@RequestMapping("/save")public void save(){System.out.println("user save ...");}}
4、设定SpringMVC加载对应的Bean
@Configuration
@ComponentScan("com.lyh.controller") // 扫描
public class SpringMvcConfig {}
5、初始化 Servlet 容器,加载SpringMVC 环境,并设置 SpringMVC 请求拦截的路径
/*** Servlet 容器配置类*/
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {/*** 加载SpringMVC容器对象* @return*/protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}/*** 请求由谁来处理?tomcat/springmvc* @return*/protected String[] getServletMappings(){return new String[]{"/"}; // 所有请求都由 springmvc 来处理}/*** 加载 Spring 的配置对应的容器对象* @return*/protected WebApplicationContext createRootApplicationContext() {return null;}
}
6、报错1
访问 localhost:85/save 报错:
7、设置请求返回值为 json 信息 并添加注解@ResponseBody 代表返回内容就是响应内容
8、重新请求 localhost:85/save
2.2、注解&配置类说明
2.2.1、注解
名称 | 类型 | 位置 | 作用 | 参数 |
@Controller | 类注解 | 控制器类上方 | 设置SpringMVC的核心控制器Bean | 无参 |
@RequestMapping | 方法注解 | 控制器方法上面 | 设置当前控制器方法请求访问路径 | @RequestMapping("/save") 访问的时候就访问 localhost:85/save |
@ResponseBody | 方法注解 | 控制器方法上面 | 设置当前控制器方法的返回值就是响应内容 | 无参 |
2.2.2、AbstractDispatcherServletInitializer
AbstractDispatcherServletInitializer 是 SpringMVC 提供的快速初始化 Web3.0 容器的抽象类,它提供了三个接口抽象方法供用户实现:
1)createServletApplicationContext
作用:加载 SpringMVC 容器,一旦 tomcat 启动,就会把这个容器加载到 tomcat 容器中。
2)getServletMappings
作用:设定 SpringMVC 对应的请求路径,也就是哪些请求由 SpringMVC 管,哪些由 tomcat 管。返回 "/" 代表拦截所有请求交给 SpringMVC 处理。
3)createRootApplicationContext
作用:加载除了 SpringMVC 之外的所有容器的内容(Bean)
这里我们没有其它容器,所以直接返回 null。
2.3、总结
对于一次性工作,我们以后做项目直接 CV 大法然后改一改就好了。我们真正做的最多的还是多次工作:定义控制器、定义控制器中的方法等。
3、SpringMVC 工作流程分析
工作流程主要分为两部分:
- 启动服务器
- 发送一次请求
3.1、服务器初始化过程
在 Web3.0 的规范中,我们不再需要 web.xml 来配置,而是通过一个配置类(继承 AbstractDispatcherServletInitializer 抽象类)来完成。
3.2、单次请求工作流程
4、Bean 加载控制
4.1、Controller 加载控制与业务 Bean 加载控制
现在我们的项目结构是这样的:
-
config目录存入的是配置类,我们之后的配置类会有:
-
ServletContainersInitConfig
-
SpringConfig
-
SpringMvcConfig
-
JdbcConfig
-
MybatisConfig
-
-
controller目录存放的是SpringMVC的controller类
-
service目录存放的是service接口和实现类
-
dao目录存放的是dao/Mapper接口
4.1.1、SpringMVC 相关 Bean 加载控制
- SpringMVC 加载的 Bean 都放在 com.lyh.controller 包下
controller 包下的所有 Bean 会被 SpringMVC 来加载,而其它包(dao、service等)下的 Bean 都应该由 Spring 来加载,但是如何控制 Spring 不去加载 SpringMVC 中的 Bean ?
4.1.2、Spring 相关 Bean 加载控制
- 方式一:Spring 加载的 Bean 设定扫描范围为 com.lyh,排除掉 controller 包内的 Bean
- 方式二:Spring 加载的 Bean 设定扫描范围为精准范围,比如 service、dao包等
- 方式三:不区分 Spring 和 SpringMVC 的环境,都加载到同一个环境中。
方式一:只加载 Spring 管理的 Bean:
@Configuration
@ComponentScan({"com.lyh.service","com.lyh.dao"})
public class SpringConfig {}
方式二:按照注解进行过滤,过滤掉由 SpringMVC 管理的包下的 Bean:
@Configuration
@ComponentScan(value = "com.lyh",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class))
public class SpringConfig {}
测试
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);// 如果Controller类被Spring注册了,会输出对象地址// 如果没有被注册,那么会报错System.out.println(ctx.getBean(UserController.class));}
}
注意:在测试时,SpringMvcConfig 的注解 Configuration 需要去掉,因为 SpringConfig 中我们设置 Spring 会扫描所有 com.lyh 目录下的目录(除了 exclude 之外的),但是 Spring 会把所有带有 @Configuration 注解的类加载一遍,而 SpringMvcConfig 上面除了 @Configuration 之外还有一个注解 @ComponentScan 用来扫描 controller 包,所以 Spring 又会把 controller 目录下的 Bean 加载一遍。
所以我们可以把这两个带有 @Configuration 注解的配置类放到 com.lyh 包外边,防止被 Spring 加载。
到这里,我们需要把由 Spring 加载的环境配置放到 ServletContainersInitConfig 中:
这样,当服务器启动后,tomcat 容器中就不只有 SpringMVC 的容器了,还有 Spring 的容器。
4.1.3、简化开发
目前,我们需要在 Servlet 容器中分别指定两个配置类(SpringMVC 和 Spring),能不能再简化一些呢? 答案是可以的,我们只需要继承抽象类 AbstractAnnotationConfigDispatcherServletInitializer 即可:
本节注解说明:
名称 | 位置 | 作用 | 参数 |
@ComponentScan | 类注解 | 类定义上方 | excludeFilters:排除扫描路径中加载的bean,需要指定类别(type)和具体项(classes) includeFilters:加载指定的bean,需要指定类别(type)和具体项(classes) |
5、Postman
目前我们测试请求都是直接在地址栏输入参数,但是这种方式只能模拟 get 请求,对于 post 请求我们还需要创建表单,对于更复杂的 Ajax 请求我们不只需要表单,还是配置 JavaScript 代码来完成异步提交。
postman 的作用就是用来模拟各种网页请求的,所以作为一个后端程序员,我们就再也不用去写一些恶心的前端代码去测试了。
相关文章:
SpringMVC(一)【入门】
前言 学完了大数据基本组件,SpringMVC 也得了解了解,为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多,但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到,所以不废话学吧…...
SQL Server详细使用教程
SQL Server 是 Microsoft 公司开发的关系型数据库管理系统(RDBMS),用于存储和检索数据。以下是 SQL Server 的详细使用教程: 目录 1. 安装 SQL Server 2. 连接到 SQL Server 3. 创建数据库 4. 创建数据表 5. 插入数据 6. 查…...
Spring Boot项目启动时执行指定的方法
项目场景: 本文介绍Spring Boot项目启动时执行指定的方法两种常用方式和他们之间的区别。 实现方案: 方式一:使用注解PostConstruct Component public class PostConstructTest {PostConstructpublic void postConstruct() {System.out.prin…...
红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程
HTTP版RTU(支持GNSS)项目概述 RTU(Remote Terminal Unit),中文即远程终端控制系统,负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置,通常由信号输入/出模块、微…...
在 Mac 上配置高级内容缓存设置
在 Mac 上配置高级内容缓存设置 您可以使用高级配置参数针对网络配置微调内容缓存。 您可以在“终端”中使用命令行或通过修改“/资源库/Preferences/com.apple.AssetCache.plist”文件中的键值,来设定内容缓存的高级配置参数。若要使某些更改生效,必须…...
算法与数据结构 顺序栈(C++)
随机产生10个100以内的整数建立一个顺序栈,从栈顶到栈底依次显示栈内元素;从键盘输入出栈元素个数 n (1< n <10),将 n 个元素依次出栈并显示出栈元素,再显示此时栈顶元素。 #include <iostream> #include <cstd…...
【WSL】在WIN11安装并使用Linux子系统(Ubuntu)
前言: 最近买了4060Ti 16G,可以尝试在本地实验大模型。一开始尝试使用Vmware搞Linux,发现没有办法加载GPU(或者另外有办法没找到)。所以只剩下了两条路:要么搞双系统,要么使用WSL(W…...
【vim 学习系列文章 20 -- a:mode 的值有哪些?】
请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中,a:mode 常常用于函数内部,以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…...
sed命令多行处理
1. sed 如何工作的 sed 维护两个空间: 模式空间保留空间 sed是以行为周期来处理文本的。 sed从输入流中读取一行,去掉最后的换行符,把它放入模式空间。随后执行命令,每个命令都有关联的地址和条件,只有匹配时才执行…...
Secure Copy Protocol or SCP - 安全拷贝协议
Secure Copy Protocol or SCP - 安全拷贝协议 1. scp 文件传输1.1. 将远程文件拷贝到本地1.2. 将本地文件拷贝到远程1.3. 将远程目录拷贝到本地 References Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a s…...
Java面试题:什么是Java的值传递和引用传递?列举其应用场景,并说明其特点
在Java中,值传递和引用传递是两种不同的参数传递机制。它们在Java程序中扮演着重要的角色,影响着方法如何接收和处理参数。了解这两种传递机制对于编写高效、可靠的Java代码至关重要。 值传递(Pass by Value) 值传递是指在调用方…...
Java 基于微信小程序的智能停车场管理小程序
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
python基础——类型注解【变量,函数,Union】
📝前言: 上一篇文章Python基础——面相对象的三大特征提到,python中的多态,python中,类型是动态的,这意味着我们不需要在声明变量时指定其类型。然而,这可能导致运行时错误,因为我们…...
人工智能研究生前置知识—科学计算库numpy
人工智能研究生前置知识—科学计算库numpy numpy是python中做科学计算的基础库,对数组进行操作 整个numpy的操作和使用比较简单因此可以通过案例的学习掌握基本的用法在之后的学习中不断的进行熟悉和补充 创建数组(矩阵 ) 创建的ndarray数组…...
element UI 设置type=“textarea“ 禁止输入框缩放
背景 在 Element UI 中,当您使用 el-input 组件并设置 type"textarea" 时,默认情况下,用户可以通过拖动输入框的右下角来调整其大小。如果您想禁止这种缩放行为,需要使用 CSS 来覆盖默认的浏览器行为。 注意上图&#x…...
Rust腐蚀服务器常用参数设定详解
Rust腐蚀服务器常用参数设定详解 大家好我是艾西,一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式,其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 (注本文中xxxx…...
无人机巡检技术革命性变革光伏电站运维管理
在中国广袤的大地上,光伏电站如雨后春笋般崛起,晶体硅组件板在阳光下熠熠生辉,为人们带来了源源不断的绿色能源。然而,随着光伏产业的迅猛发展,电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入,…...
【学习】软件信创测试中,如何做好兼容性适配
在软件信创测试的领域中,兼容性适配是至关重要的一环。如何确保软件在不同的操作系统、硬件设备和软件环境中稳定运行,是每个测试人员需要面对的挑战。本文将从几个方面探讨如何做好兼容性适配,以提高软件的稳定性和用户体验。 首先…...
阿里云ACK k8s集群迁移
1、创建k8s集群 阿里云ACK创建 2、创建所需的第三方插件 ACK ingress创建 3、导出原有ACK集群配置 包含deployment、service、ingress、PersistentVolumeClaim 执行命令 kubectl get deployment,service,secret,ingress,PersistentVolumeClaim -n <namespace_name> -o y…...
1.3 字符设备驱动
1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针,一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…...
计算机毕业设计springboot小区物业报修管理系统m8x57
该物业报修管理系统实施的目的在于帮助物业管理企业升级员工管理、住户管理、报修问题管理等内部管理平台,整合物业管理企业物力和人力,全面服务于维修人员管理的内部管理需求,并重视需求驱动、管理创新、与业主交流等外部需求,通过物业管理企业各项资源…...
深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用
1. 卷积神经网络 卷积神经网络(CNN)是一种特别适用于处理具有网格结构的数据,如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统,这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…...
js 数字的常用方法梳理
toFixed:保留几位小数。toFixed(保留小数位)。注意:不做任何的四舍五入。 Math集合: random:获取一个0-1之间的随机数。注意,包含0,不包含1。 round:四舍五入取整数,最后返回一个整数值。 ceil:向上取整。 floor:…...
STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(5)
接前一篇文章:STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(4) 本文参考以下文章及视频: STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课(I2S,HAL&am…...
Objective-C学习笔记(block,协议)4.10
1.block:是一个数据类型,存储一段代码,代码可以有参数有返回值。 2.声明block: 返回值类型 (^block变量名称)(参数列表); int (^myblock) (int num1,int num2); 代码段格式:^返回值类型(参数列表){ 代码段 }; int (^m…...
AD7982BRMZRL7 二进制 500kSPS 模数转换芯片 ADI
AD7982BRMZRL7是一款由Analog Devices(亚德诺)公司生产的18位逐次逼近型模数转换器(ADC)。它主要用于将模拟信号转换为数字信号,适用于数据采集系统、嵌入式系统、工业控制和医疗设备等领域。 AD7982BRMZRL7的主要功能…...
采集某新闻网资讯网站保存PDF
网址:融资总额近3亿美元、药明康德押注,这家抗衰老明星公司有何过人之处-36氪 想要抓取文章内容,但是找不到啊,可能是文字格式的问题,也可能文章内容进行了加密。 在元素中查看,window.initialState返回的就…...
03攻防世界-unserialize3
根据题目可以看出,这是个反序列化的题目 打开网址观察题目可以看到这里是php的代码,那么也就是php的反序列化 本题需要利用反序列化字符串来进行解题,根据源码提示我们需要构造code。 序列化的意思是:是将变量转换为可保存或传输…...
蓝桥杯备考随手记: 常见的二维数组问题
在Java中,二维数组是一种可以存储多个元素的数据结构。它由多个一维数组组成,这些一维数组可以看作是行和列的组合,形成了一个矩阵。 1. 二维数组旋转问题 二维数组的旋转是指将数组中的元素按照一定规则进行旋转。通常有两种常见的旋转方式…...
Java | Leetcode Java题解之第28题找出字符串中第一个匹配项的下标
题目: 题解: class Solution {public int strStr(String haystack, String needle) {int n haystack.length(), m needle.length();if (m 0) {return 0;}int[] pi new int[m];for (int i 1, j 0; i < m; i) {while (j > 0 && needl…...
南宁做网站公司/网推平台有哪些比较好
原文阅读:集合去重三境界mp.weixin.qq.com王国维在《人间词话》中说过治学三重境界,想要成大事者会经历三个阶段,而数组去重几个方式也显示出了我们所经历的三个阶段,你在哪个阶段呢?给定最简单的整型集合List 第一重…...
寮步做网站/seo优化方案模板
函数:实现独立功能的代码段 函数只有在调用时才会执行 语法一: function F_NAME{ 函数体 } 语法二: F_NAME() { 函数体 } 函数的返回值: 默认函数返回值:函数执行状态返回值,默认是脚本中最后一条命令执行的…...
莱西网站制作联赛与超/优化网站排名
华为鸿蒙 2.0 开发者公测版 Bata 3来了,目前已经为大家推送了!感兴趣的朋友们就赶紧来体验啊,优酷、新浪新闻、央视影音都是全新的鸿蒙系统。此外呢,更新也还解决了之前的运动健康步数显示不准确的问题,为大家带来了超…...
建筑案例网站有哪些/上海企业网站推广
不知道什么原因,Zenoss官方的文档中似乎没有涉及到国际化方面的内容,本文对如何对Zenoss如何汉化做个简单的总结 基本汉化 http://code.google.com/p/zenforge/wiki/ZenossI18n 这里包含了基本的汉化包,该汉化包完成了60%左右的汉化工作,这…...
做vi的图有网站吗/seo一个月赚多少钱
介绍 牛云资源变现专为内容/资源下载场景设计,一站式解决内容带货、流量、资源变现难题,uniCloud云开发无需购买服务器和域名,助力每一位内容创业者。 传统小程序开通流量主要求小程序累计独立访客(UV)1000以上,本项…...
做餐饮网站建设/常用的关键词挖掘工具有哪些
昨天同事的一台电脑出了点问题,需要客服人员远程登陆解决,由于是内网,不能用team viewer这类的远程服务软件。过去看了一下,win7的系统,先在“我的电脑”右键打开“属性”,点击左边的“远程设置”ÿ…...