1. SpringMVC 简介
文章目录
- 1. SpringMVC 概述
- 2. SpringMVC 入门案例
- 2.1 入门案例
- 2.2 入门案例工作流程
- 3. bean 加载控制
- 4. PostMan 工具
1. SpringMVC 概述
SpringMVC 与 Servlet 功能等同,均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。
对于 SpringMVC,主要学习如下内容:
- SpringMVC 简介
- 请求与响应
- REST 风格
- SSM 整合(注解版)
- 拦截器
SpringMVC 是处于 Web 层的框架,所以其主要的作用就是用来接收前端发过来的请求和数据然后进行处理,并将处理的结果响应给前端,所以如何处理请求和响应是 SpringMVC 中非常重要的一块内容。
REST 是一种软件架构风格,可以降低开发的复杂性,提高系统的可伸缩性,后期的应用也是非常广泛。
SSM 整合是把咱们所学习的 SpringMVC+Spring+Mybatis 整合在一起来完成业务开发,是对三个框架的综合应用。
对于 SpringMVC 的学习,最终要达成的目标:
(1) 掌握基于 SpringMVC 获取请求参数和响应 json 数据操作。
(2) 熟练应用基于 REST 风格的请求路径设置与参数传递。
(3) 能够根据实际业务建立前后端开发通信协议并进行实现。
(4) 基于 SSM 整合技术开发任意业务模块功能。
学习 SpringMVC 前,先回顾一下现在 web 程序是如何做的。现在的 web 程序大都基于三层架构来实现:
如上图,Web 程序通过浏览器访问页面,前端页面使用异步提交的方式发送请求到后端服务器,后端服务器采用三层架构——表现层、业务层、数据层进行开发。页面发送的请求由表现层接收,获取用户的请求参数后,将参数传递给业务层,再由业务层访问数据层,得到用户需要访问的数据后,将数据返回给表现层。表现层拿到数据后,将数据转换成 json 格式发送给前端页面,前端页面接收数据后,解析数据并组织成用户最终浏览的页面信息交给浏览器。
初学时,数据层采用的是 jdbc 技术,后来 Mybatis 框架将其取代;表现层采用的是 servlet 技术,现在将要学习的 SpringMVC 框架可以将其取代。
介绍了这么多,对 SpringMVC 进行一个定义:
SpringMVC 是一种基于Java 实现 MVC 模型的轻量级 Web 框架。
优点:使用简单、开发便捷(相比于Servlet);灵活性强。
2. SpringMVC 入门案例
2.1 入门案例
(1) 创建项目
创建 Maven 项目。
补全目录结构,因为使用骨架创建的项目结构不完整,需要手动补全。
(2) 导入依赖
<?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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><packaging>war</packaging><name>springmvc01_quickstart</name><groupId>com.itheima</groupId><artifactId>springmvc01_quickstart</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--导入springmvc与servlet的依赖--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope><!--防止与tomcat插件冲突--></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.10.RELEASE</version></dependency></dependencies><!--tomcat插件--><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><!--tomcat端口号--><path>/</path><!--虚拟目录--></configuration></plugin></plugins></build>
</project>
说明:servlet 的依赖为什么需要添加<scope>provided</scope>
?
scope 是 maven 中 jar 包依赖作用范围的描述,如果不设置默认是在编译、运行、测试时均有效。
如果运行有效的话就会和 tomcat 中的 servlet-api 包发生冲突,导致启动报错。
provided 代表的是该包只在编译和测试时用,运行时无效,直接使用 tomcat 中的,就避免了冲突。
(3) 创建 Controller 类
//使用Controller定义bean
@Controller
public class UserController {// 当前操作的请求映射路径:用户发出哪个请求能调用到这个方法@RequestMapping("/save")// 设置当前操作的返回值类型// 把返回的东西整体作为响应的内容给到外面@ResponseBody//设置当前控制器方法响应内容为当前返回值,无需解析// 处理请求的方法// 返回值为String:执行完这个方法,要对外返回json数据public String save(){System.out.println("user save ...");return "{'module':'springmvc'}";}
}
(4) 创建配置类
@Configuration
//加载 controller 对应的 bean
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
(5) 使用配置类替换 web.xml
将web.xml删除,换成ServletContainersInitConfig
// 定义一个servlet容器启动的配置类
// 要继承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {//加载springMVC容器的配置//tomcat服务器启动时,就能加载SpringMVC配置类了@Overrideprotected WebApplicationContext createServletApplicationContext() {//加载springMVC的配置类AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}//设置哪些请求由springMVC处理@Overrideprotected String[] getServletMappings() {//所有请求都由springMVC处理return new String[]{"/"};}//加载spring容器配置//现在只用springMVC容器,所以这个方法不用管,直接返回null@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}
(6) 配置 tomcat 环境
(7) 运行项目后,用浏览器访问
idea 控制台也打印出了:user save …
SpringMVC 入门程序开发总结(1+N):
一次性工作
- 创建工程,设置服务器,加载工程
- 导入依赖
- 创建 web 容器启动类,加载 SpringMVC 配置,并设置SpringMVC 请求拦截路径
- SpringMVC 核心配置类(设置配置类,扫描 controller 包,加载 Controller 控制器 bean)
多次工作
- 定义处理请求的控制器类
- 定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回 json 数据(@ResponseBody)
如:直接在 UserController 中加入如下代码,就可以扩展功能。
@RequestMapping("/delete")
@ResponseBody
public String delete(){System.out.println("user delete ...");return "{'module':'springmvc delete'}";
}
2.2 入门案例工作流程
3. bean 加载控制
SpringMVC 需要加载的 bean:表现层的 bean,也就是 controller 包下的。
Spring 需要加载的bean:
业务 bean(Service)
功能 bean(DataSource、SqlSessionFactoryBean、MapperScannerConfigurer 等)
分析清楚谁该管哪些 bean 以后,要解决的问题就是如何让 Spring 和 SpringMVC 分开加载各自的 bean。
在 SpringMVC 的配置类 SpringMvcConfig 中使用注解@ComponentScan
,只需将扫描范围设置到 controller,如:
之前在 Spring 的配置类 SpringConfig 中使用注解@ComponentScan
时,扫描的范围其实已经包含了 controller,如:
实际上,应该避免 Spring 错误地加载到 SpringMVC 的 bean,下面就来解决这个问题。
解决方案有三种:
① Spring 加载 bean 时,设定扫描范围为精准范围,例如 service 包、dao 包等(主要用这种)。
@Configuration
@ComponentScan({"com.itheima.service","comitheima.dao"})
public class SpringConfig {
}
注意:dao 包下的类的对象是使用 mybatis 自动代理的方式创建的,这个对象不是我们自己创建出来的,所以写不写 com.itheima.dao 都不影响对应 bean 的加载,但是写上更好(因为不用 mybatis 自动代理时可能会需要)。
② Spring 加载 bean 时,设定扫描范围为 com.itheima,排除掉 controller 包中的 bean。
@Configuration
//扫描com.itheima下的类,以加载bean
//按注解过滤,过滤掉带有@Controller注解的类
@ComponentScan(value = "com.itheima",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}
- excludeFilters:排除扫描路径中加载的 bean。
- includeFilters:加载指定的 bean,在现有基础上追加。
SpringConfig 扫描时,如果某个类上有 @Configuration 注解,那么这个类也会被扫描,同时它里面的 bean 也会被加载。
SpringMvcConfig 上就有一个@ComponentScan。虽然 SpringConfig 的扫描过滤掉了 controller 类,但又通过 SpringMvcConfig 把 controller 类给扫描进来了。
解决方案:把 SpringMvcConfig 移出 Spring 配置类的扫描范围。如:可以将 SpringConfig、SpringMvcConfig 移动到 com 下。
③ 不区分 Spring 与 SpringMVC 的环境,加载到同一个环境中(了解即可)
最后一个问题,有了 Spring 的配置类,要想在 tomcat 服务器启动将其加载,我们需要修改 ServletContainersInitConfig。
// 定义一个servlet容器启动的配置类
// 要继承AbstractDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractDispatcherServletInitializer {//加载springMVC容器的配置//tomcat服务器启动时,就能加载SpringMVC配置类了@Overrideprotected WebApplicationContext createServletApplicationContext() {//加载springMVC的配置类AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}//设置哪些请求由springMVC处理@Overrideprotected String[] getServletMappings() {//所有请求都由springMVC处理return new String[]{"/"};}//加载spring容器配置@Overrideprotected WebApplicationContext createRootApplicationContext() {//加载spring的配置类AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);return ctx;}
}
对于上述的配置方式,Spring 还提供了一种更简单的配置方式,可以不用再去创建
AnnotationConfigWebApplicationContext 对象,不用手动register 对应的配置类,如何实现?
// 定义一个servlet容器启动的配置类
// 要继承AbstractAnnotationConfigDispatcherServletInitializer
public class ServletControllerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载Spring配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//加载SpringMVC配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置哪些请求由springMVC处理@Overrideprotected String[] getServletMappings() {//所有请求都由springMVC处理return new String[]{"/"};}
}
4. PostMan 工具
代码编写完后要想测试,只需要打开浏览器直接输入地址发送请求即可。发送的是 GET 请求可以直接使用浏览器,但是如果要发送的是 POST 请求呢?
如果要求发送的是 POST 请求,就得准备页面,并在页面上准备 form 表单,测试起来比较麻烦。所以就需要借助一些第三方工具,如 PostMan。
PostMan 是一款网页调试与发送网页 HTTP 请求的 Chrome 插件,常用于进行接口测试。
(1) 创建 WorkSpace 工作空间
(2) 工作空间的名称
(3) 选择请求方式
(4) 发送请求(相当于在浏览器发送请求)
数据效果:
页面效果:
(5) 同样地,可以向百度发请求:
(6) 保存当前请求(ctrl+s后)
注意:第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。
对于 PostMan 如果觉得字小不好看,可以使用 ctrl+“=” 调大,ctrl+“-” 调小。
相关文章:
1. SpringMVC 简介
文章目录1. SpringMVC 概述2. SpringMVC 入门案例2.1 入门案例2.2 入门案例工作流程3. bean 加载控制4. PostMan 工具1. SpringMVC 概述 SpringMVC 与 Servlet 功能等同,均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。 对于 SpringMVC,主…...
《解谜三星堆:开启中华文明之门》-范勇 笔记
甲篇 应重视民间流传的疑似三星堆的文物,对其展开充分的研究,以发现更多关于三星堆的秘密,并且避免“敦煌窘境”,让我国的三星堆学术研究处于世界领先地位!(书中就讲到了在民间首次发现了圆形玉器…...
锐捷(十四)mpls vxn optionc的关键问题所在和具体问题分析
用锐捷的设备搭建mpls vxn optionc的基础版和带RR的版本,在控制平面和转发平免上分析mpls vxn optionc的关键问题所在和具体问题分析。一 基础mpls vxn optionc:核心:两pe之间之间建立MP EBGP邻居,从而直接传递路由解放了ASBR。关…...
Python语言零基础入门教程(十四)
Python 日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜(历元&…...
Https 协议超强讲解(一)
都说Https协议非常安全,那为什么还是会被抓包呢?抓包后会影响什么吗? HTTPS协议 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关…...
5.Redis 实现点赞 优化登陆(验证码 token..)
Redis(1)简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中,性能高。(2&#…...
scscanner:一款功能强大的大规模状态码扫描工具
关于scscanner scscanner是一款功能强大的大规模状态码扫描工具,该工具可以帮助广大研究人员从一个URL列表文件中批量读取目标网站的状态码响应信息。除此之外,该工具还可以过滤出指定的状态码,并将结果存储到一个文件中以供后续深入分析使用…...
Word 和 LaTeX 文档相互转换
Word 和 LaTeX 文档相互转换 目前可以找到两种工具完成将 LaTeX\LaTeXLATEX 文档向 Word 文档的转换, 分别为 Tex2Word和LaTeX-to-Word。 Tex2Word 安装Tex2Word后, 启动 Word, 打开你要转换的 LaTeX\LaTeXLATEX 源文件 (注意,如果没有成功安装 Tex2Word,那么你无法读取…...
python自动发送邮件实现
目录1 前言2 准备工作2.1 电子邮件的基础知识。2.2 python邮件库2.3 邮箱设置3 python实现邮件自动发送3.1 SMTP()和send()方法介绍3.2 python实现实例参考信息1 前言 python功能强大,可以实现我们日常办公的很多任务。诸如批量处理word,excel,pdf等等文件…...
ccc-Classification-李宏毅(4)
文章目录Classification 概念Example ApplicationHow to do ClassificationWhy not RegesssionProbability from Class - FeatureProbability from ClassHow’s the results?Modifying ModelThree StepsProbability DistributionClassification 概念 本质是找一个函数&#x…...
Kubernetes + Docker 部署一个yolov5检测服务(基于FastDeploy)
Kubernetes Docker 从零部署一个yolov5检测服务,服务基于PaddlePaddle/FastDeploy的服务化部署;所有软件从零安装。 文章目录1.说明2.环境3.安装过程 3.1安装 Docker 3.2安装 minikube 3.3安装 Kubectl4.部署过程 4.1 Docker相关 4.2 k8s相关 4.3 启动服…...
【C++/QT】QT5.6解析Excel教程(qtxlsx)
这里写目录标题【背景】【下载qtxlsx】【安装perl】【编译qtxlsx】【添加模块】【使用qtxlsx】【背景】 新接触QT,很多东西都不会,刚接触一个解析Excel的demo,记录一下安装、编译、解析Excel的过程 【下载qtxlsx】 在解析之前,…...
C++之智能指针
前言普通指针的不足new和new门的内存需要用delete和delete[释放。程序员的主观失误,忘了或漏了释放程序员也不确定何时释放(例如多个线程共享同一个对象,没办法确定什么时候释放)普通指针的释放类内的指针,在析构函数中…...
Redis实战-session共享之修改登录拦截器
在上一篇中Redis实战之session共享,我们知道了通过Redis实现session共享了,那么token怎么续命呢?怎么刷新用户呢?本来咱们就通过拦截器来实现这两个功能。 登录拦截器优化: 先来看看现在拦截器情况: 拦截…...
数据可视化,流程化处理pycharts-
本文直接进入可视化,输入讲解输入列表生成图片,关于pandas操作看这篇pandas matplotlib 导包后使用 import matplotlib.pyplot as plt饼图 使用 plt.figure 函数设置图片的大小为 15x15 使用 plt.pie 函数绘制饼图,并设置相关的参数&…...
1626_MIT 6.828 lab1课程大纲学习过程整理
全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 现在lab1的内容全都学习完了,该做的练习也都做了。接下来,整理一下自己看这一部分课程讲义的一些笔记。 整理之前,先把自己完成…...
12月无情被辞:想给还不会自动化测试的技术人提个醒
公司前段时间缺人,也面了不少测试,结果竟没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但是平均水平很让人失望。基本能用一句话概括就是:3年测…...
开发必备技术--docker(使用篇)
文章目录前言Docker的基本概念概念数据卷虚拟网络镜像操作镜像名称镜像命令容器操作基本操作容器创建数据卷操作创建和查看数据卷其他指令实战前言 续接上一篇博文: 开发必备技术–docker(一) 这也是开学了,假期的最后一篇博文&a…...
2023备战金三银四,Python自动化软件测试面试宝典合集(三)
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...
TortoiseGit 使用教程
一、下载工具 这里给大家准备了所有安装包自取 链接:https://pan.baidu.com/s/1xrxxgyNXNQEGD_RjwKnPMg 提取码:qwer 也可在官网自行下载最新版 1.下载git,直接去官网下载Git - Downloads,根据自己的系统合理下载,…...
Linux项目自动化构建工具make/Makefile
本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 目录 前言 正文 makefile文件与语法规则 make指令与执行逻辑 makefile任务刷新策略 .PHONY修饰为伪目标 最后 前言 会不会写makefile,从一个侧面…...
M100嵌入式自动吞吐式读写器|电动读卡机如何通过C#程序读取社保卡号
M100嵌入式自动吞吐式读写器|电动读卡机是一款双保护门功能读卡器,第一层防尘防异物机械门,第二层电动门。 M100嵌入式自动吞吐式读写器|电动读卡机采用耐高温、耐磨擦、高强度、抗老化的复合型塑胶为主体,在走卡通道两侧镶有不锈钢金属&…...
STM32----搭建Arduino开发环境
搭建Arduino开发环境前言一、Arduino软件1.软件下载2.软件安装3.软件操作二、Cortex官方内核三、烧录下载四、其他第三方内核1.Libmaple内核2.Steve改进的LibMaple 内核3.STMicroelectronics(ST)公司编写的内核总结前言 本章介绍搭建STM32搭建Arduino开发环境,包括…...
华为OD机试 - 事件推送(Python),真机试题
事件推送 题目 同一个数轴 X 上有两个点的集合 A={A1, A2, …, Am} 和 B={B1, B2, …, Bn}, Ai 和 Bj 均为正整数,A、B 已经按照从小到大排好序,A、B 均不为空, 给定一个距离 R (正整数), 列出同时满足如下条件的所有(Ai, Bj)数对: Ai <= BjAi, Bj 之间的距离小于…...
论如何获取CSDN原力
0x00 前言 因为个人需求,所以需要增长原力值,故对原力值的增长方式进行探索和总结。 0x01 正文 参考:https://blog.csdn.net/SoftwareTeacher/article/details/114499372 1.举报了劣质内容(博客,下载的资源&#x…...
流程引擎之发展史及对比总结
流程引擎渊源市场上比较有名的开源流程引擎有 jBPM、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四个框架同宗同源,祖先都是 jbpm4,开发者只要用过其中一个框架,基本上就会用其它三个。而 Compile…...
【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN-工具使用】
【DSView逻辑分析抓取波形CAN步骤-硬件连接-数据解析-底层波形认识CAN】1、概述2、实验环境3、写在前面的一个问题4、实验准备(1)硬件连接1)CAN卡连接开发板(2)逻辑分析仪连接开发板(2) CAN卡连接软件&…...
C++中的模板
1.模板C 的模板一直是这门语言的一种特殊的艺术,模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理,仅在运行时处理那些最核心的动态服务,进而大幅优化运行期的性能。因此模板也被…...
Maven_第四章 使用Maven:IDEA环境
目录第一节 创建父工程第二节 配置Maven信息第三节 创建Java模块工程第四节 创建Web模块工程1、创建模块2、修改打包方式3、Web 设定4、借助IDEA生成web.xml5、设置 Web 资源的根目录6、测试6.1 创建文件6.2 配置tomcat第五节 其他操作1、在IDEA中执行Maven命令①直接执行②手动…...
RocketMQ基础学习
前言: RocketMQ阿里开源的,一款分布式的消息中间件,它经过阿里的生产环境的高并发、高吞吐的考验,同时,还支持分布式事务等场景。RocketMQ使用Java语言进行开发,方便Java开发者学习源码。但是,R…...
浙江十大建筑公司排名/搜索引擎优化是做什么的
如果是windows虚拟机 1 记得将杀毒关掉 2 记得将agent.pyw的默认打开方式变更为pythonw 否则有可能没有截图。...
曲阳网站建设/网站源码交易平台
css3pie当Microsoft宣布对Internet Explorer 9CSS3支持时,我们所有人都感到高兴。也许现在,我们将能够使用几十年来在其他浏览器中支持的时髦效果(大约两年)。 不幸的是,IE9仍然不可用,并且更有可能在明年出…...
自己做网站还是用别人网站/杭州seo价格
子查询 一、含义 嵌套在其他语句内部的select语句称为子查询或内查询, 外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多 外面如果为select语句,则此语句称为外查询或主查询 二、分类 1、按出现位置 sele…...
上海的网站开发公司电话/广告公司怎么找客户资源
数据链路层基础——交换机 1.以太网/工作原理以太网采用CSMA/CD——带冲突检测的载波监听多路访问——避免信号冲突工作原理:发送前先监听信道是否空闲,若空闲直接发送,若有冲突则停止发送,等待一段时间继续发送2. 以太网MAC地址—…...
深圳网站开发奇辰科技/世界杯数据分析
一、安装 在集群中每台服务器都执行如下命令: yum install rsync -y 二、使用 rsync -P --rshssh root192.168.102.100:/mnt/test.sql.tar.gz /mnt/test/test.sql.tar.gz 这个命令的含义: -P 断点续传 -rsh ssh 远程shell /mnt/test/test.sql.tar.gz…...
网站怎么做电子合同/新媒体seo培训
2019独角兽企业重金招聘Python工程师标准>>> 为了给希望使用web3j的开发人员提供更大的灵活性,项目由多个模块组成。 根据依赖顺序,列一下: org.web3j.utils :最小实用模块。org.web3j.rlp :递归长度前缀&a…...