1.Servlet
[1] Servlet簡介 > Server + let > 意為:運行在服務器端的小程式, > Servlet實際上就是一個介面, - 狹義上的Servlet,指的就是Servlet介面 - 廣義上的我們認為凡是實作Servlet介面的類,我們都稱他是一個Servlet ***** > Servlet的作用: 1.接收用戶發送的請求 2.呼叫其他的java程式來處理請求 3.根據處理結果,回傳給用戶一個頁面 > Servlet的HelloWorld 1.創建一個類并實作Servlet介面 2.在web.xml檔案中對Servlet進行配置 <servlet> <servlet-name>別名</servlet-name> <servlet-class>全類名</servlet-class> </servlet> <servlet-mapping> <servlet-name>別名</servlet-name> <url-pattern>需要servlet處理的請求地址</url-pattern> </servlet-mapping> > Servlet的三個名字: <servlet-name> - Servlet的別名,程式員通過別名對Servlet進行配置 <servlet-class> - Servlet的全類名,服務器通過全類名來創建Servlet的實體 <url-pattern> - Servlet映射的請求地址,用戶通過該地址訪問Servlet [2] Servlet的生命周期 > Servlet的生命周期,指Servlet的物件從被創建到被銷毀的程序, > Servlet的生命周期方法: 1.構造器: - Servlet第一次處理請求時,會呼叫構造器,來創建Servlet實體, - 只會呼叫一次,Servlet是單例模式,他是以多執行緒的方式呼叫service()方法. - Servlet不是執行緒安全,所以盡量不要再service()方法中操作全域變數, 2.init()方法: - 構造器呼叫之后馬上被呼叫,用來初始化Servlet,只會呼叫一次, 3.service()方法: - Servlet每次處理請求時都會呼叫service()方法,用來處理請求,會呼叫多次, 4.destroy()方法: - Servlet物件銷毀前(WEB專案卸載時)呼叫,用來做一些收尾作業,釋放資源, [3] 相關介面 ①ServletConfig 代表:當前Servlet的配置資訊,每一個Servlet都有其唯一對應的ServletConfig, <servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.atguigu.servlet.AServlet</servlet-class> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123123</param-value> </init-param> </servlet> 獲取:由Tomcat服務器創建,最終作為引數傳遞到init()方法中,我們可以在init()方法直接使用, 當我們通過繼承HttpServlet創建Servlet時,由于父類已經實作ServletConfig介面, 所以我們可以在Servlet中直接呼叫ServletConfig的方法, 功能: 【1】 獲取Servlet的別名 【2】 獲取當前Servlet的初始化引數, <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123123</param-value> </init-param> 【3】 獲取當前WEB應用的ServletContext物件, ②ServletContext 代表:當前的WEB應用,一個WEB應用對應一個唯一的ServletContext物件, ServletContext物件在專案啟動時創建,在專案卸載時銷毀, 獲取:通過ServletConfig的getServletContext()方法獲取, 功能: 【1】 可以獲取整個WEB應用的初始化引數 <context-param> <param-name>phone</param-name> <param-value>1388888888</param-value> </context-param> 【2】 可以獲取資源的真實路徑(物理路徑),主要在檔案的上傳和下載時使用, 【3】 可以作為一個域物件在不同的web資源之間共享資料,(下回分解) [4] GenericServlet - 通用Servlet的父類 - 相比Servlet介面GenericServlet更加簡單一些,但是我們最終實際上使用的HttpServlet [5] HttpServlet - HttpServlet繼承了GenericServlet,而GenericServlet實作Servlet介面 - 所以我們可以同構繼承HttpServlet來創建一個Servlet, - HttpServlet重寫service()方法: 1.在該方法中先將ServletRequest和ServletResponse 強轉為了HttpServletRequest和HttpServletResponse, 2.然呼叫多載的service()方法,并將剛剛強轉得到物件傳遞到多載的方法中, - 多載service(HttpServletRequest request , HttpServletResponse response) 1.在方法中獲取請求的方式(get或post) 2.在根據不同的請求方式去呼叫不同的方法: 如果是GET請求,則呼叫doGet(HttpServletRequest request , HttpServletResponse response) 如果是post請求,則呼叫doPost(HttpServletRequest request , HttpServletResponse response) - 結論: 當通過繼承HttpServlet來創建一個Servlet時,我們只需要根據要處理的請求的型別,來重寫不同的方法, 處理get請求,則重寫doGet() 處理post請求,則重寫doPost() [6] HttpServletRequest 代表:瀏覽器發送給服務器的請求報文, 獲取:該物件由Tomcat服務器創建,最終作為引數傳遞到doGet或doPost方法中,我們可以在這兩個方法中直接使用, 功能: 【1】獲取用戶發送的請求引數 request.getParameter("username"); 【2】獲取專案的名字(用來設定絕對路徑) request.getContextPath(); 【3】作為一個域物件,在不同的WEB資源之間共享資料, 【4】請求的轉發 request.getRequestDispatcher("target.html").forward(request, response); [7] HttpServletResponse 代表:服務器發送給瀏覽器的回應報文, 獲取:該物件由Tomcat服務器創建,最終作為引數傳遞到doGet或doPost方法中,我們可以在這兩個方法中直接使用, 功能: 【1】回應給瀏覽器一個網頁或者是網頁片段(設定的是回應報文的回應體) response.getWriter(""); 【2】請求的重定向 response.sendRedirect("target.html"); 轉發和重定向:(掌握) 轉發 重定向 請求的次數: 1 2 發生的位置 服務器內部 瀏覽器 瀏覽器地址欄 不改變 改變 瀏覽器的感知 不知道 知道 [8] 字符編碼 > 當用戶通過表單向Servlet發送中文請求引數時,Servlet獲取到內容會產生亂碼, 當Servlet向瀏覽器回應中文內容時,也會產生亂碼, > 瀏覽器和服務器之間通信時,中文內容時不能直接發送的,需要對中文進行編碼, > 編碼: - 將字符轉換為二進制碼的程序叫編碼, > 解碼: - 將二進制碼轉換為普通字符的程序叫解碼, > 編碼和解碼所采用的規則我們稱為字符集, > 產生亂碼問題的根本原因: 編碼和解碼所采用的字符集不同, > 解決方法: 統一編碼和解碼的字符集為UTF-8, > 常見字符集: 1.ASCII 2.ISO8859-1 3.GBK 4.GB2312 5.UTF-8 > 請求編碼 - 請求是瀏覽器發送給服務器的, - 瀏覽器 --> 服務器 - 瀏覽器 編碼 > 瀏覽器的會自動使用網頁的字符集對引數進行編碼 UTF-8的張三:%E5%BC%A0%E4%B8%89 GBK的張三:%D5%C5%C8%FD > 所以我們只需要統一網頁的字符集為UTF-8即可, - 服務器 解碼 post請求 > request解碼時默認字符集時iso8859-1,但是iso壓根就不支持中文 > post請求在servlet中解碼,所以我們只需要指定request的字符集即可, > 我們可以通過如下方法,來設定request的字符集: request.setCharacterEncoding("utf-8"); > 注意: 該方法要在request.getParameter()第一次呼叫之前呼叫 get請求 > get請求是通過url地址傳遞請求引數,url中的請求引數將會被Tomcat服務器自動解碼, > Tomcat的默認編碼是iso8859-1,但是iso壓根就不支持中文,所以必然亂碼, > 只需要修改Tomcat的解碼的默認字符集,修改組態檔server.xml > 在server.xml的Connector標簽中(改埠號的那個標簽)添加如下屬性: URIEncoding="utf-8" > 修改完組態檔以后,get請求的編碼就不用再處理的,但是post請求還是老樣子, > 回應編碼 - 回應是服務器發送給瀏覽器 - 服務器 --> 瀏覽器 - 服務器 編碼 > 指定服務器的編碼字符集為UTF-8, > 指定response的字符集 response.setCharacterEncoding("utf-8"); > 雖然我們已經指定了response的字符集為utf-8,但是瀏覽器并不是用utf-8解碼, 瀏覽器默認使用gb2312解碼的,所以依然亂碼,只不過沒有那么亂, - 瀏覽器 解碼 > 瀏覽器的解碼字符集可以通過瀏覽器來設定(不靠譜) > 我們可以通過服務器來告訴瀏覽器,我們的內容的編碼格式為utf-8 > 我們可以通過一個回應頭來告訴瀏覽器,內容的編碼格式: Content-Type:text/html;charset=utf-8 > 通過response的方法,來設定回應頭: response.setHeader("Content-Type", "text/html;charset=utf-8"); 解決方案: 1.設定回應頭 response.setHeader("Content-Type", "text/html;charset=utf-8"); 2.設定response的編碼格式 response.setCharacterEncoding("utf-8"); > 當我們設定Content-Type這個回應頭時,服務器會自動使用回應頭中的字符集為內容編碼, > 最終方案: response.setContentType("text/html;charset=utf-8"); 總結: post請求: - 在request.getParameter()方法第一次呼叫之前,呼叫如下代碼: request.setCharacterEncoding("utf-8"); get請求: - 修改server.xml組態檔 - <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 回應: - 設定一個Content-Type回應頭 response.setContentType("text/html;charset=utf-8"); [9] 路徑問題 > URI和URL - URL是URI的一種實作,也是URI最常見的實作方式, - URI有兩種實作方式URL和URN,URN用的很少 - 我們說URL和URI實際上可以理解為一個意思 > URL地址的格式 http://主機名:埠號/專案名/資源路徑/資源名 ①相對路徑和絕對路徑 > 相對路徑 - 之前我們使用的路徑全都是相對路徑: - 所謂的相對路徑指相對于當前資源所在路徑: http://主機名:埠號/專案名/資源路徑/ - 由于轉發的出現,相對路徑會經常發生變化,容易出現錯誤的鏈接 所以在開發中我們一般不使用相對路徑,而是使用絕對路徑, > 絕對路徑 - 絕對路徑使用/開頭 - 由瀏覽器決議的絕對路徑中的/代表的是服務器的根目錄: http://主機名:埠號/ 注意:需要加上專案名 - 由服務器決議的絕對路徑中的/代表的專案的根目錄: http://主機名:埠號/專案名/ 注意:不要加專案名 - 轉發的路徑由服務器決議,設定絕對路徑時不需要加專案名 - 重定向的路徑由瀏覽器決議,設定絕對路徑時需要加上專案名 ②常見的路徑: url-pattern: 轉發的路徑: - url-pattern和轉發中的路徑都是由服務器決議的, 根目錄是專案的根目錄: http://主機名:埠號/專案名/ - 所以這兩個路徑不需要加專案名 重定向的路徑: 頁面中的路徑: - 重定向和頁面中的路徑(HTML標簽中的路徑),由瀏覽器決議的, 根目錄是服務器的根目錄: http://主機名:埠號/ - 所以這個兩個路徑必須加上專案名
[10]運行的流程

[11]HttpServlet

轉載于:http://www.cnblogs.com/libingbin/
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/40884.html
標籤:Java
上一篇:Go Web爬蟲并發實作
下一篇:JAVA對檔案的一些操作
