JavaWeb-Servlet的總結
阿新 • • 發佈:2018-10-31
轉載於傳智播客教程.
今天內容 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目錄路徑。 ----------------------------------------------------------