介绍

Servlet(Server Applet),全称Java Servlet,未有中文译文。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

其实我们可以将servlet想简单一点,不用考虑那么多。
它就是用Java语言编写的一套接口,介于浏览器(HTTP客户端)和数据库(HTTP服务器)之间(实际存在服务器上),用于处理HTTP请求。
代码编写好之后,还不能直接使用,需要部署到一个servlet容器(比如tomcat)。由这个容器接收请求,并分发给对应的servlet去处理,最后再由容器响应。

生命周期

servlet部署在容器中,他的生命周期也是由容器管理的。需要注意的是容器启动的时候,servlet不一定被加载,servlet只在收到请求的时候才会被加载和实例化。而这之后,如果没有特殊情况(比如容器内存回收),那么servlet实例会直到服务器关闭才被销毁。

servlet可以由 javax.servletjavax.servlet.http 包创建,它里面提供了五个方法:

  1. init(ServletConfig)
  2. getServletConfig()
  3. service(ServletRequest,ServletResponse)
  4. getServletInfo()
  5. destroy()

我们重点关注 1、3、5 三个方法。
init()是初始化方法,只在servlet第一次接受请求时执行一次,与之相似的是destroy()方法,只在servlet销毁时执行才执行一次,这两个方法在一个servlet实例中都只执行一次。

service()方法就是处理HTTP请求的方法,每次请求的时候都会调用这个方法,这个方法可以被执行多次。

创建方式

这里讲解三种创建servlet的方式

  • 第一种:实现Servlet接口
public class ServletDemo1 implements Servlet {

    //public ServletDemo1(){}

     //当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    public void init(ServletConfig arg0) throws ServletException {
                System.out.println("=======init=========");
        }

    //对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("hehe");

    }

    //当Servlet被销毁时执行该方法
    public void destroy() {
        System.out.println("******destroy**********");
    }

    //当停止tomcat时销毁的servlet。
    public ServletConfig getServletConfig() {

        return null;
    }

    public String getServletInfo() {

        return null;
    }
}
复制代码
  • 第二种:继承GenericServlet 类

这种方法比较少用

public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("heihei");

    }
}
复制代码
  • 第三种:继承HttpServlet 类

最常用的方法

public class ServletDemo3 extends HttpServlet {

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

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

}
复制代码

关于HttpServlet、GenericServlet 和 Servlet 的关系是这样的:

GenericServlet 是 Servlet 的一个子类抽象类,对其中的 init() 和 destroy() 提供了默认实现,可以直接调用 ServletConfig 中的方法。继承这个类必须重写service()方法。

HttpServlet 也是一个抽象类,它进一步继承并封装了 GenericServlet,由于这个类还扩展了HTTP的内容,因此还需要传入HttpServletRequest 和 HttpServletResponse两个参数。

这里需要了解的是,JSP也是HttpServlet的扩展,只不过是使用了HTML的书写格式,在其中加入Java代码。也就是说JSP也是一个servlet。