本篇会加入个人的所谓鱼式疯言
❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!
引言
Spring MVC 犹如一座桥梁,连接着前端的精彩与后端的强大,它赋予开发者以灵动之笔,在数字化的画布上描绘出绚丽多彩的 Web 世界。在 Spring MVC 的引领下,我们能够驾驭复杂的业务逻辑,实现流畅的用户体验,让技术与创意完美融合,开启无限可能的 Web 开发之旅。
目录
-
Spring MVC
-
Controller 的参数传递
-
Cookie 与 Session 传递
一. Spring MVC
1. Spring MVC 初识
如上图
首先当用户发送一个
HTTP 请求
, 是直接给 Controller 控制器 发送请求
然后当 Controller 控制器 接收到之后, 就会把请求进一步传给
Model
, 让Model
来处理 数据并返回结果给 Controller 。
最后
Controller
接收到Model 响应
的数据之后, **不会直接返回给用户, 而是传给 View **, 让View响应对应的文字和图片等数据的页面展示给用户 。
如上图, 上面的这样模型就称之为 Spring MVC 模型
:
Model
: 负责具体的 数据管理和业务逻辑的处理的一端
Controller
: 负责接收来自 用户的数据 , 并传递给Model 端
进行处理 , 并 传递给View 端
View
: 负责把最终的结果数据 , 通过页面展示的方式 响应给用户。
鱼式疯言
补充讲解
找工作栗子:
上述的流程就好比我们应届生找工作的过程:
好比现在小编有一个内推名额, 有了内推名额的话
小编这边就可以直接进行面试,也就是直接可以找 Controller 端
进行面试,经过几波重重考验, 小编通过了面试。
这时
Controller
就会告诉他的领导Model
来同意是否任用小编, 同意之后 , 领导Model 就会通知给 Controller .
Controller
然后又告诉HR
, 也就是这里的View
, 让View
直接给小编发Offer
2. Spring MVC 的优点
Spring MVC
的优点:
低耦合性 : 使每个模块都 相互独立
, 方便扩展更多的业务逻辑
高效性 : 每个模块都 独立工作
, 调用起来更方便,并且还能相互 配合处理大量的数据
集成性 : 与 Spring 框架集成
,开发效率高, 容易上手, 可以动态的配置文件 , 充分利用 Spring 的各种资源和特性 。
二. Controller 的参数传递
Controller
的参数传递, 主要是 演示代码 , 通过代码的方式来小伙伴初步的了解 Spring 框架 的使用, 下面我们开始吧~
1. 无参数
@RestController
@RequestMapping("/begin")
public class helloController {@RequestMapping("/hello")public String hello() {return "I Love You";}
}
在讲解参数之前, 先带着小伙伴们回顾上一篇的内容:
@RestController
: Controller 入口的标志
@RequestMapping
: 路径的声明, 第一个为 父路径 :/begin
, 第二个为 子路径 :/hello
所以最终的URL 为:
http://127.0.0.1:8080/begin/hello
还不理解的小伙伴可以参考小编的前面一篇文章哦~
Spring 入门操作详解
鱼式疯言
补充说明:
@RequestMapping
: 可以接收post 请求
, 也可以接收get 请求
@RequestMapping
可以设置
get请求
:
@RequestMapping(value = "/hello" ,method = RequestMethod.GET)public String hello() {return "I Love You";}
post 请求
:
@RequestMapping(value = "/hello" ,method = RequestMethod.POST)public String hello() {return "I Love You";}
- 或者可以换其他注解`:
@PostMapping
: 只能接收post请求
@GetMapping
: 只能接收get请求
2. 单参数传递
<1>. 普通演示
@RestController
@RequestMapping("/begin")
public class helloController {/*** 传递时需要同名* @param name 名字* @return 该正文*/// 传递一个请求参数@RequestMapping("/param1")public String param1(String name) {return "name: " + name;}}
这里传递
单个参数
, 是在URL
的查询字符串进行拼接, 小编这里使用postman
进行发送get 请求
, 当Controller
接收到postman
发送的这条 URL 请求 时 , 就会 效应对应的数据 。
需要注意的是, 这里的 URL
的参数名 一定要 方法中的参数名 保持一致 。
鱼式疯言
补充说明 :
其实这里使用
postman
来 发送请求和使用浏览器发送请求的效果是一样的, 没有本质区别。
如果还不熟练使用 postman
的小伙伴,也可以这样发送请求哦~
<2>. 重命名演示
上面的单参数传递是不是要必须保证参数名是统一的, 如果不统一会怎么样呢?
如上图,如果参数不统一我们就无法传入对应参数。
那么我们就 无法换参数传递 吗?
答案: 不是
我们还可以这样使用
@RestController
@RequestMapping("/begin")
public class helloController {// 传递一个请求参数@RequestMapping("/param1")public String param1(@RequestParam("name1") String name) {return "name: " + name;}
如上图:
我们可以使用
@RequestParam("name1")
绑定参数
这里只需要
@RequestParam
中的参数和URL
中的查询字符串中的参数相同 即可
而 方法中的参数我们只需要自己命名自己想要的都可以 。
但是有一点,
@RequestParam("name1")
是 必传参数 ,也就是说name1
如果没传就会出现客户端的错误
。
鱼式疯言
补充说明:
@RequestMapping("/param1")public String param1(@RequestParam(value = "name1", required = false) String name) {return "name: " + name;}
如上面的代码, 如果我们不需要是必传参数, 就可以把 required = false
即可
3. 多参数传递
如果我们不止传一个参数呢? 假如我们需要传
name
,age
,gender
这三个参数
@RestController
@RequestMapping("/begin")
public class helloController {// 传递多个请求参数@RequestMapping("/param2")public String param2(String name , int age , String gender) {return "name: " + name + "age: " + age + "gender: " + gender;}
这里 不需要考虑参数的顺序 , 只要对应着像 单参数一样同名称传递 就可以有效的传达到
Controller 端
。
4. 对象传递
小伙伴们有没有思考过, 如果 参数很多 , 那么我们 岂不是要一个一个传
,那样岂不是很麻烦。
所以我们就不妨就把这些参数都定义为类的一个一个属性 , 通过对象的方式 进行传递。
<1>. head 传递
@RestController
@RequestMapping("/begin")
public class helloController {/*** @RequestBody 表示用来修饰对象传递一个 JSON 格式的对象的注解* 传递一个 JSON 对象* @param student 对象* @return 返回该对象*/@RequestMapping("/param3·· ··")public Student param3 (Student student) {return student;}
}class Student {private String name;private int age;private String gender;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
如上图, 对于 Head
的传递, 传参时就在 URL 的查询字符串
中进行插入即可。
<2>. Body 传递
@RestController
@RequestMapping("/begin")
public class helloController {/**** @RequestBody 表示用来修饰对象传递一个 JSON 格式的对象的注解* 传递一个 JSON 对象* @param student 对象* @return 返回该对象*/@RequestMapping("/param7")public Student param7 (@RequestBody Student student) {return student;}}
class Student {private String name;private int age;private String gender;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
如上图
- 我们把
name
,age
,gender
都定义为 对象的属性 , 于是就可以 通过对象来传递 。
- 注意使用这个
@RequestBody
标明是通过body(报文)
来 传递对象 的。
- 对于 对象而言 ,
HTTP
的报文格式是:JSON
格式的。
鱼式疯言
JSON
就是一种有 特定数据的格式 :
相当于 中文有中文的格式 , 英文有英文的格式 ,对象就有JSON 的格式。
故: JSON 格式
是针对 对象 而言的。
- 键值对 的格式:
{
Key1
:Value1
,
Key2
:Value2
,
Key3
:Value3
}
{
}
表示 一个对象 ,[
]
表示 多个对象的集合
- 添加了
@RequestBody
的需要在Body
, 未加就要使用Head
传递。
5. 数组传递
@RestController
@RequestMapping("/begin")
public class helloController {/*** 对数组进行传参*/@RequestMapping("/param6")public List<String> param6(String[] names) {return List.of(names);}}
如上图
如果 参数都是相同类型 的话,我们可以 像上方一样用
数组
传递
数组传递的方式:在查询字符串中使用
数组名赋值
, 中间用 逗号分隔。
6. 集合传递
/*** 传集合 list* 需要用 RequestParam 来绑定将数组转化 list* @param list* @return*/@RestController
@RequestMapping("/begin")
public class helloController {@RequestMapping("/param4")
// 传集合
public List<String> param4(@RequestParam List<Student> list) {return list;
}
}
这里 传参的方式和数组 一样,小编在这里就不赘述了~
三. Cookie 与 Session 传递
1. Cookie 和 Session 的初识
小伙伴可能有所不知的是,对于 HTTP 协议
来说: 是 无状态的协议
无状态协议: 不会记录中间传入的数据, 通信本身不维护和通信本身相关的任何状态信息 , 只是做 传输的作用 。
当有重要的数据传入时, 我们就需要使用一种属性来存储。
那么对于 客户端 来说,
存储数据
的方式:Cookie
存储, 由 服务器来提供 。
对于 服务器 来说,
存储数据
的方式:Session
存储, 服务器自身来生成。
由服务器存储一份, 客户端存储一份, 从而保证
数据的有效性
, 也能 提供校验 。
关于更多 Cookie
和 Session
内容, 小伙伴可以移步小编的下面这篇文章哦~
Cookie 详解文章链接
在 Controller
中, 我们也提供了如何操作 Cookie
和 Session
的多种方式, 下面就让小编来演示一下吧~
2. Cookie
<1>. 获取 Cookie 方式一
@RequestMapping("/entrance")
@RestController
public class header {// 获取多个Cookie/*** 通过 HttpServerletRequest 来获取整个 Http 的请求的 所有信息* 获取到信息后再获取 Cookie* @param quest 请求的信息* @return 返回 Cookie*/@RequestMapping("/getCookie")public String getCookie(HttpServletRequest quest) {Cookie[] cookies = quest.getCookies();for (Cookie cookie: cookies) {System.out.println(cookie.getName() + ":" + cookie.getValue());}return "获取Cookie 成功!";}}
如上图:
首先在
postman
中设置Cookie
, 先在 上方指定IP 和 端口号 , 然后对应Cookie_数字
来设置对应的Cookie 的信息
。
其次,在 Controller 端的代码下, 我们使用
HttpServletRequest
类型来接收所以来自用户发送的请求。
接着,利用这些请求 通过
getCookie()
提取出所以的Cookie
数据, 用一个 Cookie类型的数组 来存储。
最终打印
Cookie 信息
, 并提示用户, 获取 Cookie 成功 。
<2>. 获取 Cookie 方式二
通过 注解获取 :
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;import java.util.Arrays;@RequestMapping("/entrance")
@RestController
public class header {/*** 使用 @CookieValue 绑定 Cookie 的key的注解* @param name1 作为 key* @return 返回 Cookie 的信息*/@RequestMapping("/getCookie1")public String getCookie1(@CookieValue("Cookie_1") Cookie name1) {System.out.println(name1.getName() + " : " + name1.getValue());return name1.getName() + " : " + name1.getValue();}
}
如上图:
-
首先, 在
postman
中设置Cookie
-
其次,
@CookieValue 注解
中标记, 并且在参数中 指定是需要哪个Cookie
这时,就可以获取到对应
Cookie
的 全部信息 : 包括 Cookie 的名字 和 Cookie 的值
- 进行打印 Cookie 的name 和
Cookie 的Value
。
这里唯一需要和小伙伴说明的是:
在 设置的Cookie 中, 必须含有
@CookieValue
标明的那个Cookie
, 否则就会 报错 , 因为这是 必传参数。
3. Session
<1>. 设置Session 方式
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")
@RestController
public class header {/*** 要先获取到 session 就需要先设置 session**/@RequestMapping("/setSession")public String setSession(HttpServletRequest servletRequest) {HttpSession session = servletRequest.getSession();// 设置键值对session.setAttribute("hello", 78);session.setAttribute("cake", "bbt");session.setAttribute("jat", "good");return "session 设置完毕!";}
}
如上图 , 在
Controller
中设置一些Session
, 这些Session
就存储在 服务端 这边了, 当需要调用时, 就可以随时调用了 。
首先,通过
HttpServletRequest
这个类型来获取请求的所有信息
其次, 通过
getSession()
方法来获取 Session 对象。
然后, 操作
Session 对象
通过setAttribute
来插入 Session 的 Name 和 Value
<2>. 获取 Session 方式一
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")
@RestController
public class header {
// 获取 session 数据方法一: 使用 HttpServletRequest@RequestMapping("getSession1")public String getSession1(HttpServletRequest servletRequest) {HttpSession session = servletRequest.getSession();return session.getAttribute("hello")==null ? "未设置session 值" : String.valueOf(session.getAttribute("hello"));}
}
-
首先还是先 设置
Session
-
其次对应的通过
HttpServletRequest
来获取 Session对象 -
最终 操作
Session 对象
, 通过getAttribute
, 并加入对应的Session 的属性名
来获取对应的 Session 的 Value 值。
<3>. 获取 Session 方式二
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")
@RestController
public class header {
// 获取session 数据方法二 : 使用 HttpSession@RequestMapping("getSession2")public String getSession2(HttpSession session) {return session.getAttribute("hello")==null ? "未设置session 值" : String.valueOf(session.getAttribute("cake"));}}
如上图:
首先: 设置 Session 属性
其次: 通过 HttpSession
来直接获取Session 对象
最后: 通过 getAttribute()
并加入对应 Session
的 属性名 来获取 Value
。
鱼式疯言
注意事项:
需要提醒小伙伴一点的是, 获取的 Session 的Value 值是一个Object 的类型 , 所以如果要获取成
String 类型
的话,就需要 强转 。
<4>. 获取 Session 方法三
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")
@RestController
public class header {
// 获取session 数据方法三 : 利用 SessionAttribute 绑定 Session 注解@RequestMapping("getSession3")public String getSession3(@SessionAttribute("jat") String jat) {return jat;}}
如上图:
首先: 设置Session 的属性
最后: 通过
@SessionAttribute("jat")
注解来返回,()
内并加上对应的Session name 来获取。 需要注意的是 () 内必须是含有这个Session 名的,否则:
鱼式疯言
上面的 获取Session 和 Cookie 的方式多样 , 小伙伴根据 自己的需求 来获取哦~
总结
-
Spring MVC: 了解了MVC的三种模型: Model, Controller 以及 View 的分工不同: Model 主要处理数据, Controller 主要接管外来请求, View 主要呈现给用户视图信息 , 为了更高效的实现网络的连接 。
-
Controller 的参数传递 : 使用 Controller 来传递对应的参数: 无参数的请求方式, 单参数,多参数, 对象传递, 数组传递, 集合传递等… 小伙伴要注意对应的注解的使用方式哦~
-
Cookie
与Session
传递:理解Cookie
和Session
是对于 Http 无状态协议的一种客户端,服务器的记录数据的方式 ,并且可以通过 Controller的接口 使用 多种方式来设置和访问对应的 Cookie 和Session 。
如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正
希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖