官术网_书友最值得收藏!

實踐任務 Java Web開發基礎知識

1.目的

(1)了解文件編碼的重要性。

(2)了解兩種網址的區別:以“/”結尾的網址與不以“/”結尾的網址。

(3)編寫Web程序,將Web程序部署到Tomcat,通過瀏覽器訪問、運行該程序。

(4)掌握將Web程序部署到Tomcat的方法。

(5)掌握Web項目虛擬路徑的概念。

2.環境

Web服務器主機:JDK 8、Tomcat 9。

編輯器:記事本。

瀏覽器:Chrome。

3.準備工作

(1)啟動Tomcat。

(2)編寫Web程序前,要確保顯示文件的擴展名。方法是:打開控制面板→文件夾選項→查看選項卡→取消如圖所示的選擇→確定。

場景1 文件字符編碼的重要性

場景1步驟

(1)在Tomcat的ROOT目錄下,新建文本文檔,重命名為“abc.jsp”。用記事本打開文件,輸入如下代碼,然后保存文件并關閉記事本。


<%
System.out.println("你好,Tomcat控制臺"); 
String realPath = request.getServletContext().getRealPath(""); 
response.getWriter().print("Web項目的根目錄或部署后的絕對物理路徑是" + realPath); 
%> 

說明1:JSP程序中,起始標記為“<%”,結束標記為“%>”,其間可以輸入Java代碼。

說明2:System.out.println(str)負責在控制臺輸出信息;response.getWriter().print(str)負責在HTML頁面中輸出信息(實際上是將str字符串添加到response響應對象的緩存中,參考4.4.1節內容)。

說明3:request和response都是JSP的內置對象,無須創建和初始化,可以直接在JSP程序中使用這些內置對象。

說明4:Web項目部署后的絕對物理路徑是指,Web項目部署到Tomcat服務器上的磁盤位置。

說明5:路徑分為物理路徑和URL路徑。

物理路徑:物理路徑描述了磁盤上物理文件的路徑,物理路徑分為絕對物理路徑和相對物理路徑。以磁盤根目錄開始的路徑就是絕對物理路徑,例如C:\a\b\c.txt\就是絕對物理路徑;不以磁盤根目錄開始的路徑就是相對物理路徑。Web開發過程中,經常使用絕對物理路徑實現文件的上傳和下載、XML文件讀取、Properties文件讀取等功能。

URL路徑:URL路徑用于定位互聯網上的物理文件。例如,在瀏覽器地址欄中輸入URL路徑就可以訪問Web服務器上的物理文件,有關URL路徑的更多知識參考2.3節內容。

(2)打開瀏覽器,輸入網址:http://localhost:8080/abc.jsp。JSP程序的執行結果出現如圖所示的中文字符亂碼問題。

同時Tomcat控制臺也出現中文字符亂碼問題,如圖所示。

說明

本例Web項目部署后的絕對物理路徑是C:\apache-tomcat-9.0.29\webapps\ROOT\。

(3)再次使用記事本打開文件,將文件另存為新文件,“編碼”處選擇UTF-8,如圖所示,替換原有文件。

注意

在簡體中文Windows操作系統中,新建的文本文檔字符編碼默認采用ANSI。

(4)重新執行步驟(2),觀察前臺頁面和Tomcat控制臺,中文字符亂碼問題已解決。

結論:相同的JSP程序,文件的字符編碼不同,結果可能不同。

知識擴展1:字符集

字符:字符(Character)是人類語言最小的表義符號,例如“A”“B”等。

字符編碼:給定一系列字符,并對每個字符匹配一個數值,用數值來代表對應的字符,這個數值就是字符編碼(Character Encoding)。例如,假設給字符“a”匹配整數97,給字符“b”匹配整數98,則97就是字符“a”的編碼,98就是字符“b”的編碼。

字符集:給定一系列字符并匹配對應的編碼后,所有這些“字符和編碼對”組成的集合就是字符集(Character Set)。常見的字符集有UTF-8、GBK、GB2312和ISO-8859-1等,其中GBK、GB2312、UTF-8支持中文字符,GB2312是GBK的子集。

ASCII里的字符都是單字節字符。同一個單字節字符在ISO-8859-1、GBK、GB2312、UTF-8中的編碼相同,因為這些字符集都向下兼容ASCII。例如小寫字母“a”,在ISO-8859-1、GBK、GB2312、UTF-8中的編碼都是“01100001”,對應十六進制數“61”(十進制數97)。正因為單字節字符的ISO-8859-1編碼、GBK編碼、GB2312編碼、UTF-8編碼相同,所以單字節字符不存在亂碼問題。這就是輸出到Tomcat控制臺的“Tomcat”沒有亂碼的原因。

但是,漢字屬于多字節字符,在GBK字符集或者GB2312字符集中,漢字需要占用2個字節(同一個漢字的GBK編碼和GB2312編碼相同);在UTF-8字符集中,漢字需要占用3個字節。同一個漢字的GBK編碼與UTF-8編碼并不相同、GBK編碼與UTF-8編碼不兼容,以及ISO-8859-1編碼不支持中文字符等,是導致Web開發過程中中文字符亂碼問題發生的主要原因。

以漢字“中”為例,GBK(或GB2312)編碼為2個字節,“11010110 11010000”,對應十六進制數“D6D0”;UTF-8編碼為3個字節,“11100100 10111000 10101101”,對應十六進制數“E4B8AD”。可見漢字“中”的GBK編碼與UTF-8編碼的不兼容。此外,ISO-8859-1不支持中文字符,如圖所示。

知識擴展2:Windows操作系統中的ANSI編碼

在Windows操作系統中新建文本文檔時,文本文檔中的字符默認采用ANSI編碼。簡體中文Windows操作系統中的ANSI編碼等效于GBK字符集,繁體中文Windows操作系統中的ANSI編碼等效于BIG5字符集,日文Windows操作系統中的ANSI編碼等效于Shift_JIS字符集。使用不同語言文字的Windows操作系統的ANSI編碼各不相同。

UTF-8、GBK和ISO-8859-1是標準字符集;而ANSI編碼只適用于Windows操作系統,并不是標準字符集。

知識擴展3:中文字符亂碼問題產生的原因和解決方案

新建的abc.jsp文件默認采用ANSI編碼,而ANSI編碼并不是標準字符集,導致Tomcat采用默認的ISO-8859-1編碼“識別”abc.jsp文件中的字符,以單字節為單位識別abc.jsp文件中的漢字,故而產生中文字符亂碼問題。

將abc.jsp文件另存為新文件,字符編碼選擇UTF-8。UTF-8是標準字符集,Tomcat采用UTF-8編碼“識別”abc.jsp文件中的字符,可解決中文字符亂碼問題。

場景2 網址末尾斜杠問題

說明

本場景依賴于場景1。

場景2步驟

(1)刪除場景1的abc.jsp文件的擴展名,重命名為abc(注意此時文件的編碼是UTF-8)。

(2)打開瀏覽器,輸入網址:http://localhost:8080/abc。執行結果如圖所示。

說明

網址中abc后面沒有斜杠。

結論1:網址http://localhost:8080/abc訪問的是ROOT目錄下的abc文件。

結論2:場景1中,abc.jsp文件的擴展名是“.jsp”,因此Tomcat將abc.jsp文件中的Java代碼交由Servlet容器解釋執行,并將執行結果返回給瀏覽器。場景2中,abc文件的擴展名不是“.jsp”,因此Tomcat將abc文件中的Java代碼作為“普通文本”返回給瀏覽器。

(3)打開瀏覽器,輸入網址:http://localhost:8080/abc/。執行結果如圖所示。

結論:網址中abc后面有斜杠,斜杠前面的abc代表的是abc目錄(并不是abc文件)。繼續進行以下步驟可以印證這一結論。

(4)將ROOT目錄下的abc.jsp文件重命名為test.jsp,在ROOT目錄下創建abc目錄。將ROOT目錄下的test.jsp文件復制到abc目錄下,再將其修改為index.jsp。

注意

該步驟較為復雜,是因為操作系統中,同一目錄下,目錄名和文件名不能同名。

(5)重新執行步驟(3)和步驟(2),執行結果雖然相同(如圖所示),但過程卻不相同。

結論1:重新執行步驟(3)時,網址中abc后面有斜杠,明確訪問的是abc目錄下的默認資源文件index.jsp。因此,瀏覽器只發出一次請求,Web服務器只做出一次響應,瀏覽器就顯示了執行結果。

結論2:重新執行步驟(2)時,瀏覽器地址欄abc后會自動添加斜杠。

分析:重新執行步驟(2)時,網址中abc后面沒有斜杠,說明訪問的是abc資源。注意這里使用abc資源更為恰當,因為abc文件是abc資源,abc目錄也是abc資源。瀏覽器先將abc資源看作abc文件,訪問ROOT目錄下的abc文件,但該文件并不存在(注意這是瀏覽器發出的第一次請求)。

Web服務器ROOT目錄下如果沒有abc文件,也沒有abc目錄,請求和響應就會結束。但Web服務器“善良無比”,檢測到ROOT目錄下雖然沒有abc文件,卻有abc目錄,abc目錄也叫作abc資源;于是將擁有abc目錄的事情“告訴”瀏覽器,并“控制”瀏覽器,讓瀏覽器重新訪問abc目錄(注意這是瀏覽器發出的第二次請求),瀏覽器最終訪問了abc目錄下的默認資源文件index.jsp。

假設ROOT目錄下沒有abc文件,也沒有abc目錄,重新執行步驟(2),若網址中abc后面沒有斜杠,瀏覽器會發送幾次請求呢?答案是一次。

結論3:在瀏覽器地址欄輸入網址時,千萬不要忽視末尾的斜杠“/”。如果末尾沒有斜杠,可能引發二次請求問題。作為Web開發人員,必須謹記:為了避免瀏覽器發出二次請求,要盡量避免網址中的資源名與Web服務器物理路徑的目錄名同名。

知識匯總:Tomcat服務器查找資源的策略(以ROOT目錄為例)。

策略1:在瀏覽器輸入網址http://localhost:8080/abc/時,Tomcat服務器查找ROOT目錄下abc目錄下的默認資源文件,分為兩種情形(整個過程,瀏覽器只發出一次請求)。

情形1:如果查找不到默認資源文件,則直接返回404錯誤,請求/響應結束。

情形2:如果查找到默認資源文件,則返回默認資源文件,請求/響應結束。

策略2:在瀏覽器輸入網址http://localhost:8080/abc時,瀏覽器發出第一次請求,Tomcat服務器查找ROOT目錄下的abc資源(abc文件和abc目錄都是abc資源),Tomcat服務器優先查找abc文件,如果查找到abc文件,則直接返回該文件,請求/響應結束(整個過程,瀏覽器只發出一次請求)。如果沒有查找到abc文件,Tomcat服務器則查找abc目錄,分為兩種情形。

情形1:如果查找不到abc目錄,則直接返回404錯誤,請求/響應結束(整個過程,瀏覽器只發出一次請求)。

情形2:如果查找到abc目錄,Tomcat服務器將“查找到abc目錄”的消息發給瀏覽器,并控制瀏覽器發出第二次請求(第二次請求的網址是http://localhost:8080/abc/),Tomcat服務器查找abc目錄下的默認資源文件(整個過程,瀏覽器發出了兩次請求),其余過程請參考策略1。

場景3 Tomcat中webapps目錄和ROOT目錄優先級問題

說明

默認情況下,Tomcat安裝目錄的conf目錄中,server.xml配置文件存在如下配置選項。這就意味著,webapps目錄也可以用于存放Web程序,Tomcat會自動加載webapps目錄下的Web程序。ROOT目錄也位于webapps目錄下,ROOT目錄相當于webapps的默認資源目錄。


<Host name="localhost"  appBase="webapps"
              unpackWARs="true" autoDeploy="true"> 

問題:webapps目錄和ROOT目錄都可以存放項目,如果項目名稱相同,會優先訪問哪個項目?

答案詳見以下步驟。

場景3步驟

(1)接場景2的步驟(4)。

(2)在Tomcat安裝目錄下的webapps目錄下,新建abc文件夾(空文件夾),重新執行場景2的步驟(2),執行結果如圖所示。

分析:webapps目錄下的abc目錄的默認資源文件不存在,因此出現404錯誤。

結論:當webapps目錄下的項目名與ROOT目錄下的項目名同名時,ROOT目錄下的Web項目將被“隱身”。

(3)將ROOT目錄下的abc目錄下的index.jsp,重命名為test.jsp。然后將test.jsp復制到ROOT目錄下,刪除ROOT目錄下的abc目錄。然后將test.jsp重命名為abc。

(4)重新執行場景2的步驟(2),執行結果如圖所示。

分析:webapps目錄下的abc目錄的默認資源文件不存在,因此出現404錯誤。

結論:當webapps目錄的項目名與ROOT目錄下的文件名同名時,ROOT目錄下的同名文件會被“隱身”。

知識匯總:webapps目錄下的Web項目優先級高于ROOT目錄下的Web項目。舉例來說,webapps目錄下的abc目錄,會使ROOT目錄下的abc文件或者abc目錄“隱身”。

知識回顧:步驟(3)和步驟(4)中訪問的目的資源是abc(不帶斜杠),由于webapps目錄下存在abc目錄,因此在步驟(3)和步驟(4)中,瀏覽器地址欄abc后都會自動添加斜杠,都向Tomcat服務器發送了兩次請求。Web開發人員應該避免網址中的目的資源名與Web服務器的目錄名同名。

場景4 任意的物理絕對路徑都可以部署Web項目(方法一)

說明

物理絕對路徑中不要包含中文字符。

場景4 準備工作

(1)在C盤根目錄下,創建test目錄。

(2)在test目錄下新建文本文檔,然后重命名為“index.jsp”,參考場景1的步驟,輸入場景1的代碼,注意文件編碼使用UTF-8。保存文件并關閉記事本。

場景4步驟

(1)打開Tomcat安裝目錄,打開conf目錄,用記事本打開server.xml配置文件,找到如下配置選項。


<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"> 

(2)在上述代碼后,輸入如下配置選項,然后保存server.xml配置文件并關閉記事本。


<Context docBase="C:/test/" path="/abc/" /> 

注意

Java是區分大小寫的,需要注意Context、docBase和path中字母的大小寫。

說明1:docBase配置了Web項目部署到Tomcat后的絕對物理路徑,也稱為Web項目的根目錄;path配置的Web項目虛擬路徑必須以“/”開頭,表示以Web服務器的根目錄為起始目錄。該配置選項的主要目的是“告訴”Web服務器,Web項目的虛擬路徑與Web項目根目錄之間的對應關系。

在瀏覽器地址欄輸入網址http://localhost:8080/abc/時,Web項目虛擬路徑“/abc/”會指向Web服務器上的絕對物理路徑“C:/test/”,然后訪問“C:/test/”里的默認資源文件(這里是index.jsp)。

說明2:Web項目虛擬路徑,通常作為URL路徑的一部分。

(3)停止Tomcat服務,再次啟動Tomcat服務。

Tomcat配置文件server.xml一旦被修改,就需要重啟Tomcat服務,修改后的配置文件才能生效。

注意

啟動Tomcat時,Tomcat會自動加載docBase指定的目錄,如果參數錯誤或者目錄不存在,就會導致Tomcat啟動失敗。

(4)打開瀏覽器,輸入網址http://localhost:8080/abc,執行結果如圖所示。

通過上述步驟,成功地將“C:\test\”部署為Web項目的絕對物理路徑。

注意

“C:/test/”中Web項目的存在導致webapps目錄下的abc項目被“隱身”。

場景5 任意的物理絕對路徑都可以部署Web項目(方法二)

說明

本場景依賴于場景4準備工作。

場景5步驟

(1)打開C:\apache-tomcat-9.0.29\conf\Catalina\localhost目錄,新建文本文檔,重命名為hello.xml。

(2)用記事本打開hello.xml,輸入如下配置選項,然后保存配置文件并關閉記事本。


<Context docBase="C:/test/" /> 

分析:hello.xml配置文件的文件名hello(不包括擴展名)配置了Web項目虛擬路徑,docBase配置了Web項目部署后的絕對物理路徑。

(3)無須手動重啟Tomcat服務。

(4)打開瀏覽器,輸入網址http://localhost:8080/hello,執行結果如圖所示。

知識匯總:場景4和場景5中,配置了兩個虛擬路徑,分別是/hello/和/abc/,它們都指向C:\test\。

使用場景4的方法,需要手動重啟Tomcat服務。使用場景5的方法,Tomcat服務會自動重啟。

說明

取消發布的Tomcat項目時,不要忘記刪除server.xml配置中對應的Context,也不要忘記刪除C:\apache-tomcat-9.0.29\conf\Catalina\localhost目錄下對應的XML文件,更不要忘記重啟Tomcat服務。

主站蜘蛛池模板: 衡山县| 东辽县| 迁西县| 东乌| 临朐县| 桑日县| 库伦旗| 利辛县| 崇左市| 谢通门县| 安国市| 恭城| 特克斯县| 疏勒县| 筠连县| 崇州市| 达孜县| 宣威市| 宽城| 天水市| 普兰县| 常德市| 武城县| 漠河县| 靖边县| 襄樊市| 内丘县| 山东省| 富锦市| 连南| 翁源县| 广西| 双城市| 旬邑县| 嘉兴市| 新河县| 扬州市| 灵川县| 邢台市| 焦作市| 怀化市|