研究servlet的生命周期,就是研究servlet在什么时候创建对象,时候调用什么方法,在什么时候销毁对象。
以前: new Student();
现在: servlet是由tomcat服务器执行的生命周期。
Sevlet的四个重要的生命周期方法:
构造方法: 创建servlet对象时调用,只调用1次,证明了sevlet是单例的。
init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。
service方法: 在每次请求时调用,调用n次。该方法入口方法,我们的逻辑代码在这里被调用。
destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。
用伪代码演示tomcat服务器如何调用四个方法:
通过url-pattern得到字符串: com.xxjqr.dd.HelloServlet
1. 通过反射,创建HelloServlet的对象
1.1 得到HelloServlet的CLass对象
Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ")
1.2 通过class对象调用构造方法
Object obj = clazz.newInstance(); 调用无参的构造方法。 --1)构造方法被调用
2. 通过反射,调用init方法
2.1 得到init方法对象
Method m =clazz.getDeclaraeMethod("init",ServletConfig.class);//声明参数类型
2.2 调用方法
m.invoke(obj,config); --2)init方法被调用
3. 通过反射,调用service方法
3.1 得到service方法对象
Method m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
3.2 调用方法
m.invoke(obj,request,response); --3)service方法被调用
4. 通过反射,调用destroy方法
4.1 得到destroy方法对象
Method m= clazz.getDeclareMethod('destroy",null);
4.2调用方法
m.invoke(obj,null); --4)destroy方法被调用
代码演示:
public class LifeCycleDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LifeCycleDemo() {
System.out.println("构造方法被调用啦!!!");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init方法被调用啦!!!");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("service方法被调用啦!!!");
}
@Override
public void destroy() {
System.out.println("destroy方法被调用啦!!!");
}
}
补充:
自动加载的配置:
我们在第一次访问网站时,servlet才开始初始化,创建,并调用一次service方法;这样对第一次访问来说,响应比较慢;所以可以在这个站点启动的时候就创建servlet对象;
在server.xml中找到对应的servlet进行配置;
各种servlet的启动数字不要一样,数字越大,优先级越低
两个init方法作用:
init(ServletConfig) :这个有参数的init方法的作用就是Servlet的其中一个重要的生命周期方法。这个方法一定会被tomcat服务器调用。
init():这个无参的init方法的作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑。这个方法才是真的给开发者做初始化逻辑的方法