循序渐进写一个 Servlet (1) - 介绍相关的接口和类
Servlet(Server Applet),全称 Java Servlet,是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。本系列将一步步地写出一个 Servlet 程序。
这篇博文将介绍一些后面会用到的接口和类。
常用的类和接口
javax.servlet.Servlet
javax.servlet.Servlet是一个接口,它定义了一个 servlet 必须要实现的方法,包括如何初始化一个 servlet,如何让这个 servlet 处理请求,以及如何将这个 servlet 从容器中移除,即 “生命周期方法”。它们被调用的顺序,即 servlet 的生命周期,是这样的:
- 容器生成这个 servlet 的对象,然后调用其
init()方法完成初始化步骤 - 当收到请求之后,会调用其
service()方法来处理请求 - 当这个 servlet 停止服务时,
destroy()方法会被调用并准备销毁
Servlet 的启动时间由web.xml中load-on-startup属性决定,当值为负数或未设定该属性时,容器可以自由决定何时初始化该 servlet;当值为零或正整数时,容器需要在启动时就初始化该 servlet,此时该属性的值代表初始化的优先级,值越小优先级越高,对于有相同优先级的 servlet,容器可以自行决定加载顺序。
当应用被重新部署,或者在容器停机时,servlet 会被销毁,同时 servet 无法被手动销毁。
除了生命周期方法外,Servlet接口还有两个方法:
getServletConfig()可以让 servlet 取到启动相关的信息getServletInfo()用来获取 servlet 相关的信息,如作者、版本号、版权信息等
javax.servlet.GenericServlet
GenericServlet类是一个抽象类,定义了一个协议无关的,通用的 servlet 实现。
它预置了ServletConfig接口的实现,并且简易实现了Servlet接口中的init()方法和destroy()方法,开发人员只需要覆盖service()方法。
javax.servlet.http.HttpServlet
HttpServlet类提供了一个用于处理 HTTP 请求的 servlet 基类。一个HttpServlet的子类至少需要覆盖一个方法,而且通常是覆盖如下几个方法:
doGet(),以实现对HTTP GET请求的处理doPost(),以实现对HTTP POST请求的处理doPut(),以实现对HTTP PUT请求的处理doDelete(),以实现对HTTP DELETE请求的处理init()和destroy(),以管理 servlet 生命周期内所需的资源getServletInfo(),可以用来自定义 servlet 返回哪些关于自身的信息
此外,不建议直接覆盖service()方法,因为HttpServlet#service()方法中已经实现了根据 HTTP 请求类型调用对应的doXXX()方法。
如果某个 HTTP 方法对应的doXXX()方法没有被覆盖,则视为该 servlet 不支持这个 HTTP 方法。如在没有覆盖doGet()时收到HTTP GET请求,则会返回HTTP 405 METHOD NOT ALLOWED (对应HTTP 1.1)错误码,或HTTP 400 BAD REQUEST (对应其他HTTP版本)错误码。
需要注意的是,HttpServlet类并没有实现HTTP CONNECT和HTTP PATCH方法。当请求这两个方法,或其他非标准方法时,将会返回HTTP 501 NOT IMPLEMENTED错误码。
常用的常量
- HTTP 方法相关的常量位于
HttpServlet类中,是 String 类型,命名规则为METHOD_方法,如METHOD_GET - HTTP 状态码相关的常量位于
HttpServletResponse类中,是 int 类型,命名规则为SC_状态码名,如SC_OK、SC_NOT_FOUND