01 08Servlet生命週期

Servlet的生命週期可以控制的只是初始化、服務、銷燬。其它的操作都會由容器來負責完成。

1 基本生命週期

在HttpServlet類裏面提供有以下的幾個方法來負責生命週期的處理:
1、初始化:public void init() throws ServletException
|————默認情況下是在Servlet第一次使用的時候初始化;
2、服務(主要是處理GET與POST請求):
(1)處理GET請求:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
(2)處理POST請求:protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
3、銷燬:public void destroy()
|————一個Servlet長時間不使用,爲了保證資源的節約,自動銷燬;
|————當容器關閉的時候,自動調用銷燬操作;
|————當Tomcat自動重新加載的時候也會銷燬。
範例:觀察生命週期

package org.lks.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {

	public void init() throws ServletException {
		System.out.println("[LifeServlet] init...");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] get...");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] post...");
	}

	public void destroy() {
		System.out.println("[LifeServlet] destory...");
	}

}

<servlet>
	<servlet-name>LifeServlet</servlet-name>
	<servlet-class>org.lks.servlet.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>LifeServlet</servlet-name>
	<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>

對於初始化的控制方法,也可以在容器啓動的時候設置爲默認初始化,那麼需要在web.xml文件裏面增加如下配置:

<load-on-startup>1</load-on-startup>

加入以上的配置之後,Servlet會在容器啓動的時候自動進行初始化的操作。

2 擴展生命週期

以上給出的幾個操作方法,嚴格來講是使用最多的幾個方法,但是對於初始化和服務的方法在HttpServlet類裏面還是有其他定義的:
(1)初始化方法:public void init(ServletConfig config) throws ServletException
|————可以讀取初始化的配置參數數據;
(2)服務方法:
|————GenericServlet:public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
|————HttpServlet:protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException

HttpServlet類中的service()方法是一個普通方法,已經實現好的方法。
範例:觀察擴展生命週期

package org.lks.demo;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {

	public void init() throws ServletException {
		System.out.println("[LifeServlet] init...");
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("[LifeServlet] init, parameter: " + config.getInitParameter("data"));
	}

	@Override
	public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("[LifeServlet] service...");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] get...");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] post...");
	}

	public void destroy() {
		System.out.println("[LifeServlet] destory...");
	}

}

<servlet>
   <servlet-name>LifeServlet</servlet-name>
   <servlet-class>org.lks.demo.LifeServlet</servlet-class>
   <init-param>
   	<param-name>data</param-name>
   	<param-value>HELLO</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
	<servlet-name>LifeServlet</servlet-name>
	<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>

此時可以發現無參的初始化方法將不再起作用,而變爲了可以讀取初始化配置參數的方法執行。同時可以發現,一旦覆寫了service()方法之後,doGet()和doPost()兩個方法將不再執行了。因爲在HttpServlet類中的service()方法裏面會接收用戶的請求類型,如果發現這個請求類型是GET請求,這個方法自動調用doGet()方法(此方法是交給子類覆寫的),也就是說整個Servlet之中如果子類要想處理GET請求就必須覆寫doGet()方法,如果要想處理POST請求,就必須按照要求覆寫doPost()方法,那麼這就是一個最典型的模板設計模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章