目录
1.认识SpringMVC
MVC的定义
MVC和SpringMVC的关系
2.创建SpringMVC项目
1.@RequestMapping实现连接
2. @POSTMapping注解实现连接
3.@GETMapping实现连接
3.获取参数
1.获取单个参数
2.获取多个参数
3.获取普通对象
4.获取json对象
5.特殊场景
6.获取URL?前的参数
7.获取上传的文件@RequestPart
8.获取Cookie/Session/header
4.返回数据
1.返回静态页面
2.返回text/html数据
3.返回JSON对象
4.跳转
1.forward,请求转发
2.redirect,请求重定向
3.请求重定向和请求转发的区别
5.热部署
1.认识SpringMVC
Spring MVC 是一个功能强大、高效、可靠的 Web 框架
Spring MVC 是 Spring Framework 的一个模块,也叫做 Web MVC 框架,它是基于 Java Servlet 和 JavaServer Pages (JSP) 技术的 Web 应用程序开发框架。
Spring MVC 是一种轻量级、灵活、可扩展的 Web 框架,具有以下主要优点:
- 简单易用:Spring MVC 采用约定优于配置的方式,可以快速地创建 Web 应用程序并进行开发和测试。
- 高度可定制化:Spring MVC 提供了许多可定制化的选项,例如,可以使用不同的视图技术、后端数据源和验证器等,以满足各种不同的应用程序需求。
- 易于集成:Spring MVC 可以与许多其他 Spring 模块无缝集成,例如,Spring Security、Spring Boot 等。
- 容易进行测试:Spring MVC 采用了模型-视图-控制器 (MVC) 架构,这种设计模式使其易于编写自动化测试。
MVC的定义
MVC是Model View Controller的缩写,是软件工程中的一种软件架构模式(是一种设计模式),理念:将软件系统分为模型,控制器,视图三个部分
1.User发送HTTP请求,来到控制器,进行安全校验,控制用户输入等操作后发送给Model
2.Model是数据模型,通常负责在数据库中存取数据,将响应信息返回到控制器
3.控制器返回数据到视图进行渲染,结果呈现给User
MVC和SpringMVC的关系
和IoC和DI相同,MVC是一种思想,SpringMVC是具体的实现,并继承了Servlet API的Web框架
SpringMVCd的重要性:现在多数的Java项目都是基于Spring/SpringBoot,SpringMVC是Spring的核心模块,所以Java项目约等于SpringMVC项目
2.创建SpringMVC项目
SpringMVC的建立和创建连接
使用SpringBoot来创建SpringMVC项目
点击Maven框架支持,导入依赖
实现连接
这里的路由/hello,可以是多级路由.访问时必须写全路由名称,否则不能访问
启动项目
这样就实现了连接
建立连接条件:
1.@RestController注解,将类注册到Spring容器中
2.@RequestMapping注解,路由映射
1.@RequestMapping实现连接
@RequestMapping支持的方法
1.支持GET请求
我们是通过URL的方式访问的,所以肯定是支持GET方法的
通过开发者工具也可以查看到
2.POST请求
我们通过Apifox模拟POST请求,也是可以的
所以@RequsetMapping也支持POST方法
@RequsetMapping既支持GET请求,也支持POST请求.其它的方法也支持
源码中关于请求方法的部分:
使用注解的时候,也可以进行方法的设置,添加方法参数后,会自动给路由信息添加value.默认只有一个参数时,是缺省的,多个参数就会逐个表明
@RequestMapping(value = "/hello",method = RequestMethod.POST)
设置为POST后进行访问,此时通过URL的GET方法是不被允许的
状态码:405,方法不被允许!
2. @POSTMapping注解实现连接
换成GET是不支持的,更加简洁了
@POSTMapping注解可以指定多个属性
后两个属性:consumes,produces
-
consumes属性允许指定接受请求正文时使用的MIME类型。例如,@PostMapping(value=”/example”, consumes=”application/json”)将仅匹配Content-Type为application/json的POST请求
-
produces属性允许指定方法返回的MIME类型。例如,@PostMapping(value=”/example”, produces=”application/json”)将指示处理程序方法返回application/json数据
MIME(Multipurpose Internet Mail Extensions)是一种互联网标准,用于表示各种类型的数据。它在电子邮件中广泛使用,也被HTTP和其他应用程序协议采用。 MIME类型通常由两部分组成:主类型和子类型,用斜杠分隔开来,例如”text/html”或”image/jpeg”。每个MIME类型都与一个特定的文件格式相关联,并指定如何处理该格式的数据。客户端和服务器可以使用MIME类型来确定如何正确地解释和显示传输的数据。
3.@GETMapping实现连接
不支持POST方式
总结:
@RequsetMapping既支持GET请求,也支持POST请求.其它的方法也支持
@POSTMapping支持POST请求
@GETMapping支持GET请求
3.获取参数
建立连接之后,学习如何获取参数
1.获取单个参数
URL中没有传参数,默认值就是null
传参后
一个是包装类,一个是基础数据类型.不传参的访问的结果
结论:
一个对象没设值的时候,值就为null
基础数据类型,没有值就会报错.
Java中的原始数据类型(如int、double等)是不能为null的,因为它们是基本类型而非对象
在Java中,如果将一个可能为null的值传递给基本数据类型的参数会导致编译错误。因为基本数据类型不能为null,因此在尝试访问具有null值的变量时会引发NullPointerException异常。为了避免这种情况,可以使用对应的包装类来替代基本数据类型,因为包装类的实例可以为null。如果需要进行算术运算等操作,可以使用包装类的valueOf()方法将其转换为基本数据类型
这里和获取Servlet参数的方式相同,证明了:
Servlet 是 Java Web 开发中的一个核心组件,它负责接收 HTTP 请求并返回 HTTP 响应。Spring MVC 则是基于 Servlet API 构建的 Web 框架,它提供了一种方便的方式来处理和响应 HTTP 请求
这两个对象都可以进行使用,这里会直接重定向到sougou
2.获取多个参数
直接加参数,并且参数的顺序不重要,URL中的K-V对应上就能成功传参
输出结果是正确的,URL中传参顺序不影响输出结果,影响结果的是KV是否对应
3.获取普通对象
框架实现了自动的参数映射
结论:
在Spring MVC中,可以将返回值类型声明为Object
类型,Spring MVC会根据请求的Accept头信息和处理方法上的@RequestMapping
注解来自动匹配合适的数据类型返回码。
例如,如果请求的Accept头信息为application/json
,并且处理方法使用了@ResponseBody
注解,那么Spring MVC会自动将返回值转换为JSON格式,并设置返回码为200。
同样的,如果请求的Accept头信息为application/xml
,并且处理方法使用了@ResponseBody
注解,则Spring MVC会自动将返回值转换为XML格式,并设置返回码为200。
如果返回值类型不能被自动转换成JSON或XML格式,Spring MVC会尝试使用其他方式进行转换或者直接返回错误码。因此,在使用Object
作为返回值类型时,需要确保返回值能够被正确地转换成支持的格式,以避免出现返回值无法序列化的问题。
4.获取json对象
前端传递参数使用apifox模拟
返回结果:
可以看到,是获取不到json对象的
要拿到json对象,必须加注解@RequestBody
在Spring MVC中,可以使用@RequestBody注解来获取JSON格式的请求参数。当我们在Controller方法的入参上加上@RequestBody注解时,Spring MVC就会自动将请求体中的JSON字符串转换为对应的Java对象,并将其绑定到该入参上
@RequestBody注解作用于PoeopleComponent类型的入参上,表明当前请求参数是一个JSON对象,并将它转换为PoeopleComponent对象。这样我们就可以方便地获取JSON格式的请求参数了。需要注意的是,前端发送请求时需要设置请求头的Content-Type为application/json,使用spifox模式时已经设置过格式为json了
再次发送json对象数据
获取参数成功
5.特殊场景
当前端传递一个和后端名称不同的参数时,可以使用重命名方式接收前端传参
重命名之后依然能接收到参数
注意:此时传参不能为空,必须传参数.看源码:
默认是true..要求必须传参!
要解决@RequestParam注解缺少参数值的问题,可以使用以下方法之一:
-
提供必要的请求参数。在请求中提供所需参数的值,确保与@RequestParam注解的方法参数匹配
-
使用defaultValue属性。通过为@RequestParam注解的defaultValue属性设置值来指定默认值,如果请求中没有传递该参数,则使用默认值
-
将@RequestParam注解的required属性设置为false。该属性用于指示请求参数是否是必需的。将其设置为false可以使参数变为可选,并允许请求不提供该参数,而不会抛出错误。当请求未提供该参数时,方法参数将被赋予null值
6.获取URL?前的参数
从基础的URL中获取参数..注意,不是从URL参数部分获取参数
需要在参数前添加注解@PathVariable,否侧获取不到前端的URL参数
还要注意:当URL基础部分和形参名称不同时,要设置参数非必须才不会报错.仍不会获得该参数
通过在注解中设置参数就能解决
总结:
@PathVariable获取URL?之前的参数(适用参数比较少,更简洁)
@RequestParam获取URL?之后的参数(参数多,灵活)
/user/12345
和/user?id=12345
这两种传参方式都可以实现将参数传递到URL中的效果,不过它们的实现方式是有所不同的。其中,
/user/12345
是一种 RESTful API 的实现方式,它代表了用户资源在服务器端的地址,其中12345
表示了该用户资源的唯一标识符。这种方式通常用于请求某个特定的资源,可以根据请求的 URL 直接获取该用户的相关信息。而
/user?id=12345
则是通过查询字符串的方式将参数传递到URL中,其中id
表示参数名,12345
是对应的参数值。这种方式则更加灵活,可以传递多个参数,也可以只传递部分参数,比如/user?id=12345&name=John&age=25
。总体来说,使用
/user/12345
的方式更为直观和简洁,语义明确,而且更符合 RESTful API 设计的规范。而使用/user?id=12345
的方式则更加灵活,可以传递多个参数,且易于获取参数值。根据具体的需求和场景选择不同的方式来传递参数即可。
7.获取上传的文件@RequestPart
上传文件的路径需要根据实际情况进行指定,具体格式可以采用以下两种方式:
绝对路径:指从磁盘根目录开始的完整路径。例如:/var/www/html/uploads/image.jpg
相对路径:指相对于当前文件所在目录的相对路径。例如:../../uploads/image.jpg
启动,前端进行模拟数据
报错信息:图片大小超出最大上传限制
重新上传小点的图片,上传成功
另一种解决方案:
SpringMVC中单次上传文件的大小最大默认为1MB。但是,我们可以通过在Spring MVC配置文件中进行修改来调整最大上传文件大小。具体的修改方法如下:
1.打开 application.yml 配置文件。
2.添加以下配置:
spring:
servlet:
multipart:
max-file-size: 50MB
max-request-size: 100MB
我们上传这个文件到demo6
需要注意,路径不修改,会将上次上传的图片覆盖
解决覆盖问题:
上传的图片文件类型也是很多的,需要获取文件后缀名
然后使用UUID加上后缀名,就能解决覆盖问题
UUID(Universally Unique Identifier)是通用唯一识别码的缩写,也可以称为 GUID(Global Unique Identifier)。它是一个标准化的格式,用于表示一个128位的值,可以用于唯一地标识某个实体或对象。
UUID 的生成算法是根据某些特定的标准或随机数来计算得出的,保证了生成的 UUID 具有全局唯一性。具体的生成方式包括时间戳、硬件地址、随机数等。而且,UUID 是不可变的,一旦生成,就不可以改变。
启动后上传图片,不会覆盖原来的图片
上传了三个相同的文件,都不会被覆盖
代码:
@RequestMapping("/getFile")
public Object getFile(@RequestPart("myimg")MultipartFile file) throws IOException {
String fileName = UUID.randomUUID() +//文件名
file.getOriginalFilename().//文件后缀
substring(file.getOriginalFilename().lastIndexOf("."));
File file1 = new File("D:\projets\demo6\"+fileName);
try{
file.transferTo(file1);
return true;
}
catch (IOException e){
e.printStackTrace();
}
return false;
}
8.获取Cookie/Session/header
获取Request和Response对象
注解获取Cookie-@CookieValue
设置非必需后
不会报错了
这时伪造一个Cookie
再次访问
获取header-@RequestHeader
结果
9.存储session和获取session
存储不能用注解实现,还是在servlet中的获取方式
获取-@SessionAttribute
4.返回数据
1.返回静态页面
return “index.html”没有加/,是在test目录下寻找index.html页面,是访问不到的.因为index.html页面是放在根目录下的,加了/,就会在根路径下寻找index.html页面,才能获取到
2.返回text/html数据
可以在方法上使用 @ResponseBody 注解
3.返回JSON对象
4.跳转
请求转发或请求重定向
return不但可以返回一个视图,还可以实现跳转.跳转的方式有两种:
1.forward,请求转发
使用request对象也能进行请求转发
2.redirect,请求重定向
还可以使用response对象重定向
3.请求重定向和请求转发的区别
请求重定向(Redirect)和请求转发(Forward)都是 Web 应用程序中常用的两种跳转方式。
请求重定向是指服务器收到请求后,返回一个指示客户端重新发送请求到另一个 URL 地址的响应。客户端接收到这个响应后,会重新向新的 URL 发送一个新的请求,完成跳转。请求重定向是在本次请求完成之后,重新发起一次 GET 请求,所以它的缺点是会多消耗一次服务器资源,但它的优点是可以避免表单重复提交等问题,还可以避免表单重复提交等问题。
优点:
避免表单重复提交等问题.
避免表单重复提交等问题.
缺点:
多消耗一次服务器资源
请求转发是指当客户端向服务器发起请求时,服务器不会直接响应客户端请求,而是将请求转发给另一个资源进行处理,并将其响应结果返回给客户端。请求转发是在服务器内部完成的,客户端无法感知到该过程,因为只有一个请求和一个响应。请求转发不需要重新发起新的请求,相比请求重定向,速度更快,但它的缺点是只能在同一 Web 应用程序内进行跳转,无法实现跨域名跳转。
优点:
速度更快.
请求转发不需要重新发起新的请求.
缺点:
无法实现跨域名跳转
5.热部署
最后介绍一下IDEA提供的热部署功能
Java 的热部署(Hot Deployment)是指在应用程序运行过程中,无需重启应用程序或重新部署应用程序即可更新应用程序的代码或资源。也可以理解为在不停止应用程序的情况下,动态地将新的代码或资源加载到应用程序中。方便了我们开发的工作
步骤:
1.添加热部署框架支持
2.Settings开启项目自动编译
需要配置两次,一次是 本项目,一次是 新项目.
3.Advanced Settings
4.使用Debug启动
代码改变后,就会自动重新启动