servlet的生命周期和执行流程

  1. servlet

servlet没有main方法,它不能够独立运行,需要的是容器的支持,一般我们都是用tomcat作为servlet的运行容器,servlet可以动态的生成html页面。
在这里插入图片描述
如图所示,在这个B/S模式下,用户输入网址访问,然后浏览器解析成http请求发送到服务器端,服务器端会有一个web服务器程序进行接收请求,然后把请求交给服务器程序去做,服务器程序会生成一个动态的html然后响应给浏览器,那么这个wen服务器程序就相当于tomcat容器,servlet就相当于服务器程序。

  1. servlet的执行流程

在这里插入图片描述
1,我们首先输入访问路径
2,进入web.xml文件中,根据输入的路径找到servlet映射
3,根据映射找到servlet-name
4,根据servlet-name找到servlet-class,就是我们自己写的HelloServlet

3. servlet的生命周期
1,当启动了tomcat之后但是没有输入路径进行访问的时候,这个时候web程序会把这个servlet进行装载,此时只是解析这个web.xml,并没有去创建这个servlet。
2,根据路径访问的时候,进行创建servlet,这个创建只是单纯的new一个对象,会默认的执行构造函数。
3,会执行init()初始化方法,对我们的servlet进行初始化,同时也创建了servletConfig,里面存放了一些初始化信息(服务器只会创建一次servlet对象,所以servletConfig也只有一个),init()方法是在GenericServlet.class中实现的。GenericServlet.class实现了servlet接口。servlet的servletConfig也是在GenericServlet.class中实现的,包括回去初始化参数和servlet上下文等等。
注意
在GenericServlet中执行public void init(ServletConfig config)方法的时候,又调用了自己无惨无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }

4,调用service方法,service方法在HttpServlet类中,直接调用并且将HttpServletRequest, HttpServletResponse这两个参数传入,service中进行判断Http请求是哪一种,如果是get就在service中调用doget方法,doget和doPost会被我们重写,如果不重写doGet或者doPost的话,我们直接重写service方法的话就不需要对doGet和doPost进行重写,service方法本来的作用是用来转向的,但是如果重写之后就是用来处理业务逻辑的,不管传回来的请求是哪一种都直接在service下执行。如下是service方法的源代码,这里是jdk1.8.

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }

5,当服务器关闭或者重启的时候会调用destroy方法,这是会自动销毁。

我们来看一下HelloServlet,当浏览器输入url执行之后

public class HelloServlet extends HttpServlet {
    public HelloServlet() {
        System.out.println("servlet HttpServlet()");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("servlet init()");
    }

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

    @Override
    public void destroy() {
        System.out.println("servlet destroy()");
    }
}

结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值