Java Servlet【2】Servlet工作原理(生命週期)

      學習Servlet真心有些累啊,學習了這麼久還是剛剛入門。但現在的學習熱情還是很高。加油!

      在Servlet【1】的博客中已經寫到如何使用實現Servlet接口的方法來寫Servlet程序,並寫在web.xml文件中進行配置,成功運行,那麼現在就說說Servlet的工作原理。同時這也是面試題之一。

      在實現Servlet接口的時候複寫了四個方發,可以通過說明對四個方法的使用來簡述Servlet的工作流程(生命週期):

如果認真的看這幾個函數,會發現這個Servlet Java程序沒有主函數,所以這是服務器在幫助我們調用這些方法。

Servlet程序是由WEB服務器調用,web服務器收到客戶端的Servlet請求後;
(1)當Servlet第一次被調用的時候,會觸發init函數,該函數會把Servlet的實例裝載到內存,init函數只會被調用一次。
(2)然後去調用Servlet的service函數
(3)當第二次後訪問該Servlet就直接調用service函數
(4)當web應用reload、關閉tomcat或者關機,就會調用destroy函數,銷燬Servlet。

      同時再來說說繼承HttpServlet的方法來開發Servlet(在軟件公司90%都是通過該方法開發),在HttpServlet中設計者對post提交和get提交分別處理。然後就必須說說這兩種提交的區別了。

get和post提交的區別:
1.從安全性看get<post,get 提交的數據匯在瀏覽器的地址欄顯示
2.從提交的內容大小看get<post,get不能大於2K,而post提交理論上不受限制,但不要大於64K。
3.從請求響應速度看,get>post,get要求服務器立即處理請求,而post請求可能形成一個隊列。

下面是對象的一個小程序,可以先看一下。

public class servlet1 extends HttpServlet {

	int ticket=2;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.getWriter().println("linweieran,"+new java.util.Date().toString());
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//一般開發人員,習慣把doGet()doPost()合二爲一。
		this.doGet(request, response);
		
	}

}

在本文最前說到了工作機制,當Servlet被第一次訪問後,就被加載至內存,以後該實例對各個請求服務,即在使用中是單例的。說到單例就會想到當多個用戶訪問一個變量,會出現線程安全問題。所以編寫代碼的時候有一個原則

(1)如果一個變量需要多個用戶共享,則應在訪問該變量的時候加同步機制。
synchronized(對象){
//同步代碼
}
(2)如果一個變量不需要共享,則直接在doGet()或者doPost()中定義即可。

下面是一個買票的小程序,爲了模擬訪問買票網站時的時延情況專門加了睡眠10秒鐘,爲了同步ticket使用synchronized方法。

public class servlet1 extends HttpServlet {

	int ticket=2;
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.getWriter().println("lijingbo,"+new java.util.Date().toString());
		
		//簡單的解決辦法
		synchronized(this){
			if(ticket>0){
				System.out.println("你買到票");
				
				//休眠
				try {
					Thread.sleep(10*1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				ticket--;
			}else{
				System.out.println("你咩有買到票");
			}
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//一般開發人員,習慣把doGet()doPost()合二爲一。
		this.doGet(request, response);
		
	}

}


     運行結果表明這樣子可以保證只用兩個人可以買到票。



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