Spring Web MVC
Spring Web MVC
Spring Web MVC 是基于 Severlet API 构建的原始的Web框架,从一开始就包含在Spring框架中.它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".
MVC
MVC是 Model View Controller 的缩写,他是软件工程中的一种软件架构设计模式,它把软件系统分为模型,视图和控制器三个基本部分.
MVC 是一种思想,Spring进行了实现,称为 Spring MVC.
不过 Spring 在实现 MVC 时,也结合了自身项目的特点,做了一些改变,相对而言,下图会更加的合适.
SpringBoot是创建SpringMVC项目的一种方式.
学习Spring MVC
当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有View层了.所以View又有了一种解释:之前返回的是视图,现在返回的是视图所需要的数据.
1.建立连接(客户端和服务器)
@RequestMapping
@RequestMapping 路由映射
@RequestMapping可以修饰方法,也可以修饰类
访问地址:类的路径+方法路径
现在由于@RequestMapping没有修饰类,所以没有类路径,因此在这里,只需要方法路径即可
如果有类路径
则需要用类路径+方法路径来访问
每个路径也可以写多层,比如:
注意:此处的 / 可以省略,但是建议加上.
在学习servlet的时候请求分为get请求和post请求,那么这里的请求是get还是post呢?
用fiddle抓包之后我们可以知道他支持GET请求.
那他支不支持post请求呢?
我们总不能费老大劲写一个form表单或者Ajax的前端页面吧?此时就需要用到postman.
我们可以看到,当我们将这个请求改为post请求的时候,下方也可以进行一个正确的响应.
说明@RequestMapping及支持GET请求也支持POST请求.
其实@RequestMapping支持所有类型的请求.
限制请求方式
那如果我只想让它支持GET请求怎么办?
此时此刻我们再次使用postman发送POST请求
此时就会报405.
2.请求
请求主要就是学习如何传参.
使用基本类型来接收参数的时候,参数是必须要传的(除了boolean),因此建议使用包装类型.
1.传递单个参数
我们建议给每一个类都单独创建一个RequestMapping(类路径).
因为不同的类之间,方法的路径名可能会相同,为了防止发生冲突,所以推荐每个类都有一个类路径.
这里我们使用 query string 的方式去发送信息
这里需要注意的是
这里的名字要相同,不然会识别不到!!!.
底层逻辑:从请求的参数中,获取参数名为name的值,并给name赋值.
2.多个参数
当然这里的顺序也可以调换.
我们这里没有传age,但由于这里我们使用的是Integer类型的数据,所以传过来的显示的是null.
那假如说我们这里用int类型,正常传参一定是可以的,那如果此时我们没传age数据,会怎么样?
内部错误.
同时日志也报了错误.
日志翻译.
所以我们在定义的时候尽可能的去使用包装类型.而且包装类型可以区分0和null.
3.对象
如果传递对象的话,直接去发值就可以了,spring会帮助我们进行关系的映射,自动的封装成对象.
开发中,接口的参数通常定义为对象.
后端参数重命名
假设,现在我的系统有很多种名字,前端这里发来的name数据我为了区分,想要使用username,怎么办?
此时就可以使用@RequestParam注解.
那如果此时前端使用username来发数据会怎么样呢?
idea日志报错:
也就是说,如果我们使用了@RequsetParam注解,那么这个参数就变成了一个必传参数.
通过阅读@RequsetParam注解源码可以得知,使其变成必传参数的代码,就是这一行.
那如果我们只是想改个名字,不想让它变为必传参数,怎么办?
如果进行了重命名之后,就必须使用@RequestParam注解里的名字
4.数组/集合类
当我们请求中,同一个参数有多个时,浏览器就会帮我们封装成一个数组.
5开头的通常指服务端发生错误(此时第一反应去看后端日志)
4开头的通常指客户端发送错误
控制台日志如上,翻译如下:
人话,浏览器默认将相同名字的数据整合为数组,不是集合,如果我们需要使用集合类,需要加一个注解.
当然了我们需要记住的是,这个注解所修饰的参数,是必传参数,如果不想使其成为必传参数
要加这行代码.
状态码是后端去自定义的吗?.
状态码分为两种
1.HTTP状态码
通常情况下
2XX:成功
3XX:重定向
4XX:客户端错误
5XX:服务端错误
比如我们前面看到过的 404 405 500
这些状态码不是后端自定义的,而是HTTP返回的
2.业务状态码(后端自定义)
HTTP响应成功的情况下,业务的响应结果分为不同的状态.
比如:用户登录
1.密码正确 200
2.密码错误 -1
传递JSON数据
注意:JSON只能接收body的数据,也就是只能接收post请求的请求正文.
以上所有数据传输的格式都有一个共同的缺点:扩展性非常差.也就是说上述的方式只要我数据传输的类型不同我就要去改接口的定义.在这里"接口"指的是API,就是应用程序提供了哪些服务,接口如果对应到代码上,通常是指方法或者类.
JSON:JavaScript Object Notation (Java对象表示法)
JSON是一种轻量级的数据交互格式.它基于ECMAScript的一个子集,采用我完全独立于编程语言的文本格式来存储和表示数据.
简单来说:JSON就是一种数据格式,有自己的格式与语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同语言中数据传递和交换.
这样写我们发现接收不到数据,此时就需要加一个注释
这行注释的意思是将请求正文转换为Person对象
此时此刻就可以正确接收到数据了
如何获取URL中的数据?
注意,这里的数据是一篇文章的id,是存放在URL当中的,?后面的才是query string,那么我们如何拿到URL中非query string,非body的数据?
假设我们想要拿到123这个数据
那如果我们要从URL中拿到多个数据呢?
可以获取一个,也可以获取多个,但是在获取多个的时候,注意他们的顺序!而且必须传参!
也可以利用这个注解进行改名操作
此时要求他两保持一致且不可省略.
上传文件
注意事项:
那么如何保存客户端上传的图片呢?
注意:需要手动创建相应的文件夹.