1.什么是生命周期
- 生命周期表示一个java对象从最初的创建到最终的销毁,经历的所有过程
2.Servlet对象的生命周期是由谁来管理的
- Servlet对象的生命周期,JavaWeb程序员是无法干涉的。包括Servlet对象的相关方法的调用,Javaweb程序员也是无法干涉的。
- Servlet对象从最初的创建,方法的调用以及对象的销毁,整个过程是由web容器来管理的
- web容器管理Servlet对象的生命周期
3.Servlet对象在web容器启动阶段会不会被实例化
- “默认情况下”,Servlet对象在web容器启动阶段不会被实例化。
- 若希望在web服务器启动阶段实例化Servlet对象,需要进行特殊的设置,就是web.xml文件中进行相关的配置,例如:
<servlet>
<servlet-name>testLifeCycle</servlet-name>
<servlet-class>com.javaweb.servlet.math.TestLifeCycle</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>testLifeCycle</servlet-name>
<url-pattern>/testLifeCycle</url-pattern>
</servlet-mapping>
- url-pattern是对应的用户在浏览器中输入的请求路径
- servlet-class是对应的java小程序完整类名
- servlet-name是对应的java小程序具体类名
- load-on-startup中自然数越小优先级越高
4.Servlet生命周期
- 4.1: 用户在浏览器地址栏上输入URL:http://localhost:8080/hcz3/testLifeCycle
注意:这里的/hcz3是我在Tomcat服务器中布置的该项目名字 - 4.2: web容器截取请求路径:/hcz3/testLifeCycle
- 4.3: web容器在容器上下文中找取请求路径/hcz3/testLifeCycle对应的Servlet对象
- 4.4: 如果没有找到对应的Servlet对象
- (1)通过web.xml文件中的相关配置信息,得到请求路径/testLifeCycle对应的Servlet完整类名
- (2)通过反射机制,调用Servlet类的无参数构造方法完成Servlet对象的实例化
public TestLifeCycle(){
System.out.println("无参构造方法");
}
- (3)web容器调用Servlet对象的init方法完成初始化操作
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet中的init方法");
}
- (4)web容器调用Servlet对象的service方法提供服务
@Override
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
System.out.println("Servlet中的service方法");
}
- 4.5: 如果有找到对应的Servlet对象
- web容器直接调用Servlet对象的service方法提供服务
- 4.6: web容器什么时候会将Servlet对象销毁
- web容器关闭的时候
- webapp重新部署的时候
- 该Servlet对象长时间没有用户访问的时候
- web容器会调用Servlet对象的destroy方法完成销毁
@Override
public void destroy() {
System.out.println("Servlet中的destroy方法");
}
5.Servlet对象是不是单例模式
- Servlet对象是单例,但是不符合单例模式,只能称为伪单例,因为真单例的构造方法是私有的。
- Tomcat服务器是支持多线程的,所以Servlet对象是在单实例多线程的环境下运行的。
- 那么Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
6.Servlet对象实例化之后,这个Servlet对象被存到哪里了?(有找到Servlet对象时)
- 大多数的web容器都是将Servlet对象以及对应的url-pattern存储到Map集合中了
- 在web容器中有这样一个Map集合,Map<String,Servlet>
key | Value |
---|---|
/login | LoginServlet对象引用 |
/delete | DeleteServlet对象引用 |
/save | SaveServlet对象引用 |
7.服务器在启动的时候就会解析各个webapp中的web.xml文件,然后做了什么?(没有找到Servlet对象时)
- 将web.xml文件中的url-pattern和对应的Servlet完整类各存储到Map集合中
- 在web容器中有这样一个Map集合
Map<String,String>
key | value |
---|---|
/login | com.javaweb.servlet.math.LoginServlet |
/delete | com.javaweb.servlet.math.DeleteServlet |
/save | com.javaweb.servlet.math.SaveServlet |
8.Servlet接口中的这些方法中可以编写什么代码?什么时候使用这些方法?
-
无参数构造方法
-
init方法
- 以上两个方法执行时间几乎是相同的,构造方法执行的时候对象正在创建,init方法执行的时候对象已经创建好了
- 若系统要求在对象创建时刻执行一段特殊的程序,这段程序尽量写到init方法中
- 为什么不建议将代码编写到构造方法中呢?
- 因为在编写构造方法的时候,可能会导致无参构造方法不存在
- 一个类不编写任何构造方法,默认有一个无参数构造方法,但是一旦编写一个有参数构造方法,系统则不再提供无参数构造方法
- Servlet中的init方法是SUN公司为为JavaWeb程序员提供的一个代码初始化时刻,若希望在初始化时刻执行一段特殊的程序,这个程序可以编写到init方法,将来会被自动调用
- service方法
- 这个方法是必然要重写的,因为这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应的处理
- destroy方法
- 若希望在销毁时刻执行一段特殊的代码,需要将这段代码编写到destroy方法中,会自动被调用
9.总结
- Servlet类的构造方法只执行一次
- Servlet对象的init方法只执行一次
- Servlet对象的service方法,只要用户调用一次,则执行一次
- Servlet对象的destroy方法只执行一次
10.注意
- init方法执行的时候,Servlet对象已经被创建好了
- destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁