關於servlet的一些總結

	1.Servlet
		服務器端小應用程序
		它運行在Servlet容器中,它是由服務器直接解析運行。
		
	2.怎樣創建一個Servlet
		1.通過查看示例,發現Servlet在創建時它會繼承一個HttpServlet類。
		2.重寫doGet,doPost等方法。
		
		
	-------------------------------------------------
	3.創建一個servlet步驟:
		1.創建一個類,去繼承HttpServlet(實現Servlet接口 或繼承 GenericServlet)
		2.重寫方法  doPost  doGet  (接口中需要將所有方法重寫,但是service方法是處理請求)
		3.在web.xml文件中配置
		
	4.servlet生命週期
		
		1.創建servlet,並調用init方法
		2.通過service方法來處理請求。
		3.通過destroy來銷燬servlet。
		
		當我們創建一個servlet時,第一次訪問,會創建servlet對象,並調用init方法,init方法只調用一次。
		開啓一個線程來調用service方法。
		當下一次在訪問時,又開啓一個線程來調用service方法。
		servlet對象,一般情況只創建一次,它常駐內存。
		當服務停止,或servlet對象銷燬時會調用destroy方法。
		
		注意:如果在servlet中創建了成員變量,就可以出現線程安全問題
		在開發中,儘量避免在servlet中創建成員變量。
		如果創建了,就需要同步。
		
	5.關於Servlet接口中service方法與HttpServlet中的doPost,doGet什麼關係?
	
		一個servlet被訪問時,它默認處理請求的是service方法,這個方法是在Servlet接口中定義的。
		
		根據請求的url,在web.xml文件中查找到具體的servlet,
		會默認調用service方法。
		對於我們來說,它在HttpServlet中對service方法進行了重寫,執行其內容

		在HttpServlet的service方法中,會根據請求方式的不同,分別調用不同的方法。
		根據java中的多態,在調用doPost,doGet時,會調用的是我們自己的servlet中的方法。

		這裏面涉及到一個java模式:模板方法模式
			
	---------------------------------------------------------
	5.模板方法模式:
		
	---------------------------------------------------------
-------------------------------------------------------------------
	myeclipse安裝	
		注意:將myeclipse10目錄放置在d盤根目錄下,破解後就可以使用.
	myeclipse與tomcat整合
		
	關於myeclipse下的web project部署到tomcat的目錄結構(重點)
	
	----------------------------------------------------------------------
	6.關於servlet自動加載.
		我們可以通過設置讓servlet跟隨服務器啓動而創建.
		
		只需要在servlet配置中<servlet>這個標籤中加上 <load-on-startup>2</load-on-startup>
		
		問題1:servlet跟隨tomcat啓動有什麼作用?
			就是用來加載資源。
		問題2:load-on-startup它的值可以取什麼?
			
			優先級有10個,是從1-10,1已經被佔用了,我們在使用時,一般情況下是從2開始。
			數值越小優先級越高。
			
			優先級相同情況下根據配置的順序加載。
			
	----------------------------------------------------------------------
	7.關於servlet配置中的url-pattern問題
		
		問題1:一個servlet是否可以被映射到多個路徑?
			可以的,一個servlet允許被不同的路徑映射.
			
		問題2:url-pattern它的寫法是什麼樣的?
			1.完全匹配  要求必須以 /開始。
			
			以下兩種可以使用通配符. *
			2.目錄匹配  必須以/開始,以*結束。
			3.擴展名匹配  不能以/開始,以*.xxx結束.
			
			最經典錯誤  /*.do
			
			以上三種配置有優先級:  完全匹配>目錄匹配>擴展名匹配
			
	----------------------------------------------------------------------
	複習:
		1.servlet是什麼,它的作用.
		2.怎樣創建Servlet(三步)
		3.Servlet體系
		4.關於servlet生命週期
		5.關於servlet配置.
	----------------------------------------------------------------------------
	8.web開發中的路徑問題
		問題是:瀏覽器訪問服務器有幾種訪問方式?
			1.直接在瀏覽器地址欄上輸入url
			2.超鏈接.
			3.表單
			4.javascript
			
			請求的方式最常用的是post  get
			
			除了表單可以post請求,其它的都是get請求。
			
		訪問servlet路徑問題	
			
			1.絕對路徑
				1.帶協議
					<a href="http://localhost:8080/day7_2/demo1">demo1Servlet</a>
					這種方式在開發不常用,如果使用這種方式,一般是用於訪問站外資源。
				2.不帶協議
					在瀏覽器端寫一個"/"相當於是服務器的根路徑.
					<a href="/day7_2/demo1">demo1Servlet</a>					
					對於"/"它相當於是  http://localhost:8080也就是說,我們直接在"/"後面加上我們的工程名,在加上我們的資源名稱就可以。
					這種方式在開發中應用比較多,因爲它一般用於訪問站內資源。
					
			2.相對路徑		
				
				http://localhost:8080/day7_2/demo1         servlet路徑
				http://localhost:8080/day7_2/admin.html	   html路徑
				
				通過它們的路徑,我們發現它們是一個級別,那麼我們在訪問時,就可以寫成以下效果.
				<a href="./demo1">demo1Servlet</a>
				
				這個路徑可以簡化成
				<a href="demo1">demo1Servlet</a>
					
			
			在WebRoot下創建一個jsps目錄,將admin.html放置到其中。那麼在訪問時,絕對路徑不會出問題。
			相對路徑失效。怎樣修改它?
				
						http://localhost:8080/day7_2/demo1  
						http://localhost:8080/day7_2/jsps/admin.html	

						路徑:	<a href="../demo1">demo1Servlet</a>		

			-----------------------------------------------------------------
			結論:在開發中,推薦使用不帶協議絕對路徑。
				寫法:  /工程名/servlet的url-pattern的值.
	------------------------------------------------------------------------------------------
	9.關於Servlet接口中的init方法	
		
		問題1:在Servlet接口中定義的init方法是有參數的,它的參數類型是ServletConfig,而我們重寫的init方法沒有參數,爲什麼?
		
			原因:父類中已經將init(ServletConfig  config)這個方法進行了重寫,而我們在自己的Servlet中就不需要在重寫了,
				   我們重寫的init()它不是接口中定義的,而是在父類中定義的。
				   
				   細節:在GenericServlet中對Servlet接口中的init(ServletConfig config)進行了重寫,並且調用了自己定義的一個
				        init()方法。那麼我們在自己的Servlet類中重寫了init()方法,根據多態就會調用我們自己的init()方法。						
						
		
		問題2:ServletConfig是什麼?它有什麼作用?
			
			在GenricServlet中將ServletConfig對象保存到了GenericServlet中。
			public void init(ServletConfig config) throws ServletException {
				this.config = config;
				this.init();
			}
			
			ServletConfig對象,代表的是Servlet的配置對象。
			
			當去訪問一個servlet時,就會實例化這個servlet對象,並且會創建一個servletConfig對象,將這個對象通過init方法傳遞到servlet中。
			那麼我們就可以在自己的servlet中獲取Servlet的配置信息.
			
			獲取ServletConfig對象: this.getServletConfig();
	----------------------------------------------------------------
	10.	ServletConfig對象
		
		功能:
			1.可以獲取Servlet的name。
			2.可以獲取初始化參數
				是我們可以在Servlet的配置中通過<init-param>來進行配置,
				對於這些配置,我們可以通過ServletConfig來獲取.
				
				通過初始化參數,我們可以進行預定義信息的加載,這種操作一般情況是在框架中應用。
			3.可以獲取ServletContext對象	
				
			常用API總結:
				public String getServletName();
				用於獲取Servlet名稱
				
				public String getInitParameter(String name);
				用於獲取init-param中指定名稱的value值.
				
				public Enumeration getInitParameterNames();
				用於獲取所有的init-param中的name名稱.
				
				public ServletContext getServletContext();
				用於獲取一個ServletContext對象。

		ServletConfig要求掌握內容:
			1.它是由服務器創建,通過init方法傳遞到我們的Servlet中。
			  我們在Servlet中通過  this.getServletConfig()獲取ServletConfig對象.
			  
			2.ServletConfig對象是用於獲取當前Servlet的配置信息.
				1.Servlet的名稱
				2.Servlet的初始化參數。
				
		每一個Servlet都具有自己的ServletConfig對象。它們之間是不能共享的。	

	-------------------------------------------------------------------------------------
	11.關於ServletContext對象.
		ServletContext它代表的是一個web應用。
		
		怎樣獲取一個ServletContext對象?
			可以通過ServletConfig對象獲取.
			
			ServletConfig.getServletContext();
			
		作用:
			1.它可以獲取全局初始化參數
				String getInitParameter(String name)  
				Enumeration getInitParameterNames()  
				
				在web.xml文件中可以配置我們的全局初始化參數
				<!-- 配置全局初始化參數 -->
				<context-param>
					<param-name>name</param-name>
					<param-value>tom</param-value>
				</context-param>
				
				它的配置是針對於整個web應用.
			2.它可以幫助我們讓servlet實現信息共享.
			
				ServletContext是一個域對象,提到域對象想到兩件事,一個是它相當於是一個Map,另一個它有作用域,對於
				ServletContext它的作用域是整個web應用。
				
				示例:統計站點訪問次數
					問題:怎樣判斷是第一次訪問
					
				setAttribute(String name,Object value);
				getAttribute(String name);
				removeAttribute(String name);
			
			3.可以獲取路徑(資源)***********************
			
				在web開發中,如果要想獲取資源,必須使用絕對的磁盤路徑。
				
				怎樣可以得到在服務器上的文件的絕對磁盤路徑?
					
				1.String getRealPath(String s);
					
					ServletContext.getRealPath("/"); 得到當前工程在磁盤上的絕對路徑。
				
				2.URL  gerResource(String s);
					得到一個URL路徑,它也是指向我們的web工程下的資源。
					
				3.InputStream getResourceAsStream(String s);
					得到一個指向資源的輸入流.
					
				擴展:對於classes目錄下的文件,它有其它的方式可以獲取到.
				
					Class.getResource("/").getPath();  獲取的就是class文件所有的目錄的絕對磁盤路徑。
				
					對於存在於classes目錄下的文件,我們可以通過classpath的方式去獲取其絕對磁盤路徑。				
					
				
				
			4.其它功能(瞭解)
				1.獲取MIME類型
					String getMimeType(String file)   文件下載時會用到.
					
				2.分發請求
					 RequestDispatcher getRequestDispatcher(String path)  
					 在開發中不常使用,如果使用通過request對象來操作。
				3.日誌
					log方法是用來處理日誌.
		--------------------------------------------------------------
		自己做:
			1.將筆記中所有的問題全都看一遍
			2.手動創建servlet,並描述servlet生命週期.
			3.關於url-pattern配置
			4.關於ServletContext功能描述。
			5.關於路徑問題總結.
			
			
	
		

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