Tomcat:servlet与servlet容器

前言

        在介绍Tomcat之前,我们首先需要了解它的作用,简单的说,tomcat就是一个servlet容器。因此,本文首先从Web 应用程序开始讲起,逐步介绍servlet。

        Web即表示网页的意思,它用于表示 Internet 主机上供外界访问的资源。

        Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。

        Internet 上供外界访问的 Web 资源分为主要分为静态资源与动态资源:

  • 静态 web 资源:指 web 页面中供人们浏览的数据始终是不变。常见静态资源文件:html、css、各种图片类型(jpg、png)
  • 动态 web 资源:指 web 页面中供人们浏览的数据是由程序产生的,不同时间点访问 web 页面看到的内容各不相同。常见动态资源技术:JSP/Servlet、ASP、PHP

        常用的web服务器:

  • apache http Server
  • nginx
  • IIS

        不过以上服务器只能处理静态的资源请求。网页要提前写好,不能动态生成。

        早期在servelet出现之前,使用CGI(Common GateWay Interface-通用网关接口)程序来扩展。CGI程序开发复杂,移植性差,很少用了。

目录

前言

一、Servlet简介

        1、什么是 Servlet

        2、Servlet 生命周期如下

二、Servlet API

        1、Servlet 接口

        2、init() 方法

        3、service() 方法

        4、doGet() 方法

         5、doPost() 方法

        6、destroy() 方法


一、Servlet简介

        1、什么是 Servlet

        狭义的Servlet 是指 Java 实现的一个接口,定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

        你初始化时要做什么、你销毁时要做什么、你接受到请求时要做什么

Tomcat:servlet与servlet容器_第1张图片

        而广义的Servlet 是指任何实现了这个 Servlet 接口的类,比如Spring MVC的核心组件DispatcherServlet。

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

        servlet是一个规范,那实现了servlet的类,就能处理请求了吗?答案是,不能。

        因为servlet只定义了接收到请求后要做什么,至于端口监听,协议协议解析这些则完全不关系。那请求怎么来到servlet呢?答案是servlet容器,比如我们最常用的tomcat。

        tomcat才是与客户端直接打交道的家伙,他监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。

        2、Servlet 生命周期如下

        所谓生命周期,就是Servlet什么时候创建,调用了何种方法,最后在什么时候被销毁。我们之前学过的对象都是自己手动创建的,最后由JVM来销毁,而Servlet的整个生命周期,都是由tomcat服务器来控制的。

        我们通过去实现Servlet接口的方式观察Servlet的生命周期。如图:

Tomcat:servlet与servlet容器_第2张图片

        由上图所示,程序运行后得出结论,Servlet的生命周期是:

        实例化 --》初始化 --》多次调用service服务 --》 tomcat容器关闭时销毁

  • 默认情况下Servlet是在第一次访问的时候实例化和初始化的
  • 第一次访问就会调用service()服务方法
  • 直到关闭服务器时,Servlet才会被销毁

        除了默认情况,我们也可以通过load-on-startup来控制Servlet在服务器启动的时候就加载(实例化+初始化)。

二、Servlet API

        1、Servlet 接口

        Servlet 接口定义了下面五个方法: 

public interface Servlet {
    void init(ServletConfig var1) throws ServletException;

    ServletConfig getServletConfig();

    void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

    String getServletInfo();

    void destroy();
}

        2、init() 方法

        init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。

        Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。

        当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。

public void init() throws ServletException {
  // 初始化代码...
}

        3、service() 方法

        service() 方法是执行实际任务的核心方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

        service() 方法有两个参数:ServletRequest 和 ServletResponse。ServletRequest 用来封装请求信息,ServletResponse 用来封装响应信息,因此本质上这两个类是对通信协议的封装。

        每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

public void service(ServletRequest request,
                    ServletResponse response)
      throws ServletException, IOException{
}

        service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,您不用对 service() 方法做任何动作,您只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。

        doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。

        4、doGet() 方法

        GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

         5、doPost() 方法

        POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

public void doPost(HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 代码
}

        6、destroy() 方法

        destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

        在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:

  public void destroy() {
    // 终止化代码...
  }

你可能感兴趣的:(tomcat,java,servlet,tomcat,java)