SpringMVC01 |执行流程|接收前端请求|返回数据给前端|转发、重定向

目录

**该部分重点是

一、搭建springboot环境,演示springmvc功能

二、http协议

2.1 Http协议概述

2.2 请求协议

请求协议的格式如下:

Get方式和Post方式的区别

请求体

2.3 响应协议

三、前后端交互

3.1 浏览器发起请求

3.2 服务端接收请求

 3.3 接收数据

3.4 响应数据给前端

四、json数据格式

json工具类

五、接口测试工具

get请求

post请求

Get方式和Post方式的区别(面试题)

六、服务端接收请求的三种方式

1、@RequestMapping注解

2、@GetMapping注解

3、@PostMapping 注解

七、响应数据给前端及页面跳转

响应数据给前端(前后端分离)

方式一:使用原生的HttpServletResponse对象

方式二:使用@ResponseBody注解

方式三:使用@RestController注解@RestController=@Controller+@ResponseBody

页面跳转(前后端一体) 了解

方式一:转发 forward

方式二:重定向 redirect

转发和重定向的区别和联系?

八、springmvc的视图解析器

​编辑 九、springmvc内部执行流程图(面试题必备)

十、面试题:

1、get和post的区别?(重点)

2、服务端接收前端请求的方式?(重点)

3、服务端响应数据给前端的方式?(重点)

4、转发和重定向的区别和联系?(扩展)

5、springmvc的内部执行流程图(重点)


**该部分重点是

1、springmvc的内部执行流程
2、springmvc如何接收前端请求
3、springmvc如何接收前端传递的数据
4、springmvc如何返回数据给前端
5、springmvc转发和重定向的区别?(前后端分离不适用 了解)

一、搭建springboot环境,演示springmvc功能

springboot环境内置集成了tomcatjar包,启动项目,默认部署在内置的tomcat中运行。

 resource目录下 application.properties中修改tomcat端口

# 应用服务 WEB 访问端口
server.port=8080

启动项目

二、http协议

网址:http://192.168.0.173:8080/lv/shouye.html

URL:统一资源定位符 --及时向服务器发送请求

格式:  协议名:// ip地址 : 端口号 / 项目名 / 资源名

2.1 Http协议概述

  • HTTP(HyperText Transfer Protocol),即超文本传输协议。这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。
  • HTTP协议的作用:HTTP就是一个通信规则,通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。其实我们要学习的就是这个两个格式。
  • 客户端发送给服务器的格式叫“请求协议”【也称之为请求报文】;
  • 服务器发送给客户端的格式叫“响应协议”【也称之为响应报文】;
  • http协议是基于请求和响应模式,无状态的协议。 应用层
  • 浏览器的url网址是遵循http协议。
  • http协议中定义了浏览器发送请求的打包方式,加密方式,传输方式,传输信息,传输速度等标准
  • http发送的url格式: http://ip:端口号/资源信息
  • URL -- 统一资源定位符
  • http://www.baidu.com -- http://202.108.22.5:80/index.html
  • http://localhost:8080/项目名/资源名称
  • https是http的升级,加入了更加复杂的加密方式。

2.2 请求协议

请求协议的格式如下:

  • 请求行;请求行包含:
  1. 访问地址;
  2. 请求方式;
  3. HTTP协议的版本;
  • 请求头信息;
  1. 作用:通过具体的参数对本次请求进行详细的说明;
  2. 键值对,键和值之间使用冒号隔开;
  • 请求体;
  1. 作用:作为请求的主体,发送数据给服务器。具体来说其实就是POST请求方式下的请求参数。

浏览器发送给服务器的内容就这个格式的,如果不是这个格式服务器将无法解读!在HTTP协议中,请求有很多请求方法,其中最为常用的就是GET和POST。不同的请求方法之间的区别。
请求方式:
浏览器通过发送http请求向服务器请求对资源的访问,http请求可以使用多种请求方法:

方法作用
GET请求获取所指定的资源
POST请求服务器接收在请求中封装的实体
HEAD请求获取所指定资源的响应信息报头(不返回实际内容)
PUT请求服务器更新指定的资源
DELETE请求服务器删除指定的资源
TRACE请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS请求服务器的性能支持,或查询与资源相关的选项和需求

Get方式和Post方式的区别

1. 参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)
Get请求参数:

Post请求参数:

 4. 数据长度限制。get请求参数长度是有上限的(几Kb级别),而post请求理论参数长度无上限

请求体

Accept: 客户端向服务器端表示,我能支持什么类型的数据。
Accept-Encoding:编码方式,通常是某种压缩算法。
Accept-Language: 支持语言格式。
Connection : 网络连接在当前会话完成后是否仍然保持打开状态。
Cookie:Cookie信息。
Host : 主机地址。
Sec-Fetch-Dest:数据的来源以及如何使用这些获取到的数据。
Sec-Fetch-Mode:请求的模式。
Sec-Fetch-Site:请求发起者的来源与目标资源来源之间的关系。
Sec-Fetch-User:一个导航请求是否由用户激活触发。
Upgrade-Insecure-Requests:用来向服务器端发送信号,表示客户端优先选择加密及带有身份验证
的响应。
User-Agent: 浏览器向服务器表明,当前来访的客户端信息。
Sec-CH-UA:浏览器向服务器提供浏览器名称和版本信息。
Sec-CH-UA-Mobile:是否是移动设备的浏览器。
Sec-CH-UA-Platform:浏览器所处的系统。
Content-Type: 提交的数据类型。经过urlencoding编码的form表单的数据。
Content-Length: 数据长度
Cache-Control : 对缓存的操

2.3 响应协议

响应协议的格式如下:

  • 响应行;
  • 响应头信息;
  • 响应体。

响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示

  • 状态码:
  1. 1xx 请求失败
  2. 2xx 请求和响应都成功 200
  3. 3xx 请求转发或响应重定向 304
  4. 4xx 请求资源未找到 404 405
  5. 5xx 服务器错误 500

具体:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Statu

三、前后端交互

3.1 浏览器发起请求

3.2 服务端接收请求

@RequestMapping("/hello")

//接收前端映射路径
@RequestMapping("/hello")
public void hello() throws IOException {
}

 3.3 接收数据

HttpServletRequest request 请求对象,获取浏览器请求信息

//接收前端映射路径
//HttpServletRequest request 请求对象,获取浏览器请求信息
//HttpServletResponse response 响应对象,响应数据给浏览器
@RequestMapping("/hello")
public void hello(HttpServletRequest request) throws IOException {
System.out.println("hello........");
//获取请求参数
String name = request.getParameter("name");
}

3.4 响应数据给前端

HttpServletResponse response 响应对象,响应数据给浏览器

//接收前端映射路径
//HttpServletRequest request 请求对象,获取浏览器请求信息
//HttpServletResponse response 响应对象,响应数据给浏览器
@RequestMapping("/hello")
public void hello(HttpServletRequest request, HttpServletResponse response)
throws IOException {
System.out.println("hello........");
//获取请求参数
String name = request.getParameter("name");
System.out.println(name);
//响应数据给前端
//设置响应格式
response.setContentType("application/json;charset=utf-8");
//添加响应数据
response.getOutputStream().print("hello world");
}

四、json数据格式

  • JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于文本,易于人类阅读和编写,同时也易于机器解析和生成。JSON 格式在 Web 开发中广泛使用,特别是在前后端数据交换中。
  • JSON:JavaScript Object Notation,JS对象表示法, 是一种轻量级的数据交换格式。在开发中凡是涉及到『跨平台数据传输』,JSON格式一定是首选。
  • JSON本质:JavaScript对象,可以与字符串或对象可以进行转换。
  • JSON作用:JSON可以在不同语言,不同生态之间进行数据交互。
  • JSON数据两种要么是{},要么是[]。
  • JSON对象的格式是:

{key:value,key:value,...,key:value}
如:
{"id":1001,"username":"zhangsan","password":"123","name":"张三","tel":"110}
  • 使用大括号{}包裹起来的内容,数据结构为{key1:value1,key2:value2,...}的键值对结构,key为对象的属性,value为对应的值。
  • JSON数组的格式是:
[value,value,...,value]
如:
["aa","bb","cc","dd","ee"]
[
{"id":1001,"username":"zhangsan","password":"123","name":"张
三","tel":"110"},
{"id":1002,"username":"wangwu","password":"234","name":"王
五","tel":"120"},
{"id":1003,"username":"zhaoliu","password":"345","name":"赵
六","tel":"130"}
]
  • SpringMVC中默认采用Jackson进行json转换

json工具类

com.alibaba.fastjson

<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>

//添加响应数据
//String msg = JSON.toJSONString("hello world");
//返回对象给前端
// User user = new User();
// user.setName("admin");
// user.setId(111);
// response.getOutputStream().print(JSON.toJSONString(user));
List list = new ArrayList();
list.add("beijing1");
list.add("beijing2");
list.add("beijing3");
response.getOutputStream().print(JSON.toJSONString(list));

五、接口测试工具

模拟前端请求:
测试工具: postman、apifox、apipost、swagger、小幺鸡

get请求

post请求

Get方式和Post方式的区别(面试题)


1. 参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)

2. 安全性。get请求是不安全的,而post请求是"安全"的

3. 编码方式不一样。get请求的编码是通过URLEncoder.encode()(地址栏编码); 而post请求的编码是将参数转成二进制流的形式发送

4. 数据长度限制。get请求参数长度是有上限的(几Kb级别),而post请求理论参数长度无上限

六、服务端接收请求的三种方式

1、@RequestMapping注解

2、@GetMapping注解

3、@PostMapping 注解

/**
* 接收请求的几种方式
*/
@Controller
public class UserController {
/*
一、@RequestMapping 接收任意请求
*/
@RequestMapping("/add")
public void add(){
System.out.println("add............");
}
/*
二、@GetMapping 只接收get请求
*/
@GetMapping("/delete")
public void delete(){
System.out.println("delete......");
}
/*
三、@PostMapping 只接收post请求
*/
@PostMapping("/update")
public void update(){
System.out.println("update......");
}
}

七、响应数据给前端及页面跳转

响应数据给前端(前后端分离)

方式一:使用原生的HttpServletResponse对象

@RequestMapping("/hello")
public void hello(HttpServletRequest request, HttpServletResponse response)
throws IOException {
List list = new ArrayList();
list.add("beijing1");
list.add("beijing2");
list.add("beijing3");
//设置响应格式
response.setContentType("application/json;charset=utf-8");
response.getOutputStream().print(JSON.toJSONString(list));
}

方式二:使用@ResponseBody注解

/*
一、@RequestMapping 接收任意请求
*/
@RequestMapping("/add")
@ResponseBody
public User add(){
System.out.println("add............");
return new User();
}

方式三:使用@RestController注解@RestController=@Controller+@ResponseBody

@RestController
public class UserController {
/*
一、@RequestMapping 接收任意请求
*/
@RequestMapping("/add")
// @ResponseBody
public User add(){
System.out.println("add............");
return new User();
}

页面跳转(前后端一体) 了解

方式一:转发 forward

方式二:重定向 redirect

@Controller
public class LoginController {
@RequestMapping("/login")
public String login(String username,String password){
System.out.println(username+" "+password);
//省略逻辑判断
//跳转到登录成功页 转发跳转
// return "forward:/success.html";
// 重定向跳转
return "redirect:/success.html";
}
}

转发和重定向的区别和联系?

联系:都可以进行页面跳转
区别:
1、转发,是服务端转发,是服务端行为。 重定向是有浏览器重新发起请求,是客户端行为。
2、转发,浏览器只发起一次请求。重定向:浏览器至少发起两次请求。
3、转发,浏览器地址栏不更改。重定向:浏览器地址栏更改。
4、转发,可以转发到当前应用任何页面。重定向:不能访问web-inf下的页面。
5、转发,不能转发到其他应用中。重定向:可以重定向到外部项目。
6、转发,可以携带request作用域的数据,重定向不可以。

八、springmvc的视图解析器

@RequestMapping("/login")
public String login(String username, String password, HttpServletRequest
request){
System.out.println(username+" "+password);
return "success";
}

 九、springmvc内部执行流程图(面试题必备)


1、浏览器发起请求: http://localhost:8080/user/getById?id=1
2、浏览器解析地址:http://     localhost    8080
3、定位到硬件服务器 ip 和 软件服务器 8080(tomcat应用)
4、通过8080----->部署的项目
5、前端控制器接收请求 解析url路径得到资源路径 /user/getById
6、前端控制器 通过调用 处理器映射器,查询 handler是否存在
7、如果路径存在,返回路径的执行链给前端控制器。如果不存在,返回404。
执行链包含了目标方法前的一系列过滤器和拦截器 目标方法路径 及后置的过滤器和拦截器。
8、前端控制器 调用处理器适配器 请求执行handler(目标方法)
9、处理器适配器封装参数到目标方法的参数中(解析httpServletRequest ,调用
request.getParameter方法)
10、执行目标handler(目标方法) 目标handler响应结果给处理器适配器(数据和视图名)
11、处理器是配置返回modelandview给前端控制器
12、前端控制器,请求视图解析器, 拼接前缀路径和后缀路径,得到完整的视图名
13、前端控制器,将model中的数据,在指定的视图页面上进行渲染
14、响应结果给前端。

十、面试题:

1、get和post的区别?(重点)

对比维度GET 请求POST 请求
参数可见性参数暴露在地址栏中,用户可见参数放在请求体(Body)中,用户不可见
安全性不安全,数据暴露在URL中,不适合传输敏感信息相对“安全”,参数不在URL中显示,适合传输敏感数据
编码方式使用 URLEncoder.encode() 进行URL编码将参数转换为二进制流形式发送
数据长度限制参数长度受限(通常几KB级别),受浏览器和服务器限制理论上无上限,实际由服务器配置决定

2、服务端接收前端请求的方式?(重点)

注解HTTP 方法简写等价形式常见用途
@RequestMapping所有方法无(需手动指定 method多方法兼容的路由
@GetMappingGET@RequestMapping(method = GET)查询数据
@PostMappingPOST@RequestMapping(method = POST)提交数据(如表单/JSON)
@PutMappingPUT@RequestMapping(method = PUT)更新资源(全量替换)
@DeleteMappingDELETE@RequestMapping(method = DELETE)删除资源
  • 关键区别:

@RequestMapping 是通用注解,需手动指定 method,灵活性高。
 

@RequestMapping(value = "/user", method = RequestMethod.GET)  // 仅处理 GET
public String getUser() { return "user"; }

@RequestMapping(value = "/user", method = RequestMethod.POST) // 仅处理 POST
public String addUser() { return "added"; }

@GetMapping / @PostMapping 是专用注解,代码更简洁,语义更明确。

  • 联系:
  1. @GetMapping 和 @PostMapping 本质上是 @RequestMapping 的派生注解,底层仍调用 @RequestMapping。
  2. Spring 4.3 后引入这些专用注解,推荐优先使用它们以提高代码可读性。 

3、服务端响应数据给前端的方式?(重点)

前后端分离

对比维度HttpServletResponse@ResponseBody@RestController
所属层级原生 Servlet APISpring MVC 注解Spring MVC 组合注解(= @Controller + @ResponseBody
使用方式在 Controller 方法中注入并手动写入输出流标注在方法上,Spring 自动将返回值写入响应体标注在类上,所有方法默认返回值直接写入响应体
返回类型可以写入任意格式(字符串、JSON、文件流等),需手动处理支持自动序列化(如 JSON、XML),基于返回对象类型同 @ResponseBody
控制粒度更细粒度,可完全自定义响应内容和头信息控制粒度适中,适合统一返回结构控制粒度较粗,适用于整个控制器
异常处理兼容性需要手动处理异常输出可与 @ControllerAdvice 等配合统一处理异常同 @ResponseBody
是否支持 REST✅ 可以实现,但不够简洁✅ 推荐用于单个方法的 REST 返回✅ 推荐用于整个类的 REST 返回
开发效率较低,需要手动操作输出流中等,Spring 自动处理序列化高,简化了代码结构
适用场景特殊需求(如下载文件、流式输出、自定义协议)普通 REST 接口,返回 JSON/XML 数据构建标准的 RESTful Web 服务
是否推荐使用特殊场景下使用推荐用于非全局 REST 接口强烈推荐用于现代 RESTful 开发

4、转发和重定向的区别和联系?(扩展)

对比项转发(Forward)重定向(Redirect)
行为主体服务端行为客户端(浏览器)行为
请求次数浏览器只发起 1 次 请求浏览器至少发起 2 次 请求
地址栏变化浏览器地址栏 不变浏览器地址栏 变化(显示新 URL)
访问范围可转发到当前应用的 任意页面(包括 /WEB-INF/不能 访问 /WEB-INF/ 下的页面
跨应用/外部资源不能 转发到其他应用可以 重定向到外部项目(如 https://example.com
数据传递可以 携带 request 作用域的数据不能 携带 request 作用域的数据(需通过 session 或 URL 参数传递)

5、springmvc的内部执行流程图(重点)

1、浏览器发起请求: http://localhost:8080/user/getById?id=1
2、浏览器解析地址:http://     localhost    8080
3、定位到硬件服务器 ip 和 软件服务器 8080(tomcat应用)
4、通过8080----->部署的项目
5、前端控制器接收请求 解析url路径得到资源路径 /user/getById
6、前端控制器 通过调用 处理器映射器,查询 handler是否存在
7、如果路径存在,返回路径的执行链给前端控制器。如果不存在,返回404。
执行链包含了目标方法前的一系列过滤器和拦截器 目标方法路径 及后置的过滤器和拦截器。
8、前端控制器 调用处理器适配器 请求执行handler(目标方法)
9、处理器适配器封装参数到目标方法的参数中(解析httpServletRequest ,调用
request.getParameter方法)
10、执行目标handler(目标方法) 目标handler响应结果给处理器适配器(数据和视图名)
11、处理器是配置返回modelandview给前端控制器
12、前端控制器,请求视图解析器, 拼接前缀路径和后缀路径,得到完整的视图名
13、前端控制器,将model中的数据,在指定的视图页面上进行渲染
14、响应结果给前端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值