【Java】Day4Web基础知识

创建springboot工程



pom.xml 文件


项目目录结构


spring入门程序




使用阿里云的spring脚手架


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 核心对比
  1. GET

    参数放在请求行(URL 后面)

    没有请求体

    浏览器对 URL 长度有限制,传输数据小

    参数直接暴露在地址栏,安全性差一点

  2. POST
    参数放在请求体
    理论上数据大小没有限制
    参数不在 URL 上,相对更安全
    需要请求头 Content-Type 来说明请求体格式

  3. 补充: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/13553 

    404

    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 项目更推荐,代码简洁。
相关推荐
灿飞屋1 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
NE_STOP2 小时前
Spring AI Alibaba - MCP入门
java
nice_lcj5202 小时前
【从零理解 Spring AI · 07】对话记忆:让模型记住上一句说了什么
java·spring ai·ai应用开发·chatmemory·对话记忆
SL_staff3 小时前
制造业交付崩盘?用跨部门节点协同计划打通销售、生产与质量链路
java·开源·产品
文丑颜不良啊4 小时前
LeetCode2261~2280题目解析
java·leetcode
SL_staff4 小时前
告别规则黑盒:JVS-Rules 在金融风控中的可视化决策编排实践
java·产品·全栈
逆回5 小时前
升级 Boot 4 后,我的 mock 全红了
spring boot
逃逸线LOF5 小时前
服务网关Gateway
java·运维·gateway
灿飞屋5 小时前
Kotlin与Java虚拟机四:函数
java·python·kotlin·安卓·android jetpack