【JavaWeb学习,快一起呀,干!】第二章 Servlet基础(1)—— Servlet 概述

开门见山的说

    本章从四个方面去讲解 Servlet 基础:Servlet 概述、Servlet 创建、Servlet 应用、Servlet 3.0 特性

    点亮 Servlet 基础 技能树第一个分支:Servlet 概述!

    在动态网络技术发展初期,为替代笨拙的 CGI(通用网关接口)技术,Sun 公司定制 JavaEE 规范时引入 Servlet,实现了基于 Java 语言的动态 Web 技术。

    对于现在而言,Servlet 在普遍使用的 MVC 模式的 Web 开发中仍占据了重要地位,流行的 Web 框架基本上都基于 Servlet 技术,如 Struts、WebWork 和 Spring MVC 等。

    可以说,只有掌握 Servlet,才能真正掌握 Java Web 编程的核心和精髓

    代码什么的将会在最后出现,可复制的!

一、Servlet 简介

Servlet 是基于 Java 语言的 Web 服务器端编程技术,是 Sun 公司提供的一种实现动态网页的解决方案。

按照 Java EE 规范定义,Servlet 是运行在 Servlet 容器中的 Java 类,它能处理 Web 客户的 HTTP 请求,并产生 HTTP 响应。

当浏览器发送一个请求到服务器后,服务器会把请求交给一个特定的 Servlet ,该 Servlet 对请求进行处理后会构造一个合适的响应(通常以 HTML 网页形式)返回给客户。

Servlet 对请求的处理和响应过程可进一步细分为如下几个步骤:

· 接收 HTTP 请求

· 取得请求信息,包括请求头和请求参数数据

· 调用其他 Java 类方法,完成具体的业务功能

· 实现到其他 Web 组件的跳转(包括重定向或请求转发)

· 生成 HTTP 响应(包括 HTTP 或非 HTTP响应)

Servlet 技术特点:高效、方便、功能强大、可移植性好

Servlet 运行在服务器端,由 Servlet 容器所管理。

Servlet 容器也叫 Servlet 引擎,是 Web 服务器或应用服务器的一部分,用于在发送的请求和响应之上提供网络服务、解码基于 MIME 的请求、格式化基于 MIME 的响应。

二、Servlet 体系结构

Servlet 是使用 Servlet API(应用程序设计接口)及相关类和方法的 Java 程序。

Servlet API 包含两个软件包:javax.servlet 包和 javax.servlet.http 包

    · javax.servlet 包:包含支持所有协议的通用的 Web 组件接口和类,主要有 javax.servlet.Servlet 接口、javax.servlet.GenericServlet 类、javax.servlet.ServletRequest 接口、javax.servlet.ServletResponse 接口。

    · javax.servlet.http 包:包含支持 HTTP 协议的接口和类,主要有 javax.servlet.http.HttpServlet 类、javax.servlet.http.HttpServletRequest 接口、javax.servlet.http.HttpServletResponse 接口。

1、Servlet 接口

javax.servlet.Servlet 的定义:

在这里插入图片描述

所有的 Servlet 都必须直接或间接地实现 javax.servlet.Servlet 接口。

Servlet 接口规定了必须由 Servlet 类实现并且由 Servlet 引擎识别和管理的方法集。

Servlet 接口的基本目标是提供与 Servlet 生命周期相关的方法,如 init()、service() 和 destroy() 等。

【示例】javax.servlet.Servlet 接口源码
在这里插入图片描述

Servlet 接口中的主要方法及描述

    · init(ServletConfig config)    Servlet 的初始化方法。

        在 Servlet 实例化后,容器调用该方法进行 Servlet 的初始化;

        ServletAPI 规定对任何 Servlet 实例 init() 方法只能被调用一次,如果此方法没有正常结束,就会抛出一个 ServletException 异常,一旦抛出异常,Servlet 将不再执行,而随后对其进行再次调用会导致容器重新载入并再次运行 init() 方法。

    · service(ServiceRequest req, ServletResponse resp)    Servlet 的服务方法。

        当用户对 Servlet 发出请求时容器会调用该方法处理用户的请求;

        ServletRequest 参数提供访问请求数据的方法,ServletResponse 参数提供 Servlet 构造响应的方法

    · destroy()    Servlet 的销毁方法

        容器在终止 Servlet 服务前调用此方法,容器调用此方法前必须给 service() 线程足够时间来结束执行,因此接口规定当 service() 正在执行时, destroy() 不被执行

    · getServletConfig()    此方法可以让 Servlet 在任何时候获得 ServletConfig 对象

    · getServletInfo()    此方法返回一个 String 对象,该对象包含 Servlet 的信息,例如开发者、创建日期和描述信息等。

在创建 Servlet 时必须直接或间接的实现这个接口。

一般趋向与间接实现:通过从 javax.servlet.GenericServlet 或 javax.servlet.http.HttpServlet 派生。

在实现 Servlet 接口时必须实现它这 5 个方法。

2、GenericServlet 类

javax.servlet.GenericServlet 的定义如下:

在这里插入图片描述

GenericServlet 类是一个抽象类,是 Servlet 接口的直接实现,除 service() 方法之外还提供了其他有关 Servlet 生命周期的方法。

这意味着只需通过简单地扩展 GenericServlet 和实现 service() 方法就可以编写一个基本的 Servlet。

GenericServlet 类的主要方法:

    · init(ServletConfig config)    该方法来源于 Servlet 接口,若重写该方法,必须调用 super.init(config),这样 GenericServlet 类的其他方法才能正常工作

    · init(ServletConfig config)    该方法重载 Servlet 接口的上一个 init() 方法而不需调用 super.init(config),而 ServletConfig 对象依然可以通过调用 getServletConfig() 方法获得

    · service(ServletRequest req, ServletResponse resp)    这是一个抽象的方法,当为执行网络请求继承 GenericServlet 类时必须实现它。

    · destroy()    与 Servlet 接口中的 destroy() 方法相同

    · getServletConfig()    返回一个 Servlet 的 ServletConfig 对象

    · getServletContext()    返回一个 Servlet 的 ServletContext 对象,通过 ServletConfig.getServletContext() 获得

    · getServletInfo()    该方法来源于 Servlet 接口,可以重写该方法以产生有意义的信息(如版本号、版权和作者等)



GenericServlet 类同时实现了 ServletConfig 接口,这使得开发者可以在不用获得 ServletConfig 对象情况相爱直接调用 ServletConfig 的方法,例如:getInitParameter()、getInitParameterNames() 和 getServletContext()。

GenericServlet 类还包含两个写日志的方法:log(String msg) 和 log(String msg, Throwable cause)

    · log(String msg)    用于将 Servlet 的名称和 msg 参数写到容器的日志中

    · log(String msg, Throwable cause)    除了记录 Servlet 的相关信息外还包含一个异常。

这两个方法实际上调用的是 ServletContext 接口的对应方法。

3、HttpServlet 类

虽然通过扩展 GenericServlet 就可以编写一个基本的 Servlet,但是若要实现一个在 Web 中处理 HTTP 请求的 Servlet,则需要使用 HttpServlet。



javax.servlet.http.HttpServlet 的定义如下:

在这里插入图片描述

HttpServlet 类扩展了 GenericServlet 类并且对 Servlet 接口提供了与 HTTP 相关的实现,是在 Web 开发中定义 Servlet 最常使用的类。

HttpServlet 类中的主要方法的源代码如下:

【示例】HttpServlet.java

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HttpServlet 类中的主要方法及其描述:

· service(HttpServletRequest req, HttpServletResponse resp)

    HttpServlet 在实现 Servlet 接口时,重写了 service() 方法,该方法会自动判断用户的请求方法;若为 Get 请求,则调用 HttpServlet 的 doGet() 方法;若为 Post 请求,则调用 HttpServlet 的 doPost() 方法。

    因此,开发人员在编写 Servlet 时,通常只需要重写 doGet() 或 doPost() ,而不要去重写 servie() 方法。

    如果 Servlet 收到一个 HTTP 请求而没有重载相应的 do 方法,它就返回一个说明此方法对本资源不可用的标准 HTTP 错误。

· doGet(HttpServletRequest req, HttpServletResponse resp)    此方法被本类的 service() 方法调用,用来处理一个 HTTP GET 请求

· doPost(HttpServletRequest req, HttpServletResponse resp)    此方法被本类的 service() 方法调用,用来处理一个 HTTP POST 请求

HttpServlet 作为 HTTP 请求的分发器,除了提供对 GET 和 POST 请求的处理方法 doGet() 和 doPost() 外,对于其他请求类型,如 HEAD、OPTIONS、DELETE、PUT 和 TRACE 也提供了相应的处理方法,如 doHead()、doOption()、doDelete()、doPut() 和 doTrace()。

    

HttpServlet 指能够处理 HTTP 请求的 Servlet,它在原有 Servlet 接口上添加了对 HTTP 协议的处理,它比 Servlet 接口的功能更为强大。

因此开发人员在编写 Servlet 时,通常应继承这个类,而避免直接去实现 Servlet 接口。

案例:采用继承 HttpServlet 类的方式创建的一个 Servlet 示例,此 Servlet 重写了父类的 init() 方法、destroy() 方法、处理 HTTP 协议 GET 请求的 doGet() 方法和 POST 请求的 doPost() 方法,体现了一个自定义 Servlet 的基本结构。

【示例】SampleServlet.java
在这里插入图片描述

三、Servlet 生命周期

Servlet 程序本身不直接在 Java 虚拟机上运行,而是由 Servlet 容器负责管理其整个生命周期。

Servlet 生命周期是指 Servlet 实例从创建到响应客户请求,直至销毁的过程。

Servlet 生命周期中有 7 个种状态:创建、初始化、服务可用、服务不可用、处理请求、终止服务和销毁。

Servlet 的生命周期按照 7 种状态间的转换,可分为以下 4 个阶段:加载和实例化、初始化、处理请求、销毁

    

    · 加载和实例化

        Servlet 的创建是指加载和实例化两个过程。

        Servlet 容器在如下时刻加载和实例化一个 Servlet:

            1)在服务器运行中,客户机首次向 Servlet 发出请求时;

            2)重新装入 Servlet 时(如服务器重新启动、Servlet 被修改)

            3)在为 Servlet 配置了自动装入选项(load-on-startup)时,服务器在启动时会自动装入此 Servlet.

    

    · 初始化    

        Servlet 实例化后,Servlet 容器将调用 Servlet 的 init(ServletConfig config) 方法来对 Servlet 实例进行初始化。

        在这一过程中,可以读取一些固定的数据、初始化 JDBC 的连接以及建立与其他资源的连接等操作。

        init() 方法的参数 ServletConfig 对象由 Servlet 容器创建并传递给 Servlet,并在初始化完成后一直在内存中存在,直到 Servlet 被销毁。

        如果初始化没有问题,Servlet 在 Web 容器中会处于服务可用状态;如果初始化失败 Servlet 容器会从运行环境中清除掉该实例。

        当 Servlet 运行出现异常时,Servlet 容器会使实例变为服务不可用状态。

        Web 程序维护人员可以设置 Servlet,使其成为服务不可用状态或者从服务不可用状态恢复成服务可用状态。

    · 处理请求

        服务器接收到客户端请求,会为该请求创建一个 “请求”对象和一个“响应”对象并调用 service(),service() 方法再调用其他方法来处理请求。

        在 Servlet 生命周期中,service() 方法可以被多次调用。

        当多个客户端同时访问某个 Servlet 的 service() 方法时,服务器会为每个请求创建一个线程,这样可以并行处理多个请求,减少请求处理的等待时间,提高服务器的响应速度。但同时要注意对同一对象的并发访问问题。

    · 销毁

        当 Servlet 容器需要终止 Servlet(例如 Web 服务器即将被关掉或需要出让资源),它会先调用 Servlet 的 destroy() 方法使其释放正在使用的资源。

        在 Servlet 容器调用 destroy() 方法之前,必须让当前正在执行 service() 方法的任何线程完成执行,或者超过了服务器定义的时间限制。

        在 destroy() 方法完成后,Servlet 容器必须释放 Servlet 实例以便被垃圾回收。

在 Servlet 的生命周期中,Servlet 的初始化和销毁智慧发生一次,因此 init() 和 destroy() 方法只能被 Servlet 容器调用一次,而 service() 方法的调用次数则取决于 Servlet 被客户端访问的次数。

在一个请求到来时,Servlet 生命周期的处理过程:

    1)客户端发送请求至 Servlet 容器

    2)Servlet 容器对请求信息进行解析

    3)Servlet 容器根据请求目标创建 Servlet 实例

    4)Servlet 容器调用 Servlet 实例的 init() 方法对其进行初始化

    5)Servlet 容器为该请求创建“请求”和“响应”对象作为参数传递给 service() 方法

    6)service() 方法在对请求信息进行处理后,将结果转给 Servlet 容器。

    7)Servlet 容器将结果信息响应给客户端

    8)当 Servlet 容器需要终止 Servlet 时,将调用其 destroy() 方法使其终止服务并将其销毁。

Servlet 基础的第一部分就到此结束了。

基础概念很重要!

由于是纯手打,所以出现错误请联系 UP猪,我会第一时间作修改的

最后,源代码附上:

【SamplseServlet.java】

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class SampleServlet extends HttpServlet {

public HelloServlet() {

    super();

}



public void init(ServletConfig config) throws ServletException {

    

}



public void destroy() {

    

}



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

    

}



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

    

}

}

作者:何以百里
https://www.bilibili.com/read/cv3811707
出处: bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值