Servlet 简介

    xiaoxiao2021-03-25  148

    Servlet 简介

    Servlet 是用Java编写的服务器端程序。

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

    狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

    Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。

    Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。

    但是相比于 CGI,Servlet 有以下几点优势:

    性能明显更好。

    Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。

    Servlet 是独立于平台的,因为它们是用 Java 编写的,跨平台运行。

    服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。

    Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。

    Servlet在Web应用程序中的位置:

    Servlet 任务

    Servlet 执行以下主要任务:

    读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。

    读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。

    处理数据并生成结果。这个过程可能需要调用 Web 服务,访问数据库,或者直接计算得出对应的响应。

    发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。

    发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

    Servlet 生命周期

    Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。

    加载:容器通过类加载器使用servlet类对应的文件加载servlet创建:通过调用servlet构造函数创建一个servlet对象初始化:调用init方法初始化处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求卸载:调用destroy方法让servlet自己释放其占用的资源

    Servlet生命周期三大重要时刻:

    1. 实例化 init()

    在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。

    可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。

    2. 服务 service()

    它是Servlet的核心,负责响应客户的请求。

    每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。

    在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。

    3. 销毁 destroy()

    仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。

    一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

    Servlet 生命周期方案:

    第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。Servlet 容器在调用 service() 方法之前加载 Servlet。然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

    Tomcat 与 Servlet 配合工作

    步骤:

    Web Client 向Servlet容器(Tomcat)发出Http请求Servlet容器接收Web Client的请求Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。Servlet容器创建一个HttpResponse对象Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet 对象。HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。HttpServlet调用HttpResponse对象的有关方法,生成响应数据。Servlet容器把HttpServlet的响应结果传给Web Client。

    Servlet工作原理

    1、首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

    2、每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

    3、Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse。

    创建Servlet对象的时机:

    Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

    在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。

    Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

    <servlet> <servlet-name>Init</servlet-name> <servlet-class>org.xl.servlet.InitServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>

    开发Servlet的三种方式

    实现servlet接口(偏向底层)

    继承GenericServlet(觉得1不好用,就开发了这个,现在基本没啥用)

    继承HttpServlet(现在大多数用这个,因为Spring MVC就是用的这个)

    Servlet接口有五个方法

    Servlet接口有五个方法

    init 初始化,就是把servlet装载到内存中,只会被调用一次

    getServletConfig 获取servletConfig对象

    service 主要的服务方法,放业务逻辑,每次都会被调用

    getServletInfo 得到servlet配置信息

    destroy 销毁该servlet,从内存中清除掉

    继承GenericServlet

    GenericServlet实现了servlet接口,然后只有一个抽象方法需要你自己去重写,那就是service方法,所以相比来说init别的方法他都帮你实现好了,只要你写service方法就可以了。

    至少看起来继承GenericServlet比直接实现servlet接口要方便。这个类是在javax.servlet.GenericServlet下的。

    继承HttpServlet

    因为后来发现servlet主要是为了服务于http请求的,而且发现GenericServlet对于http来说还不够好,所以有了HttpServlet,首先它是继承自GenericServlet,然后它有很多http相关的方法,post,get,put等等。

    用户可以根据自己需要来实现这些方法,每个过来的请求都会调用service方法,最后service会根据不用的请求分发到不同的地方去做。

    转载请注明原文地址: https://ju.6miu.com/read-11780.html

    最新回复(0)