目录
[1 什么是Spring Web MVC](#1 什么是Spring Web MVC)
[1.2 什么是Spring MVC?](#1.2 什么是Spring MVC?)
[2 学习Spring MVC](#2 学习Spring MVC)
[2.1 项目准备](#2.1 项目准备)
[2.2 建立连接](#2.2 建立连接)
[2.2.1 @RequestMapping 注解](#2.2.1 @RequestMapping 注解)
[2.2.2 @RequestMapping 使用](#2.2.2 @RequestMapping 使用)
[2.2.3 @RequestMapping是GET还POST请求?](#2.2.3 @RequestMapping是GET还POST请求?)
[2.3 请求](#2.3 请求)
[2.3.1 传递单个参数](#2.3.1 传递单个参数)
[2.3.2 传递多个参数](#2.3.2 传递多个参数)
[2.3.3 传递对象](#2.3.3 传递对象)
[2.3.4 后端参数重命名](#2.3.4 后端参数重命名)
[2.3.5 传递数组](#2.3.5 传递数组)
[2.4.6 传递集合](#2.4.6 传递集合)
[2.4.7 传递JSON数据](#2.4.7 传递JSON数据)
[2.4.8 获取URL中参数@PathVariable](#2.4.8 获取URL中参数@PathVariable)
[2.4.9 上传文件](#2.4.9 上传文件)
[2.4.10 获取Cookie/Session](#2.4.10 获取Cookie/Session)
[2.4.11 获取Header](#2.4.11 获取Header)
前言~~
大家好,有一周时间没有写博客了,最近由于在做实验,每天都很忙,接下来我会抽空来写博客,希望大家给我提出建议,我会认真的接受。
经过一直学习,现在也是学到了Spring,我非常高兴,前面也是认真打好了基础,现在Spring的学习路程也是非常顺利。😊😊😊
1 什么是Spring Web MVC
我们可以简单的理解为,Spring Web MVC就是一个框架,它是基于Servlet API构建的原始web框架,它一开始就包含在Spring框架中,它通常被称为"Spring MVC"。
下面我们简称之为:Spring MVC
在理解什么是Spring MVC之前,我们要清楚什么是MVC?
1.1MVC定义
MVC是Model View Controller的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型、试图和控制器三个基本部分。
**View(视图)**在应用程序中专门用来与浏览器进行交互,展示数据
**Model(模型)**应用程序的主体部分,用来处理程序中数据逻辑的部分
**Controller(控制器)**用来决定视图发来的请求,需要用一个模型来处理以及处理完后需要跳转到哪一个视图,即用来连接视图和模型
大家是不是觉得很抽象,那换一个解释
视图就是服务员,负责接待顾客,帮助顾客点餐,给顾客端饭
控制器 就是前厅,根据用户点餐的情况来选择给哪个后厨下达命令
模型 就是后厨,根据前厅的要求完成客户的用餐情况
HR 就是视图 ,负责接待候选人,并告知候选人的面试结果
不同 的部分就是控制器 ,HR根据候选人来选择对应的部门来进行面试
面试官 就是模型 ,来处理候选人的面试
现在听起来是不是就通常多了**❤️❤️**
1.2 什么是Spring MVC?
MVC是一种架构设计模型,也是一种思想,而Spring MVC是对MVC思想的集体实现,除此之外,Spring MVC还是一个Web框架。
总的来说Spring MVC是一个实现了MVC 模式的Web 框架,因此,Spring MVC主要关注两个点:1)MVC 2)Web框架
其实在我们创建Spring Boot 项目的时候,我们勾选的Spring Web 框架其实就是Spring MVC框架
为什么创建的Spring Boot项目就成了spring MVC项目了?它们之间的关系是什么。其实Spring Boot只是实现Spring MVC的其中一种方式而已,Spring Boot添加Spring Web MVC框架,来实现Web功能。
2 学习Spring MVC
前面啰嗦了很多,现在终于到了Spring MVC的学习了,废话不多说,直接开始😊😊😊
学习Spring MVC重点学习如何通过浏览器和用户程序进行交互。
主要分以下三个方面:
1 建立连接:将浏览器和Java程序连接起来,访问一个地址能够调用到我们的Spring程序。
2 请求:用户请求的时候会带一些参数,在程序中需要获取到参数。
3 响应:执行到了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应。
通俗一点:
建立连接:去柜台 请求:带着银行卡,身份证去存款 响应:银行返回一张存折
对于Spring MVC来说,掌握以上3个功能就相当于掌握了Spring MVC
2.1 项目准备
创建Spring Boot项目,勾选Spring Web就相当于创建了Spring MVC项目
2.2 建立连接
在Spring MVC中使用@RequestMapping来实现URL路由映射,也就是浏览器连接程序的作用
java
@RestController
public class SpringBoot {
@RequestMapping("/learn")
public String learn() {
return "learn,SpringBoot";
}
}
我们使用127.0.0.1:8080/learn这个路径名来访问
2.2.1 @RequestMapping 注解
@RequestMapping是Spring Web MVC应用程序中最常被用到的注解之一,它是用来注册接口的路由映射,当我们通过路径**/learn**访问时,就会调用learn这个方法的代码。
2.2.2 @RequestMapping 使用
@RequestMapping既可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址时类路径+方法路径
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/learn")
public String learn() {
return "learn,SpringBoot";
}
}
@RequestMapping的URL路径也可以是多层路径,最终访问时,依然是类路径+方法路径
2.2.3 @RequestMapping是GET还POST请求?
我们通过postman来发送请求看一下
从结果上看 @RequestMapping既支持GET请求,也支持POST请求,同时,也支持其他请求方式
2.3 请求
在访问不同的路径时,就是发送不同的请求,在发送请求时,可能会带一些参数,所以学习Spring的请求,主要时学习如何传递参数到后端以及后端如何让接收参数。
传递参数,主要使用浏览器和postman来模拟
2.3.1 传递单个参数
接收单个参数,在Spring MVC中直接用方法的参数就可以了
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m1")
public String m1(String name) {
return "接收到的参数:" + name;
}
}
如果参数不一致,是获取不到参数的
在使用基本类型接收参数时,参数必须传(除了boolean类型),因此建议使用包装类型
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m2")
public String m2(int age) {
return "接收到的参数:" + age;
}
}
当出现了500代表服务器出现了问题,我们观察一下控制台有没有错误日志
因此在接收参数的时候建议使用包装类型
当我们传入参数的类型不匹配时也会出现错误
总结:对于包装类型,如果不传对应的参数,Spring接收到的数据为null,所以对于参数为空的情况,建议使用包装类型
2.3.2 传递多个参数
和接收参数一样,直接使用方法的参数接收即可
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m3")
public String m3(String name,Integer age) {
return "接收到的参数:" + name + "+" +age;
}
}
只有参数匹配,顺序时没有影响的
2.3.3 传递对象
如果参数比较多时,该方法生命就需要很多形参,因此我们对这些参数进行封装,直接传入一个对象
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m4")
public String m4(Person person) {
return "接收到的参数:" + person.toString();
}
}
2.3.4 后端参数重命名
在某些情况下,前端传递的参数key和我们后端接收到的key不一致,例如前端传了一个name给后端,而后端使用username字段来接收,如果出现这种情况,就需要使用@RequestParam来重命名前后端的数据值
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m5")
public String m5(@RequestParam("name") String username) {
return "接收到的参数:" + username;
}
}
可以看到Spring可以正确的把浏览器传递的参数name绑定到后端参数username上了
因此得出结论:
使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明一致才能进行绑定参数和赋值
使用@RequestParam进行参数重命名时,参数就变成了必传参数
非必传参数
如果前端的参数是一个非必传参数,就需要设置@RequestParam中的required=false来避免不传递时报错。
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m5")
public String m5(@RequestParam(value = "name",required = false) String username) {
return "接收到的参数:" + username;
}
}
2.3.5 传递数组
当我们请求中,同一个参数有多个时,浏览器就会帮我们给封装成一个数组
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m6")
public String m6(String[] arr) {
return "接收到的参数:" + Arrays.toString(arr);
}
}
2.4.6 传递集合
集合参数:和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m7")
public String m7(@RequestParam List<String> list) {
return "list:" + list + ",长度:" + list.size();
}
}
2.4.7 传递JSON数据
在接收json对象时,需要使用@RequestBody注解
RequestBody:请求正文,这个注解的作用在请求正文的数据绑定,请求参数必须写在正文中
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m8")
public String m8(@RequestBody Person person) {
return person.toString();
}
}
通过抓包我们看一下请求的类型
如果去掉@RequestBody,此时传过来的值为空,表示后端未能给person对象赋值
2.4.8 获取URL中参数@PathVariable
path variable:路径变量
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m9/{id}/{name}")
public String m9(@PathVariable Integer id,@PathVariable("name") String username) {
return "userId:" + id + ",username:" + username;
}
}
如果方法法参数名称和需要绑定的URL中的变量名称⼀致时,不用给@PathVariable的属性赋
值,如上述例子中的id变量
如果方法法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值,如上述例子中的userName变量
2.4.9 上传文件
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
file.transferTo(new File("E:/photo/" + file.getOriginalFilename()));
return "success";
}
}
2.4.10 获取Cookie/Session
传统的获取Cookie
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m11")
public String m11(HttpServletRequest request, HttpServletResponse response) {
//获取所有的cookie
Cookie[] cookies = request.getCookies();
StringBuilder stringBuilder = new StringBuilder();
if (cookies != null) {
for (Cookie cookie : cookies) {
stringBuilder.append(cookie.getName() + ":" + cookie.getValue());
}
}
return "cookie信息:" + stringBuilder;
}
}
因此此时没有设置cookie的值,所以为空,现在我们设置一下cookie的值
简洁的获取Cookie
java
@RestController
public class SpringBoot {
@RequestMapping("/getCookie")
public String getCookie(@CookieValue String zhangsan){
return "cookie信息:" + zhangsan;
}
}
获取Session
Session需要先存储,才能获取
Session存储
javascript
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("username","Spring");
return "session存储成功";
}
}
可以看到在HTTP响应中,通过Set-Cookie告知客户端,把Session存储在Cookie中
Session获取
java
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
String username = (String) session.getAttribute("username");
return "登录用户:" + username;
}
return "session为空";
}
在HTTP请求中,把SessionId通过Cookie传递给了服务器
简洁的获取Session
java
@RequestMapping("/getSession")
public String getSession(@SessionAttribute String username) {
return "username:" + username;
}
java
@RequestMapping("/getSession")
public String getSession(@SessionAttribute(value = "username",required = false) String username) {
return "username:" + username;
}
Cookie和Session的区别
1.Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制
2.Cookie和Session之间是通过SessionId关联起来的
3.Cookie和Session经常会在一起配合使用,但是不是必须配合
2.4.11 获取Header
传统的获取header
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m12")
public String m12(HttpServletRequest request) {
String userAgent = request.getHeader("user-Agent");
return "userAgent:" + userAgent;
}
}
简洁的获取header
java
@RequestMapping("/use")
@RestController
public class SpringBoot {
@RequestMapping("/m12")
public String m12(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:" + userAgent;
}
}
总结:以上就是所有请求的内容了,下篇博客就是响应的内容了