prj.servlet-03
servlet的生命周期
1 什么是生命周期?
生命周期表示一个Java对象从最初被创建到最终被销毁经历的所有过程
2 Servlet对象的生命周期谁来管理?程序员可以干涉么?
Servlet对象的生命周期,javaweb程序员无权干涉,包括Servlet对象的相关方法的调用,javaweb
程序员也是无权干涉的
Servlet对象从最初的创建,方法的调用以及对象的销毁整个过程有WEB容器来管理。
Web Container管理Servlet对象的生命周期。
3 “默认情况下”,Servlet对象在WEB服务器启动阶段不会实例化。【若希望在WEB服务器启动阶段实例化Servlet对象,需要进行特殊设置】
4 描述Servlet对象生命周期
1)用户在浏览器地址栏上输入URL:http://localhost:8080/prj.servlet-03/testLifeCycle
2)web容器截取请求路径:/prj.servlet-03/testLifeCycle
3)web容器在容器上下文中找请求路径/prj.servlet-03/testLifeCycle对应的Servlet对象
4)若没有找到对应的Servlet对象
4.1)通过web.xml文件中相关文件的配置信息,请求得到路径/testLifeCycle对应的Servlet完整类名
4.2)通过反射机制,调用Servlet类的无参数构造函数方法,完成Servlet实例化
4.3)web容器调用Servlet对象的init方法完成初始化操作
4.4)Web容器调用Servlet对象的service方法提供服务
5)若找到对应的Servlet对象
5.1)web容器直接调用Servlet对象的service方法提供帮助
6)web容器关闭的时候/webApp重新部署的时候/该Servlet对象长期没有对象用户再次访问时,Web容器会将Servlet对象
销毁,在销毁该对象之前,Web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。
5 总结:
5.1 Servlet类的构造方法只执行一次
5.2 Servlet对象的init方法只执行一次
5.3 Servlet对象的service方法用户请求一次,则执行一次
5.4 Servlet对象的destroy方法只执行一次
6 注意:
init方法执行的时候,Servlet对象已经被创建好了。
destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。
7 Servlet对象是单例,但是不符合单例模式。真单例的构造方法是私有化的,tomcat服务器支持多线程。
所以Servlet对象在单实例多线程的环境下运行。那么Servlet对象中若有实例变量,并且实例变量涉及
修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用
局部变量。
8 若希望在web容器启动阶段实例化Servlet对象,需要在web.xml中进行相关配置。例如:
<servlet>
<servlet-name>welcomeServlet</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.WelcomeServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>welcomeServlet</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<load-on-startup>0</load-on-startup>中间的自然数越小优先级越高。
9 Servlet对象实例化之后,这个Servlet对象被存储在哪里?
大多数的WEB容器都是将该Servlet对象以及对应的URL-pattern存储到map集合中了。
在WEB容器中有这样一个Map集合
Map<String,Servlet>集合
key value
-----------------------------
/login LoginServlet对象的调用
/delete DeletServlet对象引用
/save SaveServlet对象引用
10 服务器在启动的时候就会解析各个webApp的web.xml文件,做了什么?
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:
在Map<String,String> 集合
Key value
---------------------------------------
/login com.bjpowernode.javaweb.servlet.LoginServlet
/delete com.bjpowernode.javaweb.servlet.DeleteServlet
.......
11 Servlet接口这些方法中编写什么代码?什么时候使用这些方法?
1)无参数构造方法【以后不考虑构造函数论,尽量别动构造函数】
2)init方法
以上两个方法执行时间几乎相同,执行次数都以一次,构造方法执行的时候对象正在创建,init方法执行时,对象已经创建:
若系统要求在对象创建时刻执行一段特殊的程序,这端程序尽量卸载init方法中
为什么不建议将代码编写到构造函数中呢?
存在风险,当程序员编写构造方法的时候,可能会导致无参数构造方法不存在。
一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写有参数的构造方法之后,系统
则不在提供无参数构造函数。
Servlet中的init方法是sun送死为javaweb程序员专门提供的一个初始化时刻,
若希望初始化时刻执行一段特殊的程序,这个程序可编写到inti方法,将会被自动调用
3)service方法
这个方法必然要重写,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
而且这个方法中的代码最优价值。
也是最难编写的,最难编写的就是业务代码。
4)destroy方法
这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊的时刻被称为对象销毁时刻,
若希望在销毁时刻执行一段特殊的代码,需要将这段程序编写到destroy方法中,将会被自动调用
类加载时刻,代码编写在哪里?
静态代码块中
结论:
sun公司为我们程序员提供了很多个不同时刻 ,若要在这个特殊的时刻执行特殊程序,这些程序是有位置编写的。
1 什么是生命周期?
生命周期表示一个Java对象从最初被创建到最终被销毁经历的所有过程
2 Servlet对象的生命周期谁来管理?程序员可以干涉么?
Servlet对象的生命周期,javaweb程序员无权干涉,包括Servlet对象的相关方法的调用,javaweb
程序员也是无权干涉的
Servlet对象从最初的创建,方法的调用以及对象的销毁整个过程有WEB容器来管理。
Web Container管理Servlet对象的生命周期。
3 “默认情况下”,Servlet对象在WEB服务器启动阶段不会实例化。【若希望在WEB服务器启动阶段实例化Servlet对象,需要进行特殊设置】
4 描述Servlet对象生命周期
1)用户在浏览器地址栏上输入URL:http://localhost:8080/prj.servlet-03/testLifeCycle
2)web容器截取请求路径:/prj.servlet-03/testLifeCycle
3)web容器在容器上下文中找请求路径/prj.servlet-03/testLifeCycle对应的Servlet对象
4)若没有找到对应的Servlet对象
4.1)通过web.xml文件中相关文件的配置信息,请求得到路径/testLifeCycle对应的Servlet完整类名
4.2)通过反射机制,调用Servlet类的无参数构造函数方法,完成Servlet实例化
4.3)web容器调用Servlet对象的init方法完成初始化操作
4.4)Web容器调用Servlet对象的service方法提供服务
5)若找到对应的Servlet对象
5.1)web容器直接调用Servlet对象的service方法提供帮助
6)web容器关闭的时候/webApp重新部署的时候/该Servlet对象长期没有对象用户再次访问时,Web容器会将Servlet对象
销毁,在销毁该对象之前,Web容器会调用Servlet对象的destroy方法,完成销毁之前的准备。
5 总结:
5.1 Servlet类的构造方法只执行一次
5.2 Servlet对象的init方法只执行一次
5.3 Servlet对象的service方法用户请求一次,则执行一次
5.4 Servlet对象的destroy方法只执行一次
6 注意:
init方法执行的时候,Servlet对象已经被创建好了。
destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁。
7 Servlet对象是单例,但是不符合单例模式。真单例的构造方法是私有化的,tomcat服务器支持多线程。
所以Servlet对象在单实例多线程的环境下运行。那么Servlet对象中若有实例变量,并且实例变量涉及
修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用
局部变量。
8 若希望在web容器启动阶段实例化Servlet对象,需要在web.xml中进行相关配置。例如:
<servlet>
<servlet-name>welcomeServlet</servlet-name>
<servlet-class>com.bjpowernode.javaweb.servlet.WelcomeServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>welcomeServlet</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<load-on-startup>0</load-on-startup>中间的自然数越小优先级越高。
9 Servlet对象实例化之后,这个Servlet对象被存储在哪里?
大多数的WEB容器都是将该Servlet对象以及对应的URL-pattern存储到map集合中了。
在WEB容器中有这样一个Map集合
Map<String,Servlet>集合
key value
-----------------------------
/login LoginServlet对象的调用
/delete DeletServlet对象引用
/save SaveServlet对象引用
10 服务器在启动的时候就会解析各个webApp的web.xml文件,做了什么?
将web.xml文件中的url-pattern和对应的Servlet完整类名存储到Map集合中了:
在Map<String,String> 集合
Key value
---------------------------------------
/login com.bjpowernode.javaweb.servlet.LoginServlet
/delete com.bjpowernode.javaweb.servlet.DeleteServlet
.......
11 Servlet接口这些方法中编写什么代码?什么时候使用这些方法?
1)无参数构造方法【以后不考虑构造函数论,尽量别动构造函数】
2)init方法
以上两个方法执行时间几乎相同,执行次数都以一次,构造方法执行的时候对象正在创建,init方法执行时,对象已经创建:
若系统要求在对象创建时刻执行一段特殊的程序,这端程序尽量卸载init方法中
为什么不建议将代码编写到构造函数中呢?
存在风险,当程序员编写构造方法的时候,可能会导致无参数构造方法不存在。
一个类不编写任何构造函数,默认有一个无参数的构造方法,但是一旦编写有参数的构造方法之后,系统
则不在提供无参数构造函数。
Servlet中的init方法是sun送死为javaweb程序员专门提供的一个初始化时刻,
若希望初始化时刻执行一段特殊的程序,这个程序可编写到inti方法,将会被自动调用
3)service方法
这个方法必然要重写,因为在这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应。
而且这个方法中的代码最优价值。
也是最难编写的,最难编写的就是业务代码。
4)destroy方法
这个方法也是SUN公司为javaweb程序员提供的一个特殊的时刻,这个特殊的时刻被称为对象销毁时刻,
若希望在销毁时刻执行一段特殊的代码,需要将这段程序编写到destroy方法中,将会被自动调用
类加载时刻,代码编写在哪里?
静态代码块中
结论:
sun公司为我们程序员提供了很多个不同时刻 ,若要在这个特殊的时刻执行特殊程序,这些程序是有位置编写的。