第6天:Servlet相關知識(二)

Servlet相關知識2
1、Http協議
    (1)是什麼?
        hypertext transfer protocol 超文本控制傳輸協議。
        (W3C)定義了瀏覽器與web服務器之間數據傳輸的方式與數據格式。
    (2)數據傳輸的方式
        a、瀏覽器請求建立連接。
        b、瀏覽器向服務器發送請求。
        c、服務器處理請求。
        d、服務器發送響應,然後立即關閉連接。
        如果瀏覽器想向服務器再發送一個請求,需要重新請求建立連接。
    (3)數據格式
        a、請求數據包
            1)請求行
                請求方式(get/post) 請求資源的路徑 http協議版本
            2)若干消息頭
                瀏覽器與服務器之間通訊的一些約定
                比如:瀏覽器會告訴服務器用的是什麼瀏覽器,是否緩存等。
            3)實體內容
                如果是post方式,請求數據會存放到實體內容裏面
                如果是get方式,會放到請求行中的請求資源路徑後面
        b、響應數據包
            1)狀態行
                協議版本號 狀態碼 狀態碼描述
                狀態碼:
                    200 OK(正常)
                    404 Not Found(找不到資源)
                    500 Internal Server Error(服務器內部錯誤)
            2)若干消息頭
                比如服務器可以向瀏覽器發送cookie
            3)實體內容
                服務器處理完之後的結果,一般要求瀏覽器顯示的數據
2、get/post請求方式
    (1)get方式:
        a、表單默認提交的方式
        b、直接在瀏覽器地址欄輸入地址
        c、通過鏈接訪問某個地址
    (2)get方式的特點:
        在地址欄會顯示請求數據。
        請求數據會放到請求資源路徑的後面
        get方式一般用於向服務器獲取資源
        瀏覽器有可能緩存get方式訪問過的資源
    (3)post方式:
        設置表單method="post"
    (4)post方式的特點:
        a、數據不會在地址欄顯示
        b、數據會存放在實體內容裏
        c、post方式一般用於向服務器提交數據
    (5)有缺點比較
        get方式提交數據有兩個缺點:
            a、提交的數據量有限制(因爲只能存放到請求行之後)
            b、不安全(在瀏覽器地址欄能看到數據)
        post方式提交數據有優點:
            a、數據量大(因爲存放在實體內容裏面)
            b、相對安全(但是實體內容裏面的數據仍然沒有加密,可以藉助工具查看)
3、重定向
    (1)什麼是重定向:
        服務器向瀏覽器發送一個狀態碼302及一個消息頭location,瀏覽器會立即向location所指定的地址發送一個新的請求。
    (2)編程:
        response.sendRedirect(重定向的地址);
    (3)重定向的特點及注意事項:
        a、重定向的地址是任意的;
        b、瀏覽器地址欄的地址會變成重定向的地址;
        c、一件事情已經做完。
        d、在重定向之前,不能夠有任何的輸出。如果緩存當中有數據,重定向之前會先清空緩存中的數據。
4、服務器如何處理url地址
    比如在瀏覽器地址欄輸入http://ip:port/appname/abc.html
    瀏覽器會依據ip、port連接服務器,然後,會將/appname/abc.html存放到請求數據包的請求行。
    服務器如何處理"/appname/abc.html"?
        step1   服務器會查看有沒有appname對應的應用存在,若沒有,則返回404;
                若有,則進行下一步。
        step2   在web.xml中,使用"/abc.html"與url-pattern進行匹配:
                    a、精確匹配:要求精確匹配。
                    b、模糊匹配(使用通配符*)
                        * 代表任意的字符串。
                        比如:/some  /some/*  /some/dsfk/fdksjk 以上三種均對應同一個Servlet地址
                    c、後綴匹配
                        不能以"/"開頭  比如: *.do 表示以.do結尾的請求
        step3   如果仍然不匹配,會查詢靜態資源。
                如果能找到該資源,則返回,找不到,返回404
5、servlet的生命週期與核心的類與接口
    (1)核心的類與接口
        Servlet接口
            a、所有的Servlet,必須實現該接口;
            b、該接口定義了三個方法:
                init(ServletConfig config)  初始化方法
                service(ServletRequest request, ServletResponse response)   處理請求
                destroy()   銷燬資源
        Genericervlet抽象類,部分實現了Servlet接口,實現了init、destroy方法。
        HttpServlet抽象類,繼承Genericervlet,實現了service()方法。
            service(HttpServletRequest request, HttpServletResponse response);
            HttpServletRequest是ServletRequest子接口
            HttpServletResponse是ServletResponse子接口
    (2)生命週期
        什麼是生命週期:Servlet容器如何去創建Servlet實例,分配資源,調用其方法,最後銷燬的整個過程。
        分四個階段:
            a、實例化:調用缺省的構造器,創建對象。
                創建對象的時機:
                    1)當請求到達Servlet容器時,如果要訪問的servlet沒有對應的實例,則會創建;
                    2)當服務器啓動時會,會檢查web.xml中的配置,如果<load-on-startup>1</load-on-startup>
                        "1"表示優先級,值越小、優先級越高。
            b、初始化:分配資源
                Servlet容器創建servlet實例後一定會執行init()方法。
                默認的init()由GenericServlet來實現。如果想定義自己的初始化過程,可以override init()方法。
                方式一:override init(ServletConfig config)
                    public void init(ServletConfig config) {
                        this.config = config;
                        this.init();
                    }
                方式二:override init()
                    //空方法!“鉤子方法”,由子類實現
                    public void init() {
                    }
                最好使用方式二。初始化只有一次。
            c、就緒,執行service()方法
                HttpServlet的service()方法,會依據get/post請求,分別調用對應的doGet()和doPost()方法。
                我們開發的servlet,可以override service();或者override doGet()/doPost();
            d、銷燬:容器依據自己的算法,會刪除servlet實例,在刪除之前,會調用destory()方法,釋放資源。
                    該方法只會執行一次。

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