1. 程式人生 > >servlet簡介轉載自 http://www.cnblogs.com/libingbin/

servlet簡介轉載自 http://www.cnblogs.com/libingbin/

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/

感謝您的閱讀。如果文章對您有用,那麼請輕輕點個贊,以資鼓勵。