SpringMVC-学习笔记
文章目录
- 1.概述
- 1.1 SpringMVC快速入门
- 2. 请求
- 2.1 加载控制
- 2.2 请求的映射路径
- 2.3 get和post请求发送
- 2.4 五种请求参数种类
- 2.5 传递JSON数据
- 2.6 日期类型参数传递
- 3.响应
- 3.1 响应格式
- 4.REST风格
- 4.1 介绍
- 4.2 RESTful快速入门
- 4.3 简化操作
1.概述
SpringMVC是一个基于Java的Web应用程序框架,用于构建灵活和可扩展的MVC(Model-View-Controller)架构的Web应用程序。
- 它是
Spring框架的一部分,旨在简化Web应用程序的开发过程。- SpringMVC技术与Servlet技术功能等同,属于
WEB层开发技术。SpringMVC优点:
- 简化WEB层开发;
- 与Spring、SpringBoot等框架集成;
- 提供强大的约定大于配置的契约式编程支持;
- 支持REST风格;
1.1 SpringMVC快速入门
步骤:
- 创建maven-web工程
- 添加spring-webmvc依赖
- 准备controller类(处理浏览器请求的接口)
- 创建配置文件
- 定义一个用于配置Servlet容器的初始化类,加载spring配置
- 启用测试
<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><groupId>com.imooc</groupId><artifactId>springmvc-demo</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><url>http://maven.apache.org</url><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.9.RELEASE</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>81</port><path></path></configuration></plugin></plugins></build>
</project>
package it.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;//3.创建控制器(等同于servlet)
@Controller
public class MyController {//设置当前操作的请求路径@RequestMapping("/save")//设置当前操作的返回类型@ResponseBodypublic String save(){System.out.println("user saving...");return "{'info':'springmvc'}";}
}-------------------------------------------------------------------------------------
package it.conf;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;//4.创建springmvc的配置文件,加载controller对应的bean
@Configuration
@ComponentScan("it.controller")
public class SpringMvcConfig {
}------------------------------------------------------------------------------------------------
package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//5.定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//创建Servlet应用程序上下文,加载springmvc容器配置@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class);return context;}//配置DispatcherServlet映射的URL路径,设置哪些请求归属springmvc处理//{"/"}表示所有请求@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//创建根应用程序上下文,加载spring容器配置@Overrideprotected WebApplicationContext createRootApplicationContext() {return null;}
}

2. 请求
2.1 加载控制
Spring相关bean
- 业务bean(Service)
- 功能bean(DataSource)
SpringMVC相关bean
- 表现bean
不同的bean都是通过@controller 定义如何避免扫描混乱?

配置Servlet容器的初始化,并加载Spring和Spring MVC的配置的两种方式:
方法1:继承自AbstractDispatcherServletInitializer
package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {//创建Servlet应用程序上下文,加载springmvc容器配置@Overrideprotected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringMvcConfig.class);return context;}//配置DispatcherServlet映射的URL路径,设置哪些请求归属springmvc处理//{"/"}表示所有请求@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}//创建根应用程序上下文,加载spring容器配置@Overrideprotected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();context.register(SpringConfig.class);return context;}
}
方法2:继承自AbstractAnnotationConfigDispatcherServletInitializer类
package it.conf;import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;//
//定义一个用于配置Servlet容器的初始化类,加载spring配置
public class ServletContainersInitConfigg extends AbstractAnnotationConfigDispatcherServletInitializer {@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}
}
2.2 请求的映射路径
避免不同控制器中有相同的请求映射,每个控制器类中要加应该请求路径前缀,用于区分不同的请求
@Controller
@RequestMapping("/book") //请求路径的前缀
public class BookController {@RequestMapping("/save") //请求映射@ResponseBodypublic String save(){System.out.println("book save");return "{'module':'book save'}";}@RequestMapping("/delete")@ResponseBodypublic String delete(){System.out.println("book delete");return "{'module':'book save'}";}
}

2.3 get和post请求发送
get请求


post请求


解决中文乱码问题
- 在Springmvc的Servlet容器配置中添加过滤器
@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("utf-8");return new Filter[]{characterEncodingFilter};}

2.4 五种请求参数种类
参数类型:
- 普通参数
- POJO类型参数
- 嵌套POJO
- 数组类型
- 集合类型
@ResponseBody的作用
- 设置当前控制器方法响应内容为当前返回值,无需解析。
参数映射规则
- 客户端传递的参数名称需要和服务器端的参数名称对应,名称不对应无法接受。
- 解决:注解@RequestParam
2.实体类参数传递


3.嵌套POJO

4. 数组类型

5. 集合类型

2.5 传递JSON数据
添加json坐标
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency>
在SpringMvcConfig配置文件中添加@EnableWebMvc开启Json转换功能
package com.it.config;@Configuration
@ComponentScan("com.it.controller")
@EnableWebMvc
public class SpringMvcConfig{
}



2.6 日期类型参数传递
日期格式:
- 2023-08-29
- 2023/08/29
- 08/23/2023


3.响应
3.1 响应格式
响应:将处理完的结果反馈给客户端(浏览器)
响应页面
响应数据
- 文本数据
- json数据
@ResponseBody的作用
- 设置当前控制器返回值作为响应体
- 对象->json 、list->json
1.响应页面
package com.it.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class UserRespController {//响应页面@RequestMapping("/toJumpPage")public String toJumpPage(){System.out.println("跳转页面中");return "page.jsp";}
}

<%--Created by IntelliJ IDEA.User: 11445Date: 2023/8/29Time: 18:22To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>跳转页面</title>
</head>
<body>
<h1>跳转页面hh</h1>
</body>
</html>
跳转到其他网站页面
将返回值改为 “redirect:https://www.baidu.com/”
//响应页面2@RequestMapping("/tobaidu")public String tobaidu(){System.out.println("跳转页面中");return "redirect:https://www.baidu.com/";}

2.响应文本数据
//响应文本@RequestMapping("/toText")@ResponseBodypublic String toText(){System.out.println("响应文本");return "response text";}

3.响应JSON数据
//响应JSON@RequestMapping("/toJSON")@ResponseBodypublic User toJSON(){System.out.println("响应JSON");User user = new User();user.setId(1);user.setAge(56);user.setName("nimi");return user;}

4.REST风格
4.1 介绍
REST(Representational State Transfer)表现形式转换
- 是一种
软件架构风格,用于设计网络应用程序的分布式系统。- 使用
统一的接口和基于资源的通信方式,通过HTTP协议进行通信。
REST风格的设计原则
- 基于资源:将应用程序的功能抽象为资源,每个资源通过唯一的URL进行标识。
- 使用HTTP方法:通过HTTP的不同方法(GET、POST、PUT、DELETE等)对资源进行操作。
- 无状态:服务器不保存客户端的状态信息,每个请求都包含足够的信息来完成请求。
- 统一接口:使用统一的接口定义资源的操作方式,包括资源的标识、操作方法和表示形式等。
- 可缓存性:对于不经常变化的资源,可以使用缓存机制提高性能。
- 分层系统:不同的组件可以通过中间层进行通信,提高系统的可伸缩性和灵活性。
与传统资源描述形式的区别
传统风格
http://localhost/user/getById?id=1
http://localhost/user/saveUserREST
http://localhost/user/1
http://localhost/user
---------------------------------------------------------------------------按照REST风格访问资源使用 -行为动作- 区分对资源进行何种操作查全部用户 GET:http://localhost/user
查指定用户 GET:http://localhost/user/1
添加用户 POST:http://localhost/user
修改用户 PUT :http://localhost/user
删除用户 DELETE:http://localhost/user/1
优点
- 隐藏了资源的访问行为,无法通过地址得知对资源是何种操作
- 书写简化
4.2 RESTful快速入门
package com.it.controller;import com.it.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;@Controller
public class UserRestController {//1通过id查@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)@ResponseBodypublic String getById(@PathVariable Integer id){System.out.println("通过id查询"+id);return "...";}//查全部@RequestMapping(value = "/user",method = RequestMethod.GET)@ResponseBodypublic String getAll(){System.out.println("查全部");return "...";}//修改//@ResponseBody注解表示该方法的返回值将直接作为HTTP响应的body部分返回给客户端。// insert方法返回的字符串将作为响应的body返回给客户端。//@RequestBody注解表示该方法需要从请求的body部分获取数据,通常用于处理POST、PUT请求中的数据。// @RequestBody User user表示将请求的body中的数据转换为User对象,并作为参数传入insert方法中。@RequestMapping(value = "/user",method = RequestMethod.PUT)@ResponseBodypublic String update(@RequestBody User user){System.out.println("修改"+user);return "...";}//新增@RequestMapping(value = "/user",method = RequestMethod.POST)@ResponseBodypublic String insert(@RequestBody User user){System.out.println("新增"+user);return "...";}//删除//@PathVariable是Spring MVC中的注解,它的作用是将路径中的变量与方法参数进行绑定。// @PathVariable注解用于绑定路径中的{id}变量到方法参数id上,即通过{id}来获取请求路径中的id值。@RequestMapping(value = "/user/{id}",method = RequestMethod.DELETE)@ResponseBodypublic String delete(@PathVariable Integer id){System.out.println("通过id删除"+id);return "...";}
}

4.3 简化操作
package com.it.controller;import com.it.pojo.User;
import org.springframework.web.bind.annotation.*;@RestController //@Controller和@ResponseBody的合体
@RequestMapping("/user")public class UserRestEasyController {//1通过id查@GetMapping("/{id}")public String getById(@PathVariable Integer id){System.out.println("通过id查询1"+id);return "...";}//查全部@GetMappingpublic String getAll(){System.out.println("查全部");return "...";}//修改@PutMappingpublic String update(@RequestBody User user){System.out.println("修改"+user);return "...";}//新增@PostMappingpublic String insert(@RequestBody User user){System.out.println("新增"+user);return "...";}//删除@DeleteMapping("/{id}")public String delete(@PathVariable Integer id){System.out.println("通过id删除"+id);return "...";}
}相关文章:
SpringMVC-学习笔记
文章目录 1.概述1.1 SpringMVC快速入门 2. 请求2.1 加载控制2.2 请求的映射路径2.3 get和post请求发送2.4 五种请求参数种类2.5 传递JSON数据2.6 日期类型参数传递 3.响应3.1 响应格式 4.REST风格4.1 介绍4.2 RESTful快速入门4.3 简化操作 1.概述 SpringMVC是一个基于Java的Web…...
【STM32】学习笔记(TIM定时器)
TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且…...
Jdk8 动态编译 Java 源码为 Class 文件(三)
Jdk8 动态编译 Java 源码为 Class 文件 一.JDK版本二.工程介绍1.依赖2.启动类3.配置类(用于测试依赖注入)4.工具类1.Java 源码文件读取类2.SpringBoot 容器实例管理类 5.测试类1.抽象类2.接口类3.默认抽象实现4.默认接口实现 6.接口类1.测试接口2.类重载…...
Shell自动化日志维护脚本
简介: 系统日志对于了解操作系统的运行状况、故障排除和性能分析至关重要。然而,长期积累的日志文件可能变得庞大,影响系统性能。在这篇文章中,我们将介绍一个自动化的解决方案,使用 Bash 脚本来监控和维护系统日志文件…...
设计模式入门笔记
1 设计模式简介 在IT这个行业,技术日新月异,可能你今年刚弄懂一个编程框架,明年它就不流行了。 然而即使在易变的IT世界也有很多几乎不变的知识,他们晦涩而重要,默默的将程序员划分为卓越与平庸两类。比如说ÿ…...
存储成本降低85%,携程历史库场景的降本实践
携程,一家中国领先的在线票务服务公司,从 1999 年创立至今,数据库系统历经三次替换。在移动互联网时代,面对云计算卷积而来的海量数据,携程通过新的数据库方案实现存储成本降低 85% 左右,性能提升数倍。本文…...
如何精确掌握函数防抖和函数节流的使用?
前序 函数防抖(Debouncing)和函数节流(Throttling)都是用于控制函数执行频率的技术,通常在处理高频率触发的事件(如窗口滚动、鼠标移动、输入框输入等)时非常有用 一、核心概念 函数防抖 函…...
【Linux系列】离线安装openjdk17的rpm包
首发博客地址 首发博客地址[1] 系列文章地址[2] 视频地址[3] 准备 RPM 包 请从官网下载:https://www.oracle.com/java/technologies/downloads/#java17[4] 如需不限速下载,请关注【程序员朱永胜】并回复 1020 获取。 安装 yum localinstall jdk-17_linux…...
Python 没有 pip 包问题解决
最近需要搞一个干净的Python,从官网上直接下载解压可用的绿色版,发现无法正常使用PiP 一 官网下载Python https://www.python.org/downloads/ 选择 embeddable package,这种是免安装的包,解压后可以直接使用。 二 配置环境变量 添加环境变量:…...
并发-Java中的锁(二)--- 重入锁ReentrantLock,公平锁,非公平锁笔记
重入锁ReentrantLock 支持重进入的锁,表示该锁能够支持一个线程对资源的重复加锁该锁支持获取锁时的公平和非公平的选择 如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么锁是公平的,获取锁是顺序的。 实现重进入 线程再…...
LeetCode每日一题:1921. 消灭怪物的最大数量(2023.9.3 C++)
目录 1921. 消灭怪物的最大数量 题目描述: 实现代码与解析: 贪心 原理思路: 1921. 消灭怪物的最大数量 题目描述: 你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 …...
SpringBoot连接MySQL数据库,使用Mybatis框架(入门)
1. 说明 SpringBoot项目,连接MySQL数据库,使用Mybatis框架。 本篇文章作为 SpringBoot 使用 Mybatis 的入门。 2. 依赖 2.1. MySQL驱动依赖 MySQL驱动,使用SpringBoot版本对应的默认版本,不需要手动指定版本。 比如…...
滑动窗口实例6(找到字符串中所有字母异位词)
题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabac…...
武林新秀(一)`git init` 初始化一个新的Git仓库
文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 git init 是 Git 版本控制系统中用于初始化一个新的 Git 仓库或重新初始化一个现有的仓库的命令。“init” 是 “initialize”(初始化)…...
gRPC之Interceptor
1、gRPC Interceptor 在应用开发过程中会有这样的需求,就是在请求执行前后做一些通用的处理逻辑,比如记录日志、tracing、身份 认证等,在web框架中一般是使用middleware来实现的,gRPC 在客户端和服务端都支持了拦截器功能&#…...
计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉
文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…...
ELK安装、部署、调试 (七)kibana的安装与配置
1.介绍 Kibana 是一个基于浏览器的开源可视化工具,主要用于分析大量日志,以折线图、条形图、饼图、热图、区域图、坐标图、仪表、目标、时间等形式。预测或查看输入源的错误或其他重大事件趋势的变化。Kibana 与 Elasticsearch 和 Logstash 同步工作&am…...
【Npm】的安装和使用教程
前端工具及插件库 专栏收录该内容 24 篇文章1 订阅 订阅专栏 npm 一、安装配置 二、初始化配置文件 package.json package.lock.json 二、下载模块 2.1、下载指令 2.2、清理缓存 2.3、模块信息 2.4、npm i 与 npm ci 区别 三、其他指令 第三方模块是别人写好的一些文件…...
22.3D等距社交媒体菜单的悬停特效
效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…...
音视频开发常用工具
文章目录 前言一、VLC 播放器1、简介2、下载3、VLC media player4、VLC 打开网络串流5、VLC 作为流媒体服务器①、搭建 RTSP 流媒体服务器②、新建播放器 二、MediaInfo1、简介2、下载3、MediaInfo①、主界面②、主要功能特点③、使用方法④、Mediainfo 相关参数和含义简介 三、…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...


