1. 程式人生 > 其它 >Web基礎知識(1)- Java Servlet (一)

Web基礎知識(1)- Java Servlet (一)

Java Servlet簡介、Servlet容器和開發環境配置

 

1. Java Servlet簡介

    Java 是一種功能強大的通用型程式語言,可以處理 HTTP 請求,可以訪問資料庫,可以生成 HTML 程式碼,您完全可以使用原生 Java 來開發動態網站。但是,使用原生 Java 開發動態網站非常麻煩,需要自己解析 HTTP 請求的報頭,需要自己分析使用者的請求引數,需要自己載入資料庫元件,需要 ... 。
    
    正是基於這種原因,Java 官方後來推出了 Servlet 技術,它對開發動態網站需要使用的原生 Java API 進行了封裝,形成了一套新的 API,稱為 Servlet API。

    Servlet 是 Server Applet 的縮寫,譯為 “伺服器端小程式”,是一種使用 Java 語言來開發動態網站的技術。

    Servlet 基於 Java,可以使用幾乎全部的 Java API,所以它的功能異常強大,完全可以勝任企業級開發,能夠處理那些高併發、大吞吐量、業務邏輯複雜的應用場景。

    可以這樣理解,Servlet 是 Sun 公司推出的一種基於 Java 的動態網站開發技術。編寫 Servlet 程式碼需要遵循 Java 語法,一個 Servlet 程式其實就是一個按照 Servlet 規範編寫的 Java 類。Servlet 程式需要先編譯成位元組碼檔案(.class檔案),然後再部署到伺服器執行。


    1) Servlet 是一種規範

        嚴格來說,Servlet 只是一套 Java Web 開發的規範,或者說是一套 Java Web 開發的技術標準。只有規範並不能做任何事情,必須要有人去實現它。所謂實現 Servlet 規範,就是真正編寫程式碼去實現 Servlet 規範提到的各種功能,包括類、方法、屬性等。

        Servlet 規範是開放的,除了 Sun 公司,其它公司也可以實現 Servlet 規範,目前常見的實現了 Servlet 規範的產品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等,它們都被稱為“Servlet 容器”。Servlet 容器用來管理程式設計師編寫的 Servlet 類。


    2) Servlet 介面

        所有的 Servlet 功能都是通過一個名為Servlet的介面(Interface)向外暴露的,編寫 Servlet 程式碼,可以從實現 Servlet 介面開始,就像下面這樣:

            public class TestServlet implements Servlet {
                // TODO:
            }

        直接實現 Servlet 介面比較麻煩,需要實現很多方法,所以 Servlet 規範又提供了兩個抽象類,分別是 GenericServlet 類和 HttpServlet 類,它們都實現了 Servlet 介面的很多常用功能。和 GenericServlet 類相比,HttpServlet 類更加方便,所以實際開發中一般都繼承自 HttpServlet 類。

    3) JSP



        Servlet 是第一代 Java Web 開發技術,它將 HTML 程式碼以字串的形式向外輸出,編寫 HTML 文件就是在拼接字串,非常麻煩,所以 Java 官方又推出了第二代 Web 開發技術——JSP。

        JSP 才是現代化的 Web 開發技術,它允許 HTML 程式碼和 JSP 程式碼分離,讓程式設計師能夠在 HTML 文件中直接嵌入 JSP 程式碼。

        現在沒有人直接使用 Servlet 開發動態網站,大家都轉向了 JSP 陣營。但是 JSP 依賴於 Servlet,使用者訪問 JSP 頁面時,JSP 程式碼會被翻譯成 Servlet 程式碼,最終,HTML 程式碼還是以字串的形式向外輸出的。您看,JSP 只是在 Servlet 的基礎上做了進一步封裝。

        JSP 程式碼可以呼叫 Servlet 類,程式設計師可以將部分功能在 Servlet 中實現,然後在 JSP 中呼叫即可。

        總之,Servlet 是 JSP 的基礎,Servlet 雖然不直接面向用戶,但是它依然是 JSP 的後臺支撐,想玩轉 JSP,必須先玩轉 Servlet。

        學習順序:

            學習 Servlet 的正確順序是:Java --> Servlet。
            學習 JSP 的正確順序是:Java --> Servlet --> JSP。

    4) Servlet 版本

        截止到 2020 年 10 月,最新的 Servlet 版本是 4.0。下表列出了各種主要 Servlet 版本的釋出日期及其對應的 Java 版本。

            Servlet 版本         釋出日期       JAVA EE/JDK 版本
            Servlet 4.0        2017年10月     Java EE 8
            Servlet 3.1        2013年5月      Java EE 7
            Servlet 3.0        2009年12月    Java EE 6 / Java SE 6
            Servlet 2.5        2005年10月    Java EE 5 / Java SE 5
            Servlet 2.4        2003年11月    J2EE 1.4 / J2SE 1.3
            Servlet 2.3        2001年8月     J2EE 1.3 / J2SE 1.2
            Servlet 2.2        1999年8月     J2EE 1.2 / J2SE 1.2
            Servlet 2.1        1998年11月     未指定
            Servlet 2.0                           JDK 1.1
            Servlet 1.0        1997年6月    

2. Web 伺服器

    部署動態網站一般需要 Web 伺服器的支援,例如:

        執行 PHP 網站一般選擇 Apache 或者 Nginx;
        執行 ASP/ASP.NET 網站一般選擇 IIS;
        執行 Python 網站一般選擇內建的 WSGI 伺服器模組 — wsgiref。

    Web 伺服器是一種對外提供 Web 服務的軟體,它可以接收瀏覽器的 HTTP 請求,並將處理結果返回給瀏覽器。

    通常所說的 Web 伺服器,比如 Apache、Nginx、IIS 等,它們的功能往往都比較單一,只能提供 http(s) 服務,讓使用者訪問靜態資源(HTML 文件、圖片、CSS 檔案、JavaScript 檔案等),它們不能執行任何程式語言,也不能訪問資料庫,更不能讓使用者註冊和登入。

    也就是說,如果只有 Web 伺服器,那您只能部署靜態網站,不能部署動態網站。要想部署動態網站,必須要有程式語言執行環境(執行時,Runtime)的和資料庫管理系統的支援:

        1) 執行環境(執行時)

            開發網站使用的程式語言一般都是指令碼語言(比如 PHP、ASP、Python),部署網站時都是將原始碼直接上傳到伺服器上,然而原始碼自己並不能執行,必須要有直譯器的支援;當用戶訪問動態頁面時,直譯器負責分析、編譯和執行原始碼,然後得到處理結果。

            直譯器是執行指令碼語言的核心部件,除此以外還有一些輔助性的部件,例如:

                a) 垃圾回收器:負責及時釋放不需要的記憶體,騰出資源供其它頁面使用;
                b) 標準庫:任何程式語言都會附帶標準庫,它們提供了很多通用性的功能,極大地提高了開發效率,避免重複造輪子。

            我們習慣將以上各種支援指令碼語言執行的部件統稱為執行環境,或者執行時(Runtime)。

        2) 資料庫
        
            Web 伺服器不帶資料庫,程式語言也不帶資料庫,資料庫是一款獨立的軟體;要想實現使用者註冊、釋出文章、提交評論等功能,就必須安裝一款資料庫,比如 MySQL、Oracle、SQL Server 等。


    部署動態網站一般至少需要三個元件,分別是 Web 伺服器、指令碼語言執行時和資料庫,例如,部署 PHP 網站一般選擇「Apache + PHP 執行時 + MySQL」的組合。


3. Servlet容器

    Servlet 是基於 Java 語言的,執行 Servlet 必然少不了 JRE 的支援,它負責解析和執行位元組碼檔案(.class檔案)。然而 JRE 只包含了 Java 虛擬機器(JVM)、Java 核心類庫和一些輔助性性檔案,它並不支援 Servlet 規範。要想執行 Servlet 程式碼,還需要一種額外的部件,該部件必須支援 Servlet 規範,實現了 Servlet 介面和一些基礎類,這種部件就是 Servlet 容器。

    Servlet 容器就是 Servlet 程式碼的執行環境(執行時),它除了實現 Servlet 規範定義的各種介面和類,為 Servlet 的執行提供底層支援,還需要管理由使用者編寫的 Servlet 類,比如例項化類(建立物件)、呼叫方法、銷燬類等。

    Servlet 中的容器和生活中的容器是類似的概念:生活中容器用來裝水、裝糧食,Servlet 中的容器用來裝類,裝物件。

    Servlet 類為什麼需要 Servlet 容器來管理呢?這是因為我們編寫的 Servlet 類沒有 main() 函式,不能獨立執行,只能作為一個模組被載入到 Servlet 容器,然後由 Servlet 容器來例項化,並呼叫其中的方法。

    一個動態頁面對應一個 Servlet 類,開發一個動態頁面就是編寫一個 Servlet 類,當用戶請求到達時,Servlet 容器會根據配置檔案(web.xml)來決定呼叫哪個類。

    下圖演示了 Servlet 容器在整個 HTTP 請求流程中的位置:

        瀏覽器 <-> Web伺服器 <-> Servlet容器 <-> 資料庫
                                                    |
                                                  JRE

    Web 伺服器是整個動態網站的“大門”,使用者的 HTTP 請求首先到達 Web 伺服器,Web 伺服器判斷該請求是靜態資源還是動態資源:如果是靜態資源就直接返回,此時相當於使用者下載了一個伺服器上的檔案;如果是動態資源將無法處理,必須將該請求轉發給 Servlet 容器。

    Servlet 容器接收到請求以後,會根據配置檔案(web.xml)找到對應的 Servlet 類,將它載入並例項化,然後呼叫其中的方法來處理使用者請求;處理結束後,Servlet 容器將處理結果再轉交給 Web 伺服器,由 Web 伺服器將處理結果進行封裝,以 HTTP 響應的形式傳送給最終的使用者。

    常用的 Web 容器有 Tomcat、Jboss、Jetty、WebLogic 等,其中 Tomcat 由 Java 官方提供,是初學者最常使用的。

    為了簡化部署流程,Web 容器往往也會自帶 Web 伺服器模組,提供基本的 HTTP 服務,所以您可以不用再安裝 Apache、IIS、Nginx 等傳統意義上的伺服器,只需要安裝一款 Web 容器,就能部署 Servlet 網站了。正是由於這個原因,有的教材將 Tomcat 稱為 Web 容器,有的教材又將 Tomcat 稱為 Web 伺服器,兩者的概念已經非常模糊了。

    將 Web 容器當做伺服器使用後,上面的流程圖就變成了下面的樣子:

        瀏覽器 <-> Servlet容器 <-> 資料庫
                              |
                            JRE

    注意,Servlet 容器自帶的 Web 伺服器模組雖然沒有傳統的 Web 伺服器強大,但是也足以應付大部分開發場景,對初學者來說是足夠的。當然,也可以將傳統的 Web 伺服器和 Servlet 容器組合起來,兩者分工協作,各司其職,共同完成 HTTP 請求。

    Servlet 容器就是 Servlet 程式的執行環境,它主要包含以下幾個功能:

        (1) 實現 Servlet 規範定義的各種介面和類,為 Servlet 的執行提供底層支援;
        (2) 管理使用者編寫的 Servlet 類,以及例項化以後的物件;
        (3) 提供 HTTP 服務,相當於一個簡化的 Web伺服器。


4. 開發環境配置

    1) 系統要求

        (1) 基礎要求
    
            硬體:桌上型電腦或膝上型電腦,記憶體在 2G 以上,CPU 儘量 I3 以上(或其它CPU同等配置)
            作業系統:Windows XP/7/8/10/11、MacOS或Linux等桌面系統(達到WinXP效能以上)
            程式碼編輯器:Visual Studio Code,Sublime Text,Ultra Edit,Notepad 等(有些需要付費)。
            Java JDK: 8 以上版本
            Tomcat Server:  7 以上版本

        (2) 擴充套件要求(提高開發效率,降低開發難度)

            a) Apache Maven:

                Apache Maven 是一款基於 Java 平臺的專案管理和整合工具,它將專案的開發和管理過程抽象成一個專案物件模型(POM)。開發人員只需要做一些簡單的配置,Maven 就可以自動完成專案的編譯、測試、打包、釋出以及部署等工作。

                官方網址:https://maven.apache.org/

            b) Eclipse IDE for Enterprise Java and Web Developers:

                面向使用 Java 和 Web 應用程式的開發人員的工具,包括Java IDE、JavaScript工具、TypeScript、JavaServer 頁面和介面、Yaml、Markdown、Web服務、JPA和資料工具、Maven和Gradle、Git等。

                官方網址:https://www.eclipse.org/

            c) IntelliJ IDEA Community Edition (簡稱 IDEA,Ultimate版是付費的):

                IntelliJ IDEA Community Edition 是 IntelliJ IDEA的一個開源版本。 支援Java、XML和Groovy程式碼,支援 Ant和Maven 等構建工具,整合JUnit和TestNG測試框架,整合CVS、Subversion和git版本控制系統。

                官方網址:https://www.jetbrains.com/idea/

            *注:本文主要討論 Maven + IDEA 組合的 Servlet 開發環境。
     

    2) Windows 下配置環境

        Windows版本 : Windows 10 Home (20H2)

        (1) Java/JDK 安裝

            a) 下載 JDK
        
                https://www.oracle.com/java/technologies/downloads/
                
                下載 Windows 版的 Java 8+ 的 *.exe 檔案,預設安裝後,假設安裝目錄是 C:\Program Files (x86)\Java\jdk8.0.1。

            b) 配置環境變數
        
                右擊“我的電腦” → “屬性” → “高階系統設定” → “高階” → “環境變數”

                新建系統變數(點選“系統變數”下方的“新建”按鈕,填寫變數名與變數值,點選“確定”)

                    JAVA_HOME = C:\Program Files (x86)\Java\jdk8.0.1
                    CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

                編輯系統變數 Path (PATH)

                    Path = ... ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

                檢視Java版本,執行如下命令:
                
                   c:\> java -version

        (2) Apache Maven 配置

            https://archive.apache.org/dist/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip

            下載後解壓縮,無需安裝,只需配置。假設 Maven 相關的目錄如下:

                Maven 目錄: C:\Applications\java\apache-maven-3.8.1
                本地 Maven 倉庫: C:\Applications\java\maven-repository

            a) 配置環境變數

                右擊“我的電腦” → “屬性” → “高階系統設定” → “高階” → “環境變數”

                新建系統變數(點選“系統變數”下方的“新建”按鈕,填寫變數名與變數值,點選“確定”)

                    MAVEN_HOME = C:\Applications\java\apache-maven-3.8.1

                編輯系統變數 Path (PATH)

                    Path = ... ;%MAVEN_HOME%\bin;

            b) 修改成阿里源

                修改 C:\Applications\java\apache-maven-3.8.1\conf\settings.xml

                ...

                # 修改本地倉庫路徑
                <localRepository>C:\Applications\java\maven-repository</localRepository>

                ...

                # 修改成阿里源
                <mirror>
                    <id>alimaven</id>
                    <name>aliyun maven</name>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                    <mirrorOf>central</mirrorOf>       
                </mirror>

        (3) IntelliJ IDEA Community Edition 安裝

            https://www.jetbrains.com/idea/download/

            下載的 *.exe 檔案,預設安裝後,執行。

            配置 Maven:

                IntelliJ IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven

                    Maven home path: C:\Applications\java\apache-maven-3.8.1
                    User settings file: C:\Applications\java\apache-maven-3.8.1\conf\settings.xml
                    Local repository: C:\Applications\java\maven-repository

        (4) Tomcat Server 配置

            http://tomcat.apache.org/

            下載 64-bit Windows zip 檔案,這裡下載了 9.0.52 版本,直接解壓zip包,Tomcat目錄如下:

                C:\Applications\Java\apache-tomcat-9.0.52

            啟動 Tomcat, 執行:

                C:\Applications\Java\apache-tomcat-9.0.52\bin\startup.bat
            
            關閉 Tomcat,執行:

                C:\Applications\Java\apache-tomcat-9.0.52\bin\shutdown.bat
     
        (5) XAMPP for Windows 安裝

            https://www.apachefriends.org/download.html

            本文安裝版本 7.4.25,用到 XAMPP 的如下功能:

                + Apache 2.4.51
                + MariaDB 10.4.21 (MySQL的分支)
                + PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
                + phpMyAdmin 5.1.1


    3) macOS 下配置環境

        macOS版本 : macOS High Sierra (Version: 10.13.6)

        (1) Java/JDK 安裝

            a) 下載 JDK

                https://www.oracle.com/java/technologies/downloads/
                
                下載 macOS 版 Java 8+ 的 *.dmg 檔案,雙擊安裝。

                執行 "/usr/libexec/java_home -V" 檢視 Java 目錄,查到的目錄如下:

                    /Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home

                    *注:路徑中的 xxx 是當前的macOS使用者名稱,下同。

            b) 設定 JAVA_HOME

                修改系統配置檔案 /etc/profile (也可修改當前使用者的 ~/.bash_profile,下同)

                    $ sudo vi /etc/profile

                        JAVA_HOME=/Users/xxx/Library/Java/JavaVirtualMachines/corretto-1.8.0_302/Contents/Home
                        JRE_HOME=$JAVA_HOME/jre
                        CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
                        PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
                        export JAVA_HOME JRE_HOME CLASS_PATH PATH

                    $ source /etc/profile
                    $ echo $JAVA_HOME

                檢視Java版本,執行如下命令:

                    $ java -version

        (2) Apache Maven 配置

            下載:https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz

            下載後解壓縮,無需安裝,只需配置。假設 Maven 相關的目錄如下:

                Maven 目錄: /Users/xxx/Applications/Java/apache-maven-3.8.1
                本地 Maven 倉庫: /Users/xxx/Applications/maven-repository

            a) 配置環境變數

                修改系統配置檔案 /etc/profile

                    $ sudo vim /etc/profile

                        ...
                        MAVEN_HOME=/Users/xxx/Applications/Java/apache-maven-3.8.1
                        CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
                        PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
                        export JAVA_HOME JRE_HOME MAVEN_HOME CLASS_PATH PATH
                    
                    $ source /etc/profile
                    $ echo $MAVEN_HOME

             b) 修改成阿里源

                修改 /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml

                ...

                # 修改本地倉庫路徑
                <localRepository>/Users/xxx/Applications/maven-repository</localRepository>

                ...

                # 修改成阿里源
                <mirror>
                    <id>alimaven</id>
                    <name>aliyun maven</name>
                    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
                    <mirrorOf>central</mirrorOf>       
                </mirror>           

       (3) IntelliJ IDEA Community Edition 安裝

            https://www.jetbrains.com/idea/download/

            下載的 *.dmg 檔案,預設安裝後,執行。

            配置 Maven:

                IntelliJ IDEA -> Preferences -> Build, Execution, Deployment -> Build Tools -> Maven

                    Maven home path: /Users/xxx/Applications/Java/apache-maven-3.8.1
                    User settings file: /Users/xxx/Applications/Java/apache-maven-3.8.1/conf/settings.xml
                    Local repository: /Users/xxx/Applications/maven-repository

        (4) Tomcat Server 配置

            http://tomcat.apache.org/

            下載 64-bit tar.gz 檔案,這裡下載了 9.0.52 版本,直接解壓zip包,Tomcat目錄如下:

                 /Users/xxx/Applications/Java/apache-tomcat-9.0.52

            啟動 Tomcat, 執行:

                /Users/xxx/Applications/Java/apache-tomcat-9.0.52/bin/startup.sh
            
            關閉 Tomcat,執行:

                /Users/xxx/Applications/Java/apache-tomcat-9.0.52/bin/shutdown.sh
     
        (5) XAMPP for macOS 安裝

            https://www.apachefriends.org/download.html

            本文安裝版本 7.4.25,用到 XAMPP 的如下功能:

                + Apache 2.4.51
                + MariaDB 10.4.21 (MySQL的分支)
                + PHP 7.4.25 (VC15 X86 64bit thread safe) + PEAR
                + phpMyAdmin 5.1.1


    4) Linux 下配置環境

        Linux版本:Ubuntu 18.04

        (1) Java/JDK 安裝

                $ sudo apt-get update
                $ sudo apt-get install openjdk-8-jdk
                $ java -version

                openjdk version "1.8.0_275"
                OpenJDK Runtime Environment (build 1.8.0_275-8u275-b01-0ubuntu1~18.04-b01)
                OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)

            $ update-alternatives --config java

                There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

            設定 JAVA_HOME 和 macOS 類似。

        (2) Apache Maven 配置

            參考 macOS 下 Maven 配置

        (3) IntelliJ IDEA Community Edition

            略
        
        (4) Tomcat Server 配置

            參考 macOS 下 Tomcat 配置

        (5) XAMPP for Linux
        
            略