Servlet生命周期

package com.zs.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*新建一个类实现Servlet接口并实现接口中的方法,可以看到有五个方法,我们学习Servlet生命周期
* 只需要看init(),service(),destroy()方法*/
@WebServlet("/aaa")
/*这里的@WebServlet("/虚拟路径"),通过这样的写法,就可以直接设置虚拟路径,不需要配置文件了,比较方便*/
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
//        被创建时执行该方法,只执行一次,用来创建servelt
        System.out.println("我被创建了");
    }

    @Override
    public ServletConfig getServletConfig() {
//        这个方法我们不关心
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//        执行servlet的内容
        System.out.println("执行一次servelt服务");
    }

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

    @Override
    public void destroy() {
//      执行关闭销毁方法,
        System.out.println("我被销毁了");
    }
//    从上面我们可以看出,从init()被创建到destroy()被销毁,这就是servlet的生命周期
}
/*代码编写完毕,我们运行tomcat,然后再浏览器中输入虚拟路径localhost:8080/aaa,就会得到运行结果如下:
* 我被创建了
* 执行一次servelt服务
* 然后每刷新一次浏览器,就会多执行一次service方法,但是init方法只会执行一次,也就是只创建了一次servlet,多次刷新后结果如下:
* 我被创建了
* 执行一次servelt服务
* 执行一次servelt服务
* 执行一次servelt服务
* 当我们关闭serlet服务器时,就会执行destory方法销毁这个servlet,,关闭服务器时,结果如下:
* ...这里的日志文件就用...来替代了
* 10-Apr-2019 19:15:19.181 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-80"]
* 10-Apr-2019 19:15:19.591 信息 [main] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["ajp-nio-8009"]
* 我被销毁了
* 10-Apr-2019 19:15:19.971 信息 [main] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
* 10-Apr-2019 19:15:20.011 信息 [main] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-80"]
* ...
* 从上面可以知道,一个servelt的生命周期就是从init创建一直到destory销毁,中间的另外两个方法
* getServeltConfig,getServletInfo根据名字我们可以看出是获取Servlet的配置信息和Servlet信息的,我们现在不需要了解
* /

 接着我们学习一下Servelt的结构体系:

之前我们已经 说过了,Servelt是一个接口,既然是接口就会有实现类,它有两个子类GenericServelt类和HttpServelt类,这两个类都是抽象类

GenericServelt  抽象类,需要重写service方法,

package com.zs.servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

public class GenericServletDemo extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        /*从方法名我们可以看出,GenericServlet抽象类方法实现了Servlet接口的方法,并对Servelt接口的四个方法进行了重写,留下抽象方法service给我们实现,简化了代码*/
    }
}

HttpServlet     抽象类,对Http进行了封装,进行简化操作,doGet(),dopost()

package com.zs.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*再idea中提供了一个快捷方式,直接在新建中找到servelt,然后输入类名就会自动生成下面代码*/
@WebServlet("/aaa")
public class ServletHttpDemo extends HttpServlet { 
    /*我们可以看出该类继承的HttpServelt抽象类中有两个抽象方法,分别是dopost,doget,
    再之前学习Html时,我们学习过form表单有两种提交方式,分别是post和get,这两种提交方式就对应着两种方法,
    当提交方式为post时,就执行dopost方法,当提交方式为get时,就调用doget方法*/
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

    }
}

 

posted @ 2019-04-10 19:23  Zs夏至  阅读(134)  评论(0编辑  收藏  举报