Servlet的管理机制
- 浏览器每一次访问服务器都会发送一个信息的请求,每一次发送请求如果是请求操作,那么调用的Servlet对象是唯一的。为了保证Servlet对象是唯一的,就需要让服务器去管理Servlet对象,保证它的唯一性。
管理方式主要有如下两种:(采用Tomcat服务器)
- 立即加载:当服务器启动时,底层就会根据web.xml配置文件找到所有Servlet类,并通过反射机制创建对象将对象保存在集合中,当需要调用Servlet对象,就从该集合中取出来
- 延迟加载:当服务器启动时,不会预先创建所有的Servlet对象,而是什么时候用到就什么时候创建
- Tomcat服务器采用的是延迟加载的方式(这是默认的方式)当Tomcat启动的时候,Tomcat读取了web.xml配置文件,首先读取请求的操作名和对应的名字,也就是配置文件中的url-parttern和servlet-name,将这两个名字存入一个键值对的集合中保存起来。并且还有另一个键值对集合是用来存储和servlet-name对应的servlet-class,但是这个不是一开始就加载,而是当需要用Servlet对象的时候再创建,并将创建之后的对象保存到该集合中。
- 我们可以改变默认加载的方式,只要在web.xml配置文件中,在<servlet>下添加一个配置,<load-on-startup>整数0</load-on-startup>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>TestController</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
那么在Tomcat启动时,这个servlet类就会被创建
Servlet生命周期
Tomcat为了更好的管理servlet对象的产生和销毁,提供了三个方法标识Servlet对象的生命周期,分别是init(),service()和destroy();
- servlet通过调用init()方法进行初始化
由于servlet对象是单例的,所以init()在servlet第一次创建的时候就被调用,之后就不会再被调用 - servlet调用service()来处理客户端发送过来的请求
每一次服务器收到一个操作请求时,服务器就会产生一个线程并调用servlet,执行service()方法 - servlet通过调用destroy()方法中值
当servlet生命周期结束时会调用,会调用一次destroy()方法
Servlet的继承关系
- HttpServlt类继承了一个抽象类GenericServlet
- GenericServlet实现了三个接口,分别是Servlet、ServletConfig和Serializable
-
ServletConfig接口有四个方法
- String getServletName();
- ServletContext getServletContext();
- String getInitParameter(String var1);
- Enumeration<String> getInitParameterNames();
-
Servlet接口里面有五个方法
- void init(ServletConofig var1) throws Exception
- ServletConfig getServletConfig();
- void service(ServletRequest var1, ServletResponse var2);
- void destroy();
- String getServletInfo();
-
GenericServlet抽象类(实现了ServletConfig和Servlet接口,体现出了缺省适配器模式)
- 将两个接口中的9个方法都添加了过来,将其中的8个方法都进行了重写,除了Destroy()
- 多添加了一个init()无参数的方法
- 留下一个方法是没有具体实现的service方法
- 添加了log()方法
-
HttpServlet抽象类
- 存在的目的:
- 添加了具体的请求方式对应的方法,比如doGet、doPost
- HttpServlet保留了GenericServlet抽象类的Service,自己添加了一个带两个参数HttpServletRequest和HttpServletResponse的service方法,保留的这个service最终调用了自带的service方式。
- 自己添加的service方法内容先获取请求的方式,最后调用相对应的方法比如doGet/doPost执行
本篇文章到此就结束了,主要也是记录我的一个学习过程,请读者带着批判的角度去阅读,如有错误还望纠正
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。