当前位置: 首页 > news >正文

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 功能等同&#xff0c;均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。 对于 SpringMVC&#xff0c;主…...

《解谜三星堆:开启中华文明之门》-范勇 笔记

甲篇 应重视民间流传的疑似三星堆的文物&#xff0c;对其展开充分的研究&#xff0c;以发现更多关于三星堆的秘密&#xff0c;并且避免“敦煌窘境”&#xff0c;让我国的三星堆学术研究处于世界领先地位&#xff01;&#xff08;书中就讲到了在民间首次发现了圆形玉器&#xf…...

锐捷(十四)mpls vxn optionc的关键问题所在和具体问题分析

用锐捷的设备搭建mpls vxn optionc的基础版和带RR的版本&#xff0c;在控制平面和转发平免上分析mpls vxn optionc的关键问题所在和具体问题分析。一 基础mpls vxn optionc&#xff1a;核心&#xff1a;两pe之间之间建立MP EBGP邻居&#xff0c;从而直接传递路由解放了ASBR。关…...

Python语言零基础入门教程(十四)

Python 日期和时间 Python 程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜&#xff08;历元&…...

Https 协议超强讲解(一)

都说Https协议非常安全&#xff0c;那为什么还是会被抓包呢&#xff1f;抓包后会影响什么吗&#xff1f; HTTPS协议 随着 HTTPS 建站的成本下降&#xff0c;现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全&#xff0c;也听说过与 HTTPS 协议相关…...

5.Redis 实现点赞 优化登陆(验证码 token..)

Redis&#xff08;1&#xff09;简介Redis 是一个高性能的 key-value 数据库原子 – Redis的所有操作都是原子性的。多个操作也支持事务&#xff0c;即原子性&#xff0c;通过MULTI和EXEC指令包起来。非关系形数据库数据全部存在内存中&#xff0c;性能高。&#xff08;2&#…...

scscanner:一款功能强大的大规模状态码扫描工具

关于scscanner scscanner是一款功能强大的大规模状态码扫描工具&#xff0c;该工具可以帮助广大研究人员从一个URL列表文件中批量读取目标网站的状态码响应信息。除此之外&#xff0c;该工具还可以过滤出指定的状态码&#xff0c;并将结果存储到一个文件中以供后续深入分析使用…...

Word 和 LaTeX 文档相互转换

Word 和 LaTeX 文档相互转换 目前可以找到两种工具完成将 LaTeX\LaTeXLATE​X 文档向 Word 文档的转换, 分别为 Tex2Word和LaTeX-to-Word。 Tex2Word 安装Tex2Word后, 启动 Word, 打开你要转换的 LaTeX\LaTeXLATE​X 源文件 (注意,如果没有成功安装 Tex2Word,那么你无法读取…...

python自动发送邮件实现

目录1 前言2 准备工作2.1 电子邮件的基础知识。2.2 python邮件库2.3 邮箱设置3 python实现邮件自动发送3.1 SMTP()和send()方法介绍3.2 python实现实例参考信息1 前言 python功能强大&#xff0c;可以实现我们日常办公的很多任务。诸如批量处理word,excel,pdf等等文件&#xf…...

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检测服务&#xff0c;服务基于PaddlePaddle/FastDeploy的服务化部署&#xff1b;所有软件从零安装。 文章目录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&#xff0c;很多东西都不会&#xff0c;刚接触一个解析Excel的demo&#xff0c;记录一下安装、编译、解析Excel的过程 【下载qtxlsx】 在解析之前&#xff0c;…...

C++之智能指针

前言普通指针的不足new和new门的内存需要用delete和delete[释放。程序员的主观失误&#xff0c;忘了或漏了释放程序员也不确定何时释放&#xff08;例如多个线程共享同一个对象&#xff0c;没办法确定什么时候释放&#xff09;普通指针的释放类内的指针&#xff0c;在析构函数中…...

Redis实战-session共享之修改登录拦截器

在上一篇中Redis实战之session共享&#xff0c;我们知道了通过Redis实现session共享了&#xff0c;那么token怎么续命呢&#xff1f;怎么刷新用户呢&#xff1f;本来咱们就通过拦截器来实现这两个功能。 登录拦截器优化&#xff1a; 先来看看现在拦截器情况&#xff1a; 拦截…...

数据可视化,流程化处理pycharts-

本文直接进入可视化&#xff0c;输入讲解输入列表生成图片&#xff0c;关于pandas操作看这篇pandas matplotlib 导包后使用 import matplotlib.pyplot as plt饼图 使用 plt.figure 函数设置图片的大小为 15x15 使用 plt.pie 函数绘制饼图&#xff0c;并设置相关的参数&…...

1626_MIT 6.828 lab1课程大纲学习过程整理

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 现在lab1的内容全都学习完了&#xff0c;该做的练习也都做了。接下来&#xff0c;整理一下自己看这一部分课程讲义的一些笔记。 整理之前&#xff0c;先把自己完成…...

12月无情被辞:想给还不会自动化测试的技术人提个醒

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;结果竟没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在10-20k&#xff0c;面试的人很多&#xff0c;但是平均水平很让人失望。基本能用一句话概括就是&#xff1a;3年测…...

开发必备技术--docker(使用篇)

文章目录前言Docker的基本概念概念数据卷虚拟网络镜像操作镜像名称镜像命令容器操作基本操作容器创建数据卷操作创建和查看数据卷其他指令实战前言 续接上一篇博文&#xff1a; 开发必备技术–docker&#xff08;一&#xff09; 这也是开学了&#xff0c;假期的最后一篇博文&a…...

2023备战金三银四,Python自动化软件测试面试宝典合集(三)

马上就又到了程序员们躁动不安&#xff0c;蠢蠢欲动的季节~这不&#xff0c;金三银四已然到了家门口&#xff0c;元宵节一过后台就有不少人问我&#xff1a;现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试&#xff0c;一个程序员成长之路永恒绕…...

TortoiseGit 使用教程

一、下载工具 这里给大家准备了所有安装包自取 链接&#xff1a;https://pan.baidu.com/s/1xrxxgyNXNQEGD_RjwKnPMg 提取码&#xff1a;qwer 也可在官网自行下载最新版 1.下载git&#xff0c;直接去官网下载Git - Downloads&#xff0c;根据自己的系统合理下载&#xff0c…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...