目录
一、搭建springboot环境,演示springmvc功能
方式一:使用原生的HttpServletResponse对象
方式三:使用@RestController注解@RestController=@Controller+@ResponseBody
**该部分重点是
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 请求协议
请求协议的格式如下:
- 请求行;请求行包含:
- 访问地址;
- 请求方式;
- HTTP协议的版本;
- 请求头信息;
- 作用:通过具体的参数对本次请求进行详细的说明;
- 键值对,键和值之间使用冒号隔开;
- 请求体;
- 作用:作为请求的主体,发送数据给服务器。具体来说其实就是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 响应协议
响应协议的格式如下:
- 响应行;
- 响应头信息;
- 响应体。
响应内容是由服务器发送给浏览器的内容,浏览器会根据响应内容来显示
- 状态码:
- 1xx 请求失败
- 2xx 请求和响应都成功 200
- 3xx 请求转发或响应重定向 304
- 4xx 请求资源未找到 404 405
- 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 ) | 多方法兼容的路由 |
@GetMapping | GET | @RequestMapping(method = GET) | 查询数据 |
@PostMapping | POST | @RequestMapping(method = POST) | 提交数据(如表单/JSON) |
@PutMapping | PUT | @RequestMapping(method = PUT) | 更新资源(全量替换) |
@DeleteMapping | DELETE | @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 是专用注解,代码更简洁,语义更明确。
- 联系:
- @GetMapping 和 @PostMapping 本质上是 @RequestMapping 的派生注解,底层仍调用 @RequestMapping。
- Spring 4.3 后引入这些专用注解,推荐优先使用它们以提高代码可读性。
3、服务端响应数据给前端的方式?(重点)
前后端分离
对比维度 | HttpServletResponse | @ResponseBody | @RestController |
---|---|---|---|
所属层级 | 原生 Servlet API | Spring 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、响应结果给前端。