java
主页 > 软件编程 > java >

Java中Servlet的生命周期介绍

2022-08-22 | 佚名 | 点击:

Web基础和HTTP协议

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

                       ┌─────────┐

┌─────────┐            │?????????│

│O ???????│            ├─────────┤

├─────────┤            │?????????│

│         │            ├─────────┤

│         │            │?????????│

└─────────┘            └─────────┘

     │      request 1       │

     │─────────────────────>│

     │      request 2       │

     │─────────────────────>│

     │      response 1      │

     │<─────────────────────│

     │      request 3       │

     │─────────────────────>│

     │      response 3      │

     │<─────────────────────│

     │      response 2      │

     │<─────────────────────│

     ▼                      ▼

我们注意到HTTP协议是一个请求-响应协议,它总是发送一个请求,然后接收一个响应。能不能一次性发送多个请求,然后再接收多个响应呢?HTTP 2.0可以支持浏览器同时发出多个请求,但每个请求需要唯一标识,服务器可以不按请求的顺序返回多个响应,由浏览器自己把收到的响应和请求对应起来。可见,HTTP 2.0进一步提高了传输效率,因为浏览器发出一个请求后,不必等待响应,就可以继续发下一个请求。

HTTP 3.0为了进一步提高速度,将抛弃TCP协议,改为使用无需创建连接的UDP协议,目前HTTP 3.0仍然处于实验推广阶段。

什么是Servlet

在JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。为了实现这一目的,JavaEE提供了Servlet API,我们使用Servlet API编写自己的Servlet来处理HTTP请求,Web服务器实现Servlet API接口,

实现底层功能.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do

@WebServlet(urlPatterns = "/hello.do")

public class HelloServlet extends HttpServlet {

    protected void doGet(HttpServletRequest req, HttpServletResponse resp)

            throws ServletException, IOException {

        // 设置响应类型:

  

        resp.setContentType("text/html");

        // 获取输出流:

  

        PrintWriter pw = resp.getWriter();

        // 写入响应:

  

        pw.write("<h1>Hello, world!</h1>");

        // 最后不要忘记flush强制输出:

  

        pw.flush();

    }

}

一个Servlet总是继承自HttpServlet,然后覆写doGet()或doPost()方法。注意到doGet()方法传入了HttpServletRequest和HttpServletResponse两个对象,分别代表HTTP请求和响应。我们使用Servlet API时,并不直接与底层TCP交互,也不需要解析HTTP协议,因为HttpServletRequest和HttpServletResponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取PrintWriter,写入响应即可。

而这样的一个项目最终会打包成一个*.war文件,运行这个文件,需要使用支持ServletAPI的Web容器(Web服务器)。

因此,我们首先要找一个支持Servlet API的Web服务器。

常用的服务器有:

Servlet的生命周期

在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX()方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。

如果子类重写doXXX()方法,则调用子类重写后的doXXX()方法;

如果子类没有重写doXXX()方法,则调用父类的doXXX()方法,在父类的方法实现中,返回一个405状态码的错误页面。

405状态码:代表请求的方式服务器不提供支持。

 4.销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()方法。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.my.hyz.web.servlet;

  

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

//@WebServlet("/home.do")

public class HomeServlet extends HttpServlet {

 

    public HomeServlet() {

        System.out.println("实例化");

    }

    @Override

    public void init() throws ServletException {

        System.out.println("初始化");

        //super.init();

    }

 

    @Override

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("调用Service实例");

    }

 

    @Override

    public void destroy() {

        System.out.println("销毁咯!!!!");

    }

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // TODO Auto-generated method stub

        System.out.println("哎呦get到了"+this.hashCode());

    }

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("哎呦post到了");

    }

}

原文链接:https://blog.csdn.net/m0_66605858/article/details/126455259
相关文章
最新更新