JavaWeb三大組件之Servlet


一、基本概念

WEB,在英語中web即表示網頁的意思,它用於表示Internet主機上供外界訪問的資源。Internet上供外界訪問的Web資源分為:

  1、靜態web資源(如html 頁面):指web頁面中供人們瀏覽的數據始終是不變

  2、動態web資源:指web頁面中供人們瀏覽的數據是由程序產生的,不同時間點訪問web頁面看到的內容各不相同。常用動態web資源開發技術:JSP/Servlet、ASP、PHP等,在Java中,動態web資源開發技術統稱為Javaweb。

靜態WEB中存在以下幾個缺點:

  1、Web頁面中的內容無法動態更新,所有的用戶每時每刻看見的內容和最終效果都是一樣的。為了可以讓靜態的WEB的顯示更加好看,可以加入了JavaScript以完成一些頁面上的顯示特效,但是這些特效都是在客戶端上借助於瀏覽器展現給用戶的,所以在服務器上本身並沒有任何的變化。

  2、靜態WEB無法連接數據庫,無法實現和用戶的交互。使用數據庫保存數據是現在大多數系統的選擇,因為數據庫中可以方便地管理數據,增刪改查操作可以使用標准的SQL語句完成。

動態WEB:

所謂的動態不是指頁面會動,主要的特性的是:“WEB的頁面展示效果因時因人而變”,而且動態WEB具有交互性,WEB的頁面的內容可以動態更新。整個動態WEB操作的過程圖如下:

動態WEB中,程序依然使用客戶端和服務端,通過網絡(Network)連接到服務器上,使用HTTP協議發起請求(Request),現在的所有請求都先經過一個WEB Server Plugin(服務器插件)來處理,此插件用於區分是請求的是靜態資源(*.htm或者是*.htm)還是動態資源。

  • 如果WEB Server Plugin發現客戶端請求的是靜態資源(*.htm或者是*.html),則將請求直接轉交給WEB服務器,之后WEB服務器從文件系統中取出內容,發送回客戶端瀏覽器進行解析執行。
  • 如果WEB Server Plugin發現客戶端請求的是動態資源(*.jsp、*.asp/*.aspx、*.php),則先將請求轉交給WEB Container(WEB容器),在WEB Container中連接數據庫,從數據庫中取出數據等一系列操作后動態拼湊頁面的展示內容,拼湊頁面的展示內容后,把所有的展示內容交給WEB服務器,之后通過WEB服務器將內容發送回客戶端瀏覽器進行解析執行。

二、WEB服務器

對於“Web服務器”的多種定義和解讀:

  1. Web服務器,一般是指“網站服務器”,是指駐留於互聯網上某種類型計算機的程序。Web服務器可以向Web瀏覽器等客戶端提供文檔,也可以放置網站文件,讓全世界瀏覽,更可以放置數據文件,讓全世界下載。
  2. Web服務器是一種被動程序,只有當互聯網上運行的、其他計算機中的瀏覽器發出請求時,Web服務器才會響應。
  3. Web服務器,是指駐留於互聯網上某種類型計算機的程序。當Web瀏覽器(客戶端)連到Web服務器上,並請求文件時,Web服務器將處理該請求,並將文件發送反饋到Web瀏覽器上,附帶的信息會告訴Web瀏覽器如何查看該文件。由於Web服務器,使用HTTP(超文本傳輸協議)與客戶機瀏覽器進行信息交流,所以人們常把它們稱為“HTTP服務器”。

目前最常用的Web服務器是: Apache (阿帕奇)的Tomcat服務器和 Microsoft(微軟)的互聯網信息服務器(英文全寫:Internet Information Services,縮寫:IIS,即“互聯網信息服務”)。

 

三、Tomcat服務器

學習web開發,為什么必須要先裝一個WEB服務器?

  在本地計算機上隨便創建一個web頁面,用戶是無法訪問到的,但是如果啟動tomcat服務器,把web頁面放在tomcat服務器中,用戶就可以訪問了。這說明什么問題?
  1、不管什么web資源,想被遠程計算機訪問,都必須有一個與之對應的網絡通信程序,當用戶來訪問時,這個網絡通信程序讀取web資源數據,並把數據發送給來訪者
  2、WEB服務器就是這樣一個程序,它用於完成底層網絡通迅。使用這些服務器,We應用的開發者只需要關注web資源怎么編寫,而不需要關心資源如何發送到客戶端手中,從而極大的減輕了開發者的開發工作量。


 

 【1】Servlet簡介

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

        > 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>

【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");
 

[9] 路徑問題

> URI和URL

- URI,統一資源標志符(Uniform Resource Identifier, URI),表示的是web上每一種可用的資源,如 HTML文檔、圖像、視頻片段、程序等都由一個URI進行標識的。URI只是一種概念,怎樣實現無所謂,只要它唯一標識一個資源就可以了。

- URL是URI的一個子集。它是Uniform Resource Locator的縮寫,譯為“統一資源定位符”。

> 總結:只要能唯一標識資源的就是URI,在URI的基礎上給出其資源的訪問方式的就是URL

 

> URL地址的格式
            http://主機名:端口號/項目名/資源路徑/資源名
 
        ①相對路徑和絕對路徑
            > 相對路徑
                - 所謂的相對路徑指相對於當前資源所在路徑:
                    http://主機名:端口號/項目名/資源路徑/
            - 由於轉發的出現,相對路徑會經常發生變化,容易出現錯誤的鏈接
                所以在開發中我們一般不使用相對路徑,而是使用絕對路徑。
 
            > 絕對路徑
            - 絕對路徑使用 / 開頭   
            - 由 瀏覽器解析的絕對路徑中的 / 代表的是服務器的根目錄:
                http://主機名:端口號/
                注意:指定路徑時需要加上項目名
 
            - 由 服務器解析的絕對路徑中的 / 代表的項目的根目錄:
                http://主機名:端口號/項目名/
                注意:指定路徑時不要加項目名
 
            - 轉發的路徑由服務器解析,設置絕對路徑時不需要加項目名
            - 重定向的路徑由瀏覽器解析,設置絕對路徑時需要加上項目名
 
 
        ②常見的路徑:
            url-pattern:
            轉發的路徑:
                - url-pattern和轉發中的路徑都是由服務器解析的,
                    根目錄是項目的根目錄:
                        http://主機名:端口號/項目名/
                - 所以這兩個路徑不需要加項目名
 
            重定向的路徑:
            頁面中的路徑:
                - 重定向和頁面中的路徑(HTML標簽中的路徑),由瀏覽器解析的,
                    根目錄是服務器的根目錄:
                        http://主機名:端口號/
                - 所以這個兩個路徑必須加上項目名
 

[10]運行的流程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM