javax.servlet包中有9个类,如下,其中最后2个是异常类:
- GenericServlet
- ServletContextEvent
- ServletContextAttributeEvent
- ServletInputStream
- ServletOutputStream
- ServletRequestWrapper
- ServletResponseWrapper
- ServletException
- UnavailableException
GenericServlet抽象类可以用于开发独立于协议的servlet,为此我们只需要实现service方法。然后日常编程中,更常见的是使用HttpServlet。
ServletContextEvent和ServletContextAttributeEvent是用于提供ServletContext及其属性的改变情况的事件类。
ServletInputStream和ServletOutputStream为与客户端通信,即发送和读取二进制数据提供了输入、输出流。
包装器类ServletRequestWrapper、ServletResponseWrapper提供了ServletRequest和ServletResponse接口的有用实现。我们可以从它们派生出子类,以增强包装对象的功能。
ServletException是servlet在遇到问题必须放弃时可以抛出的一个通用异常,抛出这个异常表明用户请求、处理请求或者发送响应时出了问题。这个异常抛到了servlet容器中以后,应用程序便失去了处理请求的控制权,容器会接着负责清理这些请求,并向客户返回一个响应。根据容器的实现和配置,容器可能向用户返回一个出错页面。
当一个过滤器或servlet临时或永久性地不可用时,应该抛出UnavailableException,可以应用在servlet请求的资源(数据库、DNS、其他servlet等等)不可用时。
Servlet接口
生命周期方法
所有的servlet必须实现Servlet接口。该接口定义了三个生命周期方法,由servlet容器调用:
- public void init(ServletConfig config) throws ServletException
- public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
- public void destroy()
servlet生命周期有着明确定义。客户向Web服务器发出一个请求,服务器再根据需要把请求重定向到servlet容器:
- servlet的加载和实例化有servlet容器负责。容器需要找到servlet类,加载并实例化,以供使用。
- 容器通过调用init方法来初始化servlet,传入init的参数是一个ServletConfig对象,描述了该servlet的运行环境。
- 若servlet没有成功初始化,则抛出UnavailableException或ServletException异常,该servlet会被释放,然后系统会试图实例并初始化一个新的servlet。
- 若servlet成功初始化,则表明servlet已经准备完毕,可以处理客户请求。请求和响应信息分别包装在ServletRequest、ServletResponse对象中,它们被传递到service方法中,由service方法负责处理请求并且返回响应信息。
- ServletException、UnavailableException异常都可以在请求处理时抛出。若抛出一个异常,则容器必须清理掉该请求,可能要卸载相应的实例并调用destroy方法。
- 一旦容器决定删除某个servlet,则必须允许任何service调用结束。之后再调用destroy方法,进而释放相应实例以便垃圾回收。
其他方法
在Servlet接口中还有更多的方法需要由servlet实现:
- public ServletConfig getSerletConfig(),获取初始化参数。该