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 执行
本篇文章到此就完结了,次要也是记录我的一个学习过程,请读者带着批评的角度去浏览,如有谬误还望纠正