您的位置:首页 > 其它

servlet生命周期

2017-08-19 12:06 253 查看
ServletLife.java

package servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletLife extends HttpServlet {
public ServletLife() {
System.out.println("1、servlet构造方法被创建");

}

@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("2、servlet初始化");
}

@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
throws ServletException, IOException {
System.out.println("3、调用service方法");

}

@Override
public void destroy() {
System.out.println("4、servlet对象销毁");
}

}
运行:





Servlet重要的四个生命周期方法

构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象
只调用1次。证明servlet对象在tomcat是单实例的。

init方法: 创建完servlet对象的时候调用。只调用1次。

service方法: 每次发出请求时调用。调用n次。

destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁
4000
servlet对象。

只调用1次。

伪代码演示servlet的生命周期

Tomtcat内部代码运行:

1)通过映射找到到servlet-class的内容,字符串:
gz.itcast.a_servlet.FirstServlet

2)通过反射构造FirstServlet对象

2.1 得到字节码对象

Class clazz = class.forName("gz.itcast.a_servlet.FirstServlet");

2.2 调用无参数的构造方法来构造对象

Object obj = clazz.newInstance(); ---1.servlet的构造方法被调用

3)创建ServletConfig对象,通过反射调用init方法

3.1 得到方法对象

Method m = clazz.getDeclareMethod("init",ServletConfig.class);

3.2 调用方法

m.invoke(obj,config); --2.servlet的init方法被调用

4)创建request,response对象,通过反射调用service方法

4.1 得到方法对象

Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);

4.2 调用方法

m.invoke(obj,request,response); --3.servlet的service方法被调用

5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法

5.1 得到方法对象

Method m = clazz.getDeclareMethod("destroy",null);

5.2 调用方法

m.invoke(obj,null); --4.servlet的destroy方法被调用



Servlet的自动加载

默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。
改变servlet创建对象的时机: 提前到加载web应用的时候!!!
在servlet的配置信息中,加上一个<load-on-startup>即可!!
<servlet>
<servlet-name>LifeDemo</servlet-name>
<servlet-class>gz.itcast.c_life.LifeDemo</servlet-class>
<!-- 让servlet对象自动加载 -->
<load-on-startup>1</load-on-startup>  注意: 整数值越大,创建优先级越低!!
</servlet>
注意:放配置中,而不是映射中

有参的init方法和无参的init方法

1、有参数的init方法,该方法是servlet的生命周期方法,一定会被tomcat服务器调用

2、无参数的init方法,该方法是servlet编写初始化代码的方法,是用来给开发者进行覆盖,在里面编写初始化逻辑代码的方法

Servlet的多线程并发问题

注意: servlet对象在tomcat服务器是单实例多线程的。

因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引发线程安全问题。

解决办法:

1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)

2)建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: