Web頁面或app等前端頁面之Java Web的JSP、Servlet、Cookie、Session等技術小結

新鼬發表於2020-11-28

Java Web學習,掌握JSP、Servlet、Cookie、Session等內容,使用JSTL進行資料展示完成實際應用。

2.3.1 XML基礎

XML的用途、語法規則、語義約束、如何解析XML,以及XPath表示式等內容。
內容:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
XML是什麼?
在這裡插入圖片描述
XML與HTML的比較:
在這裡插入圖片描述
XML的用途:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
配置檔案是在專案啟動過程中,根據配置項載入對應的檔案內容,執行相應的程式碼。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
XML文件結構:
在這裡插入圖片描述
在這裡插入圖片描述
ISO8859-1不支援中文。
XML標籤書寫規則:
在這裡插入圖片描述
1.在這裡插入圖片描述
3.在這裡插入圖片描述
在這裡插入圖片描述
4.在這裡插入圖片描述
XML支援五種實體引用;
在這裡插入圖片描述
CDATA標籤:
在這裡插入圖片描述
5.有序的子元素:
在這裡插入圖片描述
XML語義約束:
在這裡插入圖片描述
在這裡插入圖片描述
規定XML文件中允許出現的節點及數量、屬性。
在這裡插入圖片描述

<!ATTLIST>中的employee是標籤名,no是屬性名,CDATA是子節點型別名稱,””代表屬性預設值.

在這裡插入圖片描述
在這裡插入圖片描述
一般來講純文字節點就是沒有子節點。
DTD定義節點數量:
在這裡插入圖片描述
在這裡插入圖片描述
XML引用DTD檔案:
在這裡插入圖片描述
SYSTEM是本地載入dtd檔案的意思。
dtd檔案建議和xml檔案同名。
dtd檔案,節點與之後的括號之間需要新增空格,這個是dtd檔案的規定,否則無法生效。
XML Schema:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
Schema檔案以.xsd結尾,第一個宣告根節點,包含子節點的時候必須要有 屬性帶資料型別,
complexType 標籤的含義是複雜的節點,包含子節點時必須使用這個標籤,sequence 下面的節點必須按順序排序,minOccurs 屬性可以設定標籤出現的最少次數,maxOccurs 屬性可以設定標籤出現的最多次數,標籤 simpleType 設定限制(設定資料範圍)

<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="100"></maxInclusive>
</restriction>
</sippleType>
<schema xmlns="http://www.w3.org/2001/XMLSchema">Schema檔案加上屬性xmlns後邊屬性xml檔案會報錯。

常用的資料型別有string integer 在element 標籤中設定type屬性,
加入標籤的屬性 <attribute name=”no" type=”string” use="required"></attribute>
引入在根節點開頭的位置 <hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xx.xsd">xx代表的是引入Schema 檔案的名字。
<!-- complexType標籤含義是複雜節點,包含子節點時必須使用這個標籤 -->
<!-- sequence標籤含義是序列,保持有序 -->
<xx xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xx.xsd">1、xmlns其實是XML Namespace的縮寫,表示名稱空間.2、xmlns:xsi表示使用xsi作為字首的Namespace,當然字首xsi需要在文件中宣告。3、xsi:noNamespaceSchemaLocatio其實是Namespace為http://www.w3.org/2001/XMLSchema-instance裡的noNamespaceSchemaLocatio屬性.

DOM文件物件模型:
在這裡插入圖片描述
在這裡插入圖片描述
DOM4J:
在這裡插入圖片描述
XML DOM與HTML DOM的關係:DOM 是定義了訪問 HTML 和 XML 文件的標準:“W3C 文件物件模型 (DOM) 是中立於平臺和語言的介面,它允許程式和指令碼動態地訪問和更新文件的內容、結構和樣式。”W3C DOM 標準被分為 3 個不同的部分:1. 核心 DOM - 針對任何結構化文件的標準模型。 2. XML DOM - 針對 XML 文件的標準模型(XML DOM 定義了所有 XML 元素的物件和屬性,以及訪問它們的方法)。 3. HTML DOM - 針對 HTML 文件的標準模型(HTML DOM 定義了所有 HTML 元素的物件和屬性,以及訪問它們的方法)。
Eclipse中java主方法的快捷生成方法(main然後Alt+”/”).
//在記憶體中更新DOM樹後,要想寫入xml檔案,需要:
Writer writer=new OutputStreamWriter(new FileOutputStream(file),“UTF-8”);//建立輸出流
document.write(writer);
writer.close();關閉輸出流
XPath路徑表示式:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
XPath謂語表示式:
在這裡插入圖片描述
是使用“@type”無法選取任何元素,“@”是選擇屬性的語法,必須配合選擇元素的語法來使用,“//”是從匹配選擇的當前節點選擇文件中的節點,當配合“@”時,“//@type”才能選擇所有含type屬性的元素。
Jaxen介紹:
在這裡插入圖片描述

Jaxen的下載地址在國外伺服器上,不能連線可通過maven.aliyun.com尋找central jaxen-1.1.6.jar最新版下載。
獲取第2到第5個員工資訊,可以通過position()與and進行匹配。testor.xpath("//employee[position()>1 and position()<6]");獲取第2個和第5個員工資訊,可以通過position()與|進行匹配。testor.xpath("//employee[position()>1 | position()<6]");獲取no屬性為’3301’的員工資訊,testor.xpath("//employee[no=’3301’]");XPath表示式獲取文字用單引號’’而不是雙引號””。

總結:
在這裡插入圖片描述

2.3.2 Servlet基礎

從Servlet全面進入Java Web開發,介紹Servlet的建立、執行和生命週期。
內容:
在這裡插入圖片描述
軟體結構發展史:
在這裡插入圖片描述
單機時代-桌面應用:eg:word文件
在這裡插入圖片描述
聯機時代(Client-Server模式):eg:qq、微信、支付寶
在這裡插入圖片描述
網際網路時代(Browser-Server模式):瀏覽器即“特殊的客戶端”,開啟網頁即開啟每一個”客戶端”。eg:百度搜尋引擎、淘寶(本質是瀏覽器)
在這裡插入圖片描述
B/S模式執行流程:
在這裡插入圖片描述
在這裡插入圖片描述
請求與響應:
在這裡插入圖片描述
請求和響應要成對出現。
J2EE是什麼?
在這裡插入圖片描述
J2EE中13個功能模組:
在這裡插入圖片描述
Apache Tomcat:
在這裡插入圖片描述
J2EE與Tomcat的關係:
在這裡插入圖片描述
在這裡插入圖片描述
Servlet:
在這裡插入圖片描述
在這裡插入圖片描述
WEB伺服器主機相當於一臺裝有web伺服器程式的高效能電腦,能動態生成網頁;Tomcat相當於’硬體主機’,Servlet相當於伺服器程式.
Tomcat安裝:
1.jdk 8.0安裝,www.oracle.com。2.Tomcat 8.x安裝,tomcat.apache.org。Tomcat 與jdk 版本最好對應。
tomcat啟動:在cmd命令列切換到tomcat安裝目錄的bin檔案下執行startup.bat(.bat是windows下的可執行檔案,.sh是linux下的可執行檔案)。啟動成功有兩種檢測方式:1.彈出一個tomcat命令列視窗並末行顯示“start Server startup in xxms.”。2.在瀏覽器輸入localhost:8080。localhost本地主機地址,8080是tomcat預設埠號。關閉有3種方式:1.點X彈出的tomcat命令列視窗。2.在彈出的tomcat命令列視窗輸出Ctrl+c。3.在原先cmd視窗切換到tomcat安裝目錄的bin檔案下執行shutdown.bat。
在這裡插入圖片描述
tomcat啟動後有亂碼是由於cmd視窗和tomcat的編碼方式不同造成的,修改一下tomcat的編碼方式:步驟:在tomcat->conf->logging.properties檔案中,將如下的UTF-8修改為GBK再試試,將:java.util.logging.ConsoleHandler.encoding = UTF-8更改為:java.util.logging.ConsoleHandler.encoding = GBK。
tomcat閃退大多數是,要麼埠號被佔用了,要麼就是jdk沒配置好。既然tomcat9可以正常用,可能是之前的tomcat9是啟動狀態,佔用著埠號,建議執行一下tomcat9關閉的命令。
Eclipse J2EE安裝與配置:
www.eclipse.org。下載eclipse-jee-2020-03-R-incubation-win32-x86_64解壓。2.配置jre:Windows-Preferences-Java-Installed JREs–Add JRE-Standard VM將jdk目錄匯入。3.配置Tomcat:Windows-Show View-Servers-下面Servers視窗建立一個新伺服器-對應tomcat 8.5版本-next
在這裡插入圖片描述
在這裡插入圖片描述
預設將web應用程式釋出到tomcat所安裝的目錄下。apache-tomcat-8.5.55\webapps是tomcat預設應用釋出目錄。
驗證eclipse中tomcat配置成功,在ide中選中tomcat伺服器然後點小蟲子除錯出現以下介面(這個資訊與cmd中一樣),或在瀏覽器中輸入localhost:8080。localhost本地主機地址,8080是tomcat預設埠號。
在這裡插入圖片描述
在這裡插入圖片描述

<hr/>分割線.

在這裡插入圖片描述
瀏覽器中localhost本地主機地址,8080是tomcat預設埠號,FirstServlet是工程名,/hi是servlet對映的URL名,?後面是引數以及引數值。
解決引數值為中文瀏覽器顯示亂碼:-Project-Properties-Resource-Text file encoding設定為utf-8(其他編碼格式也行,但要與請求響應的一致),service方法中response.setContentType(“text/html;charset=utf-8”);//設定字符集。
在這裡插入圖片描述
當一個類繼承HttpServlet時,就會變為Servlet類。建立的servlet類都要繼承HttpServlet類,要重寫service(HttpServletRequest req, HttpServletResponse res)方法。

Servlet在web.xml中的配置方式。配置Servlet的類路徑應該是<servlet-class>標籤。<servlet-name>配置的是與<servlet-mapping>對應的Servlet名稱,<url-pattern>配置的是Servlet的訪問路徑,<servlet-mapping>配置Servlet的對映關係。

標準Java Web工程結構
在這裡插入圖片描述
web.xml檔案放到/WEB-INF目錄下,/WEB-INF/lib資料夾下存放的是web應用依賴的jar檔案,/WEB-INF是WEB應用的安全目錄,web.xml是部署描述符檔案,/WEB-INF/classes用於存放編譯後的位元組碼檔案。
web應用目錄是整個FirstServlet。2、第三個/WEB應用目錄/index.html是指WebContent目錄下的index.html。3、專案釋出後,webContent就是根目錄。
出現404錯誤,一般是訪問路徑錯誤,可排查:1、檢查編寫的訪問路徑是否正確,應該是localhost:8080/專案名/對映地址?name=kai。2、檢視後臺控制檯是否有報錯資訊。如果有解決一下報錯問題。3、檢視專案的結構。

在工程的WebContent目錄下建立index.html,專案部署到tomcat後可在瀏覽器輸入localhost:8080/專案名可直接訪問html頁面。與servlet對映的URL訪問有不同是因為在web.xml中預設配置了<welcome-file-list></welcome-file-list>標籤,則表示當路徑對映為/時,會從上至下查詢所訪問的頁面是否存在,然後將其對映。如:

在這裡插入圖片描述
webapps是用來存放應用程式。當tomcat啟動時會去載入webapps目錄下的應用程式。
Servlet開發步驟:
在這裡插入圖片描述
Servlet訪問方法:
在這裡插入圖片描述
用eclipse時預設的路徑是專案名,所以訪問時是需要加專案名的,但eclipse中也是可以修改訪問路徑的(步驟)如下圖:選中專案右鍵 --> 單擊Properties --> 選中Web Project Settings --> 在Context root中修改即可。
在這裡插入圖片描述
而idea中如果我們不手動配置路徑,就會預設專案路徑為/,也就是application Context是/ ,那麼就不用寫專案名了。可在idea的application Context中設定訪問路徑,(步驟)如下圖:開啟 Run --> Edit Configurations --> Deployment,在右側有個 Application context,Application context 中填寫的值會直接加到 localhost:8080 的後面,
在這裡插入圖片描述
清除Eclipse編譯快取在Eclipse頭部選單欄中的 Project -> Clean…
dopost()、doget()是interlij idea預設的實現方式。Servlet實現方式的不同,只實現service方法是一種形式,實現dopost()、doget()也是一種形式.service()方法能處理get請求和post請求。dopost()只處理post請求,doget()只處理get請求。
請求引數:
在這裡插入圖片描述
Servlet接受請求引數:
在這裡插入圖片描述
除錯模式下啟動tomcat伺服器可設定斷點,程式執行到斷點會停止執行。start啟動tomcat伺服器,訪問系統無論任何情況,系統都可執行。
input預設型別是text,可以不定義.
表單form標籤中屬性action = “http://localhost:8080/專案名(上下文路徑)/url-pattern(servlet類的對映地址)” 實現連線html與servlet,(http://localhost:8080)可省略.action中指定的是請求提交的地址,“/”開頭代表從Tomcat根目錄開始,Eclipse中,專案上下文路徑預設是專案名。

response.getWriter().println("\n")方法中的\n不能換行,要用html標籤來換行。使用response.getWriter().println("< br/>"),不然response.setContentType(“text/html;charset=utf-8”)是吃素的?

Get與Post請求方法:
在這裡插入圖片描述
表單form預設提交方式是get。
Post方式提交的請求引數可通過瀏覽器f12除錯在Network欄-servlet的對映地址-Headers欄-Form Data可看到。Get請求提交的資料,可以在瀏覽器除錯頁面的Query String Parameters中檢視。
//service是請求處理的核心方法,無論是get或post都會被service()方法處理。request.getMethod()能夠返回提交方法方式的字串。工作常需分開處理兩種請求,一般需重寫doGet()和doPost()進行對應處理,很少會重寫service()方法通過request.getMethod()判斷方式再對應處理。
如果service()方法沒被重寫,Get和Post請求會經過service()方法進行轉發;如果service()方法被重寫,是可以接收請求,但是不能轉發到doGet和doPost方法中去了。
Get與Post處理方式:
在這裡插入圖片描述
Get與Post應用場景:
在這裡插入圖片描述
Servlet生命週期:
在這裡插入圖片描述
專案部署到tomcat伺服器並啟動後(在專案啟動時,tomcat會掃描所有的包中的類檔案編譯後的位元組碼.class檔案,當掃描的某個類中編寫了註解,並配置對映了地址,就會將該對映進行載入到Tomcat。會對web.xml中對Servlet進行宣告並且繫結了url),servlet被裝載;第一次在位址列請求servlet對映地址時,此時會建立servlet物件、初始化init(ServletConfig)、提供服務service()或doGet()或doPost(),後面修改請求引數servlet只會提供服務,重新載入tomcat伺服器(重新整理瀏覽器或修改程式碼)或關閉tomcat伺服器會銷燬servlet。即servlet在整個web應用程式中只會建立一個servlet物件。
使用註解簡化配置:
在這裡插入圖片描述
在這裡插入圖片描述
配置Servlet註解中的引數指的是Servlet的對映地址。
編寫web.xml的方式是最先開始運用的,進行配置內容,而註解是為了方便使用而產生的。1、首先web.xml方便統一管理,更加清晰一點,可維護性高。2、註解是原始碼繫結的,如果某些需求需要改原始碼,就還是需要使用XML配置方式;要根據具體的需求而選擇。
使用註解配置了Servlet以後,web.xml檔案中就不可以再配置相同訪問的url,否則會報錯;但是可以針對同一個Servlet再指定一個不同的訪問URL。
啟動時載入Servlet:
在這裡插入圖片描述

方式一:在servlet類中重寫init()方法,在web.xml配置描述檔案中在<servlet>標籤中書寫<load-on-startup>並設定值,值越小越先載入。

在這裡插入圖片描述
方式二:在JDK1.5版本後新增了註解簡化Web應用程式的配置過程,只需在servlet類中重寫init()方法和新增註解。loadOnStartup設定載入順序,但是必須寫urlPatterns=””,不寫對應的servlet類不會在啟動時載入。
在這裡插入圖片描述
Eclipse中在web.xml中使用Ctrl+Shift+/ 快捷鍵出現註釋。
設定了啟動時載入load on startup,是不是在啟動Tomcat時,直接執行圖片裡Servlet生命週期的前三步。如果不寫啟動時載入,則在第一次訪問對應的servlet的時候才會產生servlet的物件以及執行init方法。

2.3.3 JSP基礎

介紹JSP的基本語法和執行流程。
內容:
在這裡插入圖片描述
Servlet開發的痛點:
Eg:騰訊官網的維護.開發靜態頁面都不方便,
在這裡插入圖片描述
Servlet的缺點:
在這裡插入圖片描述
JSP介紹:
在這裡插入圖片描述
JSP的特點:
在這裡插入圖片描述
JSP的執行要求:
在這裡插入圖片描述

在jsp中嵌入java程式碼塊語法<% java程式碼 %>.

jsp中文亂碼將jsp頁面編碼格式修改為UTF-8,具體如下:
在這裡插入圖片描述
System.out.print是在控制檯列印輸出內容,而out.print是將內容列印輸出到網頁上。jsp主要通過頁面顯示內容,所以使用out.print更合適。
一般前端寫好html頁面,後端把html改寫成jsp頁面,並對一些需要顯示的資料,以及新增一下邏輯程式碼等等。所以,jsp頁面算是後端來寫的,但卻不用過多的關注與前端頁面的部分相關程式碼。
JavaScript和JSP的區別如下:1、JSP 是 JAVA 企業應用的一種動態技術用於 java 語言的web應用程式 。javaScript 是一種頁面指令碼語言,與 java語言沒有關係。2、JSP 執行在後臺伺服器上,本質是Servlet,JSP頁面是混合在 HTML 和 java 程式,用來生成動態網頁,通常負責呼叫後臺的資料,形成能夠根據使用情況的變化的,具有豐富資料互動效果的頁面。3、JavaScript 通常是執行在前臺,即執行於使用者瀏覽器的,通常不需要伺服器的後臺支援,混合在 HTML 中的 JavaScript 指令碼程式直接被瀏覽器解釋執行。
在JSP容器為每個頁面提供了9個Java的內建物件,分別是request、response、out、session、application 、config、pageContext、page和Exception,所以這裡可以直接使用out.println() 進行輸出,因為JSP中已經內建了這個物件.
靜態HTML指的是使用單純的HTML或者結合CSS製作的包括圖片、文字等的只供使用者瀏覽但不包含任何指令碼、不含有任何互動功能的網頁!就像我們之前的油畫案例,就是典型的靜態HTML.動態的HTML指的是網頁不僅提供給使用者瀏覽,網頁本身還有互動功能,存在著在指令碼如JAVASCRIPT,常見的例子比如:百度搜尋,淘寶頁面,可以點選進行一系列的操作來進行互動.
JSP執行過程:
在這裡插入圖片描述
JSP的轉譯過程:
在這裡插入圖片描述
JSP和Servlet的特點決定他們的使用場景是不一樣的,JSP更適用於內容展示,Servlet更適用於邏輯處理。所以在後面學習到的MVC模型中,JSP是作為顯示層,用於資訊展示,而Servlet是作為控制層,用於控制轉發等邏輯處理。
使用者訪問jsp頁面時,這些處理、編譯過程會在發出一次Request請求後執行的(只會生成一次servlet物件,後面對jsp檔案改變是在servlet物件的基礎上進行的)。如圖:
在這裡插入圖片描述
out.println() 和 out.write()區別:out.println() 和 out.write()都可以將字元輸出到網頁中。但也有所不同,println()是JspWriter類中定義的方法,write()則是Writer類中定義的。println()方法可將各種型別的資料轉換成字串的形式輸出,而write()方法只能輸出字元、字元陣列和字串等與字元相關的資料。如果字串物件的值為null,println()方法將輸出內容為“null”的字串,而write()方法則是丟擲NullPointerException異常。
_jsp.java是JSP檔案經過轉譯後的檔案,轉譯後的檔案經過進一步編譯生成_jsp.class檔案。轉譯和編譯的檔案可在tomcat安裝目錄的work資料夾下檢視。
JSP的基本語法:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

<%%>JSP程式碼塊是可以宣告變數的,但不能宣告方法。<% %>定義區域性變數,每次訪問頁面的時候變數都要宣告;<%!  %>定義成員變數,訪問頁面的話只宣告一次。

在這裡插入圖片描述

“=”等價於out.println();方法.<b>標籤是html中的標籤作用是加粗字型。JSP輸出指令<%=%>標籤內不要分號。

在這裡插入圖片描述
JSP常用處理指令:
在這裡插入圖片描述
JSP中註釋的區別:
在這裡插入圖片描述

<%-- 既可以註釋jsp中html部分的程式碼,也可以註釋掉<%%>程式碼。
<%= %>標籤內不需要新增分號;<% %>程式碼指令碼中需要語句後面需要增加分號。
1.jsp表示式:<%=表示式%>。 2.指令碼<%java程式碼%>。在jsp頁面寫的java程式碼就可以成為指令碼。

質數演算法:
在這裡插入圖片描述
標籤自帶預設屬性的就可以不加style,例如div有name ,id 等,a 標籤有href屬性等,table有border 等,這些都可不加style,因為他是標籤自帶預設屬性 ,但是 如果想給 div標籤加上一個顏色 那麼就要用style ,因為div標籤中並沒有預設的color屬性, 也就是說 只要不是預設屬性都需要通過外部樣式或者行內樣式也就是你寫的style來完成。

jsp中<%@ page import="java.io.*,java.util.*" %>,多個包都寫到雙引號裡,中間用逗號分隔。
out.println()方法中的內容就相當於在頁面寫html程式碼 ,html程式碼換行並不能導致頁面顯示的換行,還得在要換行的程式碼後加<br>標籤.

JSP頁面重用:
在這裡插入圖片描述
將其他JSP頁面與當前JSP頁面合併。最後生成一個當前JSP頁面名的原始檔。

2.3.4 Servlet與JSP加強

介紹Java Web核心特性,Servlet核心物件和JSP內建物件。
內容:
在這裡插入圖片描述
HTTP請求的結構:
在這裡插入圖片描述
GET請求的請求引數在請求URL中,所以沒有請求體。
1.在action訪問地址中,以"/“開頭,表示專案根目錄,會直接從localhost:8080後直接訪,–>/request-struc/request,就是直接從localhost:8080後開始拼接,但是這並不是絕對路徑。 2、如果沒有加”/",則是相對路徑,是相對於當前路徑進行跳轉,–>直接在action中輸入request,表示從當前路徑跳轉到request中,當前路徑中有localhost:8080/request-struc等內容,所以直接這樣寫也能照常訪問servlet。3、絕對路徑是:在jsp頁面中新增以下程式碼<%String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%>並且在對應的地址前新增這個basePath的內容,這就是一個絕對路徑。
WEB-INF是安全目錄,裡面的檔案是不能直接訪問的,建議放到WebContent下面。
巧用請求頭開發多端應用:
請求頭的User-Agent引數是多端應用最底層的實現。
一般對於專案名的命名規範,建議專案名全部小寫。多個單詞進行拼接時,建議使用下劃線_更加符合規範。
User-Agent得伺服器能夠識別客戶使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等;確定當前連結的請求方式可以通過Request Method來檢視;連結中傳遞的引數資訊可以通過Query String Parameters來檢視;當前網站的快取資訊可以通過Cookie來檢視。
響應的結構:
在這裡插入圖片描述
HTTP常見狀態碼:
在這裡插入圖片描述
狀態碼404代表無法找到檔案,說明當前訪問的url存在問題。狀態碼500代表伺服器內部發生了錯誤,通常是由於程式碼的bug引起的。
堆疊是計算機為程式分配的記憶體空間,用來儲存資料的。java記憶體模型有堆記憶體和棧記憶體。例如:堆:new 出來的物件或者陣列都存放在堆中;Student stu=new Student();此時這個stu物件就放在堆中。棧:在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配。

1、1)、在請求一個JSP頁面時,Tomcat中的JSP引擎就是一個Servlet程式,它負責解釋和執行JSP頁面.2)、每個JSP 頁面在第一次被訪問時,JSP引擎將它翻譯成一個Servlet源程式,接著再把這個Servlet源程式編譯成Servlet的class類檔案,然後再由WEB容器(Servlet引擎)像呼叫普通Servlet程式一樣的方式來裝載和解釋執行這個由JSP頁面翻譯成的Servlet程式。3)、為JSP頁面建立的Servlet原始檔和class類檔案放置在“\work\Catalina\<主機名>\<應用程式名>\”目錄中,Tomcat將JSP頁面翻譯成的Servlet的包名為org.apache.jsp 。刪除Catalina中的內容,就是刪除了第一次被訪問時編譯成Servlet的class類檔案,也就是清除快取的一個過程,刪除後,重啟tomcat,當訪問jsp頁面時,重新編譯這個JSP檔案。

ContentType的作用:
在這裡插入圖片描述
Ctrl+F5是清除快取強制重新整理。
Servlet,全稱Java Server Applet,本質上就是一個java類。工作原理:1、建立servlet(繼承HttpServlet,重寫方法)。2、部署servlet(servlet是元件,必須放在容器中,使用容器訪問),配置web.xml檔案。3、啟動伺服器,url直接在瀏覽器位址列中訪問servlet,呼叫doGet方法。
請求轉發與重定向:
在這裡插入圖片描述
在這裡插入圖片描述
響應重定向需要在servlet對映地址前增加contextPath也就是專案名。因為請求轉發是同一個WEB應用程式的內部資源之間的跳轉,而重定向的方式是不同WEB應用程式之間的請求,所以重定向需要加工程名,表示要重定向到某一個web應用,也就是某一個專案。重定向路徑前的/表示的是伺服器根目錄,不包括專案名稱,所以它要加上專案名。而轉發是伺服器內部進行,只是在專案內部進行轉發,所以它的路徑前的/表示的是當前的專案,也就是表示專案根目錄。
請求轉發是tomcat伺服器將瀏覽器發給前一個servlet類的請求轉發給了下一個servlet類,路徑不變,是開始訪問的對映地址(前一個servlet類的對映地址)。響應重定向是瀏覽器請求前一個servlet類後瀏覽器再請求下一個servlet類,路徑改變,是最後請求的對映地址(下一個servlet類的對映地址)。
tomcat伺服器中可有多個servlet類,每個servlet類在它的生命週期中只會生成一個物件。
請求轉發呼叫的是HttpServletRequest物件中的方法以及轉發時瀏覽器只請求一次伺服器,位址列的url不會發生變化。重定向時,瀏覽器中的位址列url會發生變化以及重定向呼叫的是HttpServletResponse物件中的方法。
請求轉發:
在這裡插入圖片描述
開始的servlet會給請求原封不動的發給要轉發的servlet。
響應重定向:
在這裡插入圖片描述
開始的servlet會發給瀏覽器一個特殊的響應,這個響應要求瀏覽器重新給另一個servlet傳送請求。
設定請求自定義屬性:
在這裡插入圖片描述
請求自定義屬性只有請求轉發的響應能獲得此屬性,重定向的響應不能獲得此自定義屬性,因為重定向是瀏覽器發出的兩次請求,在第一次請求後開始的servlet類物件會銷燬,對應設定的請求自定義屬性也隨之銷燬。
getAttribute表示從request範圍取得設定的屬性,必須要先在servlet中setAttribute設定屬性,才能通過getAttribute來獲取引數,設定與獲取的為Object物件型別。重定向此屬性會隨開始的servlet銷燬而銷燬,所以response.sendRedirect()重定向無法使用getAttribute()與setAttribute。不過可通過getParameter()獲取的重定向的引數。getParameter表示接收引數(不能直接獲得重定向請求自定義屬性),引數為頁面提交的引數,包括:表單提交的引數、URL中傳的引數等,沒有設定引數的方法(setParameter),而且接收引數返回的不是Object,而是String型別。如果是頁面傳的的引數,需要使用getParameter獲取引數,如果是request域setAttribute設定的引數,需要使用getAttribute獲取。
Request.setAttribute和request.getAttribute要成對出現。
請求轉發與重定向的區別各自的優勢如下:1、RequestDispatcher.forward方法的呼叫者與被呼叫者之間共享相同的request物件和response物件,它們屬於同一個訪問請求和響應過程。所以在轉發的前後頁面中傳遞資訊,可以使用request的Attribute。2、HttpServletResponse.sendRedirect方法呼叫者與被呼叫者使用各自的request物件和response物件,它們屬於兩個獨立的訪問請求和響應過程。這種情況下在request中放置Attribute會丟失,所以需要用session或者ServletContext物件。3、綜上所述,對於同一個WEB應用程式的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,並要使用HttpServletRequest.setAttribute方法傳遞預處理結果,那就更適合使用RequestDispatcher.forward方法。不同WEB應用程式之間的重定向,特別是要重定向到另外一個WEB站點上的資源的情況,都應該使用HttpServletResponse.sendRedirect方法。
請求轉發:1.位址列沒有發生變化。2.使用者只發起了一次請求。3.請求轉發只能轉發本伺服器以內的資源。4.由於請求是同一個物件,所以可以利用該request做servlet之間資料的傳輸。重定向:1.位址列會發生改變。2.使用者發起了兩次請求。3.重定向可以訪問伺服器以外的資源。4.重定向由於請求多次的,所以HttpServletRequest不是同一個物件,故不能使用它傳遞資料。
瀏覽器Cookie:
在這裡插入圖片描述
預設時效性是cookie隨著瀏覽器關閉而銷燬。
Cookie cookie=new Cookie(“num”,“s111”);//例項化cookie物件,cookie的name/value:num/s111,cookie.setMaxAge(60*60);//設定cookie儲存在本地的最長時效,單位是秒。
除錯快捷鍵分別說明下圖每個按鈕的含義:
在這裡插入圖片描述
Session-使用者會話:
在這裡插入圖片描述
cookie是將資料儲存在客戶端,session是將資料儲存在伺服器端。將資料放在客戶機上,會出現資料不安全問題,而且會佔用客戶機記憶體。所以沒有用cookie請求轉發。
request.getRequestDispatcher().forward(request,response)是把request,response轉發到了下一個頁面,而不是session。不轉發也使用的是同一個session物件。用session儲存資料時,不用進行轉發。最在一個專案中不只可以有一個session,例如,伺服器可以為每個瀏覽器使用者建立一個session。可以這樣理解。request因為生命週期是一次請求,如果不進行轉發的話,它就結束了。而session的生命週期是隨著session的建立到session的銷燬(預設無操作的清空下20-30分鐘中自動銷燬,也可以手動銷燬,也可以隨著伺服器的停止而銷燬),可以用一個個使用者來理解。部署了伺服器後,會有很多個使用者來進行訪問,從每個使用者登入,就建立了一個session,直到該使用者退出,該session銷燬,在登入期間,這個session是一直存在的。如果同時有兩個使用者登入,就有兩個session存在。
session可以設定時效,在一段時間內,不受轉發和重定向的影響。只要在一個會話中,就可以獲取其中儲存的資料,不用擔心丟失問題。同一個會話中的session物件都是一個。當一個會話結束後,再次開啟會話時Session就不是之前的了。一個會話可簡單地理解為:開啟瀏覽器訪問一個網站,開始了一個會話,關閉瀏覽器這個會話就結束了。
第一次訪問方法(LoginServlet中的doGet方法)時,在使用request物件呼叫getSession方法時生成,伺服器會為該Session物件生成一個唯一的ID,伺服器端響應客戶端請求時會在報文頭中設定Set-Cookie屬性(一次會話結束Cookie中儲存的SessionId就沒有了,即使給Cookie設定時效。),該屬性內容中有一個JSESSIONID即是Session物件的標識,返回後由瀏覽器進行處理。當再次訪問Servlet(IndexServlet中的doGet方法)時,客戶端再次傳送請求時,瀏覽器會在報文頭中自動追加Cookie屬性,該屬性將JSESSIONID傳到伺服器端。在伺服器端用request.getSession時會取得SessionId對應的物件而不會重新生成Session。因此是同一個seesion物件。
重開瀏覽器(相當於新的會話)請求獲得首頁(第一次是登陸頁)會話session的屬性,會得到一個新的sessionId,因此獲得登入頁session設定的屬性為null,在一段時間內可通過之前登入頁sessionId獲得對應的session物件從而獲得對應的屬性。
Session的原理:
在這裡插入圖片描述
cookie以文字格式儲存在瀏覽器上,儲存量有限;session是在服務端,可以無限量儲存多個變數並且比cookie更安全,把伺服器中產生的會話sessionID儲存到客戶端瀏覽器cookie中去。就可以保證客戶端和服務端的通訊。在客戶端存在週期為瀏覽器關閉時,消失。這樣便解決了客戶端請求服務端會話不同步問題。
ServletContext:
在這裡插入圖片描述
上下文物件ServletContext 可以理解為一個域,這個域中可以放置一些屬性,只是它的生命週期是隨著伺服器的啟動而開始,直到伺服器關閉而消失。所以在ServletContext中設定的屬性和內容,是可以在伺服器中的任何一個頁面中都可以訪問到,所以說在ServletContext中的屬性,是全域性生效的。
Java Web三大作用域物件:
在這裡插入圖片描述
1、HttpServletRequest-請求物件:傳送請求時被建立,Servlet處理後產生響應並且返回給瀏覽器後被銷燬(用完即扔掉);2、HttpSession-使用者會話物件:使用者第一次發來請求的時候建立,預設情況下這個session三十分鐘內沒被訪問就被銷燬,瀏覽器關掉只是把儲存sessionID的cookie拋棄,而不是銷燬伺服器端的session;3、ServletContext-Web應用全域性物件:Web應用程式被啟動時建立,在Web應用程式重啟或關閉時銷燬;注:考慮程式維護和資源浪費,在開發過程中,我們要優先選用作用域小的物件–HttpServletRequest。Java Web三大作用域物件作用域依次遞增。
如果想用java編寫CS架構(客戶端-伺服器端)應用程式,可以使用swing程式設計工具,Swing是JAVA基礎類的一部分。Swing包括了圖形使用者介面(GUI)器件如:文字框,按鈕,分隔窗格和表。現在很少有人用Java寫CS架構的軟體了,基本都是用BS(WEB)架構。
Web應用的中文亂碼由來:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
請求過來的字符集是iso-8895-1,而後端用的是utf-8 。所以new String(ename.getBytes(“iso-8895-1”). “utf-8”) 是以iso-8895-1先解碼,再用utf-8的編碼方式展現。
request.setCharacterEncoding方法用於將請求體中的字符集轉換成UTF-8.注意:post請求提交方式才有請求體,get請求提交方式沒有請求體(請求引數在URL後面),所以request.setCharacterEncoding方法只對post請求提交方式的請求體中字符集有效。
對與get請求提交方式:
在這裡插入圖片描述
在這裡插入圖片描述
在tomcat安裝目錄-conf-server.xml的第63行Connector標籤新增屬性URIEncoding=”UTF-8”.在tomcat8(包含)以後版本不管設定與否這個屬性預設是UTF-8。
Web應用的中文亂碼處理總結:對於請求,post請求提交方式需在doPost方法第一行設定request.setCharacterEncoding(“UTF-8”);get請求提交方式在tomcat8.0版本及以後無需額外設定,若tomcat在8以前則需在tomcat安裝目錄-conf-server.xml的第63行Connector標籤新增屬性URIEncoding=”UTF-8”.對於響應,不區分post和get請求提交方式,統一是設定response.setContentType(“text/html;charset=utf-8”)。並注意UTF-8需要大寫。有些瀏覽器不支援小寫的。
web.xml常用配置:
在這裡插入圖片描述

<url-pattern>/pattern/*</url-pattern>-Servlet萬用字元*-所有對映地址以ip+context path+/pattern/開頭的都會被攔截,也可以用註解配置。request.getRequestURL()方法獲得請求URL,返回StringBuffer。toString();方法把返回值StringBuffer轉換為String.url.lastIndexOf("/")擷取最後一個斜槓出現的位置.通過url.substring()方法擷取位置及以後字串.
Servlet萬用字元應用頻率很高。
全域性引數在web.xml中通過<context-param>標籤設定,在Servlet中通過ServletContext物件的context.getInitParameter(全域性引數名)方法獲取全域性引數值。

在這裡插入圖片描述
設定404、500等狀態碼預設頁面:其他程式使用者可能會利用預設tomcat提供的404、500等頁面暴露的程式路徑實現技術等資訊進行不可估影響。

web.xml中通過<error-page>標籤指定錯誤頁面及路徑,同時手寫相應頁面程式碼。

在這裡插入圖片描述
JSP九大內建物件:
在這裡插入圖片描述
內建物件的建立和初始化是由容器來完成的。JSP頁面中可以直接使用這些內建物件物件。
pageContext是PageContext類的例項,代表當前頁面的上下文物件,它封裝了相應的方法來訪問page,request,session,application範圍的變數;可以獲得其他的內建物件 。
在這裡插入圖片描述
將500錯誤頁面由靜態html轉為動態的jsp,需在jsp中設定當前jsp全域性屬性isErrorPage=”true”,宣告當前jsp檔案為專門顯示錯誤的介面。
在這裡插入圖片描述
獲得異常類的名稱。
在使用時,需要在page指令下增加isErrorPage=“true”,而且exception內建物件只可以用在錯誤頁面中。
如果頁面的處理邏輯中出現了異常,可以在頁面中指定一個錯誤處理頁面,錯誤頁面的指定方式。需要在page指令下增加errorPage屬性,指定錯誤處理頁面。 isErrorpage:是否指定當前頁面為錯誤頁面,isErrorpage預設值為false,若要當前頁面為錯誤頁面就設定isErrorPage=true。

JSP頁面跳到另一個JSP頁面多種方式:1、<a href="success.jsp">跳轉到成功頁面</a>(點選連結跳轉)。2、 <div onclick="window.location='success.jsp'">跳轉</div>(點選跳轉)。3、<% request.getRequestDispatcher("/success.jsp").forward(request, response);%> 直接跳轉。

Java Web打包與釋出:
在Eclipse中將專案以.war檔案匯出(export),將匯出的.war檔案複製貼上到已經配置好的tomcat的webapps資料夾中,執行startup.bat啟動tomcat成功,即可在瀏覽器上訪問Java Web專案。
在這裡插入圖片描述
釋出網站優化:將URL中http://localhost:8080/contextpath.中埠8080去掉,需將TOMCAT_HOME/conf中的server.xml檔案中第63行<connection>標籤中的屬性port=”8080”修改成”80”,URL不用寫8080埠,瀏覽器預設訪問80埠;將contextpath上下文路徑去掉需將server.xml檔案中末尾的<Context>標籤中的屬性path=contextpath上下文路徑改成”/”即根路徑。屬性reloadable="true"是自動載入。若server.xml沒有<Context>標籤可手動新增<Context docBase="D:\Program Files\apache-tomcat-8.5.55-windows-x64\apache-tomcat-8.5.55\webapps\first_servlet1" path="/" reloadable="true" ></Context>。
雙擊startup.bat後,那個視窗執行了一下就沒了,需配置好環境變數(JAVA_HOME, CATALINA_HOME),CATALINA_HOME是tomcat的主目錄
上線通常是在Linux系統中,需要在Linux系統中配置jdk(jre)環境以及tomcat伺服器才可以的。

2.3.5 JSTL與EL表示式

介紹Java Web開發中常用的JSP標準標籤庫JSTL和EL表示式的內容。
內容:
在這裡插入圖片描述
在這裡插入圖片描述
JSP的缺點是封裝和處理資料麻煩。MVC中的控制器一般由Servlet來承擔。在JSP+JavaBean模式中,使用JavaBean來封裝和處理資料。Servlet的缺點是顯示HTML元素的時候很複雜。
EL表示式不能用到HTML頁面中,只能在JSP頁面中使用。
例項:不使用EL表示式的jsp開發
在這裡插入圖片描述
在這裡插入圖片描述
不使用EL表示式的jsp開發,1.需匯入未定義的類。2.程式碼繁雜。
在這裡插入圖片描述
使用EL表示式的jsp開發,不需要導包,程式碼簡單明瞭。
為什麼用EL表示式可以直接呼叫Student類中的私有變數name和age?EL表示式會根據name去Student類裡尋找這個name的getter方法,此時會自動把name首字母大寫並加上get字首,一旦找到與之匹配的方法即getName方法,El表示式就會認為這就是要訪問的屬性,並返回return的值。不能改成${requestScope.student.getName()} 。
作用域物件:
EL表示式內建四種作用域物件。忽略書寫作用域物件時,el則按作用域從小到大一次嘗試獲取。雖然省略el作用域物件書寫方便,但從佔用資源和時間的角度上不建議省略el作用域物件。
在這裡插入圖片描述
上圖物件作用域範圍從小到大遞增。
在這裡插入圖片描述
每一個web應用都有且僅有一個ServletContext 物件,並且ServletContext物件 也是一個作用域。其作用為:1)、作為域物件用來共享資料,使資料在整個應用程式中共享。2)、該物件中儲存了當前應用程式相關資訊。例如:可以通過getServerInfo();方法獲取當前伺服器資訊,getRealPath(String path);獲取資源的真實路徑等。
若el作用域範圍內沒有名為xx的屬性,那麼將沒有任何輸出,不會輸出null。
EL表示式輸出:
在這裡插入圖片描述
el表示式訪問私有屬性xx,el表示式預設會呼叫私有屬性xx對應的get()方法,如果是其它方法就不可以了,需要自定義標籤,沒有寫get()方法,就訪問不到了。
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
可重寫toString()(在set這個屬性對應的物件所屬的.java檔案中重寫toString方法)改變Object的toString()輸出格式,頁面將顯示toString()方法的返回值。
空字串java預設輸出null。
null與"“是不一樣的,null是物件型別,表示空物件。”“是一個空的字串。口頭上我們都可以稱之為“空”。因為空字串是一個在邏輯上沒有意義的值。但是對於Java的String物件來說,null和空字串的意義不同,空字串也是一個合理的String物件,不會造成空指標異常,而null則不能直接呼叫任何方法。比如:String s1=null;String s2=”"; 如果這麼寫s1.equals(“s”);執行時因為s1為null,所以會報NullPointerException,也就是空指標異常。而s2.equals(“s”);是可以正常執行的。""就代表什麼都沒有的空白字串;而null是引用為null,沒有建立物件,不能呼叫方法。
JSP將Java程式碼和特定變動內容嵌入到靜態的頁面中,實現以靜態頁面為模板,動態生成其中的部分內容。當Tomcat執行時,會將其編譯成Servlet來執行。是因為Servlet展示資訊程式碼複雜,才引入了JSP。由於JSP的目的是為了展示,一般來說,JSP中動態的部分是java程式碼。JSP中可以完全沒有java程式碼,但沒有HTML的就極少了。
EL輸出引數值:
在這裡插入圖片描述

jsp最終都會編譯為java程式碼,在編譯時<%%>中的程式碼,並不會處理,而是直接當做java程式碼了。

JSTL標籤庫:
在這裡插入圖片描述
下載JSTL標籤庫:
在這裡插入圖片描述
在新版本的jsp中已經內建了EL表示式支援包。
1、JSP 是 Servlet 技術的擴充套件,本質上就是 Servlet 。2、Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開來。而JSP的情況是Java和HTML可以組合成一個副檔名為.jsp的檔案。JSP更側重於前端頁面顯示,Servlet更側重於業務邏輯。
安裝JSTL標籤庫:
在這裡插入圖片描述
第一種安裝方式所安裝的jstl標籤庫只對當前的web專案有效,第二種方式是安裝到Tomcat安裝目錄的lib目錄,也就是tomcat全域性元件依賴目錄,對配置了tomcat的所有web專案都有效。推薦第一種,因為將jar包放在Tomcat的lib目錄裡,有些專案需要的jar包版本可能不同,可能會發生衝突。
當/WEB-INF/lib目錄下匯入jar包,eclipse會自動的將jar包新增至Java Resources/Libraries/Web App Libraries中。
J2EE只制定標準,而具體的實現由第三方廠商來實現。而JAVA WEB中tomcat所提供jar包就是一些標準的實現。eclipse預設會使用tomcat下的jar(第三方)來構建專案,以至於我們可在專案中編寫自己的程式碼。
JSTL的標籤庫種類:
在這裡插入圖片描述
在這裡插入圖片描述
在Java或JSP檔案中輸入Alt+/可出現智慧提示。
快捷鍵Ctrl+f可查詢資訊並替換。
在jsp中引入jstl標籤庫:
在這裡插入圖片描述
prefix屬性的值是可以改變的,只不過我們一般習慣用c表示。
URI和URL的區別:URI 是統一資源識別符號,而 URL 是統一資源定位符。URL格式為 “協議://IP地址:埠/路徑和檔名”如:http://localhost:8080/restful/request。URI可以說是一個緊湊的字串用來標示抽象或物理資源,URL除去host(域名或者ip)部分的路徑,如:/restful/request 。
判斷標籤:
在這裡插入圖片描述
jstl核心庫中多分支判斷類似java中的if else if else結構。
jstl核心庫中的單分支和多分支的test屬性中一般是el表示式(關係判斷),值是true/false。
在Java中,單引號 ’ ’ 包裹的值預設是char型別不是String型別,而char型別的值預設是使用Long進行儲存。但在EL表示式中,'a’被看做是個字串。
遍歷集合:
在這裡插入圖片描述

<c:forEach>標籤中:屬性items是資料來源(可用el表示式),屬性var是迭代變數,屬性varStatus是狀態變數。varStatus 常用屬性值:current: 當前這次迭代的(集合中的)項;index: 當前這次迭代從 0 開始的迭代索引;count: 當前這次迭代從 1 開始的迭代計數;first: 用來表明當前這輪迭代是否為第一次迭代的標誌;last: 用來表明當前這輪迭代是否為最後一次迭代的標誌。
<c:out>標籤中,屬性value是原始值,屬性default是預設值(將原始值顯示為預設值),屬性escapeXml是否(true/false)將原始值轉譯為Xml檔案顯示(是否顯示原始碼)。

在這裡插入圖片描述
fmt格式化標籤庫:
在這裡插入圖片描述
fmt格式化輸出標籤庫中標籤fmtDate的屬性value是需要被格式的屬性值,屬性pattern是一組有特殊意義符號組成的格式化方式。日期格式化模式,如下圖:
在這裡插入圖片描述

數字格式化模式,如下圖:整數部分兩位用’.’分割,小數點後保留兩位有效數字。根據pattern決定保留小數位數,它使用的是"4舍6入5奇偶"的演算法。1、實現四捨五入,只需要在原有值的基礎上再加一個比較小的值即可。例如:<fmt:formatNumber  value="${56.5 + 0.0001}"  pattern="0.000"/>。2、如果不想四捨五入,可以通過將資料的最末尾的數減去一半這樣的方法來實現,例如:<fmt:formatNumber  value="${56.5-0.5 + 0.0001}"  pattern="0.000"/>

在這裡插入圖片描述
員工資訊表:
在專案中,修飾屬性時,一般對於能使用包裝類不會使用基本資料型別,因為基本資料型別有預設值,比如,這個屬性使用的是包裝類,我們判斷它就可使用null來判斷它的屬性是否存在。所以在專案中建議使用包裝類,這是一個程式設計習慣,當然這裡如使用基本資料型別也是沒錯。
將HTML檔案轉換JSP檔案,開啟.html檔案在首行新增<%@ page contentType=”text/html;charset=’UTF-8’”%>,關閉.html檔案,更改.html檔案字尾名為.jsp。
使用ServletContext的物件context全域性設定屬性也有缺陷,只有當tomcat伺服器執行時這些屬性可全域性獲取,當tomcat伺服器關閉後這些屬性就銷燬了。
Java Web基礎小結:
java web應用中的jsp頁面的初識,jsp檔案需要執行在web伺服器上,html和htm屬於靜態頁面,可以直接通過瀏覽器訪問。js屬於指令碼檔案,需要嵌入靜態頁面中,直接通過瀏覽器訪問。
引入系統包的標籤是:<%@ page import=“”%>。getParameter()方法的返回值型別是String。response內建物件對應到Servlet中是HttpServletResponse類的物件,它封裝了伺服器對客戶端的響應,然後被送到客戶端以響應客戶的請求。

相關文章