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目錄路徑。
					
					
		----------------------------------------------------------
	
				
				
					
					
				
			

 

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