代码编织梦想

JavaWeb学习总结(八)Servlet

一、Servlet简介

Servlet(Server Applet)是Java Servlet的简称,是运行在服务器上的一个小服务程序,也称为服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
  狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。它可以接收客户端发送过来的请求,并响应数据给客户端
  Servlet 是 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。

img

二、Servlet运行过程

在这里插入图片描述

三、手动实现Servlet程序

首先用IDEA创建一个动态WEB工程
接着
1、在src下编写一个类去实现 Servlet 接口
2、实现 service 方法,处理请求,并响应数据
3、到 web.xml 中去配置 servlet 程序的访问地址

Servlet 程序的示例代码:

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Hello Servlet 被访问了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

web.xml中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
    <servlet>
        <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
        <servlet-name>HelloServlet</servlet-name>
        <!--servlet-class 是 Servlet 程序的全类名-->
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
    <servlet-mapping>
        <!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--url-pattern 标签配置访问地址
        / 单独一个斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
        /hello 表示地址为:http://ip:port/工程路径/hello
        -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

运行Tomcat实例,并在地址栏输入:
在这里插入图片描述

在这里插入图片描述
常见的错误

  1. url-pattern 中配置的路径没有以斜杠打头
    在这里插入图片描述
  2. servlet-name 配置的类不存在
    在这里插入图片描述
  3. servlet-class 标签的全类名配置错误

url 地址到 Servlet 程序的访问过程:
在这里插入图片描述

四、Servlet映射路径问题

一般情况下我们都会指定一个URL , 一个URL对应一个请求。

Servlet访问URL使用*通配符映射:
  1. Servlet映射到任意路径:

*可以匹配任意的字符,所以此时可以用任意的URL去访问这个Servlet,如下图所示:

<servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

在这里插入图片描述

  1. Servlet映射到任意包含.do的路径:
<servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>*.do</url-pattern>
</servlet-mapping>

在这里插入图片描述

3.Servlet映射到多级目录的路径:

<servlet-mapping>
        <servlet-name>servlet</servlet-name>
        <url-pattern>/demo1/demo2</url-pattern>
</servlet-mapping>

在这里插入图片描述

五、Servlet从创建到销毁,各方法的执行

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("构造方法被执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init初始化方法被执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service方法被执行了");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法被执行了");
    }
}

运行Tomcat实例,并且在地址栏输入工程路径:/hello
在这里插入图片描述
多次刷新浏览器页面:
在这里插入图片描述
按下Tomcat的停止按键:
在这里插入图片描述
结论

  • 执行顺序
    1.执行 Servlet 构造器方法
    2.执行 init 初始化方法
    3.执行 service 方法
    4.执行 destroy 销毁方法
  • 执行次数
    第1、2步,是在第一次访问的时候创建 Servlet 程序会调用,只执行一次。
    第3步,每次访问都会调用。
    第4步,在 web 工程停止的时候调用。

六、GET 和 POST 请求的分发处理

由于GET和POST是两种不同的请求方式,因此我们需要对不同的请求方式做不同的处理

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class HelloServlet implements Servlet {
    public HelloServlet() {
        System.out.println("构造方法被执行了");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init初始化方法被执行了");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    //service 方法是专门用来处理请求和响应的
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        // ServletRequest类型转换为它的子接口HttpServletRequest(因为它有 getMethod()方法)
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        // getMethod() 获取请求的方式
        String method = httpServletRequest.getMethod();
        //判断请求是哪种方式,做不同处理
        if("GET".equals(method)){
            doGet();
        }else if("POST".equals(method)){
            doPost();
        }
    }
    public void doGet(){
        System.out.println("这是针对于Get请求的处理");
    }
    public void doPost(){
        System.out.println("这是针对于Post请求的处理");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法被执行了");
    }
}

七、GET与Post的区别

  1. form运行方式
    • 当form框里面的method为get时,执行doGet方法
    • 当form框里面的method为post时,执行doPost方法
  2. 传送的数据量
    • GET方式:数据量长度有限制,一般不超过2kb。因为是参数传递,且在地址栏中,故数据量有限制。
    • POST方式:适合大规模的数据传送。因为是以实体的方式传送的。
  3. 安全性
    • GET方式:安全性差。因为是直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息。所以安全性低。
      在这里插入图片描述
      提交输入的用户名和密码后,地址栏显示了用户名和密码的信息。在这里插入图片描述
    • POST方式:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的。
      在这里插入图片描述
  4. 在用户刷新时
    • GET方式:不会有任何提示。
    • POST方式:会弹出提示框,问用户是否重新提交。

在这里插入图片描述

因此,在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用POST方式。

八、Servlet的实现类

Servlet接口Sun公司定义了两个默认实现类,分别为:GenericServletHttpServlet

(一)GenericServlet

  • GenericServlet 是一个抽象类,实现了 Servlet 接口,并且对其中的 init() 和 destroy() 和 service() 提供了默认实现
  • 同时还实现了ServletConfig接口,ServletConfig接口中直接提供了getServletContext()**方法,所以当我们在实现Servlet时直接继承GenericServlet这个抽象类,就可以直接使用getServletContext方法来获取**ServletContext对象了。
  • 如果继承这个类的话,我们必须重写 service() 方法来对处理请求。

(二)HttpServlet

  • HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,使得使用更加简单方便。
  • HttpServlet指能够处理HTTP请求的Servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大,因此开发人员在编写Servlet 时,通常应继承HttpServlet,而避免直接去实现Servlet接口
  • HttpServlet在实现Servlet接口时,重写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为POST请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要重写doGet或doPost方法,而不要去重写service方法。
  • 一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序

(三)Servlet 类的继承体系

在这里插入图片描述

九、通过继承 HttpServlet 实现 Servlet 程序

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序
1、编写一个类去继承 HttpServlet 类
2、根据业务需要重写 doGet 或 doPost 方法
3、到 web.xml 中的配置 Servlet 程序的访问地址

Servlet 类的代码:

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost方法");
    }
}

web.xml里的配置:

<servlet> 
	<servlet-name>HelloServlet</servlet-name> 
	<servlet-class>com.fox.servlet.HelloServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
	<servlet-name>HelloServlet</servlet-name> 
	<url-pattern>/hello</url-pattern> 
</servlet-mapping>

十、IDEA快速创建Servlet程序

在这里插入图片描述
在这里插入图片描述

十一、ServletConfig 类

ServletConfig 类从类名上来看,就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象。

(一)ServletConfig 类的三大作用:

  1. 可以获取 Servlet 程序的别名 servlet-name 的值
  2. 获取初始化参数 init-param
  3. 获取 ServletContext 对象

(二)在init()方法中使用ServletConfig

web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
        <!--init-param 是初始化参数-->
        <init-param>
            <!--是参数名-->
            <param-name>username</param-name>
            <!--是参数值-->
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

Servlet 中的代码:

import javax.servlet.*;
import java.io.IOException;

public class HelloServlet implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

在这里插入图片描述
问:假设又有一个Servlet类,叫HelloServlet2,它能不能通过SevletConfig获取到HelloServlet的init-param呢?
答:不能,ServletConfig 是每个 Servlet 程序创建时才创建的,只能获取所属Servlet的信息。

(三)通过getServletConfig()方法使用ServletConfig

web.xml配置文件同上。
Servlet 中的代码:

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }
}

在这里插入图片描述
这个方式也能使用ServletConfig,但是如果此时重写有参的init()方法:

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("重写了有参init方法");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
        // 1、可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet 程序的别名是:" + servletConfig.getServletName());
        // 2、获取初始化参数 init-param
        System.out.println("初始化参数 username 的值是;" + servletConfig.getInitParameter("username"));
        System.out.println("初始化参数 password 的值是;" + servletConfig.getInitParameter("password"));
        // 3、获取 ServletContext 对象
        System.out.println(servletConfig.getServletContext());
    }
}

再重新运行会报错:
在这里插入图片描述
因为getServletConfig()是GenerciServlet类里的方法,这个方法会返回this.config
在这里插入图片描述
这个config即它自己的ServletConfig对象
在这里插入图片描述
我们查看GenerciServlet类的有参init()方法可以看到,这里将参数ServletConfig保存为this.config,而如果我们此时在自己的Servlet类中重写了该有参init()方法,父类GenerciServlet这个保存操作就不存在,this.config=null,因此会报空指针异常。
在这里插入图片描述
解决办法,如果要重写有参init()方法,记得一定要调用父类的有参init()方法

@Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        System.out.println("重写了有参init方法");
    }

十二、ServletContext 类

(一)什么是 ServletContext?

  1. ServletContext 是一个接口,它表示 Servlet 上下文对象
  2. 一个 web 工程,只有一个 ServletContext 对象实例
  3. ServletContext 对象是一个域对象
  4. ServletContext 是在 web 工程部署启动的时候创建(它代表当前web应用),在 web 工程停止的时候销毁

什么是域对象?
域对象,是可以像 Map 一样存取数据的对象,叫域对象。
这里的域指的是存取数据的操作范围(整个 web 工程)。

存数据取数据删除数据
Mapput()get()remove()
ServletContextsetAttribute()getAttribute()removeAttribute()

(二)ServletContext 类的四个作用

  1. 获取 web.xml 中配置的上下文参数 context-param
  2. 获取当前的工程路径,格式: /工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map 一样存取数据

案例1
web.xml 中的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--context-param 是上下文参数(它属于整个 web 工程)-->
    <context-param>
        <param-name>username</param-name>
        <param-value>context</param-value>
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>root</param-value>
    </context-param>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.fox.servlet.HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

ServletContext 演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //ServletConfig可以获取ServletContext对象
        ServletContext servletContext = getServletConfig().getServletContext();
        //1、获取 web.xml 中配置的上下文参数 context-param
        System.out.println("context-param的username的值是:"+servletContext.getInitParameter("username"));
        System.out.println("context-param的password的值是:"+servletContext.getInitParameter("password"));

        //2、获取当前的工程路径,格式: /工程路径
        System.out.println( "当前工程路径:" + servletContext.getContextPath() );

        // 3、获取工程部署后在服务器硬盘上的绝对路径
        // 一根斜杠 被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录
        System.out.println("工程部署的路径是:" + servletContext.getRealPath("/"));
        System.out.println("工程下web.xml的绝对路径是:" + servletContext.getRealPath("/WEB-INF/web.xml"));
    }
}

在这里插入图片描述在这里插入图片描述
案例2:ServletContext 像 Map 一样存取数据,实现多个Servlet之间数据共享
web.xml 中的配置:

在这里插入代码片

HelloServlet演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GenericServlet中的getServletContext()方法可以直接获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("存数据前,HelloServlet获取key的值:"+servletContext.getAttribute("key"));
        servletContext.setAttribute("key","value");
        System.out.println("存数据后,HelloServlet获取key的值:"+servletContext.getAttribute("key"));
    }
}

HelloServlet2演示代码:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GenericServlet中的getServletContext()方法可以直接获取ServletContext对象
        ServletContext servletContext = getServletContext();
        System.out.println("HelloServlet2获取key的值:"+servletContext.getAttribute("key"));
    }
}

先在地址栏输入http://localhost:8080/WebStudy/hello:
在这里插入图片描述
再输入http://localhost:8080/WebStudy/hello2:
在这里插入图片描述
因为ServletContext表示整个web工程的Servlet 上下文对象,因此HelloServlet2也能取到HelloServlet存放的ServletContext数据
在这里插入图片描述
案例3:通过servletContext对象读取网站配置文件

  1. 新建一个properties文件
    在这里插入图片描述
  2. 编写properties文件
driver=com.mysql.jdbc.Driver
username=root
password=123456
url=jdbc:mysql://localhost:3306/smbms
  1. 编写Servlet类
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class TestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //读取配置文件

        //1.获得配置文件的路径
        String realPath = this.getServletContext().getRealPath("/WEB-INF/classes/resources/database.properties");
        System.out.println("取得的路径为:"+realPath);

        Properties properties = new Properties();
        FileInputStream fis = new FileInputStream(realPath);

        properties.load(fis);//把文件流加载到配置文件的对象中;

        String driver = properties.getProperty("driver");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");

        //响应到网页
        response.getWriter().println(driver);
        response.getWriter().println(username);
        response.getWriter().println(password);
        response.getWriter().println(url);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
  1. 配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Demo01</servlet-name>
        <servlet-class>com.fox.servlet.TestServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>Demo01</servlet-name>
        <url-pattern>/q1</url-pattern>
    </servlet-mapping>
</web-app> 
  1. 访问查看
    在这里插入图片描述

十三、HTTP 协议

(一)什么是协议?

协议是指双方,或多方,相互约定好,大家都需要遵守的规则,叫协议。

(二)什么是 HTTP 协议?

所谓 HTTP 协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫 HTTP 协议。 HTTP 协议中的数据又叫报文。

(三)请求的 HTTP 协议格式

客户端给服务器发送数据叫请求。
请求又分为 GET 请求,和 POST 请求两种

1.GET 请求

  1. 请求行
    (1) 请求的方式 GET
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号 (HTTP/1.1 )
  2. 请求头
    key : value 组成不同的键值对,表示不同的含义。
    在这里插入图片描述

2.POST 请求

  1. 请求行
    (1) 请求的方式 POST
    (2) 请求的资源路径[+?+请求参数]
    (3) 请求的协议的版本号 (HTTP/1.1 )
  2. 请求头
    key : value 不同的请求头,有不同的含义
  3. 空行
  4. 请求体
    就是发送给服务器的数据
    在这里插入图片描述

3.常用请求头的说明

Accept: 表示客户端可以接收的数据类型
Accpet-Languege: 表示客户端可以接收的语言类型
User-Agent: 表示客户端浏览器的信息
Host: 表示请求时的服务器 ip 和端口号

4. 哪些是 GET 请求,哪些是 POST 请求

①GET 请求有哪些:

  • form 标签 method=get
  • a 标签
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车

② POST 请求有哪些:

  • form 标签 method=post

(四)响应的 HTTP 协议格式

  1. 响应行
    (1) 响应的协议和版本号
    (2) 响应状态码
    (3) 响应状态描述符
  2. 响应头
    key : value 不同的响应头,有其不同含义
  3. 空行
  4. 响应体
    就是回传给客户端的数据
    在这里插入图片描述

(五)常用的响应码说明

  • 200 表示请求成功
  • 302 表示请求重定向(后面讲)
  • 404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
  • 500 表示服务器已经收到请求,但是服务器内部错误(代码错误)

(六)MIME 类型说明

MIME 是 HTTP 协议中的数据类型。

MIME 的英文全称是"Multipurpose Internet Mail Extensions" ——多功能 Internet 邮件扩充服务。 MIME 类型的格式是“大类型/小类型”,并与某一种文件的扩展名相对应。

常见的 MIME 类型
在这里插入图片描述

(七)谷歌浏览器如何查看 HTTP 协议

按F12,找到Network
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/long3359/article/details/129677455

vertx入门学习(含代码)-爱代码爱编程

Vertx入门学习 一、Vertx是什么?二、Vertx基本概念三、Vertx能干什么?四、Vertx的技术体系五、快速体验:搭建一个简单的Vertx项目并输出Hello World六、单元测试总结 一、Ver

【git】sourcetree学习笔记-图谱理解【2023.03.17】-爱代码爱编程

本系列文章前言   之前一直用的TeamFoundation,近期要代码迁移到Gitee,组内使用SourceTree进行代码管理。故将近期的学习内容做个总结。就我个人来说,不管啥技术基本上都是现学现用,网上看教程也都是看

学习java——为什么java只有值传递-爱代码爱编程

目录 Java的求值策略 Java中的对象传递 值传递和共享对象传递冲突吗? 总结 参考资料 Java的求值策略         前面我们介绍过了传值调用、传引用调用以及传值调用的特例传共享对象调用,那么,Java中是采用的哪种求值策略呢?         很多人说Java中的基本数据类型是值传递的,这个基本没有什么可以讨论的,普遍都

layui框架学习(16:表单-下)-爱代码爱编程

  除了文本框,layui官网教程及示例中还介绍了下拉框、复选框、单选框等输入元素的样式及属性设置方式。   html5中采用select标签定义下拉选择框,同时内嵌option标签定义选择项,支持option标签中使用se

vue3学习笔记-爱代码爱编程

创建/运行项目 在IDEA新建一个vue项目 nodejs(运行环境) vue的开发/编译工具(vite)是基于nodejs平台的, 所以第一步先安装nodejs,下载地址: Node.js, 安装LST(长期维护)版本即可.  npm 安装完毕后命令行会增加一个包管理工具: npm, 包管理可以理解为通过他可以下载js插件, 后续我们开发用

2023年华为认证h12-821、h12-831考试指南(包括学习视频和题库)-爱代码爱编程

一、什么是HCIP-Datacom 英文名:HCIP-Datacom-Advanced Routing & Switching Technology 中文名:培训与认证具备数通领域路由交换高阶知识和技能水平的高级工程师 二、通过认证后可以做什么?      可以胜任中到大型企业网络工程师岗位,掌握中到大型网络的特点和通用技术,具备使用华为数

学习管理系统能为企业带来哪些好处呢?-爱代码爱编程

正如我们先前提到过的,对于公司来说,建立“学习型文化”可以带来许许多多的好处。然而,企业规模会越来越大,员工的培训学习需求并不会减少,这也会为企业的员工培训带来压力。学习管理系统(LMS)可以有效的解决这些问题。   学习管理系统,顾名思义,是一款供在线培训与培训信息管理的网络系统,企业培训管理人员可以在系统后台制作课件、设置学习项目、发布学习计划

【博学谷学习记录】超强总结,用心分享丨人工智能 自然语言处理 迁移学习部分笔记-爱代码爱编程

目录 FastText作用优势安装文本分类种类过程 训练词向量词向量迁移 迁移学习标准数据集预训练模型加载和使用预训练模型的步骤 FastText 作用 进行文本分类训练词向

2023年3月20日学习总结-爱代码爱编程

主要学习内容是: 一、安装基于 VSCode 的 esp32-idf 开发环境。 二、打开范例工程来测试开发环境和ESP32的开发板。 遇到的难点问题有: 1、遇到 命令"ESP-IDF": 配置 ESP-IDF 插件

人工智能学习07-爱代码爱编程

师兄说学目标检测之前先学分类 坏了,内容好多!学学学 感谢up主,好人一生平安 混淆矩阵 什么是混淆矩阵: 横坐标:每一列属于该类的所有验证样本。每一列所有元素对应真实类别。 纵坐标:网络的预测类别。每一行对应预

opengl学习 跟着官网教程学习(模板测试)_模板测试和深度测试顺序-爱代码爱编程

一,前言 这是对官网的一部分补充,看之前需要看一下官网的文章。 了解一下小小的知识点。 1,模板测试和深度测试的顺序 片段着色器------->模板测试-------->深度测试 2,什么叫模板缓冲? 就是记录了每一个像素点的模板值。(不理解也没关系,看看后面怎么用的就了解了) 如果熟悉RGBA的Alpha通道,可能会将模板缓冲理

学习笔记20230319-爱代码爱编程

目录 一、final 二、List和Set 三、HashMap扩容机制原理 四、ArrayList和LinkedList 有哪些区别 五、HashMap和HashTable区别 六、ConcurrentHashMap扩容机制原理 七、CopyOnWriteList的底层原理是怎样 八、StringBuffer、StringBuilder、S

java基础学习(5)-爱代码爱编程

Java基础学习 一 面向对象1.1 介绍对象1.2 设计对象并使用1.2.1定义类的补充注意事项 1.3 封装好处:1.3 private关键字1.4 this关键字1.5 构造方法 构造方法的

lin.security靶机学习_lin 靶机-爱代码爱编程

靶机地址:https://www.vulnhub.com/entry/linsecurity-1,244/ 靶机网络配置 先用用户名bob 密码secret登录 然后提权到root sudo awk 'BEGIN {s

【小猫爪】autosar学习笔记07-爱代码爱编程

【小猫爪】AUTOSAR学习笔记07-Communication Stack之PduR,IpduM模块 前言1 PduR简介2 PduR功能介绍2.1 I-PDU的传输2.2 路由路径2.3 Zero Cost

【小猫爪】autosar学习笔记09-爱代码爱编程

【小猫爪】AUTOSAR学习笔记09-Communication Stack之Dcm模块 前言1 Dcm简介2 CanTp简介3 DoIp简介END 前言   前面对Communication St