JavaWeb
JavaWeb技術主要包括伺服器技術(後端),如
Tomcat,Servlet,JSP
等待,以及客戶端技術(前端)如HTML,CSS,JavaScript
等等
Web伺服器
Web伺服器主要負責處理客戶端發出的HTTP請求,並做出相應回應
- Web伺服器:安裝了伺服器軟體的計算機,只用於複雜處理請求,發出相應
- Web伺服器軟體:接受客戶端的請求,處理請求做出響應
- 在Web伺服器中可以部署web專案,讓瀏覽器作為媒介就行訪問
Web伺服器軟體
伺服器軟體是部署在伺服器中的程式,主要有以下幾種,我們主要學習Tomcat的使用
- weblogic:oracle公司,大型的javaEE伺服器,支援所有的JavaEE規範,收費的。
- websphere:IBM公司,大型的javaEE伺服器,支援所有的ovaTE規範,收費的。
- JBOSS:JBOSS公司,大型的javaEE伺服器,支援所有的JavaIL規範,收費的。
- Tomcat:Apache基金組織,中小型的javaEE伺服器,開源的,免費的。
Tomcat
Tomcat是一個免費開源的Java Servlet(Server Applet,服務程式)容器,主要用於部署和執行基於Java的Web應用程式,是由Apache基金組織成立,屬於輕量級伺服器.
Tomcat主要特點
- Servlet容器:Tomcat實現一個Servlet規範的容器,可以用來部署Servlet和JSP的Web應用程式.JSP(JavaServer Pages)是一種動態web內容技術,其允許開發者將Java程式碼和特點的JS嵌入到HTML頁面中
- 輕量級:Tomcat是一個輕量級的伺服器,相比其他商業伺服器啟動速度快,資源消耗少
- 易配置:Tomcat的配置檔案簡單明瞭,易於理解修改
Tomcat的架構
- Connector(聯結器):用於接收客戶端HTTP的請求並將其轉發至相應的
Servlet
,並提供Socket
與Request
和Response
相關的轉化; - Container(容器):
Container
是Tomcat
處理Servlet
的核心部件,其包括Engine(引擎),Host(主機),Context(上下文),Wrapper(包裝器)
Tomcat
中只有一個Server
; 一個Server
中可以包含多個Service
; 一個Service
只能包含一個Container
但可以包含多個Connector
因為一個服務可以有多個連線;示意圖如下:
多個Connector
和一個Container
就可以構成一個Sevrice
,有了Service
就可以對外提供,但還需一個執行環境,Server
提供了一個執行環境,其關係可以在Tomcat
的conf
目錄下的sever.xml
配置檔案中檢視
Connector與Container的關係
由上訴內容可知,一個請求傳送給
Tomcat
時,會經過Service,
然後轉交到我們的Connector
Connector
用於接收請求並將請求封裝成Request
和Response
來具體處理,Request
和Response
封裝完之後再交由Container
進行處理,Container
處理完請求之後再返回給Connector
,最後Connector
透過Socket
將處理的結果放回給客戶端
Servlet
Java Servlet是執行在Web伺服器或應用伺服器上的程式,它是作為來自Web瀏覽器或其他HTTP客戶端的請求和HTTP伺服器上資料庫和應用程式的中間層,其本質上是用java語言編寫的一個介面
Servlet的優勢
- 良好的效能
- Servlet在Web伺服器的地址空間執行,因此就不用再建立一個單獨的程序來處理每個客戶端的請求
- Servlet是獨立與平臺的,因為它用Java開發語言編寫
Servlet架構
下圖展示了Servlet在Web應用程式中的位置:
Servlet任務
- 讀取客戶端(瀏覽器)傳送的顯示資料.在包括網頁上的HTML表單,或者也可以是來自applet或自定義的HTTP客戶端的表單
- 讀取客戶端(瀏覽器)傳送的隱式HTTP請求資料,包括cookies,媒體型別和瀏覽器能理解的壓縮格式等等
- 處理資料並生成結果,這個過程可能需要訪問資料庫,執行RMI或CORBA呼叫,呼叫Web服務,或者直接計算得出對應響應
- 傳送顯式的資料(即文件)到客戶端(瀏覽器).該文件格式可以是多種多樣的,包括文字檔案(HTML或XML),二進位制檔案(GIF影像)
- 傳送隱式HTTP響應到客戶端
Servlet生命週期
*Servlet
的生命週期可以理解為從建立到被銷燬的過程*
- Servlet初始化後呼叫
init()
方法 - Servlet呼叫
service()
方法來處理客戶端請求 - Servlet銷燬前呼叫
destroy()
方法 - 最後,Servlet是由JVM的垃圾回收器進行垃圾回收的
現在我們開始詳細講解Servlet的生命週期方法
init()方法
init()
方法被設計成只能呼叫一次.它在第一次建立Servlet時被呼叫,在後續每次使用者請求時不再呼叫.因此其是用於一次性初始
Servlet
建立於使用者第一次呼叫對應於該Servlet
的URL時,但也可以指定Servlet
在伺服器第一次啟動時被載入- 當一個使用者呼叫一個
Servlet
時,就會建立一個Servlet
例項,每一個使用者請求都會產生一個新的執行緒. init()
方法只要用途是簡單第建立或載入一些資料,這些資料被使用者Servlet的整個週期
init()方法的定義如下:
public void init(ServletConfig servletConfig) throws ServletException {
//初始化程式碼
}
service()方法
service()方法是執行實際任務的主要方法.
- 每次伺服器接收到一個Servlet請求時,伺服器就會產生一個新的執行緒並呼叫服務.
- service()方法檢查HTTP請求型別
(GET,POST,PUT,DELETE)
並在適當時候呼叫doGet.doPost.doPut.doDelete
等方法
下面是其方法程式碼
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
service()方法由容器呼叫,service方法在適當的時候呼叫doGet.doPost.doPut.doDelete
,因此你不用對service()方法進行任何操作,你只需根據使用者不同請求型別來重寫doGet()
或doPost()
方法即可
doGet()方法
- GET請求來自於一個URL的正常請求,或者來自於一個未指定的
METHOD
的HTML
表單,它由doGet()方法進行處理
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 程式碼
}
doPost方法
- POST請求來自於一個特別指定了
METHDO
為POST
的HTML
表單,它由doPost()
方法處理
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet 程式碼
}
destroy()方法
destory()
方法和init()
方法一樣也只能呼叫一次,在Servlet生命週期結束時被呼叫- destroy()方法可以讓你的Servlet關閉資料庫連線,停止後臺執行緒,把Cookie列表或點選計數器寫入磁碟,
- 在呼叫了
destroy()
方法之後,servlet
物件就被標記為垃圾回收
destory()方法定義如下:
public void destroy() {
// 終止化程式碼...
}
架構圖如下
Web.xml配置
-
<web-app>
:web.xml
的根元素,用於宣告XML的版本.編碼格式以及Web應用的模式檔案(XSD)的位置 -
<servlet>
和<servlet-mapping>
<servlet>
用於定義一個Servlet的類資訊,包括它的名稱和實現類<servlet-name>
:設定Servlet
例項的名字<servlet-class>
:配置類的路徑,建立之前要確保有相對應的類
<servlet-mapping>
:用於指定一個或多個URL模式於前面定義的Servlet
之間的對映<servlet-name>
:用於繫結servlet
標籤名字需和<servlet>
標籤下的<servlet-name>
一致<url-patter>
:配置請求路徑,客戶端按該路徑請求,可觸發對應的Servlet
例項中的servlet
方法
<load-on-startup>
:第一次訪問時建立Servlet物件,將中間的值設為負數<load-on-startup>
:伺服器啟動後建立,將中間值設為大於大於0的數E.g
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>servlet01</servlet-name> <servlet-class>com.mashang.web.MyServlet01</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>servlet01</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> </web-app>
Servlet註釋
使用註解可以避免在
web.xml
檔案中進行顯性配置,從而減少配置檔案的複雜性和提高開發效率
@WebServlet
- 作用:標籤用於直接在Servlet類上定義其URL對映和其他配置
- 屬性:
value
或urlPatterns
:指定一個或多個URL模式,用於匹配HTTP請求並將其分發給Servletname
:為Servlet
配置一個名稱loadOnStartup
:指定Servlet
在伺服器啟動時是否載入以及載入順序asyncSupported
:指示Servlet是否支援非同步處理initParams
:初始化引數列表
urlPatterns
配置方法:
配置多種屬性時要寫上其屬性名
@WebServlet({"/demo1","/demo2",...})//配置多個請求路徑對應一個Servlet
@WebServlet("/user/demo1")//配置多級路徑
@WebServlet("/user/*")//匹配以user開頭形式的請求
@WebServlet("/*")//匹配所有的請求
@WebServlet("/*.do")//匹配do結尾的請求
HttpServlet
HttpServlet
是Servlet
的一個實現類,是一個抽象類.其在源有的Servlet
介面上新增了一些關於Http
協議的處理方法,其功能比Servle
t功能強大,在實際開發中,實現介面服務通常會繼承這個類,而避免直接繼承Servlet
類
GET請求和POST請求
GET請求
GET請求是一種
HTTP
方法,用於從伺服器請求資源.當客戶端(通常是指瀏覽器),向伺服器發起請求時,它是在請求特定的資源
- GET請求的引數
- GET請求的引數通常會附加在URL後面,使用
?
號分隔URL和引數 - 引數之間使用
&
分隔 - 例如:
https://example.com/resource?param1=value1¶m2=value2
- GET請求的引數通常會附加在URL後面,使用
- GET請求的安全性
- GET請求中的所有引數都會暴露在URL中,因此可能會被記錄在瀏覽器的歷史記錄或日誌檔案中,安全性較低
- 因此GET請求不能用來傳遞敏感資訊,例如密碼等等
- 快取速度
- 瀏覽器和其他中間部件會快取GET請求的結果,因此會導致GET請求的速度較快,提高效能
- GET的限制
- 由於GET請求是透過URL傳送的,而URL本身長度有限制,因此GET的長度是有限制的
- GET的一般使用場景
- GET請求通常用於檢索資訊,如查詢資料庫或獲取靜態資源
POST請求
和GET請求一致的是POST請求也是一個
HTTP
方法,用於向伺服器傳送資料.當客戶端(瀏覽器)使用POST方法向伺服器傳送請求時,它是在提交資料交給伺服器進行處理
-
POST的請求體
- POST請求通常不會放置在URL中,而是放置在請求體中
- 意味著資料不會顯示在URL中,於GET請求相比更具有安全性和隱式性
-
安全性
- 由於資料不會顯示在URL中,POST更適合傳送更適合傳輸敏感資訊
- POST請求中的資料通常使用編碼格式來組織
-
POST限制
- POST長度不會受到限制,因此可以傳輸大量資料
- 但伺服器仍有自己的最大限制
-
POST一般使用場景
- POST請求通常用於提交資料,如登入表單,登錄檔單
doGet()和doPost()
doGet()
doGet()
方法是HttpServlet
類中的一個方法
- 請求型別
doGet()
方法是專門用於處理HTTP GET請求的方法
doPost()
doPost()
方法是HttpServlet
類中的一個方法
- 請求型別
doPost()
方法是專門處理HTTP POST請求的方法
E.g:
@WebServlet("/login")
public class MyHttpServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("執行GET請求業務邏輯");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("執行POST請求業務邏輯");
}
}
MyHttpServlet01
類是HttpServlet
的繼承類,重寫了其中的doGet()
和doPost()
方法,我們在Postman軟體可以分別去測試其GET請求和POST請求