• 【Servlet】Servlet学习之基础篇(HTTP)


    前言:本系列文章很多地方会以小白的角度来思考很多看似“简单”的问题。适用于对Servlet 有简单了解的人。本文是自己学习的过程,学习的体验,也是在本人的能力范围内,给大家尽量带来由浅入深的文章

    本文章讲了什么

    1. 在你了解了基础Servlet运行原理之上,了解HTTP和Servlet的爱恨情仇
    2. HTTP的基础格式,以及和Servlet、服务器相关的HTTP知识

    为了不打扰您的时间,本文不以介绍HTTP是什么为主要目的,若是您要从0-1学习HTTP,本文不适合您。

    1. 需要一点点的HTML知识
    2. 需要一点点HTTP知识

    HTTP有什么作用

    即使没有学过Servlet,您也知道HTTP是干啥的,数据传输的呗,OK,知道这点足够了。
    稍微修饰一下语句:HTTP是web上客户和服务器进行通信的一个协议。
    注:平时说HTTP,可能指的是这个协议本身,也可能指的是携带数据的HTTP报文(您认为成一个带有数据的信封也可以)

    在这里插入图片描述

    发送响应

    响应就是:从客户端发送的HTTP请求,在后台有Servlet接口,容器在接收到用户的HTTP请求之后,把这个请求封装成HttpServletRequest,然后容器在自己管理的Servlet里面找到对应的Servlet处理。

    传输网页信息HTML“字符串”

    不知道你在浏览界面的时候,有没有思考,你的网页是谁管理的,是国家吗?还是某个机构?亦或者是网站管理员,我相信你应该知道是管理员,那么这个HTML是怎么到你的电脑的呢?
    【HTML】:HTML是啥,其实也是一段字符,一个HTML网页,其实你可以看成一个字符串,也是一段信息,这个信息是可以被传递的,后台把HTML响应作为返回数据给用户浏览器。
    【HTTP】:用户要啥,HTTP询问啥,能找到我都给你,怎么处理数据是浏览器的事情喽,怎么显示也是。

    网址URL

    要想介绍HTTP,URL不介绍,真的很难进行下去欸。
    当我们访问一个服务器下的网页,浏览器会发送请求,这个请求包括了啥呢,主要说明一些属性,比如说User-Agent,请求方法,数据大小,域名URL
    在这里插入图片描述一个请求,请求的最重要的参数我觉得是URL了,下面看看URL包括了啥

    流程解析:
    当输入一个网址,会调用 get请求发送到服务器,服务器反应后找到页面代码,包装到响应体中,然后返回给用户。
    在这里插入图片描述没有URL,你不知道去哪请求,你不知道对方使用的协议–无法交流,你不知道对面端口(只知道几号楼,不了解第几层),你不知道请求的页面(你找对位置了,却不知道你要杀)。

    POST和Get

    谈及HTTP,谈及获取数据,POST和Get是逃不掉的。
    这两个都是请求方法,也就是请求的类型。
    对于POST和Get,都能传输数据,但是是有一些区别的。
    主要的区别

    1. POST有请求体,存放参数更安全;Get没有体
    2. POST数据长度没有限制,Get参数长度有限制

    POST

    一般用户传输一些数据较长的数据,或者是携带一些重要的,需要隐藏的参数数据。

    例如如下:第二个框,里面写了两个参数,这个位置是POST请求的体,是用来传输数据的,POST和Get的区别之一就是参数是放在体中的,这个比Get要安全很多,Get的参数是在URL中以键值对的形式出现的,并且Get是没体的传输的参数是以Get显式跟在URL之后的。
    在这里插入图片描述简要说明上面的图片:
    分为两个部分,第二个红框及之前都是请求的报文,之后是HTTP响应报文

    1. 【请求行】以POST方式,发送到目标地址
      在这里插入图片描述
    2. 【请求字段】携带了很多信息,包括内容格式,长度…在这里插入图片描述这里着重强调一下content-type:常用的两种一种是表单form,一种是json。
      form是以键值对的形式传递参数的,例如你看看下面的图片。
      如果要获取这个vvalue就需要 request.getParamter(key);来获取,对于POST和Get请求都是一样的

    要注意的是,如果是POST请求,是可能有请求体的。如果要获取请求体内容
    request.getReader();操作字符数据
    request.getInputStream();获取字节输入流,可以操作所有类型数据
    4. 【请求体】可以放传输的数据,参数等
    在这里插入图片描述在这里插入图片描述

    Get

    举个真实的例子,就是搜索,可以看见,使用的是Get,其实一般传递不是很重要的参数来获取数据,用Get是很多的,比如说获取网页,获取资源。
    在这里插入图片描述从这里,很容易可能到Get请求的URL中携带了很多参数。
    在这里插入图片描述

    POST和Get的幂等性探究及使用场景推荐

    幂等性:这里指的是作用于对于资源产生的结果而非资源本身,即例如get如果返回的是不同的内容,但是不影响资源,那么就是幂等的。举个例子,使用get获取时间,获取到的时间不同,但是不影响其对后台资源。
    Get方法

    Get /tickets # 获取ticket列表
    这里的get方法用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。
    例如Get /time # 获取当前时间
    这里每次调用会返回不同的内容,但是对资源本身不产生影响,所以是幂等的

    Post方法
    Post /tickets # 新建一个ticket
    这是一个非幂等的方法,因为调用多次,都会产生新的资源,它对资源本身能产生影响,因此不满足幂等性。

    【使用场景探究】
    GET通过URL提交数据,数据在URL中。这方法是幂等的,所以他适合查询类的
    POST放在响应体中。这方法是非幂等的,所以代表的是新增操作
    当如果数据过长,会考虑讲GET使用POST来代替。

    POST和Get请求发送到后台有啥区别

    其实区别不大,都会被封装成一个HttpServletRequest,然后交给Servlet,下面是Servlet的生命周期,也是其运行的原理
    Servlet在服务器运行的时候会

    Servlet处理完是怎么返回数据的

    上文说到了容器,不知道你对网络编程有没有了解,例如通过TCP可以建立两个主机之间的联系,HTTP是基于TCP。在用户传递HTTP请求之前,会建立一个连接,使得两者之间可以通过这个通道来传输信息。
    当用户处理好响应和数据之后,就可以通过response.getWriter来获取输入流了。
    代码示例:

        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html");
    
            // Hello
            PrintWriter out = response.getWriter();
            out.println("");
            out.println("

    " + message + "

    "
    ); out.println(""); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    总结:

    1. PrintWriter:把文本数据打印到一个字符流。
      PrintWriter writer = response.getWriter();
      writer.println(“sfadfa”);
    2. OutputSream:输出字节输入,可以是任何内容,但是注意要setContentType
      ServletOutputSream out = response.getOutputStream()
      out.write(bytesArray)

    响应返回其实就是在容器建立的socket通道之上,通过写入输入流来生成响应并返回。

    总结:

    1. HTTP运行在TCP/Ip之上
    2. HTTP使用一种请求/响应模型,客户发送一个HTTP请求,然后web服务器返回一个HTTP响应,再由浏览器 (根据响应的类型)确定如何处理
    3. 如果返回一个HTML界面,会把HTML内容放入响应中
    4. GET请求把表单参数追加到URL后
    5. POST请求将表单数据包括在请求的体重
    6. URL代表统一资源定位(Uniform Resource Locator),Web每个资源都有自己的唯一地址,都采用这种URL格式。
  • 相关阅读:
    Tair 对 Redis 引擎架构之争的看法
    stack使用+模拟实现
    HTTP请求的几种方式
    Linux性能优化
    使用LangChain和Llama-Index实现多重检索RAG
    OpenHarmony3.0如何轻松连接华为云IoT设备接入平台?
    算法压测自己压测
    Grpc Quick Start 之协议分析
    DAMA数据管理大纲图
    leetcode:63. 不同路径II
  • 原文地址:https://blog.csdn.net/m0_52410356/article/details/126693853