研究servlet的生命周期,就是研究servlet在什么時候創(chuàng)建對象,時候調(diào)用什么方法,在什么時候銷毀對象。
以前: new Student();
現(xiàn)在: servlet是由tomcat服務(wù)器執(zhí)行的生命周期。
Sevlet的四個重要的生命周期方法:
構(gòu)造方法: 創(chuàng)建servlet對象時調(diào)用,只調(diào)用1次,證明了sevlet是單例的。
init方法: 創(chuàng)建完對象之后調(diào)用。只調(diào)用1次。該方法用于初始化對象。
service方法: 在每次請求時調(diào)用,調(diào)用n次。該方法入口方法,我們的邏輯代碼在這里被調(diào)用。
destory方法:在servlet對象銷毀之后調(diào)用。只調(diào)用1次。重新部署網(wǎng)站或者停止服務(wù)器,servlet對象就會銷毀了。
用偽代碼演示tomcat服務(wù)器如何調(diào)用四個方法:
通過url-pattern得到字符串: com.xxjqr.dd.HelloServlet
1. 通過反射,創(chuàng)建HelloServlet的對象
1.1 得到HelloServlet的CLass對象
Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ")
1.2 通過class對象調(diào)用構(gòu)造方法
Object obj = clazz.newInstance(); 調(diào)用無參的構(gòu)造方法。 --1)構(gòu)造方法被調(diào)用
2. 通過反射,調(diào)用init方法
2.1 得到init方法對象
Method m =clazz.getDeclaraeMethod("init",ServletConfig.class);//聲明參數(shù)類型
2.2 調(diào)用方法
m.invoke(obj,config); --2)init方法被調(diào)用
3. 通過反射,調(diào)用service方法
3.1 得到service方法對象
Method m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
3.2 調(diào)用方法
m.invoke(obj,request,response); --3)service方法被調(diào)用
4. 通過反射,調(diào)用destroy方法
4.1 得到destroy方法對象
Method m= clazz.getDeclareMethod('destroy",null);
4.2調(diào)用方法
m.invoke(obj,null); --4)destroy方法被調(diào)用
代碼演示:
public class LifeCycleDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public LifeCycleDemo() {
System.out.println("構(gòu)造方法被調(diào)用啦!!!");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init方法被調(diào)用啦!!!");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("service方法被調(diào)用啦!!!");
}
@Override
public void destroy() {
System.out.println("destroy方法被調(diào)用啦!!!");
}
}

補(bǔ)充:
自動加載的配置:
我們在第一次訪問網(wǎng)站時,servlet才開始初始化,創(chuàng)建,并調(diào)用一次service方法;這樣對第一次訪問來說,響應(yīng)比較慢;所以可以在這個站點(diǎn)啟動的時候就創(chuàng)建servlet對象;
在server.xml中找到對應(yīng)的servlet進(jìn)行配置;
各種servlet的啟動數(shù)字不要一樣,數(shù)字越大,優(yōu)先級越低

兩個init方法作用:
init(ServletConfig) :這個有參數(shù)的init方法的作用就是Servlet的其中一個重要的生命周期方法。這個方法一定會被tomcat服務(wù)器調(diào)用。
init():這個無參的init方法的作用就是為了提供給開發(fā)者方便去覆蓋,覆蓋這個方法,可以在此方法編寫初始化的邏輯。這個方法才是真的給開發(fā)者做初始化邏輯的方法