阐述Servlet的生命周期

在讲述Server周期l之前我们先知道什么是servlet

一:什么是Servlet?

侠义的Servlet是指java实现的一个接口,广义的servlet是指实现这个接口的类,一般情况下,人们将Servlet运行与java应用服务器中,从原理上讲Servlet可以响应任何类型的请求但是绝大对数Servlet只能用来扩展基于HTTP协议的web服务器,其简称java servlet,称为小服务器,或者服务连接器,是用Java编写的的服务器程序具有独立与平台的特性,主要的功能在于交互式的浏览和生成数据,生成动态的web内容.

二:为什么会有servlet?

在web开发阶段,编写一个HTTP服务器其实非常简单,只要先编写一个基于TCP协议的服务,然后在TCP连接中获取HTTP请求,发送HTTP想响应即可、但是编写一个完善的HTTP服务器,在JAVASE平台上需要很多步骤的

  • 识别正确和错误的HTTP请求;
  • 识别正确和错误的HTTP头;
  • 复用TCP连接;
  • 复用线程;
  • IO异常处理;

这些基础工作需要耗费大量的时间,并且经过长期测试才能稳定运行。如果我们只需要输出一个简单的HTML页面,就不得不编写上千行底层代码,那就根本无法做到高效而可靠地开发。

这时候JAVAEE平台提供的Servlet API,来处理TCP的连接解析HTTP协议的工作全都扔给了web服务器,web服务器实现底层的功能

三: 常见的servlet服务器有哪些?

  • Tomcat:由Apache开发的开源免费服务器;
  • Jetty:由Eclipse开发的开源免费服务器;
  • GlassFish:一个开源的全功能JavaEE服务器。

我们今天以Tomcat服务器来说

四:Servlet生命周期

顾名思义,就是servlet服务器从创建到销毁的过程

1:实例化 2:初始化 3:服务 4:销毁

1实例化

就是在第一次启动服务器时,会调用的他的我i参构造方法,创建Servlet实例的过程

public HomeServlet() {
		System.out.println("1.HomeServlet实例被创建");
	}

2初始化

通过实例,调用init()的初始方法,执行初始化的逻辑

@Override
	public void init() throws ServletException {
		System.out.println("2.HomeServlet实例初始化");
	}

3服务

通过实例方法,调用service()方法,如果子类没有重写该方法,则会默认的调用父类的该方法,并调用响应的该方法doxxx()方法,返回值是一个错误405

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

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
 
        String method = req.getMethod();
 
        if (method.equals(METHOD_GET)) {
            long lastModified = getLastModified(req);
            if (lastModified == -1) {
                // servlet doesn't support if-modified-since, no reason
                // to go through further expensive logic
                doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
                } catch (IllegalArgumentException iae) {
                    // Invalid date header - proceed as if none was set
                    ifModifiedSince = -1;
                }
                if (ifModifiedSince < (lastModified / 1000 * 1000)) {
                    // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                }
            }
 
        } else if (method.equals(METHOD_HEAD)) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
 
        } else if (method.equals(METHOD_POST)) {
            doPost(req, resp);
 
        } else if (method.equals(METHOD_PUT)) {
            doPut(req, resp);
 
        } else if (method.equals(METHOD_DELETE)) {
            doDelete(req, resp);
 
        } else if (method.equals(METHOD_OPTIONS)) {
            doOptions(req,resp);
 
        } else if (method.equals(METHOD_TRACE)) {
            doTrace(req,resp);
 
        } else {
            //
            // Note that this means NO servlet supports whatever
            // method was requested, anywhere on this server.
            //
 
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[1];
            errArgs[0] = method;
            errMsg = MessageFormat.format(errMsg, errArgs);
 
            resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
        }
    }

如果子类重写了该方法则会有先调用子类的方法

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("请求到了!");
		String method = req.getMethod();
		System.out.println("请求方式:" + method);
		
		System.out.println(req.getRemoteHost());
	}

4销毁

当服务器重启或者关闭的时候,实例方法就会调用destroy()方法进行销毁

@Override
	public void destroy() {
		System.out.println("4.HomeServlet实例被销毁");
	}

五:生命框架的执行的流程图

 

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值