1.Servlet的生命周期
以前:以前的程序,java类,自己去new对象,自己去使用对象调用。
现在: sevlet程序。servlet的生命周期由tomcat服务器控制的。
servlet什么时候对象创建,什么销毁,什么时候调用什么方法???
4.2 Servlet的四个生命周期
构造方法: 在创建servlet对象时调用。只调用1次。证明servlet对象在tomcat服务器中是单实例的。
init方法:在创建完servlet对象后调用。只调用1次。
service方法: 在每次请求servlet时调用。调用n次。
destroy方法: servlet对象销毁时调用。只调用1次。tomcat服务器停止或web应用重新部署时调用
4.3 用伪代码模拟tomcat服务器如何调用servlet生命周期
浏览器输入: http://localhost:8080/day10/hello
得到字符串: gz.itcast.a_servlet.HelloServlet
1)tomcat服务器通过反射构造对象
1.1 得到字节码对象
Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ");
1.2 构造对象
Object hello = clazz.newInstance(); --1) servlet的构造方法被调用
2)tomcat服务器调用init方法
2.1 得到init方法对象
Method m = clazz.getDeclareMethod("init",ServeletConfig.class);
2.2 执行方法
m.invoke(hello,config); --2)servlet的init方法被调用
3)tomcat服务器创建request和response对象,调用service方法
3.1 得到service方法对象
Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletRespnose.class);
3.2 执行方法
m.invoke(hello,request,response); --3)servlet的service方法被调
4)tomcat服务器停止或web应用重新部署时,tomcat服务器调用destroy方法
4.1 得到destroy方法对象
Method m = clazz.getDeclareMethod("destroy",null)
4.2 执行方法
m.invoke(hello,null); --4)servlet的destroy方法被调用
2.LiftServlet的代码
/**
测试Servlet的生命周期:
1.构造方法 (只是调用一次)
2.init初始化方法(只是调用了一次)
3.service方法 (多次调动)
4.destroy方法 (调用一次,服务器重新部署的时候,或者是服务器关闭重新启动的时候)
这些方法都是通过反射机制去调用的
*/
public class LiftServlet extends HttpServlet {
public LiftServlet(){
System.out.println("servlet的构造方法");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init方法被调用了");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("service方法被调用了");
}
@Override
public void destroy() {
System.out.println("destroy方法被调用了");
}
}