Servlet簡介與Servlet和HttpServlet運行的流程

1.Servlet html

    [1] Servlet簡介java

        > Server + let程序員

        > 意爲:運行在服務器端的小程序。web

        > Servlet實際上就是一個接口。小程序

            - 狹義上的Servlet,指的就是Servlet接口瀏覽器

            - 廣義上的咱們認爲凡是實現Servlet接口的類,咱們都稱他是一個Servlet *****安全

        > Servlet的做用:服務器

            1.接收用戶發送的請求多線程

            2.調用其餘的java程序來處理請求app

            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

相關文章
相關標籤/搜索