本文主要是一些关于Servlet的接口和方法的说明
Servlet 是什么?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。我们可以使用Servlet接收网页表单的用户输入,呈现数据库或者其他源的记录,还可以动态创建网页。
Servlet的实现
Servlet是通过接口来实现,那因为是实现Servlet接口,所以我们就需要实现接口里对应的方法。Servlet所提供的一系列规范,让软件可以在不同服务器上运行。
规范了可以实现的接口、类以及配置环境。
定义所有 servlet 都必须实现的方法。
servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
要实现此接口,可以编写一个扩展
javax.servlet.GenericServlet
的一般 servlet,或者编写一个扩展javax.servlet.http.HttpServlet
的 HTTP servlet。此接口定义了初始化 servlet 的方法、为请求提供服务的方法和从服务器移除 servlet 的方法。这些方法称为生命周期方法,它们是按以下顺序调用的:
- 构造 servlet,然后使用
init
方法将其初始化。- 处理来自客户端的对
service
方法的所有调用。- 从服务中取出 servlet,然后使用
destroy
方法销毁它,最后进行垃圾回收并终止它。除了生命周期方法之外,此接口还提供了
getServletConfig
方法和getServletInfo
方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。
我们来看看servlet内部可以实现的方法有哪些吧。
public void init(ServletConfig config) throws ServletExcepetion
由 servlet 容器调用,指示将该 servlet 放入服务。servlet 容器仅在实例化 servlet 之后调用
init
方法一次。在 servlet 可以接收任何请求之前,init
方法必须成功完成。servlet 容器无法将 servlet 放入服务,如果
init
方法:
- 抛出
ServletException
- 未在 Web 服务器定义的时间段内返回
config 包含 servlet 的配置和初始化参数的 ServletConfig
对象Throws ServletExcepetion: 如果发生妨碍 servlet 正常操作的异常
init顾名思义,就算初始化,config是计算机配置的意思,所以我们可以用这个方法初始化配置。
public ServletConfig getServletConfig()
返回 ServletConfig 对象,该对象包含此 servlet 的初始化和启动参数。返回的ServletConfig
对象是传递给init
方法的对象。此接口的实现负责存储
ServletConfig
对象,以便此方法可以返回该对象。实现此接口的 GenericServlet类 已经这样做了。
return 初始化此 servlet 的 ServletConfig
对象
这个方法可以返回包含servlet的初始化与启动参数的对象。
public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
由 servlet 容器调用,以允许 servlet 响应某个请求。此方法仅在 servlet 的
init()
方法成功完成之后调用。应该为抛出或发送错误的 servlet 设置响应的状态代码。
servlet 通常运行在可同时处理多个请求的多线程 servlet 容器中。开发人员必须知道要同步对所有共享资源(比如文件、网络连接以及 servlet 的类和实例变量)的访问。
req 包含客户端请求的 ServletRequest
对象res 包含 servlet 的响应的 ServletResponse
对象Throws ServletException: 如果发生妨碍 servlet 正常操作的异常 Throws java.io.IOException: 如果发生输入或输出异常
public String getServletInfo()
返回有关 servlet 的信息,比如作者、版本和版权。此方法返回的字符串应该是纯文本,不应该是任何种类的标记(比如 HTML、XML,等等)。
return 包含 servlet 信息的 String
public void destroy()
由 servlet 容器调用,指示将从服务中取出该 servlet。此方法仅在 servlet 的service
方法已退出或者在过了超时期之后调用一次。在调用此方法之后,servlet 容器不会再对此 servlet 调用service
方法。此方法为 servlet 提供了一个清除持有的所有资源(比如内存、文件句柄和线程)的机会,并确保任何持久状态都与内存中该 servlet 的当前状态保持同步。
以上这些就servlet接口中所包含的方法。
GenericServlet
直接编写Servlet的话,太过复杂,每次都得重写虽有方法,所以用GenericServlet抽象类,继承给Servlet,大大减少重写的代码量。
GenericServlet
实现Servlet
和ServletConfig
接口。servlet 可以直接扩展GenericServlet
,尽管扩展特定于协议的子类(比如HttpServlet
)更为常见。
GenericServlet
使编写 servlet 变得更容易。它提供生命周期方法init
和destroy
的简单版本,以及ServletConfig
接口中的方法的简单版本。GenericServlet
还实现log
方法,在ServletContext
接口中对此进行了声明。要编写一般的 servlet,只需重写抽象
service
方法即可。
以下就是其中的一些方法:
public void destroy()
由 servlet 容器调用,指示将从服务中取出的 servlet。
public String getInitParameter(String name)
返回包含指定初始化参数的值的String
,如果参数不存在,则返回null
。提供此方法是为了方便使用。该方法从 servlet 的
ServletConfig
对象获取指定参数的值。
name 指定初始化参数名称的 String
return String 包含初始化参数值的 String
public java.util.Enumeration<E> getInitParameterNames()
以String
对象的Enumeration
的形式返回 servlet 的初始化参数的名称,如果 servlet 没有初始化参数,则返回一个空的Enumeration
。提供此方法是为了方便使用。该方法从 servlet 的
ServletConfig
对象获取参数名称。
return Enumeration 包含 servlet 初始化参数名称的 String
对象的枚举
public ServletConfig getServletConfig()
返回此 servlet 的 ServletConfig 对象。
return ServletConfig 初始化此 servlet 的 ServletConfig
对象
public ServletContext getServletContext()
返回对此 servlet 在其中运行的 ServletContext的引用。提供此方法是为了方便使用。该方法从 servlet 的
ServletConfig
对象获取上下文。
return ServletContext 通过 init
方法传递给此 servlet 的ServletContext
对象
public String getServletInfo()
返回有关 servlet 的信息,比如作者、版本和版权。默认情况下,此方法返回一个空字符串。重写此方法使其返回有意义的值。
return String 有关此 servlet 的信息,默认情况下是一个空字符串
public void init(ServletConfig config) throws ServletException
由 servlet 容器调用,指示将放入服务中的 servlet。此实现存储它从 servlet 容器中获得的 ServletConfig 对象,以便将来使用。在重写方法的这种形式时,调用
super.init(config)
。
config 包含此 servlet 的配置信息的 ServletConfig
对象Throws ServletException: 如果发生中断 servlet 正常操作的异常
public void init() throws ServletException
可重写的便捷方法,这样就不必调用super.init(config)
。不用重写 #init(ServletConfig),只需重写此方法即可,它由
GenericServlet.init(ServletConfig config)
调用。仍然可以通过 #getServletConfig 获取ServletConfig
对象。
Throws ServletException: 如果发生中断 servlet 正常操作的异常
public void log(String msg)
将前置有 servlet 名称的指定消息写入 servlet 日志文件。
msg 指定要写入日志文件的消息的 String
public void log(String message, Throwable t)
将前置有 servlet 名称的给定Throwable
异常的解释性消息和堆栈跟踪写入 servlet 日志文件。
message 描述错误或异常的 String
t java.lang.Throwable
错误或异常
abstract public void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
由 servlet 容器调用,以允许 servlet 响应某个请求。此方法已声明为抽象方法,因此子类(比如
HttpServlet
)必须重写它。
req 包含客户端请求的 ServletRequest
对象res 将包含 servlet 的响应的 ServletResponse
对象Throws ServletException: 如果发生妨碍 servlet 正常操作的异常 Throws java.io.IOException: 如果发生输入或输出异常
public String getServletName()
返回此 servlet 实例的名称。
return 此 servlet 实例的名称
相信看了这些方法,一定能加深你对Servlet的config、context等的理解。