Servlet的生命週期分爲四個階段
1,創建Servlet對象,通過服務器反射機制創建Servlet對象,第一次請求時纔會創建。(默認)
2,調用Servlet對象的init()方法,初始化Servlet的信息,init()方法只會在創建後被調用一次
3,響應請求,調用service()或者是doGet(),doPost()方法來處理請求,這些方法是運行的在多線程狀態下的。
4,在長時間沒有被調用或者是服務器關閉時,會調用destroy()方法來銷燬Servlet對象。
可以通過web.xml文件可以配置Servlet對象的創建時間,
<load-on-startup>數字</load-on-startup>,表示服務器啓動時創建,並依照數字大小按順序創建,只用重要的Servlet纔會是用這個設置。
可以通過<init-param>標籤來配置初始化參數,可以用ServletConfig對象的
getInitParameter(String name)方法來得到參數。
<init-param>
<param-name>...</param-name>
<param-value>...</param-value>
</init-param>
多線程下所操作的變量,如果操作的是一個變量,且兼有讀寫操作,就要考慮加上同步,但同步不能亂加,否則會造成死鎖問題。
init()和destroy()方法都是運行在單線程下的。
GenericServlet類中的有參和無參的init方法。
public void init(ServletConfig config)throws ServletException
{
this.config = config;
init();
}
public void init()throws ServletException
{
.....;//覆蓋了的無參的init()方法,會在Servlet創建時調用有參的init方法時
也會被調用。
}
HttpServlet類中參數不同的service方法的調用關係。
public void service(HttpServletRequest req,HttpServletResponse res){
.......;
.......;
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try
{
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
}
catch(ClassCastException e)
{
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}