编程体系结构(07):JavaEE之Web开发
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、基礎(chǔ)概念
1、CS與BS架構(gòu)
CS架構(gòu)模式
客戶端/服務(wù)器(Client/Server)模式,既要編寫服務(wù)器端程序,也要開發(fā)客戶端程序,軟件更新時(shí)需要同時(shí)更新客戶端和服務(wù)器端,整體模式相比BS架構(gòu)要復(fù)雜,但是安全性比較高。
B/S架構(gòu)模式
即瀏覽器/服務(wù)器(Browser/Server),只需要編寫服務(wù)器端程序,瀏覽器的界面作為訪問的服務(wù)端的入口,架構(gòu)相對簡單,可以快速迭代,但是安全性較差。
2、Socket通信機(jī)制
TCP/IP 協(xié)議
傳輸控制協(xié)議/網(wǎng)際協(xié)議是指能夠在多個(gè)不同網(wǎng)絡(luò)間實(shí)現(xiàn)信息傳輸?shù)膮f(xié)議簇。TCP/IP協(xié)議不僅僅指的是TCP和IP兩個(gè)協(xié)議,而是指一個(gè)由FTP、SMTP、TCP、UDP、IP等協(xié)議構(gòu)成的協(xié)議簇,只是因?yàn)樵赥CP/IP協(xié)議中TCP協(xié)議和IP協(xié)議最具代表性,所以被稱為TCP/IP協(xié)議。
Socket套接字
網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象,一個(gè)套接字就是網(wǎng)絡(luò)上進(jìn)程通信的一端,提供了應(yīng)用層進(jìn)程利用網(wǎng)絡(luò)協(xié)議交換數(shù)據(jù)的機(jī)制。通常接收請求數(shù)據(jù),并做業(yè)務(wù)處理的稱為服務(wù)端即ServerSocket,發(fā)送請求并接收處理結(jié)果的稱為客戶端。
二、Http協(xié)議
1、Http和Https
Http協(xié)議
HTTP超文本傳輸協(xié)議,是用于從萬維網(wǎng)服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議,基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù):HTML文件、圖片、查詢數(shù)據(jù)等。HTTP協(xié)議基于客戶端-服務(wù)端架構(gòu)模式。瀏覽器作為HTTP客戶端通過URL向服務(wù)端即WEB服務(wù)器發(fā)送請求。Web服務(wù)器根據(jù)接收到的請求后,處理完請求后向客戶端發(fā)送響應(yīng)信息。
協(xié)議特點(diǎn):簡單快速、靈活、無連接、無狀態(tài)、支持客戶/服務(wù)器模式。
Https協(xié)議
以安全為準(zhǔn)則的HTTP通道,是HTTP的安全版,在HTTP請求上加入SSL層,HTTPS的安全基礎(chǔ)是SSL,因此加密的詳細(xì)內(nèi)容就需要SSL。簡單來說,HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,要比http協(xié)議安全。HTTPS協(xié)議的主要作用可以分為兩種:一種是建立一個(gè)信息安全通道,來保證數(shù)據(jù)傳輸?shù)陌踩?#xff1b;另一種就是確認(rèn)網(wǎng)站的真實(shí)性。
Https和Http區(qū)別
安全證書:Https協(xié)議需要到CA申請證書,一般免費(fèi)證書較少,因而需要一定費(fèi)用。
數(shù)據(jù)傳輸:Http是超文本傳輸協(xié)議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協(xié)議。
連接方式:Http和Https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
2、Get和Post請求
瀏覽器端
從瀏覽器角度看這個(gè)兩種請求的區(qū)別:GET方式讀取資源,比如Get到靜態(tài)頁面,即使多次讀取不會(huì)對訪問數(shù)據(jù)產(chǎn)生影響,也被稱為"冪等"請求。POST方式在頁面中定義表單,提交表單會(huì)把數(shù)據(jù)提交到服務(wù)器,而且多數(shù)情況下會(huì)產(chǎn)生數(shù)據(jù),比如常用的保存數(shù)據(jù)接口,并非"冪等"操作,不冪等也就意味著不能隨意多次執(zhí)行。
服務(wù)接口
這里指用Ajax程序請求服務(wù)接口,提交的請求類型。或者其他Http請求工具類,還有情況是微服務(wù)中各種Feign接口間的請求。這種情況接口發(fā)送請求時(shí),限制相對較少,比如REST風(fēng)格接口常用GET、POST、PUT、DELETE,幾種方式分別獲取、創(chuàng)建、更新、刪除 資源。
3、握手揮手機(jī)制
三次握手
第一次握手:客戶端主動(dòng)向服務(wù)器發(fā)起請求連接,請求報(bào)文中發(fā)送SYN=1,此時(shí)隨機(jī)生成初始序列號(hào)seq=x,此時(shí),客戶端進(jìn)程進(jìn)入SYN-SENT同步已發(fā)送狀態(tài)。
第二次握手:服務(wù)端收到請求報(bào)文后,確認(rèn)客戶的SYN,如果請求沒有拒絕,則發(fā)出確認(rèn)報(bào)文。報(bào)文中應(yīng)該ACK=1,SYN=1,確認(rèn)號(hào)是ack=x+1,同時(shí)自己也發(fā)送一個(gè)SYN包seq=y,此時(shí),服務(wù)器進(jìn)程進(jìn)入SYN-RCVD同步收到狀態(tài)。
第三次握手:客戶端收到確認(rèn)后,需要向服務(wù)器確認(rèn)報(bào)文的ACK=1,ack=y+1,此時(shí),TCP連接建立,客戶端進(jìn)入ESTABLISHED已建立連接狀態(tài)。完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù)。
四次揮手
第一次揮手:客戶端發(fā)送一個(gè)結(jié)束FIN,用來主動(dòng)關(guān)閉和服務(wù)端的數(shù)據(jù)傳輸,釋放連接且停止發(fā)送數(shù)據(jù),報(bào)文首部:FIN=1,序列號(hào)seq=u;隨后客戶端進(jìn)入終止等待1狀態(tài)FIN-WAIT-1。
第二次揮手:服務(wù)端收到這個(gè)FIN,發(fā)出確認(rèn)報(bào)文ACK=1,確認(rèn)收到序號(hào)是收到的序號(hào)+1,即ack=u+1,且?guī)献约旱男蛄刑?hào)seq=v,和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。如此,服務(wù)器通知應(yīng)用進(jìn)程,客戶端已經(jīng)沒有數(shù)據(jù)要發(fā)送,如果服務(wù)器發(fā)送數(shù)據(jù),客戶端依然要接收,該狀態(tài)會(huì)持續(xù)一段時(shí)間,服務(wù)端進(jìn)入關(guān)閉等待狀態(tài)CLOSE-WAIT。客戶端收到服務(wù)器的確認(rèn)請求后,進(jìn)入終止等待2狀態(tài)FIN-WAIT-2,等待服務(wù)器發(fā)送連接釋放報(bào)文。
第三次揮手:服務(wù)器向客戶端發(fā)送釋放連接報(bào)文FIN=1,ack=u+1,此時(shí)服務(wù)端還處于半關(guān)閉狀態(tài),服務(wù)器可能還會(huì)發(fā)送一些數(shù)據(jù),此時(shí)序列號(hào)為seq=w,如此,服務(wù)器進(jìn)入最后確認(rèn)狀態(tài)LAST-ACK,等待客戶端的確認(rèn)。
第四次揮手:客戶端收到服務(wù)器的連接釋放報(bào)文后,回發(fā)確認(rèn),ACK=1,ack=w+1,序列號(hào)是seq=u+1,如此,客戶端進(jìn)入時(shí)間等待狀態(tài)TIME-WAIT。此時(shí)TCP連接還沒有釋放,必須經(jīng)過最長報(bào)文段壽命的時(shí)間后,才進(jìn)入CLOSED狀態(tài)。MSL:最長報(bào)文段壽命,一般2分鐘,TCP連接釋放時(shí),主動(dòng)方必須經(jīng)過2MSL后才進(jìn)入CLOSED狀態(tài),因此主動(dòng)方關(guān)閉時(shí)間比較晚。
三、Servlet組件
Java編寫的服務(wù)器端程序,具有獨(dú)立于平臺(tái)和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。使用Servlet,可以收集來自網(wǎng)頁表單的用戶輸入,呈現(xiàn)來自數(shù)據(jù)庫或者其他源的記錄,還可以動(dòng)態(tài)創(chuàng)建網(wǎng)頁。
1、實(shí)現(xiàn)方式
繼承HttpServlet,HttpServlet擔(dān)任抽象模板角色,模板方法:由service()方法擔(dān)任;
繼承GenericServlet抽象類,其中的service方法為抽象方法;
實(shí)現(xiàn)Servlet接口,包含init、getServletConfig、service、getServletInfo、destroy幾個(gè)核心方法;
2、生命周期
加載和實(shí)例化,初始化init,服務(wù)service,銷毀:destroy。
3、核心API組件
ServletConfig:獲取servlet初始化參數(shù)和servletContext對象;
ServletContext:在整個(gè)Web應(yīng)用的動(dòng)態(tài)資源之間共享數(shù)據(jù);
ServletRequest:封裝Http請求信息,在請求時(shí)創(chuàng)建;
ServletResponse:封裝Http響應(yīng)信息,在請求時(shí)創(chuàng)建;
4、轉(zhuǎn)發(fā)和重定向
轉(zhuǎn)發(fā):服務(wù)器端進(jìn)行的頁面跳轉(zhuǎn)的控制 ;
重定向:服務(wù)端響應(yīng)跳轉(zhuǎn)信息,瀏覽器端進(jìn)行的頁面跳轉(zhuǎn) ;
5、Cookie與Session
Cookie機(jī)制
Cookie在HTTP中通常是用來辨別用戶身份,進(jìn)行會(huì)話跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù),一般會(huì)加密處理,由用戶客戶端計(jì)算機(jī)暫時(shí)或永久保存的信息。其結(jié)構(gòu)就是一個(gè)鍵和一個(gè)值構(gòu)成的。隨著服務(wù)器端的響應(yīng)發(fā)送給客戶端瀏覽器。然后客戶端瀏覽器會(huì)把Cookie保存起來,當(dāng)下一次再訪問服務(wù)器時(shí)把Cookie再發(fā)送給服務(wù)器。
Session會(huì)話
用戶在應(yīng)用程序的Web頁之間跳轉(zhuǎn)時(shí),存儲(chǔ)在Session對象中的變量將不會(huì)丟失,而是在整個(gè)用戶會(huì)話中一直存在下去。Servlet中可以把一個(gè)會(huì)話內(nèi)需要共享的數(shù)據(jù)保存到HttSession對象中。四大域?qū)ο?#xff1a;PageContext、ServletRequest、HttpSession、ServletContext。
6、監(jiān)聽.過濾.攔截
監(jiān)聽器
JavaWeb三大組件:Servlet,Listener,Filter,監(jiān)聽器就是指在應(yīng)用程序中監(jiān)聽相關(guān)對象狀態(tài)變化的組件。
過濾器
客戶端請求Servlet時(shí),先執(zhí)行相關(guān)Filter,如果Filter通過,則繼承執(zhí)行請求的Servlet;如果Filter不通過,則不會(huì)執(zhí)行用戶請求的Servlet。過濾器可以動(dòng)態(tài)地?cái)r截請求和響應(yīng)。
攔截器
Spring框架中的攔截器Interceptor類似于Servlet中的過濾器Filter,主要用于攔截用戶請求并作相應(yīng)的處理。例如通過攔截器可以進(jìn)行權(quán)限驗(yàn)證、記錄請求信息的日志、判斷用戶是否登錄等。請求轉(zhuǎn)發(fā)不執(zhí)行攔截、過濾;重定向執(zhí)行攔截和過濾。
四、數(shù)據(jù)庫連接池
1、C3P0連接池
C3P0是一個(gè)開源的JDBC連接池,應(yīng)用程序根據(jù)C3P0配置來初始化數(shù)據(jù)庫連接,可以自動(dòng)回收空閑連接的功能。
2、Druid連接池
Druid連接池為監(jiān)控而生,內(nèi)置強(qiáng)大的監(jiān)控功能,監(jiān)控特性不影響性能。內(nèi)置了StatFilter功能,能采集非常完備的連接池中訪問數(shù)據(jù)庫執(zhí)行信息,Druid連接池內(nèi)置一個(gè)監(jiān)控頁面,提供了非常完備的監(jiān)控信息,可以快速診斷系統(tǒng)的瓶頸,也是當(dāng)前最常用的連接池。
五、運(yùn)行服務(wù)器
1、Jetty容器
Jetty 是一個(gè)開源的servlet容器,它為基于Java的web容器,例如JSP和servlet提供運(yùn)行環(huán)境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式發(fā)布。開發(fā)人員可以將Jetty容器實(shí)例化成一個(gè)對象,可以迅速為一些獨(dú)立運(yùn)行(stand-alone)的Java應(yīng)用提供網(wǎng)絡(luò)和web連接。
2、Tomcat服務(wù)器
Tomcat服務(wù)器是一個(gè)免費(fèi)的開放源代碼的Web應(yīng)用服務(wù)器,屬于輕量級應(yīng)用服務(wù)器,在中小型系統(tǒng)和并發(fā)訪問用戶不是很多的場合下被普遍使用,是開發(fā)和調(diào)試JSP程序的首選。使用Tomcat最關(guān)鍵的兩個(gè)操作:使用開發(fā)工具連接Tomcat并部署web應(yīng)用;將應(yīng)用程序打包放到Tomcat服務(wù)下運(yùn)行。
六、源代碼地址
GitHub·地址 https://github.com/cicadasmile GitEE·地址 https://gitee.com/cicadasmile推薦閱讀:編程體系整理
| 01 | Java描述設(shè)計(jì)模式,算法,數(shù)據(jù)結(jié)構(gòu) | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 02 | Java基礎(chǔ)、并發(fā)、面向?qū)ο蟆eb開發(fā) | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆ |
| 03 | SpringCloud微服務(wù)基礎(chǔ)組件案例詳解 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆ |
| 04 | SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)綜合案例 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 05 | SpringBoot框架基礎(chǔ)應(yīng)用入門到進(jìn)階 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆ |
| 06 | SpringBoot框架整合開發(fā)常用中間件 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 07 | 數(shù)據(jù)管理、分布式、架構(gòu)設(shè)計(jì)基礎(chǔ)案例 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
| 08 | 大數(shù)據(jù)系列、存儲(chǔ)、組件、計(jì)算等框架 | GitHub·點(diǎn)這里 | GitEE·點(diǎn)這里 | ☆☆☆☆☆ |
總結(jié)
以上是生活随笔為你收集整理的编程体系结构(07):JavaEE之Web开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 架构设计:数据服务系统0到1落地实现方案
- 下一篇: Java描述设计模式(14):解释器模式