1. 程式人生 > >JavaWeb-Servlet的總結

JavaWeb-Servlet的總結

轉載於傳智播客教程.

今天內容
	1.Servlet(重點)
	2.ServletCofig(次重點)
	3.ServletContext(重點)
-----------------------------------------------------------------
		1.servlet
			servlet是什麼?它的作用是什麼?
				servlet是一門開發動態web資源的技術.
				servlet它叫伺服器端小應用程式。
				它可以理解伺服器端的一個資源,它可以進行請求與響應的處理.
			servlet技術怎樣使用?
				sun公司在api中提供了Servlet介面
				
				我們開發Servlet可以有三種方式.
					1.實現  javax.servlet.Servlet介面
					2.繼承  javax.servlet.GenericServlet
					3.繼承  javax.servlet.http.HttpServlet
					
					
			對於我們開發一個servlet它步驟有兩個.
				1.實現或繼承 Servlet介面或  GenericSerlvet,HttpServlet。
				2.在web.xml檔案對Servlet進行配置.
				
					<servlet>
						<servlet-name>任意起的一個名稱,一般會使用servlet的類名</servlet-name>
						<servlet-class>servlet的全名  就是包名.類名.</servlet-class>
					</servlet>
					
					
					<serlvet-mapping>
						<servlet-name>要與上面的servlet-name的值一樣</servlet-name>
						<url-pattern>/名稱</url-pattern>
					</servlet-mapping>
			------------------------------------------------------
				關於請求方式  get與post
				
					在瀏覽器上直接輸入url----get請求.
					超連結方式也是  get請求.
					
					如果想要以post方式提交,只能通過表單,設定method=post.
					
					
		--------------------------------------------------------------------------
			問題1:我們提交請求時,為什麼get請求就會呼叫doGet方法,post請求,會呼叫doPost方法?
			問題2:為什麼我們重寫時,只重寫了無引數的init方法,不需要重寫有引數的init?
			
			研究servlet的生命週期(******************************)
			
				在我們Servlet介面中定義了三個方法.
					init(ServletConfig config)
					service()
					destroy();
					
			問題1解決:
					是因為在HttpServlet的service方法中,它進行了重寫,重寫後分根據請求方式不同,呼叫不同的方法.
						String method=request.getMethod();
						
						if("get".equals(method)){
							doGet();
						}else if("post".equals(method)){
							doPost();
						}
				
			問題2解決:
					在GenericServlet 中定義了一個無引數init方法,重寫Servlet介面中的init(ServletConfig config)方法.
					當servlet物件建立後會呼叫有引數的init方法。在有引數的init方法中又呼叫了無引數的init方法。
					對於我們來說,我們只需要重寫無引數的init就可以。
		--------------------------------------------------------------------------------------------------------
			關於servlet的自動載入.
				正常情況下,servlet是第一次被訪問時,會建立servlet例項。並初始化,也就是呼叫init方法。
				
				我們可以通過對servlet進行配置,讓servlet可以隨著伺服器的啟動而自動建立與初始化.
				
				只需要在web.xml檔案中在配置servlet時,加上<load-on-startup>	
				
				servlet跟隨伺服器啟動的作用是什麼?
					根據特點來分析,當前servlet的init方法是伺服器啟動了,init方法就被呼叫了,
					那麼我們就可以將一些需要提前載入的資訊在servlet的init方法中定義。
					
		------------------------------------------------------------------------------------------------------------
			關於url-pattern的寫法.
				
				url-pattern它的作用是什麼?
					它的值要與瀏覽器輸入的地址相匹配,通過url-pattern可以查詢到servlet-name,在通過serlvet-name可以查詢到
					對應servlet類.
					
				它的寫法有兩種:
					1.完全匹配  要求以/開始,名稱與url一致.
					2.使用萬用字元  *
						1.目錄匹配   以/開始,以*結束.
						2.副檔名匹配.    不能以/開始,以*.xxx對束
						
					最經典錯誤   /*.do	
					
					
					優先順序:	完全匹配>目錄匹配>副檔名匹配
			--------------------------------------------------------------------------------
			關於訪問servlet時的路徑問題(客戶端訪問伺服器端資源路徑問題):******************
				
				訪問一個servlet它的路徑有兩種寫法,一種是絕對路徑,一種是相對路徑.
				
				絕對路徑:<br>
						1.帶協議的絕對路徑<br>
						<a href="http://localhost/day09/demo2">demo2 servlet</a><br>
						2.不帶協議的絕對路徑<br>
						<a href="/day09/demo2">demo2 servlet</a>
						
					在開發中,帶協議的絕對路徑一般應用於訪問站外資源。
					而不帶協議的絕對路徑我們一般是在站內訪問時使用的,也是推薦使用的。
					
				******相對路徑
					相對路徑:<br>
						<a href="./demo2">demo2 servlet</a>
						對於當前路徑下的資源我們一般寫成:
						<a href="demo2">demo2 servlet</a>
						
					分析:	
						訪問admin.html的路徑是: http://localhost/day09/admin.html
						訪問demo2Servlet的路徑是:http://localhost/day09/demo2
						
						通過上面的路徑分析,發現admin.html與demo2是同級別,那麼它們相對關係就是當前路徑下的某某...
						
						
						如果將admin.html放置在main目錄下.
						
						訪問admin.html的路徑是: http://localhost/day09/main/admin.html
						訪問demo2Servlet的路徑是:http://localhost/day09/demo2
						
						
						那麼相對路徑就需要改變。
				
							<a href="../demo2">demo2 servlet</a>
							
							
				總結:
					我們在開發中建議使用不帶協議的絕對路徑.
					它的寫法是  /虛擬目錄名稱/資源路徑
					
					根據以上的分析,說明在客戶端的 /代表的是就相當於伺服器根目錄.
					

			---------------------------------------------------------------------
			ServletCofnig
				它是什麼?它有什麼用?它是由誰建立的?
				
					ServletConfig是Servlet的一個配置物件.					
					每一個servlet都有一個對應的ServletCofnig。
					ServletConfig是由web伺服器建立的,它通過Servlet的init方法傳遞到了
					Sevlet中.
					
					ServletCofnig作用:(它是servlet的一個配置物件)
							1.可以獲取Servlet的名稱   getServletName();---web.xml檔案中的<servlet-name>的值.
							2.可以獲取初始化引數
									getInitParameter(String name);   根據name獲取value
									getIniteParameterNames();  獲取所有的name值,它返回的是一個Enumeration.
									
									對於Enumeration它相當於是一個Iterator。
									Iterator     hasNext()          next()
									Enumeration  hasMoreElement()   nextElement();
									
							3.可以獲取ServletContext物件。		
							
					通過程式碼去測試一下這些操作

						問題:我們在Servlet中怎樣獲取ServletConfig物件 
							
							我們要檢視怎樣獲取ServletConfig物件,
							我們現在知道,ServletConfig物件是由伺服器建立,通過Servlet的init方法傳遞到Servlet中.
							
							在Servlet類中通過this.getServletConfig()就獲取了ServletConfig物件.
							
						問題:什麼是初始化引數?
						
							我們在每一個Servlet的配置中,都可以通過
							<init-param>
								<param-name>name</param-name>
								<param-value>value</param-value>
							</init-param>
							進行配置,這個就是servlet的初始化引數
							
						問題:初始化引數的作用?	
						
							我們可以將一些servlet執行時需要載入常量定義在初始化引數中,當我們需要使用時,
							可以直接通過ServletConfig獲取到這些值。
							
						ServletConfig總結:
							1.每一個Servlet都有自己的ServletConfig物件.
							2.ServletCofnig物件是由伺服器建立,通過Servlet的init方法傳遞到Servlet中。
							3.ServletConfig物件代表的是Servlet的配置物件,可以通過它獲取Servlet的名稱與相關初始化引數。
							4.在Servlet中要獲取ServletConfig物件,只需要直接呼叫getServletConfig()就可以。
							5.可以通過ServletConfig獲取ServletContext物件.
		-----------------------------------------------------------------------------------------------------------					
			ServletContext物件**************************************************************
				
				它是一個全域性的web容器物件.它代表的就是當前工程。
				
				
				類的成員變數:
					這個類的每一個物件都具有這個成員變數.
				類的靜態變數
					當前類的所有物件都使用同一個靜態變數。
					
				ServletContext代表一個web應用,在這個web應用中所有Servlet使用的就是這一個。	
				每一個Servlet都有ServletConfig。

				
				因為在一個web應用中就一個ServletContext,所有的servlet使用的是同一個ServletContext,
				那麼我們這些servlet就可以通過serlvetContext去實現通訊。
				
				ServletContext物件它是一個容器物件。(大家將其想像成是一個map集合)
				我們將這種功能的物件叫做域物件(上下文物件)
				
			----------------------------------------------------------------------	
				獲取WEB應用的全域性初始化引數

				通過ServletContext物件實現資料共享
				案例--- 統計站點訪問次數

				利用ServletContext物件讀取資原始檔
				
				要完成以上的操作,出現的問題:
					1.問題:我們在servlet中怎樣獲取ServletContext物件,它是由誰建立的?
						ServletContext物件是由伺服器建立,它代表web應用.
						要想獲取我們可以通過ServletConfig物件去獲取.
						
						this.getServletConfig().getServletContext();
						this.getServletContext();這種方式底層也是通過ServletConfig獲取的.
						
					2.ServletContext的功能有什麼
						1.可以完成Servlet與Servlet之間的通訊.
							setAttribute(String name,Object value)
							getAttribute(String name);
							removeAttribute(String name);
							
						2.可以設定全域性初始化引數.
							1.在web.xml檔案中可設定全域性初始化引數
								<context-param>
									<param-name>global</param-name>
									<param-value>this is message</param-value>
								</context-param>
								
							2.怎樣獲取全域性初始化引數
								getInitParameter(String name);
								getInitParameterNames();
													
								設定全域性初始化引數在開發中有什麼用?
									例子:我們在全域性初始化引數中可以設定一個變數來描述整個web應用的字元編碼.
									     我們在任意的一個servlet中都可以獲取到這個字元編碼。
										 
									全域性初始化引數它是針對於web工程共享的資訊。	 
									
						3.獲取Mime型別.
							
							String getMimeType(String name)
							
							我們在講檔案下載時會使用到.
							
						4.在ServletContext中有一些獲取路徑操作.	
							
							getRealPath(String path); 它返回的是一個String
								
								例如:context.getRealPath("/"); 獲取的是當前web應用在磁碟上的絕對路徑.
										E:\apache-tomcat-7.0.26\webapps\day09\
								
							getResource(String source);  它返回的是一個URL
							
								例如:context.getResource("/");
									返回的是  /localhost/day09
							
						    getResourceAsStream(String path)   它返回的是一個InputStream
								例如:context.getResourceAsStream("/a.txt");
									得到一個指向了WebRoot下的a.txt檔案的一個輸入流。
									
									
					以後操作中應用比較多的是1,與4.
				-----------------------------------------------------------------------------------	
					利用ServletContext物件讀取資原始檔---關於路徑問題
					
							在web應用中如果要讀取資原始檔,我們需要得到檔案的絕對磁碟路徑。
							
							context.getRealPath("/"); 這時得到的就是tomcat/webapps/工程名/     路徑。
							得到檔案位置只需要在/後面加上相關的路徑就可以.
							
							
							注意:src下的內容會被部署到classes中。而沒有在src或WebRoot下的內容不會被部署到tomcat中.
							
					------------------------------------------------------
						關於classpath問題.
							
							javaProject工程  java原始檔被編譯後會被放置在bin目錄.
							java web project工程  java原始檔編譯後會被放置在classes目錄.
							
							我們管bin或classes這樣的可以儲存class檔案的目錄叫  classpath路徑.
							
							
							在java中,我們要想獲取classpath路徑可以通過任意一個類的字元碼物件獲取.
							
							String path=類.class.getResource("/2.txt").getPath()
					
							這時我們就得到了classes目錄下的2.txt檔案的絕對磁碟路徑。
							
					-----------------------------------------------------------------
						總結:
							getRealPath() 它可以得到tomcat下的web應用中的檔案的絕對磁碟路徑。
							
							類.class.getResource().getPath();是獲取classpath路徑。就是我們的bin或classes目錄路徑。
					
					
		----------------------------------------------------------