0


【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(1) , 万字解析, 建议收藏 ! ! !

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

引言

Spring MVC 犹如一座桥梁,连接着前端的精彩与后端的强大,它赋予开发者以灵动之笔,在数字化的画布上描绘出绚丽多彩的 Web 世界。在 Spring MVC 的引领下,我们能够驾驭复杂的业务逻辑,实现流畅的用户体验,让技术与创意完美融合,开启无限可能的 Web 开发之旅。

目录

  1. Spring MVC
  2. Controller 的参数传递
  3. 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")publicclass helloController {@RequestMapping("/hello")publicStringhello(){return"I Love You";}}

在这里插入图片描述

在讲解参数之前, 先带着小伙伴们回顾上一篇的内容:

@RestController

: Controller 入口的标志

@RequestMapping

: 路径的声明, 第一个为 父路径 :

/begin

, 第二个为 子路径 :

/hello

所以最终的URL 为:

 http://127.0.0.1:8080/begin/hello

还不理解的小伙伴可以参考小编的前面一篇文章哦~

Spring 入门操作详解

鱼式疯言

补充说明

@RequestMapping

: 可以接收

post 请求

, 也可以接收

get 请求
  1. @RequestMapping 可以设置
get请求

@RequestMapping(value ="/hello",method =RequestMethod.GET)publicStringhello(){return"I Love You";}
post 请求

:

@RequestMapping(value ="/hello",method =RequestMethod.POST)publicStringhello(){return"I Love You";}
  1. 或者可以换其他注解`:
@PostMapping

: 只能接收

post请求
@GetMapping

: 只能接收

get请求

2. 单参数传递

<1>. 普通演示

@RestController@RequestMapping("/begin")publicclass helloController {/**
     * 传递时需要同名
     * @param name 名字
     * @return 该正文
     *///    传递一个请求参数@RequestMapping("/param1")publicStringparam1(String name){return"name: "+ name;}}

在这里插入图片描述

这里传递

单个参数

, 是在

URL 

的查询字符串进行拼接, 小编这里使用

postman

进行发送

get 请求

, 当

Controller

接收到

postman

发送的这条 URL 请求 时 , 就会 效应对应的数据 。

需要注意的是, 这里的

URL

参数名 一定要 方法中的参数名 保持一致 。

鱼式疯言

补充说明

其实这里使用

postman

来 发送请求和使用浏览器发送请求的效果是一样的, 没有本质区别。

在这里插入图片描述

如果还不熟练使用

postman

的小伙伴,也可以这样发送请求哦~

<2>. 重命名演示

上面的单参数传递是不是要必须保证参数名是统一的, 如果不统一会怎么样呢?

在这里插入图片描述
如上图,如果参数不统一我们就无法传入对应参数。

那么我们就 无法换参数传递 吗?

答案: 不是

我们还可以这样使用

@RestController@RequestMapping("/begin")publicclass helloController {//    传递一个请求参数@RequestMapping("/param1")publicStringparam1(@RequestParam("name1")String name){return"name: "+ name;}

在这里插入图片描述
如上图:

我们可以使用

@RequestParam("name1")

绑定参数

这里只需要

@RequestParam

中的参数和

URL

中的查询字符串中的参数相同 即可

而 方法中的参数我们只需要自己命名自己想要的都可以 。

但是有一点,

@RequestParam("name1") 

是 必传参数 ,也就是说

name1

如果没传就会出现

客户端的错误

鱼式疯言

补充说明

@RequestMapping("/param1")publicStringparam1(@RequestParam(value ="name1", required =false)String name){return"name: "+ name;}

如上面的代码, 如果我们不需要是必传参数, 就可以把

required = false

即可

3. 多参数传递

如果我们不止传一个参数呢? 假如我们需要传

name

age

gender

这三个参数

@RestController@RequestMapping("/begin")publicclass helloController {//    传递多个请求参数@RequestMapping("/param2")publicStringparam2(String name ,int age ,String gender){return"name: "+ name  +"age: "+ age +"gender: "+ gender;}

在这里插入图片描述

这里 不需要考虑参数的顺序 , 只要对应着像 单参数一样同名称传递 就可以有效的传达到

Controller 端

4. 对象传递

小伙伴们有没有思考过, 如果 参数很多 , 那么我们

岂不是要一个一个传

,那样岂不是很麻烦。

所以我们就不妨就把这些参数都定义为类的一个一个属性 , 通过对象的方式 进行传递。

<1>. head 传递

@RestController@RequestMapping("/begin")publicclass helloController {/**
     * @RequestBody 表示用来修饰对象传递一个 JSON 格式的对象的注解
     * 传递一个 JSON 对象
     * @param student 对象
     * @return 返回该对象
     */@RequestMapping("/param3··    ··")publicStudent param3 (Student student){return student;}}classStudent{privateString name;privateint age;privateString gender;publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}publicStringgetGender(){return gender;}publicvoidsetGender(String gender){this.gender = gender;}@OverridepublicStringtoString(){return"student{"+"name='"+ name +'\''+", age="+ age +", gender='"+ gender +'\''+'}';}}

在这里插入图片描述

如上图, 对于

Head

的传递, 传参时就在

URL 的查询字符串

中进行插入即可。

<2>. Body 传递

@RestController@RequestMapping("/begin")publicclass helloController {/**
     *
     * @RequestBody 表示用来修饰对象传递一个 JSON 格式的对象的注解
     * 传递一个 JSON 对象
     * @param student 对象
     * @return 返回该对象
     */@RequestMapping("/param7")publicStudent param7 (@RequestBodyStudent student){return student;}}classStudent{privateString name;privateint age;privateString gender;publicStringgetName(){return name;}publicvoidsetName(String name){this.name = name;}publicintgetAge(){return age;}publicvoidsetAge(int age){this.age = age;}publicStringgetGender(){return gender;}publicvoidsetGender(String gender){this.gender = gender;}@OverridepublicStringtoString(){return"student{"+"name='"+ name +'\''+", age="+ age +", gender='"+ gender +'\''+'}';}}

在这里插入图片描述

如上图

  1. 我们把 name , age , gender 都定义为 对象的属性 , 于是就可以 通过对象来传递
  1. 注意使用这个 @RequestBody 标明是通过 body(报文)传递对象 的。
  1. 对于 对象而言HTTP 的报文格式是: JSON 格式的。

鱼式疯言

  • JSON 就是一种有 特定数据的格式 : 相当于 中文有中文的格式英文有英文的格式 ,对象就有JSON 的格式。

故:

JSON 格式

是针对 对象 而言的。

  • 键值对 的格式:

**{

Key1

Value1

Key2

Value2

Key3

:

Value3

}**

{
}

表示 一个对象 ,

[
]

表示 多个对象的集合

  • 添加了 @RequestBody 的需要在 Body , 未加就要使用 Head 传递。

5. 数组传递

@RestController@RequestMapping("/begin")publicclass helloController {/**
     * 对数组进行传参
     */@RequestMapping("/param6")publicList<String>param6(String[] names){returnList.of(names);}}

在这里插入图片描述
如上图

如果 参数都是相同类型 的话,我们可以 像上方一样用

数组

传递

数组传递的方式:在查询字符串中使用

数组名赋值

, 中间用 逗号分隔。

6. 集合传递

/**
 * 传集合 list
 * 需要用 RequestParam 来绑定将数组转化 list
 * @param list
 * @return
 */@RestController@RequestMapping("/begin")publicclass helloController {@RequestMapping("/param4")//  传集合publicList<String>param4(@RequestParamList<Student> list){return  list;}}

在这里插入图片描述

这里 传参的方式和数组 一样,小编在这里就不赘述了~

三. Cookie 与 Session 传递

1. Cookie 和 Session 的初识

小伙伴可能有所不知的是,对于

HTTP 协议

来说: 是

无状态的协议

无状态协议不会记录中间传入的数据, 通信本身不维护和通信本身相关的任何状态信息 , 只是做 传输的作用 。

当有重要的数据传入时, 我们就需要使用一种属性来存储。

那么对于 客户端 来说,

存储数据

的方式:

Cookie

存储, 由 服务器来提供 。

对于 服务器 来说,

存储数据

的方式:

Session

存储, 服务器自身来生成

服务器存储一份, 客户端存储一份, 从而保证

数据的有效性

, 也能 提供校验 。

关于更多

Cookie

Session

内容, 小伙伴可以移步小编的下面这篇文章哦~

Cookie 详解文章链接

Controller

中, 我们也提供了如何操作

Cookie

Session

多种方式, 下面就让小编来演示一下吧~

2. Cookie

<1>. 获取 Cookie 方式一

@RequestMapping("/entrance")@RestControllerpublicclass header {//    获取多个Cookie/**
     * 通过 HttpServerletRequest 来获取整个 Http 的请求的 所有信息
     * 获取到信息后再获取 Cookie
     * @param quest 请求的信息
     * @return 返回 Cookie
     */@RequestMapping("/getCookie")publicStringgetCookie(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 方式二

通过 注解获取

importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.CookieValue;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.SessionAttribute;importjava.util.Arrays;@RequestMapping("/entrance")@RestControllerpublicclass header {/**
     * 使用 @CookieValue 绑定 Cookie 的key的注解
     * @param name1 作为 key
     * @return 返回 Cookie 的信息
     */@RequestMapping("/getCookie1")publicStringgetCookie1(@CookieValue("Cookie_1")Cookie  name1){System.out.println(name1.getName()+" : "+ name1.getValue());return name1.getName()+" : "+ name1.getValue();}}

在这里插入图片描述

在这里插入图片描述

如上图:

  1. 首先, 在 postman 中设置 Cookie
  2. 其次, @CookieValue 注解 中标记, 并且在参数中 指定是需要哪个 Cookie

这时,就可以获取到对应

Cookie

全部信息 : 包括 Cookie 的名字 和 Cookie 的值

  1. 进行打印 Cookie 的name 和 Cookie 的Value

这里唯一需要和小伙伴说明的是:

设置的Cookie 中, 必须含有

@CookieValue

标明的那个

Cookie

, 否则就会 报错 , 因为这是 必传参数。

3. Session

<1>. 设置Session 方式

importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.CookieValue;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")@RestControllerpublicclass header {/**
     * 要先获取到 session 就需要先设置 session
     *
     */@RequestMapping("/setSession")publicStringsetSession(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 方式一

importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.CookieValue;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")@RestControllerpublicclass header {//    获取 session  数据方法一: 使用 HttpServletRequest@RequestMapping("getSession1")publicStringgetSession1(HttpServletRequest  servletRequest){HttpSession session = servletRequest.getSession();return    session.getAttribute("hello")==null?"未设置session 值":String.valueOf(session.getAttribute("hello"));}}

在这里插入图片描述

在这里插入图片描述

  1. 首先还是先 设置 Session
  2. 其次对应的通过 HttpServletRequest 来获取 Session对象
  3. 最终 操作 Session 对象, 通过 getAttribute , 并加入对应的 Session 的属性名 来获取对应的 Session 的 Value 值。

<3>. 获取 Session 方式二

importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.CookieValue;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")@RestControllerpublicclass header {//    获取session 数据方法二 : 使用 HttpSession@RequestMapping("getSession2")publicStringgetSession2(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 方法三

importjakarta.servlet.http.Cookie;importjakarta.servlet.http.HttpServletRequest;importjakarta.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.CookieValue;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/entrance")@RestControllerpublicclass header {//    获取session 数据方法三 : 利用 SessionAttribute 绑定 Session 注解@RequestMapping("getSession3")publicStringgetSession3(@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 来传递对应的参数: 无参数的请求方式, 单参数,多参数, 对象传递, 数组传递, 集合传递等… 小伙伴要注意对应的注解的使用方式哦~
  • CookieSession 传递:理解 CookieSession 是对于 Http 无状态协议的一种客户端,服务器的记录数据的方式 ,并且可以通过 Controller的接口 使用 多种方式来设置和访问对应的 Cookie 和Session 。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

标签: spring mvc 前端

本文转载自: https://blog.csdn.net/mgzdwm/article/details/143881045
版权归原作者 邂逅岁月 所有, 如有侵权,请联系我们删除。

“【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(1) , 万字解析, 建议收藏 ! ! !”的评论:

还没有评论