最近在开发一个项目,用到了servlet底层的原理,又重新复习下,在这里和大家共享下,希望对大家有所帮助。主要介绍了下,servlet的体系结构、生命周期、servlet的实例,servlet请求以及servlet的销毁。
1. servlet体系结构
servelt我们可以理解为一个实现了可以接受请求并响应请求的java类。servlet类的体系结构如下图
GenericServlet抽象类-----实现了Servlet接口和ServletConfig接口和Serializable接口
HttpServlet抽象类继-----承于GenericServlet抽象类
2.servlet生命周期
init()方法和destory()方法都只调用一次,service()方法每接受一个请求,都会调用一次service()方法。
2.1 Servlet容器实例化某个Servlet对象
在web.xml里面可以配置一个标签,让某个servlet类在Servlet容器启动的时候就创建这个servlet 类的一个对象。如果不配置servlet容器启动创建servlet对象,则当某个servlet接收到客户端的请求时,才创建这个servlet对象
2.2 某个Servlet对象初始化
Servlet实例化后,会调用servlet的init()方法,这个方法就是用来初始化的。你可以重写这个方法,根据自己的需求去初始化这个servlet实例。
如果你在web.xml为这个Servlet实例配置了初始化参数,如下
<servlet> <servlet-name>LoginDispatcher</servlet-name> <servlet-class>requestdispatcher.LoginDispatcher</servlet-class> <init-param> <param-name>name</param-name> <param-value>zhangsan</param-value> </init-param> </servlet> |
你可以调用ServletConfig接口的getInitParameter()方法去获得这些初始化参数。由上面类图我们可以知道GenericServlet抽象类实现了ServletConfig接口。
这里有两个异常要介绍:
ServletException:一般用来指明某个servlet初始化失败,例如找不到初始化参数
UnavailbleException:用于通知servlet容器该servlet实例不可用,例如当这个servlet在初始化的时候调用数据库连接失败,那么这个Servlet就不可用了,于是必须通知Servlet容器,告诉它这个Servlet对象不可用
2.3 Servlet处理请求
当客户端发送请求给某个servlet的时候,servlet会调用该servlet的service()方法去处理请求。在处理请求期间发生错误会抛出ServletException和UnavialbleException。
当UnavialbleException标志该servlet为永久不可用的servlet时,servlet容器就会调用该servlet的destory()方法销毁该servlet,并返回给客户端HTTP404错误(请求的资源不可用或不存在)。
当UnavialbleException标志该servlet为暂时不可用的servlet时,servlet容器将返回给客户端HTTP503错误(服务器忙,不能处理请求)
2.4 Servlet的销毁
当servlet容器要销毁某个servlet之前,servlet容器会调用该servlet的destory()方法,去释放一些资源,例如:数据库连接等等
3. servlet生命周期时序图