创建springboot工程
pom.xml 文件
项目目录结构
spring入门程序
使用阿里云的spring脚手架
可以使用阿里云提供的脚手架,网址为:https://start.aliyun.com
HTTP协议
概念
HTTP(Hyper Text Transfer Protocol)超文本传输协议
规定了浏览器(客户端)和服务器之间数据传输的规则。
交互模式:客户端发【请求】 → 服务器返回【响应】
三大特点
基于 TCP 协议
(1)TCP 是面向连接的协议,传输可靠。
(2)补充:HTTP 本身不加密;加密版本是 HTTPS(HTTP+SSL/TLS)
请求 - 响应模型
(1)一次请求,对应一次响应。客户端不主动发请求,服务器不会主动推送数据。无状态协议
(1)HTTP 对事务没有记忆能力,每一次请求和响应都是相互独立的。
(2)缺点:连续多次请求之间,默认不能共享用户数据(比如登录状态记不住)
(3)优点:服务器不需要保存状态信息,开销小、速度快
HTTP请求协议
请求数据格式
- HTTP 请求报文分为 3 大块:请求行、请求头、请求体
请求行
格式:请求方式 资源路径?参数 协议版本
GET /brand/findAll?name=OPPO&status=1 HTTP/1.1请求方式:
GET资源路径:
/brand/findAll请求参数:
name=OPPO&status=1(跟在?后面,多个用&分隔)协议版本:
HTTP/1.1请求头
用来携带客户端附加信息,常见的:
Host:访问的主机和端口
User-Agent:浏览器 / 客户端信息
Accept:告诉服务器我能接收什么类型的数据
Accept-Encoding:支持的压缩格式
Accept-Language:支持的语言
Content-Type:POST 专用 ,告诉服务器请求体的数据格式
Content-Length:POST 专用 ,请求体内容长度
Cookie:携带 Cookie 信息请求体
GET 没有请求体 ;POST 把参数放在请求体里
{"status":1,"brandName":"bit","companyName":"xiaobit","id":"","description":"xiaobit"}GET 和 POST 核心对比
GET
参数放在请求行(URL 后面)
没有请求体
浏览器对 URL 长度有限制,传输数据小
参数直接暴露在地址栏,安全性差一点
POST
参数放在请求体
理论上数据大小没有限制
参数不在 URL 上,相对更安全
需要请求头Content-Type来说明请求体格式补充:GET 一般用于查询数据;POST 一般用于新增 / 提交数据
- 按F12,打开开发者工具,点击网络,看标头原始
请求数据获取
浏览器发出原始 HTTP 请求报文 → Tomcat(Web 服务器) 接收、解析 HTTP 原始报文,把里面所有请求信息(请求行、请求头、请求参数等)封装成 HttpServletRequest 对象,传给 Controller,我们开发时直接拿这个对象用,不用自己解析原始 HTTP 字符串。
GET /brand/findAll?name=OPPO&status=1 HTTP/1.1 Accept: text/html,application/xhtml+xml,application Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Host: localhost:8080 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64;(1)请求行:GET /brand/findAll?name=OPPO&status=1 HTTP/1.1
请求方式:GET
请求资源路径:/brand/findAll
GET 参数:name=OPPO、status=1
协议版本:HTTP/1.1
(2)请求头(Header):
Accept、Accept-Encoding、Host、User-Agent 这些键值对,
携带浏览器环境、支持的数据类型等信息
HttpServletRequest 是什么
它是 Servlet 规范提供的请求对象 ,封装了本次 HTTP 请求全部信息:
(1)获取请求方式
getMethod()(2) 获取请求 URL、URI
(3) 获取 GET 查询参数
getParameter("name")(4) 获取请求头
getHeader("User-Agent")(5) 获取 POST 请求体数据
(6) 获取客户端 IP 等
SpringMVC 底层就是基于 Servlet,Controller 方法里可以直接声明 HttpServletRequest request 形参,框架自动把封装好的对象注入进来。
设计目的
原始 HTTP 只是一段文本字符串,如果让我们程序员手动分割字符串、解析参数、解析请求头,非常麻烦、容易出错。
Tomcat 帮我们做好解析,封装成面向对象的 HttpServletRequest,屏蔽 HTTP 底层细节,简化 Web 开发。
总结
HTTP 请求数据需要程序员自己解析吗
(1)不需要,web 服务器(Tomcat)负责对 HTTP 请求数据进行解析,
并封装为请求对象。
如何获取请求数据?
(1)HttpServletRequest对象里面封装了所有的请求信息,
我们通过这个对象来获取请求数据。
SpringBoot 中使用 HttpServletRequest 获取请求信息
@RestController public class RequestController { @RequestMapping("/request") public String request(HttpServletRequest request) { // 1. 获取请求方式 GET / POST String method = request.getMethod(); System.out.println("请求方式:"+method); // 2. 获取请求URL(完整地址)、URI(端口后的路径) String url=request.getRequestURL().toString(); System.out.println("请求url地址:"+url); String uri=request.getRequestURI(); System.out.println("请求uri地址:"+uri); //3. 获取请求协议 String protocol=request.getProtocol(); System.out.println("请求协议:"+protocol); //4. 获取请求参数(name、age) String name=request.getParameter("name"); String age=request.getParameter("age"); System.out.println("name: "+name+", age: "+age); //5. 获取请求头信息 Accept String accept=request.getHeader("Accept"); System.out.println("Accept: "+accept); return "OK"; } }
各个方法作用
访问测试
http://localhost:8080/request?name=bit&age=18补充知识点
(1)URL 和 URI 的区别
a)URI:统一资源标识符,只代表资源路径/request
b)URL:统一资源定位符,是完整的访问地址,包含协议、主机、端口
(2)HttpServletRequest是 Servlet 原生对象,
SpringMVC 可以直接注入使用,用来解析 HTTP 请求的全部信息
(3)getParameter()默认拿到的都是字符串类型,age 拿到后需要自己转 Integer
HTTP响应协议
响应数据格式
状态码
掌握这三,200,404,500
状态码大全:https://cloud.tencent.com/developer/chapter/13553404
500
总结
- HTTP 响应数据分为几个部分?
HTTP 响应分为 3 部分:响应行、响应头、响应体
响应行:包含协议版本、状态码、状态描述(例如HTTP/1.1 200 OK)
响应头:服务器返回的各种描述信息(Content-Type、Content-Length 等)
响应体:真正返回给浏览器的数据(html、json、图片等)- 响应状态码的分类
1xx:信息提示,临时状态码(请求已接收,继续处理)
2xx:成功(请求正常处理完成,如 200)
3xx:重定向(需要客户端进一步操作,如 302)
4xx:客户端错误(请求有问题,比如 404 找不到资源、400 参数错误)
5xx:服务端错误(服务器内部出错,如 500 服务器异常)- 常用状态码
200 OK:成功
302 Found:临时重定向
400 Bad Request:请求参数错误
404 Not Found:资源不存在
500 Internal Server Error:服务器内部异常响应数据设置
HttpServletResponse是服务器封装好的响应对象,用来组装 HTTP 响应数据(响应行、响应头、响应体),传给 Controller 方法,我们不用直接拼接原始 HTTP 报文
HttpServletRequest:接收、读取浏览器发过来的请求
HttpServletResponse:设置、发送给浏览器的响应
HttpServletResponse 三大功能
设置响应行(状态码)
// 设置状态码,比如404、500 response.setStatus(404);设置响应头
// 设置响应头,比如Content-Type、缓存、下载头 response.setHeader("Content-Type","text/html;charset=utf-8");设置响应体(返回给浏览器的数据)
// 获取输出流,往浏览器写文字/HTML PrintWriter writer = response.getWriter(); writer.write("<h1>hello response</h1>");
HttpServletResponse
/** * 方式一:HttpServletResponse 设置响应数据(Servlet原生方式) */ @RequestMapping("/response") public void response(HttpServletResponse response)throws IOException { //1. 设置响应状态码 response.setStatus(401); //2. 设置响应头 response.setHeader("name","bit"); //3. 设置响应体 response.getWriter().write("<h1>hello response</h1>"); }
- 特点:
需要注入 response 对象、手动获取输出流、抛出 IO 异常;属于 Servlet 原生 API。代码逻辑
(1)response.setStatus(401)
设置响应行里的状态码 ,401= Unauthorized,代表未认证、没有登录
(2)response.setHeader("name", "bit")
设置自定义响应头,返回给浏览器;
浏览器 F12 开发者工具 → Network 里可以看到这个响应头name: itheima。
(3)response.getWriter().write("<h1>hello response</h1>")
获取字符输出流,往响应体 写内容,浏览器会解析这段 html,
页面展示加粗的hello response。
Spring 自带的 ResponseEntity(推荐版)
/** * 方式二:ResponseEntity - Spring中提供的方式 */ @RequestMapping("/response2") public ResponseEntity<String> response2(){ return ResponseEntity.status(401) // 响应状态码 .header("name","Java-web-ai") // 响应头 .body("<h1>hello response2</h1>"); // 响应体 }
- 代码逻辑
(1)ResponseEntity<String>返回值类型,泛型<String>代表响应体是字符串类型 。
(2).status(401)设置状态码:401 未授权(Unauthorized)
(3).header("name", "javaweb-ai")
自定义响应头,key=name,value=javaweb-ai,F12 网络面板可以看到
(4).body("<h1>hello response</h1>")响应体内容,浏览器会解析这段 HTML
总结
- HttpServletResponse(原生 Servlet 方式)
特点:
需要注入 response 对象、手动获取输出流、抛出 IO 异常;属于 Servlet 原生 API。- ResponseEntity(Spring 封装方式)
特点:链式调用、不用处理流、不用抛异常,Spring 项目更推荐,代码简洁。






























