【进阶】Spring MVC程序开发

news2024/11/27 5:25:30

努力经营当下,直至未来明朗!

文章目录

  • 一、Spring MVC概述
    • 1. MVC定义
    • 2. MVC和Spring MVC的关系
  • 二、为什么要学Spring MVC
  • 三、如何学Spring MVC
    • 一) 实现用户和程序的映射
      • 方法1:路由@RequestMapping(“/xxx”)
      • 方法2: 使用@PostMapping(“/xxx”) 只支持post请求方式访问
      • 方法3:使用@GetMapping(“/xxx”) 只支持get请求方式访问
    • 二) 获取用户请求参数
      • 1. 获取单个参数
      • 2. 获取多个参数
      • 3. 获取对象
      • 4. 表单参数
      • 5. 实现前后端参数重命名@RequestParam
      • 6. 设置参数必传@RequestParam
      • 7. @RequestBody 接收JSON对象
      • 8. 获取URL地址中参数@PathVariable
      • 9. 上传文件@RequestPart
      • 10. 获取Cookie/Session/header
    • 三) 返回数据
    • 练习:和计算器 (返回text/html)
    • 返回JSON对象
    • 练习:实现登录功能
    • 请求转发或请求重定向【面试常问】
      • 3. ==请求重定向和请求转发的区别==:【面试常问】
    • 补充
      • 1. @ResponseBody说明
      • 2. 更多注解(官方API)
      • 3. 扩充功能
      • 4. 热部署
  • 小结


普通小孩也要热爱生活!

一、Spring MVC概述

  1. Spring Web MVC的官方描述:

Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,” comes from the name of its source module (spring-webmvc), but it is more commonly known as “Spring MVC”

官网:Spring-Web

  1. 翻译

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。

  1. 相当于:Servlet是父类,Spring Web MVC是子类。即:可以将Servlet中的方法等 平移到Spring Web MVC。但是一般不会如此使用,Spring MVC提供了更简单的方式。
  2. Spring MVC包含于Spring框架
  3. 关键信息:
    ① Spring MVC 是⼀个 Web 框架。
    ② Spring MVC 是基于 Servlet API 构建的。

1. MVC定义

  1. MVC,即Model View Controller,翻译过来即“模型、视图、控制器”。它是一种设计模式,这种设计模式将软件(项目)分为三部分:模型、视图和控制器

  2. 模型、视图和控制器三部分的交互方式(重点
    0

  3. 模型、视图和控制器的概念:

① Model(模型):是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据
② View(视图):是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
③ Controller(控制器):是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。

2. MVC和Spring MVC的关系

  1. MVC是一种设计思想,而Spring MVC是一个具体的实现框架。(其实也就类似于:IoC和DI)
  2. Spring MVC是基于MVC设计思想和Servlet API实现的一个Web项目,同时Spring MVC又是Spring框架中的的一个Web模块,它是随着Spring的诞生而存在的一个框架。
  3. Spring和Spring MVC诞生的历史是比较久远的,在他们之后才有了 Spring Boot。

二、为什么要学Spring MVC

  1. 现在绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,⽽ Spring 的核⼼就是 Spring MVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块,⽽ Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出:现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项⽬,这是我们要学 Spring MVC 的原因。
  2. 图片:
    1

三、如何学Spring MVC

  1. Spring MVC项目的创建
    基于Spring Boot 框架添加一个Spring Web(它使用的就是Spring MVC)依赖,此时项目就变成了Spring MVC项目。
  2. Spring MVC学习目标
    1)实现用户和程序的映射(在浏览器输入URL地址之后,能够在程序中匹配到相应的方法)
    2)服务器端要得到用户的请求参数
    3)服务器端要将请求返回给用户(前端)

一) 实现用户和程序的映射

方法1:路由@RequestMapping(“/xxx”)

  1. 路由@RequestMapping(“/xxx”) 实现:
    @RequestMapping(“/xxx”)类上、方法上都可以添加,但是方法上必须添加(除非你不想将该方法暴露则不加)
    返回非静态页面数据,一定要加上@ResponseBody;否则返回404。(如果不加@ResponseBody,则默认返回的是一个静态页面,就会根据方法中返回的内容作为页面名字去找该页面)
    23

注:通过浏览器url去访问的所有请求都是get类型的

  1. @RequestMapping特征:
    1)@RequestMapping既能修饰类,又能修饰方法
    2)@RequestMapping默认支持post、get等多种发送请求的方式。
    5
    6

  2. 实现只允许单种方式进行访问(如post):给@RequestMapping设置参数method,再加上路由地址value(之前没有写进行了缺省)

查看支持设置哪些参数,可以使用ctrl+左键进入@RequestMapping
7

访问结果:
① get不支持
在这里插入图片描述

② Post支持
8

建议所有地址信息都加上/,当然目前版本不加也是ok的

方法2: 使用@PostMapping(“/xxx”) 只支持post请求方式访问

9

方法3:使用@GetMapping(“/xxx”) 只支持get请求方式访问

10


二) 获取用户请求参数

1. 获取单个参数

  1. 参数强烈建议使用包装类,因为包装类是支持null的,而普通类如果为null就会报异常!
    11

  2. Url中注意?键值对的传入作为参数
    12


2. 获取多个参数

  1. 获取多个参数的方法
    13

  2. 使用url传入时注意键值对

① 如果不传入键值对,就是默认值
15

② ?后传入参数:url中String值是不需要加双引号的
16


3. 获取对象

  1. 将对象作为参数直接传入
    17

  2. 前端传参(即:url中?后的写入方式):所有属性值都要传入
    18


4. 表单参数

  1. 举栗子:
    19

5. 实现前后端参数重命名@RequestParam

  1. 某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是由 createtime 字段来接收的,这样就会出现参数接收不到的情况。如果出现这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
  2. 使用@RequestParam 来重命名前后端的参数值,使前后端参数达成一致。
  3. 举栗子:

① 参数重命名之前:
20

②对参数重命名:
21


6. 设置参数必传@RequestParam

  1. 在@RequestParam的源码中可以知道:@RequestParam是参数必传的,不传的话直接报错
    22
    23

  2. 可以手动设置为非必传参数:设置required=false
    25

  3. [小结] @RequiredParam 注意事项:
    如果在参数中添加@RequiredParam注解,那么前端一定要传递此重命名后的参数,否则就会报错;如果要想解决此问题,可以给@RequiredParam里面加上required = false


7. @RequestBody 接收JSON对象

  1. Postman模拟post发送请求(选择body -> form表单):成功
    26

  2. Postman模拟JSON发送请求(选择body -> raw -> JSON):失败

注意:JSON字符串的书写:key一定要加””

27

  1. 所以:服务器端想要接收JSON对象需要使用@RequestBody注解(注意与返回非静态页面的@ResponseBody区分)
    28
    29

8. 获取URL地址中参数@PathVariable

  1. 将参数写入URL中可以提高SEO优先级(提高网站排名)
  2. 注:url中?后面是参数部分,前面是地址部分
  3. 举栗子
    30

9. 上传文件@RequestPart

  1. 注意文件类型MultipartFile 以及 保存文件的函数transferTo
  2. 举例子
    1)固定路径
    ① 代码:
    31

② 使用postman模拟实现(有文件:选择 Body -> form-data)

注:自己的文件参数名是@RequestPart括号中的名字。是参数名,不是真实的文件名

32

③ Send之后发现成功:
33

④ 但是存在一个问题:
因为目的文件的文件名已经固定,此时后续再传文件就会进行覆盖!

2)动态设置写到配置文件中
① 需要修改的是:存入的本地目录、图片名称(名称不能重复)以及获取原上传文件的格式
② 将其写到配置文件中,便于后续修改等操作
③ 开发环境application-dev.yml和生产环境application-prod.yml的配置文件:因为有些配置在不同环境下是不同的。另外,还需要配置文件application.yml来标识是生产环境还是开发环境。
④ 本地目录:
35

⑤ 图片名称(不能重复):时间戳(但是如果同一时间发送的话就会存在覆盖行为,所以不可取)、UUID通用唯一识别码,推荐使用)
36

补充

另外,id也是不可以重复的,取巧的话也可以使用id作为不重复的文件名称;但是存在局限性:只能使用一次。UUID是更加通用的!


10. 获取Cookie/Session/header

  1. Spring MVC的方法是有两个隐含参数的,HttpServletRequest和HttpServletResponse,如果想要使用则直接进行显式使用即可。
    37

  2. 获取Cookie
    ① Servlet获取Cookie的方法:
    在这里插入图片描述
    Fn+f12 可以自己设置Cookie
    38

② 使用@CookieValue的注解实现Cookie的读取:
可以在参数中实现多个@CookieValue,使用, 进行分隔。
39

  1. 获取header(请求头)里的信息
    ① Servlet获取:
    40

② 使用@RequestHeader注解获取
41

  1. 存储和获取Session
    ① 存储Session:Servlet和 SpringMVC操作是一样的
    42

② 获取Sesison
A)方法一:Servlet模式
43
在getSession之前一定要先setSession。(直接get就是空!)
45

B)方法二:使用@SessionAttribute注解
注意:通常是需要指定是非必须参数的;如果不指定,默认是必须参数,没有就会报错!
同样也是先setSession后getSession,否则就为空。
46


三) 返回数据

  1. 默认返回的是静态页面的名称(视图):因为之前是前后端不分离的,为了兼容。
    47

  2. 加上 @ResponseBody注解返回的就是非静态页面数据
    @ResponseBody注解可以修饰类,也可以修饰方法。
    ① @ResponseBody注解修饰类:表示当前类中的所有方法返回的都是非静态页面的数据。
    ② @ResponseBody注解修饰方法:表示当前方法返回的是非静态页面的数据。
    48

  3. [主流]直接使用@RestController返回非静态页面数据(直接去掉类注解@Controller和@ResponseBody)
    49

  4. 查看@RestController源码:(ctrl+左键):
    @RestController就含有了@Controller + @ResponseBody
    50


练习:和计算器 (返回text/html)

1)前端代码:
51

2)后端代码:
52

3)实现:
(输入后自动实现跳转,地址栏中参数也跟着改变)
53


返回JSON对象

55


练习:实现登录功能

注:生产环境一般用压缩的js(即:min.js)

  1. 需要在resources -> static 底下创建一个js包 -> 然后创建jquery-1.9.1.min.js文件【前端】

  2. 如果遇到404找不到min.js(也就是明明有min.js,但是访问不到的情况):
    排查发现:target中没有该文件
    解决方法:直接将target删掉重新启动即可
    扩展:已经存在某个文件,但是访问不到的情况

  3. hasLength函数
    56

  4. JSON.stringify(ret); 注意将JSON格式转为字符串的方法

  5. ① 前端发送JSON数据的标准格式:contentType: “application/json” 对应的是JSON字符串JSON.stringify()。
    57

② 后端参数使用@RequestBody注解(获取JSON对象)
58


请求转发或请求重定向【面试常问】

  1. 请求转发(forward) 两种实现方式:
    1)类注解@Controller实现返回静态页面,注意return语句(省不省略forward都是ok的)
    59
    60

也就是说:请求转发forward是服务器端的行为,返回的是forward的页面的信息。

2)使用HttpServlet实现
61
62

  1. 请求重定向(redirect)两种实现方式:
    1)类注解@Controller,注意return返回语句以及url变化
    63
    65

即:

① 请求重定向(redirect)之后,url会发生变化,变为重定向地址。
② 请求重定向(redirect)请求两次,状态码是302(临时重定向);不返回任何关于重定向的页面信息,都是直接访问的。
③ 请求重定向(redirect)发生在客户端(浏览器端)
【可以类比借钱来区分转发和重定向】

2)使用Response对象:
66

3. 请求重定向和请求转发的区别:【面试常问】

1)定义不同:转发forward是发生在服务器上,将目标地址返回的结果直接返回给客户端; 重定向redirect是发生在客户端上的,服务器将目的地址返回给客户端,然后客户端自己去完成目标地址的访问。

2)请求方/跳转方不同(一次、两次):forward一次,是服务器端的行为;redirect两次,是客户端的行为。

3)数据共享不同:forward请求和返回的数据共享;redirect两次请求的数据是不同的。

4)最终URL地址不同:forward不变,redirect改变。

5)代码实现不同

[请求转发速度比请求重定向快:因为forward只发送一次请求]

具体参考:请求转发和请求重定向的区别
70
71


补充

1. @ResponseBody说明

  1. @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成application/json 返回给前端。
  2. @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者json,⽽不是视图。(也就是返回非静态页面数据)

2. 更多注解(官方API)

官方API


3. 扩充功能

  1. 不同平台的配置文件设置:
    1)新建不同平台的配置文件
    72

不同平台的配置文件的命名规则:application-平台.yml (properties)
【必须这样命名,为了后续在application中使用方便】

2)在主配置环境中设置运行的配置文件
73

【注】如果只有一份就直接写在总配置文件application中

4. 热部署

热部署操作步骤


小结

  1. MVC是思想,Spring MVC是具体实现
  2. Spring MVC是基于MVC设计思想和Servlet API实现的一个Web项目
  3. Spring的核心是Spring MVC
  4. 路由@RequestMapping("/xx)可以用于类or方法
  5. @RequestMapping("/xx)适用于多种请求,可以限定只能某种请求方式
  6. 获取用户请求参数:单个、多个、对象、表单、JSON对象(@RequestBody)、url中参数、上传文件以及获取Cookie、Session、header。
  7. @RequestParam 设置参数必传以及重命名
  8. @ResponseBody、@RestController
  9. 请求转发forward 和 请求重定向redirect的区别
  10. 热部署

yyy

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python纯手动搭建BP神经网络(手写数字识别)

来源:投稿 作者:张宇 编辑:学姐 实验介绍 实验要求: 实现一个手写数字识别程序,如下图所示,要求神经网络包含一个隐层,隐层的神经元个数为15。 整体思路: 主要参考西瓜书第五章神…

一款超赞的算法可视化工具,让算法过程动态展示出来

从文字或者图片中学习算法还是一件很无聊的事。当然,现在有许多很棒的网站可以查看各种算法的动画。然而,对于开发人员来说,如果能将实现算法的代码的实际执行操作通过可视化展现出来,那就是最好不过了。推荐一款开源工具&#xf…

深度学习——编码器

1.复习CNN 在CNN中,输入一张图片,经过多层的卷积层,最后输出层判别图片中的物体的类别。 CNN使用卷积层做特征提取(编码),使用Softmax回归做预测(解码) ①编码器:将输入…

ArrayList扩容机制~

ArrayList()//会使用长度为零的数组 ArrayList(int initialCapacity)//会使用指定容量的数组 public ArrayList(Collection<?extends E>c>//会使用c的大小作为数组容量假设我们设置一个列表的最初容量为10&#xff0c;如下所示&#xff1a; ArrayList<Integer>…

【Python从入门到进阶】5、变量的定义及数据类型

接上篇《4、pycharm的安装及使用》 上一篇我们学习了python编程工具pycharm的安装及基本使用。后续篇章我们正式来学习Python语言的语法和特性&#xff0c;本篇我们主要学习Python变量的定义及数据类型。 一、注释 1、注释介绍 在工作编码的过程中&#xff0c;如果一段代码的…

(深度学习快速入门)第三章第三节4:深度学习必备组件之TensorBoard和标准化技术

文章目录一&#xff1a;TensorBoard&#xff08;1&#xff09;TensorBoard介绍&#xff08;2&#xff09;Pytorch安装TensorBoard&#xff08;3&#xff09;TensorBoard使用&#xff08;4&#xff09;服务器tensorboard本地显示&#xff08;5&#xff09;AutoDL等算力平台tenso…

07技术太卷我学APEX-动态菜单+URL传参数给页面

07技术太卷我学APEX-动态菜单URL传参数给页面 0 应用场景 《技术太卷我学APEX》收集的项目越来越多&#xff0c;我想把【类】【子类】加到导航菜单栏&#xff0c;点击不同的分类菜单栏&#xff0c;对列表进行过滤&#xff0c;也可以全部浏览&#xff0c;如下图&#xff1a; …

JAVA SE复习(第1章 Java概述)

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用 目录 第1章 Java概述 1.1 Java语言发展历史&#xff08;记关键点&#xff09; 1.2 Java语言特点&#xff08;后面需要关注和体会&#xff09; 1.3 Java语言跨平台原理&#xff08;理解&#xff09; 1…

4. 网络编程之TCP编程

1. 《计算机网络编程》 我们接触网络编程&#xff0c;肯定是要对网络编程的一些专业术语及基本理论知识是要有所认知的。python网络编程无非是在这些基础理论知识之上给我们提供了一些方便实用的网络库来供我们使用。尽管做了非常底层的封装&#xff0c;并且给我们暴露了上层的…

java IO流之缓冲流详解

缓冲流概述 缓冲流也称为高效流或者高级流。之前我们学习的字节流、字符流可以成为基本流。 作用&#xff1a;缓冲流自带缓冲区、可以提高基本字节流、字符流读写数据的性能。 分类&#xff1a; BufferedInputStream -->字节缓冲输入流 BufferedOutputStream–>字节缓冲输…

ch1_1计算机系统概论

1. 内容安排 1.1 概论 1.2 计算机系统的硬件结构 存储器&#xff0c;I/O 输入与输出&#xff1b;系统总线&#xff1b;CPU 1.3 第三篇 CPU 中央处理器中&#xff0c;所包含的内容&#xff1a; ALU&#xff0c; CUCPU 内部互连寄存器 1.4 CU CU &#xff1a; control uni…

最新虚幻5引擎(UE5)游戏性能的影响详解

Unreal Engine 5 是由 Unreal Engine 公司开发的一款游戏引擎。5 代表引擎的主要版本号。它专为创建多人在线游戏、手机游戏、高端游戏和虚幻应用程序而设计。从图中可以看出&#xff0c;随着场景复杂度的增加&#xff0c;UE5的内存占用会逐渐增加。当然&#xff0c;这并不意味…

Redis简介、数据类型和命令

1 Redis 简介Redis 是一个高性能的 key/value 数据库。它是完全开源免费的&#xff0c;并且遵守 BSD 协议。1.1 Redis 特点不仅支持 key/value 类型的数据&#xff0c;也支持 list,hash,set,zset 等等数据结构。支持持久化&#xff0c;可以把内存数据保存到磁盘上&#xff0c;重…

高并发异步多线程处理例子

用户请求流程 问题点 tomcat 线程资源占满&#xff0c;由于tomcat线程资源有限&#xff0c;每个请求都会经由tomcat线程处理&#xff0c;阻塞至web层处理完才能回收再利用。web层分发至后端服务可能会扩大几倍甚至数百倍的&#xff0c;譬如用户发起请求1w/s&#xff0c;到后端…

JavaEE10-Spring Boot配置文件

目录 1.配置文件作用 2.配置文件的格式 为配置文件安装提示插件 2.1. .properties&#xff08;旧版&#xff0c;默认的&#xff09; 2.1.1.基本语法 PS:配置文件中使用"#"来添加注释信息&#xff0c;2种添加方式&#xff1a; 2.1.2.缺点分析 2.2. .yml&#…

阿里“云开发“小程序(uniCloud)

博主ps&#xff1a; 网上资料少的可怜&#xff0c;哎&#xff0c;腾讯云涨价了&#xff0c;论服务器&#xff0c;我肯定选的阿里&#xff0c;再着你们对比下uniCloud的报价就知道了&#xff0c;如果有钱就另当别论了。 所以这片博文&#xff0c;博主试过之后&#xff0c;先抛出…

Git速成指南

文章目录版本管理工具概念版本管理工具介绍版本管理发展简史SVN(SubVersion)GitGit工作流程图Git安装基本配置为常用指令配置别名&#xff08;可选&#xff09;解决GitBash乱码问题Git常用命令获取本地仓库基础操作指令查看修改的状态&#xff08;status&#xff09;添加工作区…

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进

[翻译]PostgreSQL中的WAL压缩以及版本15中的改进从以开始就一直在尝试对WAL进行不同级别的压缩。自2016年以来内置功能&#xff08;wal_compression&#xff09;就一直存在&#xff0c;几乎所有备份工具都会在传递到备机前对WAL进行压缩。但现在是时候再看看内置的wal_compress…

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

在正式学习本篇博客前&#xff0c;先要了解一下什么是 SVG&#xff08;Scalable Vector Graphics&#xff09;&#xff0c;它是一种矢量图形格式&#xff0c;可以用来在网页上创建可伸缩的图形。 使用 SVG 技术实现反爬虫的方法有以下几种&#xff1a; 验证码&#xff1a;使用…

imx6ull Linux使用设备树配置LED

我们基于寄存器的方式已经编写了LED驱动&#xff0c;实现点亮/熄灭LED&#xff0c;但是你有没有发现一个问题&#xff0c;就是假设LED修改了一个GPIO&#xff0c;那么需要对应的修改寄存器代码&#xff0c;非常繁琐&#xff0c;而且随着改板次数增加&#xff0c;那么会带来一个…