目录
一、搭建springboot环境,演示springmvc功能
7.1.1使用原生的HttpServletResponse对象
7.1.3使用@RestController注解 @RestController=@Controller+@ResponseBody
一、搭建springboot环境,演示springmvc功能
resources/application.properties
# 应用服务 WEB 访问端口
server.port=8080
二、http协议
URL:统一资源定位符 -- 就是向服务器发送的请求
格式: 协议名:// ip地址 : 端口号 / 项目名 / 资源名
2.1http协议概述
- 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方式的区别
-
参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)
Get请求参数:
Post请求参数:
-
安全性。get请求是不安全的,而post请求是"安全"的
-
编码方式不一样。get请求的编码是通过URLEncoder.encode()(地址栏编码); 而post请求的编码是将参数转成二进制流的形式发送
Get请求参数:
Post请求参数:
-
数据长度限制。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
三、前后端交互
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,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工具类
<!--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));
五、接口测试工具
笔者用的apifox,这个要求不高,用什么都行
5.1get请求
5.2post请求
5.3get方式和post方式的区别(!!!)
-
参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)
Get请求参数:
Post请求参数:
-
安全性。get请求是不安全的,而post请求是"安全"的
-
编码方式不一样。get请求的编码是通过URLEncoder.encode()(地址栏编码); 而post请求的编码是将参数转成二进制流的形式发送
Get请求参数:
Post请求参数:
-
数据长度限制。get请求参数长度是有上限的(几Kb级别),而post请求理论参数长度无上限
六、服务端接受请求的三种方式
6.1@RequestMapping注解
6.2@GetMapping注解
6.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......");
}
}
七、响应数据给前端及页面跳转
7.1响应数据给前端(前后端分离)
7.1.1使用原生的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));
}
7.1.2使用@ResponseBody注解
@Controller
public class UserController {
/*
一、@RequestMapping 接受任意请求
*/
@RequestMapping("/add")
@ResponseBody
public User add(){
System.out.println("----add----");
return new User();
}
7.1.3使用@RestController注解 @RestController=@Controller+@ResponseBody
@RestController
public class UserController {
/*
一、@RequestMapping 接受任意请求
*/
@RequestMapping("/add")
public User add(){
System.out.println("----add----");
return new User();
}
7.2页面跳转(前后端一体)
7.2.1转发forward
7.2.3重定向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";
}
}
7.3.3转发和重定向区别和联系
联系:都可以进行页面跳转
区别:
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请求参数:
-
参数可见性。get请求的参数是放在地址栏中的,post请求的参数是放在请求体中(用户在地址栏看不到)
- 安全性。get请求是不安全的,而post请求是"安全"的
-
编码方式不一样。get请求的编码是通过URLEncoder.encode()(地址栏编码); 而post请求的编码是将参数转成二进制流的形式发送
-
数据长度限制。get请求参数长度是有上限的(几Kb级别),而post请求理论参数长度无上限
2、服务端接收前端请求的方式?(重点)
注解 | HTTP 方法支持 | 简写等价形式 | 典型用途 |
---|---|---|---|
@RequestMapping | 所有方法(需指定 method ) | 无 | 灵活定义多种请求 |
@GetMapping | 仅 GET | @RequestMapping(method = RequestMethod.GET) | 查询数据、页面跳转 |
@PostMapping | 仅 POST | @RequestMapping(method = RequestMethod.POST) | 提交数据、创建资源 |
关键区别:
-
@RequestMapping
是通用注解,需手动指定method
,灵活性高。 -
@GetMapping
/@PostMapping
是专用注解,代码更简洁,语义更明确。
联系:
-
@GetMapping
和@PostMapping
本质上是@RequestMapping
的派生注解,底层仍调用@RequestMapping
。 -
Spring 4.3 后引入这些专用注解,推荐优先使用它们以提高代码可读性。
3、服务端响应数据给前端的方式?(重点)
方式 | 是否自动转 JSON | 是否需要视图解析 | 适用场景 |
---|---|---|---|
HttpServletResponse | 否(需手动处理) | 否 | 文件下载、自定义响应、低级控制 |
@ResponseBody | 是 | 否 | 混合使用(部分方法返回 JSON) |
@RestController | 是 | 否 | 纯 API 接口(全部方法返回 JSON) |
-
优先用
@RestController
:适合纯后端 API 开发。 -
混合场景用
@ResponseBody
:如部分方法返回视图,部分返回 JSON。 -
特殊需求用
HttpServletResponse
:如文件下载、自定义响应头。
HttpServletResponse如何手动转json
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
// 1. 设置响应头(指定 JSON 格式和 UTF-8 编码)
response.setContentType("application/json;charset=utf-8");
// 2. 构造数据
List<String> list = new ArrayList<>();
list.add("xiaowu1");
list.add("xiaowu2");
list.add("xiaowu3");
//3.
response.getOutputStream().println(JSON.toJSONString(list));
4、转发和重定向的区别和联系?(扩展)
联系:都可以进行页面跳转
区别:
1、转发,是服务端转发,是服务端行为。 重定向是有浏览器重新发起请求,是客户端行为。
2、转发,浏览器只发起一次请求。重定向:浏览器至少发起两次请求。
3、转发,浏览器地址栏不更改。重定向:浏览器地址栏更改。
4、转发,可以转发到当前应用任何页面。重定向:不能访问web-inf下的页面。
5、转发,不能转发到其他应用中。重定向:可以重定向到外部项目。
6、转发,可以携带request作用域的数据,重定向不可以。
5、springmvc的内部执行流程图(重点)
见上文九