Spring Web MVC(Spring MVC)

学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解

1.Spring MVC

spring Web MVC 是⼀个 Web 框架 .,简称之为: Spring MVC

MVC 定义

eg:
HR就是 View(视图) , 负责接待候选⼈, 并告知候选⼈⾯试结果
不同的部⻔, 就是 Controller(控制器) , HR根据候选⼈来选择对应的部⻔来进⾏⾯试
⾯试官, 就是 Model层 , 来处理⾯试这个事情

Spring MVC

MVC 是⼀种架构设计模式, 也是⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现 . 除此之外,
Spring MVC还是⼀个Web框架.
总结来说, Spring MVC 是⼀个实现了 MVC 模式的 Web 框架 .
Spring MVC 主要关注有两个点:

  1. MVC
  2. Web框架

Spring MVC框架

2.学习Spring MVC(重点)

既然是 Web 框架, 那么当⽤⼾在 浏览器中输⼊了 url 之后 ,我们的 Spring MVC 项⽬就可以 感知到⽤⼾ 的请求, 并给予响应 .
咱们学习Spring MVC, 重点 也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个⽅⾯:
1. 建⽴连接 :将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的
Spring 程序。
2. 请求 : ⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数 的功能.
3. 响应: 执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾, 也就是响应.
对于 Spring MVC 来说,掌握了以上 3 个功能就相当于掌握了 Spring MVC.

一.建⽴连接

@RestController

@RestController注解是Spring 4.0引入的一个组合注解,用于简化RESTful Web服务的开发。@RestController注解相当于@Controller和@ResponseBody注解的组合,表示该类是一个控制器,并且所有的方法返回值都将直接写入HTTP响应体中,而不是返回视图名称

@RequestMapping :

  1. Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接 ⼝的 路由映射的
  2. 既可修饰类,也可以修饰⽅法 ,当修饰类和⽅法时,访问的地址是类路径 + ⽅ 法路径.
  3. 既⽀持Get请求, ⼜⽀持Post请求 . 同理, 也⽀持其他的请 求⽅式
    @RequestMapping标识⼀个类:设置映射请求的请求路径的初始信息
    @RequestMapping标识⼀个⽅法:设置映射请求请求路径的具体信息
指定GET/POST⽅法类型

@RestController
public class UserController { //还有其他方法
@RequestMapping(value = "/getRequest",method= RequestMethod.POST )
public String sayHi(){
return "get request...";
}
}

二.请求

创建请求(在postman中)

传参介绍
1. 普通传参, 也就是通过查询字符串来传参

2. form-data
3. x-www-form-urlencoded
4. raw

可以上传任意格式的⽂本,可以上传text、json、xml、html等

请求

1 传递单个参数

注意事项
使⽤基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误
类型不匹配时, 会报400错误

2.传递对象
3.后端参数重命名@RequestParam (后端参数映射)

前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀ime 给后端,⽽后端是使⽤ createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值.
required=false变成非必传(可以用time也可以createtime传参,默认为true)

可以看到, 添加required=false之后, time前⾯也加了key, 变成了 value = "time"
注解属性赋值时, 没有指明key的话, 默认为value属性.
如果需要有多个属性进⾏赋值时, 需要写上key


注意

  1. 使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀
    致 , 才能进⾏参数绑定和赋值.
4.传递数组
5.传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个 , 且 需要使⽤ @RequestParam 绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使⽤
@RequestParam 绑定参数关系
请求⽅式和数组类似:

6.传递JSON@RequestBody
JSON概念

JSON:JavaScript Object Notation 【JavaScript 对象表⽰法】
JSON是⼀种轻量级的数据交互格式. 它基于 ECMAScript (欧洲计算机协会制定的js规范)的⼀个⼦集, 采⽤完全独⽴于编程语⾔的⽂本格式来存储和表⽰数据。--百度百科
简单来说: JSON就是⼀种数据格式 , 有⾃⼰的格式和语法 , 使⽤⽂本表⽰⼀个对象或数组的信息, 因此 JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.

JSON的语法:
  1. 数据在 键值对 (Key/Value) 中
  2. 数据由逗号 , 分隔
  3. 对象⽤ {} 表⽰
  4. 数组⽤ [] 表⽰
  5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象 JSON的两种结构
  6. 对象: ⼤括号 {} 保存的对象是⼀个⽆序的 键值对 集合. ⼀个对象以左括号 { 开始, 右括号 }
    结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔
  7. 数组: 中括号 [] 保存的数组是值(value)的有序集合. ⼀个数组以左中括号 [ 开始, 右中括
    号 ] 结束,值之间使⽤逗号 , 分隔。
JSON字符串和Java对象互转
JSON优点
  1. 简单易⽤: 语法简单,易于理解和编写,可以快速地进⾏数据交换
  2. 跨平台⽀持: JSON可以被多种编程语⾔解析和⽣成, 可以在不同的平台和语⾔之间进⾏数据交换和 传输
  3. 轻量级: 相较于XML格式, JSON数据格式更加轻量级, 传输数据时占⽤带宽较⼩, 可以提⾼数据传输 速度
  4. 易于扩展: JSON的数据结构灵活,⽀持嵌套对象和数组等复杂的数据结构,便于扩展和使⽤
  5. 安全性: JSON数据格式是⼀种纯⽂本格式,不包含可执⾏代码, 不会执⾏恶意代码,因此具有较⾼ 的安全性
    基于以上特点, JSON在Web应⽤程序中被⼴泛使⽤, 如前后端数据交互、API接⼝数据传输等.
传递JSON对象(重点)

接收JSON对象, 需要使⽤ @RequestBody 注解

7.获取URL中参数@PathVariable

path variable: 路径变量
和字⾯表达的意思⼀样, 这个注解 主要作⽤在请求URL路径上的数据绑定

如果⽅法参数名称和需要绑定的 URL中的变量名称⼀致时 , 可以简写, 不⽤ 给@PathVariable的属性赋 值, 如上述例⼦中的id变量
如果⽅法参数名称和需要绑定的 URL中的变量名称不⼀致时 , 需要@PathVariable的属性value赋值 ,
如上述例⼦中的userName变量

8.上传⽂件@RequestPart

9.获取Cookie/Session

HTTP 协议⾃⾝是属于 "⽆状态" 协议.
"⽆状态" 的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系. 但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
Cookie:类似于医院就诊卡,随时可以获取,来就可以办新的卡
Session:类似与服务器在就诊卡记录里面的信息

2.理解Session

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

  1. 当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过
    HTTP 响应中的 Set-Cookie 字段返回).
  2. 客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的
    Cookie 字段带上).
  3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后 续操作.找不到则重新创建Session, 并把SessionID返回
3.Cookie 和 Session 的区别

1.Cookie 是 客⼾端保存⽤⼾信息 的⼀种机制. Session 是 服务器端保存⽤⼾信息的⼀种机制.
2.Cookie 和 Session之间主要是通过 SessionId 关联 起来的, SessionId 是 Cookie 和 Session 之间的 桥梁
3.Cokie 和 Session 经常会在⼀起配合使⽤. 但是 不是必须配合 .
4.完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是
SessionId
5.Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

4.获取Cookie@CookieValue
5.获取Session@SessionAttibute

Session 存储和获取
Session是服务器端的机制, 我们需要 先存储, 才能再获取
Session 也是基于 HttpServletRequest 来存储和获取的

Session读取
简洁获取 Session(1)

(2)

10.获取Header

简洁获取 Header

三.响应@Controller

1.返回静态⻚⾯

创建前端⻚⾯ index.html(注意路径要在一个路径里面)
我们需要把 @RestController 改为 @Controller

@RestController 、 @Controller区别

所以前⾯使⽤的 @RestController 其实是返回的数据.
@RestController = @Controller + @ResponseBody
@Controller : 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理.
@ResponseBody : 定义 返回数据 格式为⾮视图, 返回⼀个 text/html 信息

2.返回数据@ResponseBody

@ResponseBody 既是类注解, ⼜是⽅法注解

因为@Controller只是把对象交给Spring管理,不能返回数据,所以必须+@ResponseBody

3 返回HTML代码⽚段

后端返回数据时, 如果数据中有HTML代码, 也会被浏览器解析

响应中的 Content-Type 常⻅取值有以下⼏种:

text/html : body 数据格式是 HTML
text/css : body 数据格式是 CSS
application/javascript : body 数据格式是 JavaScript
application/json : body 数据格式是 JSON

4 返回JSON

Spring MVC 也可以返回JSON ,后端⽅法返回结果为对象

5 设置状态码

3.练习.

1.加法计算器

  1. 留⾔板

3..2 ⽤⼾登录

4.实现服务器端代码

1 .lombok介绍

⼀个新的⼯具包 lombok
Lombok是⼀个Java⼯具库,通 过添加注解的⽅式 ,简化Java的开发.
简单来学习下它的使⽤

1. 引⼊依赖


@Data = @Getter + @Setter + @ToString + @EqualsAndHashCode @RequiredArgsConstructor

  • @NoArgsConstructor

2.更快捷的引⼊依赖

2.服务器代码实现( 留⾔板)

定义留⾔对象 MessageInfo 类
创建 MessageController 类

3.调整前端⻚⾯代码

图书管理系统

5.应⽤分层

按照上⾯的层次划分, Spring MVC 站在后端开发⼈员的⻆度上, 也进⾏了⽀持, 把上⾯的代码划分为三 个部分:
1.请求处理、响应数据 :负责,接收⻚⾯的请求,给⻚⾯响应数据.
2.逻辑处理 :负责业务逻辑处理的代码.
3.数据访问: 负责业务数据的维护操作,包括增、删、改、查等操作.
这三个部分, 在Spring的实现中, 均有体现
Controller:控制层 。接收前端发送的请求,对请求进⾏处理,并响应数据。
Service:业务逻辑层 。处理具体的业务逻辑。
Dao:数据访问层 ,也称为持久层。负责数据访问操作,包括数据的增、删、改、查.

MVC架构模式由三部分组成 , 分别是: 模型(Model), 视图(View)和控制器(Controller).
三层架构将业务应⽤划分为 :表现层, 业务逻辑层, 数据访问层

1. 代码拆分

Http相关对象(获取session、Header/设置状态码)

1.HttpServletRequest re;获取session
2.HttoSession se=re.getSeession();//通过获取Session,来
3.se.setAttribute("name","value")使⽤指定的名称绑定⼀个对象到该 session 会话,来储存
4.se.getAttribute("name")通过se,来获取对象

注解

@RestController//其实是返回的数据.==@ResponseBody返回数据+@Controller响应静态

@RequestMapping("/user")//路由映射

@RequestParam(value="time",required=false)//后端参数重命名

@RequestBody //接收JSON类型的参数

@PathVariable//接收路径参数

@RequestPart: 上传⽂件

@CookieValue("bite")//从Cookie中获取值

@SessionAttribute(value="username",required=false)//从Session中获取值

@RequestHeader("User-Agent")//从Header中获取值

@Controller响应静态//把这个对象交给Spring管理. 默认返回 视图.

@ResponseBody返回数据

总结

学习Spring MVC, 其实就是学习各种Web开发需要⽤的到注解
a. @RequestMapping: 路由映射
b. @RequestParam: 后端参数重命名
c. @RequestBody: 接收JSON类型的参数
d. @PathVariable: 接收路径参数
e. @RequestPart: 上传⽂件
f. @ResponseBody: 返回数据
g. @CookieValue: 从Cookie中获取值
h. @SessionAttribute: 从Session中获取值
i. @RequestHeader: 从Header中获取值
j. @Controller: 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回
视图.
k. @RestController: @ResponseBody + @Controller 返回数据
2. Cookie 和Session都是会话机制, Cookie是客⼾端机制, Session是服务端机制 . ⼆者通过SessionId
来关联. Spring MVC内置HttpServletRequest, HttpServletResponse两个对象. 需要使⽤时, 直接在
⽅法中添加对应参数即可, Cookie和Session可以从HttpServletRequest中来获取, 也可以直接使⽤
HttpServletResponse设置Http响应状态码 .
3. Java EE学习阶段会涉及较多⼯具, 插件的学习, 来帮助我们提⾼开发效率. ⽐如Postman, lombok, EditStarter, 后⾯还会继续学习其他的⼯具或插件.

相关推荐
Nan_Shu_61417 分钟前
学习: Threejs (2)
前端·javascript·学习
G_G#25 分钟前
纯前端js插件实现同一浏览器控制只允许打开一个标签,处理session变更问题
前端·javascript·浏览器标签页通信·只允许一个标签页
@大迁世界40 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路1 小时前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug1 小时前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu121381 小时前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中1 小时前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路1 小时前
GDAL 实现矢量合并
前端
hxjhnct1 小时前
React useContext的缺陷
前端·react.js·前端框架
前端 贾公子2 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端