• HTTP


    一 HTTP简介

    Hyper Text Transfer Protocol 超文本传输协议

    定义了客户端和服务器通信时 发送数据的格式

    二 HTTP特点

    1. 基于TCP/IP的高级协议

    2. 默认端口号80

    3. 基于请求/响应模型 一次请求对应一次响应

    4. 无状态的 每次请求之间相互独立 不能交互数据

    三 请求消息数据格式

    原始数据

    POST /login.html HTTP/1.1
    Host: localhost
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Referer: http://localhost/login.html
    Connection: keep-alive
    Upgrade-Insecure-Requests: 1
    
    username=zhangsan

    1. 请求行

    GET /login.html HTTP/1.1 -> 请求方式 请求url 请求协议/版本

    HTTP协议有7种请求方式 常用的有2种

      GET

        a. 请求参数在请求行中 拼接在url后面

        b. 请求的url长度有限制

        c. 不太安全

      POST

        a. 请求参数在请求体中

        b. 请求的url长度没有限制

        c. 相对安全

    2. 请求头

    客户端告诉服务器一些信息 固定格式(请求头名称: 请求头值)

    常见的请求头

      a. User-Agent 当前使用的版本信息

      b. Referer 当前请求从哪里来

    3. 请求空行

    空行 用于分割POST请求的请求头和请求体

    4. 请求体(正文)

    封装POST请求的请求参数

    四 Request|Response执行原理

    1. 服务器会根据请求url中的资源路径 创建对应的servlet对象

    2. 服务器会创建request对象和response对象 request对象中封装请求消息数据

    3. 服务器将request对象和response对象 传递给service() 并且调用service()

    4. 程序员可以通过request对象获取请求消息数据 通过response对象设置响应消息数据

    5. 服务器在给客户端做出响应之前 会从response对象中拿程序员设置的响应消息数据

    五 Request功能

    1. 获取请求消息数据

    a. 获取请求行数据

    请求行原始数据

    GET /xxx/demo1?name=zhangsan HTTP/1.1

      获取请求方式 String getMethod() -> GET

      获取虚拟目录 String getContextPath() -> /xxx

      获取servlet路径 String getServletPath() -> /demo1

      获取get方式请求参数 String getQueryString() -> name=zhangsan

      获取请求uri String getRequestURI() -> /xxx/demo1

      获取请求url StringBuffer getRequestURL() -> http://localhost/xxx/demo1

      获取协议及版本 String getProtocol() -> HTTP/1.1

      获取客户端IP地址 String getRemoteAddr() -> 0:0:0:0:0:0:0:1

    b. 获取请求头数据

      获取所有请求头名称 Enumeration<String> getHeaderNames()

      通过请求头名称获取请求头值 String getHeader(String name)

    c. 获取请求体数据

    请求体只有post方式请求才有 封装了请求参数

      1> 获取流对象

        BufferedReader getReader() -> 获取字符输入流 只能操作字符类型数据

        ServletInputStream getInputStream() -> 获取字节输入流 可以操作所有类型数据

      2> 从流对象中拿数据

    2. 其他功能

    a. 获取请求参数通用方式

    get和post都可以使用下列方法来获取请求参数

      通过参数名称获取参数值 String getParameter(String name)

      通过参数名称获取参数值的数组 String[] getParameterValues(String name)

      获取所有参数名称 Enumeration<String> getParameterNames()

      获取所有参数名称和参数值的数组 Map<String, String[]> getParameterMap()

    b. 请求转发

    一种在服务器内部的资源跳转方式

      特点

        1> 浏览器地址栏路径不发生变化

        2> 只能转发到当前服务器内部资源中

        3> 转发是一次请求

      步骤

        ServletRequest#getRequestDispatcher(String path).forward(ServletRequest request, ServletResponse response)

    c. 共享数据

    域对象: 一个有作用范围的对象 可以在范围内共享数据

    Request域: 代表一次请求的范围 一般用于请求转发的多个资源中共享数据

      存储数据 void setAttribute(String name, Object obj)

      通过键获取值 Object getAttribute(String name)

      通过键移除值 void removeAttribute(String name)

    d. 获取ServletContext

      ServletContext getServletContext()

    六 ServletContext

    代表整个web应用 可以和程序的容器(服务器)来通信

    1. 获取

      a. 通过ServletRequest获取 ServletRequest#getServletContext()

      b. 通过GenericServlet获取 GenericServlet#getServletContext()

    2. 功能

    a. 获取MIME类型

    MIME类型: 在互联网通信过程中定义的一种文件数据类型 固定格式(大类型/小类型) 比如text/html image/jpeg

    获取: String getMimeType(String file)

    b. 共享数据

    域对象: 一个有作用范围的对象 可以在范围内共享数据

    ServletContext域: 代表整个web应用

      存储数据 void setAttribute(String name, Object obj)

      通过键获取值 Object getAttribute(String name)

      通过键移除值 void removeAttribute(String name)

    c. 获取文件在服务器上的真实路径

      ServletContext#getRealPath("/b.txt") -> web目录下资源访问

      ServletContext#getRealPath("/WEB-INF/c.txt") -> WEB-INF目录下资源访问

      ServletContext#getRealPath("/WEB-INF/classes/a.txt") -> src目录下资源访问

    七 响应消息数据格式

    原始数据

    HTTP/1.1 200 OK
    Content-Type: text/html;charset=UTF-8
    Content-Length: 101
    Date: Wed, 06 Jun 2018 07:08:42 GMT
        
    <html>
        <head>
            <title>$Title$</title>
        </head>
        <body>
            hello response
        </body>
    </html>

    1. 响应行

    HTTP/1.1 200 OK -> 响应协议/版本 响应状态码 响应状态码描述

    响应状态码: 服务器告诉客户端本次请求和响应的一个状态 状态码都是3位数字

      1xx 服务器接收客户端消息 但没有接收完成 等待一段时间后 发送1xx状态码

      2xx 成功 比如200

      3xx 重定向 比如重定向302 访问缓存304

      4xx 客户端错误 比如请求路径没有对应的资源404 请求方式没有对应的doXxx方法405

      5xx 服务器端错误 比如服务器内部出现异常500

    2. 响应头

    服务器告诉客户端一些信息 固定格式(响应头名称: 响应头值)

    常见的响应头

      a. Content-Type 服务器告诉客户端本次响应体数据格式以及编码格式

      b. Content-Disposition 服务器告诉客户端以什么格式打开响应体数据

        in-line 默认值 在当前页面内打开

        attachment;filename=xxx 以附件形式打开响应体(文件下载)

    3. 响应空行

    空行 用于分割响应头和响应体

    4. 响应体

    传输的数据

    八 Response功能

    1. 设置响应消息数据

    a. 设置响应行数据

      设置状态码 void setStatus(int code)

    b. 设置响应头数据

      设置响应头 void setHeader(String name, String value)

    c. 设置响应体数据

      1> 获取流对象

        PrintWriter getWriter() -> 获取字符输出流 只能操作字符类型数据

        ServletOutputStream getOutputStream() -> 获取字节输出流 可以操作所有类型数据

      2> 使用输出流 将数据输出到客户端

    2. 其他功能

    a. 重定向

    资源跳转方式

      特点

        1> 浏览器地址栏路径发生变化

        2> 可以访问其他服务器资源

        3> 重定向是两次请求

      步骤

        HttpServletResponse#sendRedirect(String path)

    九 中文乱码

    1. 请求参数

      get -> tomcat8已经将乱码问题解决了

      post -> 需要在获取参数之前 设置request的编码 ServletRequest#setCharacterEncoding("utf-8")

    2. 响应数据

      需要在获取流之前 设置response的编码 ServletResponse#setContentType("text/html;charset=utf-8")

  • 相关阅读:
    自定义jdbc框架
    sql 批处理、获取自增长、事务、大文本处理
    数据库设计
    数据约束
    mysql操作之二
    mysql基本操作
    38. 外观数列
    合并两个有序链表
    有效的括号
    实现strStr
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/13230285.html
Copyright © 2020-2023  润新知