1. 程式人生 > >程式設計體系結構(07):JavaEE之Web開發

程式設計體系結構(07):JavaEE之Web開發

本文原始碼:[GitHub·點這裡](https://github.com/cicadasmile) || [GitEE·點這裡](https://gitee.com/cicadasmile) # 一、基礎概念 ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150759208-1738823426.png) **1、CS與BS架構** **CS架構模式** 客戶端/伺服器(Client/Server)模式,既要編寫伺服器端程式,也要開發客戶端程式,軟體更新時需要同時更新客戶端和伺服器端,整體模式相比BS架構要複雜,但是安全性比較高。 **B/S架構模式** 即瀏覽器/伺服器(Browser/Server),只需要編寫伺服器端程式,瀏覽器的介面作為訪問的服務端的入口,架構相對簡單,可以快速迭代,但是安全性較差。 **2、Socket通訊機制** **TCP/IP 協議** 傳輸控制協議/網際協議是指能夠在多個不同網路間實現資訊傳輸的協議簇。TCP/IP協議不僅僅指的是TCP和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇,只是因為在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱為TCP/IP協議。 **Socket套接字** 網路中不同主機上的應用程序之間進行雙向通訊的端點的抽象,一個套接字就是網路上程序通訊的一端,提供了應用層程序利用網路協議交換資料的機制。通常接收請求資料,並做業務處理的稱為服務端即ServerSocket,傳送請求並接收處理結果的稱為客戶端。 # 二、Http協議 **1、Http和Https** **Http協議** HTTP超文字傳輸協議,是用於從全球資訊網伺服器傳輸超文字到本地瀏覽器的傳送協議,基於TCP/IP通訊協議來傳遞資料:HTML檔案、圖片、查詢資料等。HTTP協議基於客戶端-服務端架構模式。瀏覽器作為HTTP客戶端通過URL向服務端即WEB伺服器傳送請求。Web伺服器根據接收到的請求後,處理完請求後向客戶端傳送響應資訊。 協議特點:簡單快速、靈活、無連線、無狀態、支援客戶/伺服器模式。 **Https協議** 以安全為準則的HTTP通道,是HTTP的安全版,在HTTP請求上加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。簡單來說,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,要比http協議安全。HTTPS協議的主要作用可以分為兩種:一種是建立一個資訊保安通道,來保證資料傳輸的安全;另一種就是確認網站的真實性。 **Https和Http區別** 安全證書:Https協議需要到CA申請證書,一般免費證書較少,因而需要一定費用。 資料傳輸:Http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。 連線方式:Http和Https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。 **2、Get和Post請求** **瀏覽器端** 從瀏覽器角度看這個兩種請求的區別:GET方式讀取資源,比如Get到靜態頁面,即使多次讀取不會對訪問資料產生影響,也被稱為"冪等"請求。POST方式在頁面中定義表單,提交表單會把資料提交到伺服器,而且多數情況下會產生資料,比如常用的儲存資料介面,並非"冪等"操作,不冪等也就意味著不能隨意多次執行。 **服務介面** 這裡指用Ajax程式請求服務介面,提交的請求型別。或者其他Http請求工具類,還有情況是微服務中各種Feign介面間的請求。這種情況介面傳送請求時,限制相對較少,比如REST風格介面常用GET、POST、PUT、DELETE,幾種方式分別獲取、建立、更新、刪除 資源。 **3、握手揮手機制** **三次握手** ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150817040-1964499861.png) 第一次握手:客戶端主動向伺服器發起請求連線,請求報文中傳送SYN=1,此時隨機生成初始序列號seq=x,此時,客戶端程序進入SYN-SENT同步已傳送狀態。 第二次握手:服務端收到請求報文後,確認客戶的SYN,如果請求沒有拒絕,則發出確認報文。報文中應該ACK=1,SYN=1,確認號是ack=x+1,同時自己也傳送一個SYN包seq=y,此時,伺服器程序進入SYN-RCVD同步收到狀態。 第三次握手:客戶端收到確認後,需要向伺服器確認報文的ACK=1,ack=y+1,此時,TCP連線建立,客戶端進入ESTABLISHED已建立連線狀態。完成三次握手,客戶端與伺服器開始傳送資料。 **四次揮手** ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150829396-570708059.png) 第一次揮手:客戶端傳送一個結束FIN,用來主動關閉和服務端的資料傳輸,釋放連線且停止傳送資料,報文首部:FIN=1,序列號seq=u;隨後客戶端進入終止等待1狀態FIN-WAIT-1。 第二次揮手:服務端收到這個FIN,發出確認報文ACK=1,確認收到序號是收到的序號+1,即ack=u+1,且帶上自己的序列號seq=v,和SYN一樣,一個FIN將佔用一個序號。如此,伺服器通知應用程序,客戶端已經沒有資料要傳送,如果伺服器傳送資料,客戶端依然要接收,該狀態會持續一段時間,服務端進入關閉等待狀態CLOSE-WAIT。客戶端收到伺服器的確認請求後,進入終止等待2狀態FIN-WAIT-2,等待伺服器傳送連線釋放報文。 第三次揮手:伺服器向客戶端傳送釋放連線報文FIN=1,ack=u+1,此時服務端還處於半關閉狀態,伺服器可能還會發送一些資料,此時序列號為seq=w,如此,伺服器進入最後確認狀態LAST-ACK,等待客戶端的確認。 第四次揮手:客戶端收到伺服器的連線釋放報文後,回發確認,ACK=1,ack=w+1,序列號是seq=u+1,如此,客戶端進入時間等待狀態TIME-WAIT。此時TCP連線還沒有釋放,必須經過最長報文段壽命的時間後,才進入CLOSED狀態。MSL:最長報文段壽命,一般2分鐘,TCP連線釋放時,主動方必須經過2MSL後才進入CLOSED狀態,因此主動方關閉時間比較晚。 # 三、Servlet元件 Java編寫的伺服器端程式,具有獨立於平臺和協議的特性,主要功能在於互動式地瀏覽和生成資料,生成動態Web內容。使用Servlet,可以收集來自網頁表單的使用者輸入,呈現來自資料庫或者其他源的記錄,還可以動態建立網頁。 **1、實現方式** 繼承HttpServlet,HttpServlet擔任抽象模板角色,模板方法:由service()方法擔任; 繼承GenericServlet抽象類,其中的service方法為抽象方法; 實現Servlet介面,包含init、getServletConfig、service、getServletInfo、destroy幾個核心方法; **2、生命週期** 載入和例項化,初始化init,服務service,銷燬:destroy。 **3、核心API元件** **ServletConfig**:獲取servlet初始化引數和servletContext物件; **ServletContext**:在整個Web應用的動態資源之間共享資料; **ServletRequest**:封裝Http請求資訊,在請求時建立; **ServletResponse**:封裝Http響應資訊,在請求時建立; **4、轉發和重定向** 轉發:伺服器端進行的頁面跳轉的控制 ; 重定向:服務端響應跳轉資訊,瀏覽器端進行的頁面跳轉 ; ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150843558-1766120631.png) **5、Cookie與Session** **Cookie機制** ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150855679-1744575120.png) Cookie在HTTP中通常是用來辨別使用者身份,進行會話跟蹤而儲存在使用者本地終端上的資料,一般會加密處理,由使用者客戶端計算機暫時或永久儲存的資訊。其結構就是一個鍵和一個值構成的。隨著伺服器端的響應傳送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie儲存起來,當下一次再訪問伺服器時把Cookie再發送給伺服器。 **Session會話** ![](https://img2020.cnblogs.com/blog/1691717/202010/1691717-20201009150907718-848954323.png) 使用者在應用程式的Web頁之間跳轉時,儲存在Session物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。Servlet中可以把一個會話內需要共享的資料儲存到HttSession物件中。四大域物件:PageContext、ServletRequest、HttpSession、ServletContext。 **6、監聽.過濾.攔截** **監聽器** JavaWeb三大元件:Servlet,Listener,Filter,監聽器就是指在應用程式中監聽相關物件狀態變化的元件。 **過濾器** 客戶端請求Servlet時,先執行相關Filter,如果Filter通過,則繼承執行請求的Servlet;如果Filter不通過,則不會執行使用者請求的Servlet。過濾器可以動態地攔截請求和響應。 **攔截器** Spring框架中的攔截器Interceptor類似於Servlet中的過濾器Filter,主要用於攔截使用者請求並作相應的處理。例如通過攔截器可以進行許可權驗證、記錄請求資訊的日誌、判斷使用者是否登入等。請求轉發不執行攔截、過濾;重定向執行攔截和過濾。 # 四、資料庫連線池 **1、C3P0連線池** C3P0是一個開源的JDBC連線池,應用程式根據C3P0配置來初始化資料庫連線,可以自動回收空閒連線的功能。 **2、Druid連線池** Druid連線池為監控而生,內建強大的監控功能,監控特性不影響效能。內建了StatFilter功能,能採集非常完備的連線池中訪問資料庫執行資訊,Druid連線池內建一個監控頁面,提供了非常完備的監控資訊,可以快速診斷系統的瓶頸,也是當前最常用的連線池。 # 五、執行伺服器 **1、Jetty容器** Jetty 是一個開源的servlet容器,它為基於Java的web容器,例如JSP和servlet提供執行環境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式釋出。開發人員可以將Jetty容器例項化成一個物件,可以迅速為一些獨立執行(stand-alone)的Java應用提供網路和web連線。 **2、Tomcat伺服器** Tomcat伺服器是一個免費的開放原始碼的Web應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP程式的首選。使用Tomcat最關鍵的兩個操作:使用開發工具連線Tomcat並部署web應用;將應用程式打包放到Tomcat服務下執行。 # 六、原始碼地址 ``` GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile ``` **推薦閱讀:程式設計體系整理** |序號|專案名稱|GitHub地址|GitEE地址|推薦指數| |:---|:---|:---|:---|:---| |01|Java描述設計模式,演算法,資料結構|[GitHub·點這裡](https://github.com/cicadasmile/model-arithmetic-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/model-arithmetic-parent)|☆☆☆☆☆| |02|Java基礎、併發、面向物件、Web開發|[GitHub·點這裡](https://github.com/cicadasmile/java-base-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/java-base-parent)|☆☆☆☆| |03|SpringCloud微服務基礎元件案例詳解|[GitHub·點這裡](https://github.com/cicadasmile/spring-cloud-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-cloud-base)|☆☆☆| |04|SpringCloud微服務架構實戰綜合案例|[GitHub·點這裡](https://github.com/cicadasmile/husky-spring-cloud)|[GitEE·點這裡](https://gitee.com/cicadasmile/husky-spring-cloud)|☆☆☆☆☆| |05|SpringBoot框架基礎應用入門到進階|[GitHub·點這裡](https://github.com/cicadasmile/spring-boot-base)|[GitEE·點這裡](https://gitee.com/cicadasmile/spring-boot-base)|☆☆☆☆| |06|SpringBoot框架整合開發常用中介軟體|[GitHub·點這裡](https://github.com/cicadasmile/middle-ware-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/middle-ware-parent)|☆☆☆☆☆| |07|資料管理、分散式、架構設計基礎案例|[GitHub·點這裡](https://github.com/cicadasmile/data-manage-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/data-manage-parent)|☆☆☆☆☆| |08|大資料系列、儲存、元件、計算等框架|[GitHub·點這裡](https://github.com/cicadasmile/big-data-parent)|[GitEE·點這裡](https://gitee.com/cicadasmile/big-data-parent)|☆☆