Servlet的生命周期由如下幾個步驟組成:
1.實例化(就是創(chuàng)建servlet對象,調(diào)用構(gòu)造器)
當用戶通過瀏覽器輸入一個路徑调违,這個路徑對應(yīng)的servlet被調(diào)用的時候复哆,該Servlet就會被實例化
為LoginServlet顯示提供一個構(gòu)造方法 LoginServlet()
無論訪問了多少次帘腹,LoginSerlvet構(gòu)造方法只會執(zhí)行一次烹植,所以Serlvet是單實例的
import java.io.IOException;
import java.io.PrintWriter;
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 LoginServlet extends HttpServlet {
public LoginServlet(){//調(diào)用構(gòu)造方法
System.out.println("LoginServlet 構(gòu)造方法 被調(diào)用");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//略
}
}
2.初始化
LoginServlet 繼承了HttpServlet橡羞,同時也繼承了init(ServletConfig) 方法
init方式是一個實例方法担租,所以會在構(gòu)造方法執(zhí)行后執(zhí)行。
無論訪問了多少次LoginSerlvet鲫构,init初始化只會執(zhí)行一次
public class LoginServlet extends HttpServlet {
public LoginServlet(){//調(diào)用構(gòu)造方法
System.out.println("LoginServlet 構(gòu)造方法 被調(diào)用");
}
public void init(ServletConfig config) {
System.out.println("init(ServletConfig)");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//略
}
}
3.提供服務(wù)
接下來就是執(zhí)行service()方法浓恶,然后通過瀏覽器傳遞過來的信息進行判斷,是調(diào)用doGet()還是doPost()方法
在service()中就會編寫我們的業(yè)務(wù)代碼结笨,在本例中就是判斷用戶輸入的賬號和密碼是否正確
public class LoginServlet extends HttpServlet {
public LoginServlet() {
System.out.println("LoginServlet 構(gòu)造方法 被調(diào)用");
}
public void init(ServletConfig config) {
System.out.println("init(ServletConfig)");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String password = request.getParameter("password");
String html = null;
if ("admin".equals(name) && "123".equals(password))
html = "<div style='color:green'>success</div>";
else
html = "<div style='color:red'>fail</div>";
PrintWriter pw = response.getWriter();
pw.println(html);
}
}
4.銷毀
在如下幾種情況下包晰,會調(diào)用destroy()
1.該Servlet所在的web應(yīng)用重新啟動
在serverl.xml中配置該web應(yīng)用的時候用到了
<Context docBase="/Users/dgscdi/Jason/apache-tomcat-7.0.77/wtpwebapps/servletHelloworld" path="/servletHelloworld" reloadable="true" source="org.eclipse.jst.jee.server:servletHelloworld"/>
如果把 reloadable="false" 改為reloadable="true" 就表示有任何類發(fā)生的更新湿镀,web應(yīng)用會自動重啟
當web應(yīng)用自動重啟的時候,destroy()方法就會被調(diào)用
- 關(guān)閉tomcat的時候 destroy()方法會被調(diào)用伐憾,但是這個一般都發(fā)生的很快勉痴,不易被發(fā)現(xiàn)。
public class LoginServlet extends HttpServlet {
public void destroy() {
System.out.println("destroy()");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 略
}
}
5.被回收
當該Servlet被銷毀后塞耕,就滿足垃圾回收的條件了蚀腿。 當下一次垃圾回收GC來臨的時候嘴瓤,就有可能被回收扫外。