最近在看教程的時候,又看到了servlet
這個詞,忽然發現我好像並不瞭解他,只是‘有所耳聞’。因此決定學習一下。java
維基百科上說:web
Servlet
(Server Applet),全稱Java Servlet
,未有中文譯文。是用Java編寫的服務器端程序。其主要功能在於交互式
地瀏覽和修改數據,生成動態Web內容。狹義的Servlet是指Java語言實現的一個接口
,廣義的Servlet是指任何實現了這個Servlet接口的類
,通常狀況下,人們將Servlet理解爲後者。
簡單來講,Servlet
就是個接口,一段程序。服務器
經過上面的介紹,能夠看到,中間提到交互式地瀏覽和修改數據
,這忽然讓我想到了前一段時間學的socket
,經過socket
,咱們也會實現客戶端和服務器的交互效果。cookie
這就讓我有點想知道,servlet
和socket
有沒有什麼關係呢?網絡
在這裏,我會從幾方面來簡單分析二者。架構
socket
:使用TCP/IP
協議或UDP
協議,前者居多。servlet
:從維基百科中能夠看到,通常使用的是HTTP
協議。app
socket
:因爲是使用的TCP
協議,因此首先必需要作到的就是創建兩端的鏈接,創建一條持續鏈接的通道。
這須要服務器端先創建起一個服務,而後由客戶端去鏈接服務器端,這樣,就創建好了一條鏈接,而後就能夠進行隨意的通訊了,服務器能夠發送消息給客戶端,一樣的客戶端也能夠發送消息給服務端。socket
整理一下:學習
1)服務器端創建服務
2)客戶端鏈接服務器端
3)相互發送數據
而後咱們在看一下servlet
的工做模式:spa
因爲servlet
大多數是工做在基於http的web服務器下,因此它的模式想必你們也很熟悉了:
1) 客戶端發送請求至服務器端;
2) 服務器將請求信息發送至 Servlet;
3) Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,一般取決於客戶端的請求;
4) 服務器將響應返回給客戶端。
看到這裏,更加以爲二者太像了。沒錯的,因爲兩個服務協議的關係,http
原本就是對TCP
協議的一個封裝和完善,因此其底層的數據傳輸仍是使用TCP
的那套東西。
對熟悉網絡的朋友來講,二者只是工做層面不一樣的兩個相互協做的過程而已。
這樣,有這種相似程度也就不以爲那麼稀奇了。
首先是socket
,經過以前的學習,socket的使用以下:
// 服務端 SocketService socketService = new SocketService(xxxx); Socket socket = socketService.accept(); // 客戶端 Socket socket = new Socket("127.0.0.1", xxxx);
主要的就是這三步,也就是說,在具體實現的時候,咱們須要對服務器和客戶端二者都進行操做。
而後在看一下servlet。下面這段代碼就是最近教程學習到的:
@GetMapping("/me") public Teacher me(HttpServletResponse httpServletResponse) { Teacher teacher = new Teacher(); try { teacher = teacherService.me(); } catch (AuthException e) { httpServletResponse.setStatus(HttpStatus.UNAUTHORIZED.value()); } return teacher; }
這裏面咱們用到了一個叫作HttpServletResponse
的東西,相信咱們看到了response
這個單詞後,立馬就會想到,是否是還有一個叫作HttpServletRequest
的東西,沒錯的。
基於http的通訊就是有這樣的特色,在服務器獲取到一個請求以後,就會建立出HttpServletResponse
和HttpServletRequest
這樣兩個對象,而後若是我想向客戶端發送東西的話,就使用HttpServletResponse
;若是咱們要從客戶端獲取東西的話,就使用HttpServletRequest
。
好比咱們上面會想客戶端返回一個狀態碼,因此使用了HttpServletResponse
。
固然,若是咱們還想傳遞其餘關於信息也是能夠的,好比cookie,header,就像咱們手動作了一個http響應同樣。
看到這裏,咱們會發現,servlet的操做貌似都沒有涉及到客戶端,所有都是在服務器端完成的。是這樣的,servlet
在前面也說到了,它是一段服務器端工做
的程序。
可能看到這裏仍是沒有怎麼明白socket
和servlet
的區別是什麼,其實簡單一點說就是:socket比servlet更基本,servlet基於socket。
由於二者都是爲通訊而服務,因此,當咱們結合了網絡的知識後,會發現這根咱們的網絡中的網絡架構是那麼的同樣,他的工做模式和咱們所熟知的網絡工做模式又是那麼的類似。
貌似提到了servlet
,就不得不提到servlet容器了
。
從字面上理解,servlet容器
就是裝servlet的東西。
首先,servlet容器
一樣也是一段程序。從上面對servlet
的學習,咱們大體知道了servlet是工做在服務器端的,可是現實狀況是,不少的服務器都不能直接
支持servlet
,而咱們如今又想用servlet,這時就須要編寫一段程序,加在服務器上,幫咱們來處理servlet
。這就是咱們說的servlet容器
。咱們接觸過的Tomcat
就是一個這樣的容器。
通常的通訊是這樣的:
當咱們須要使用servlet
時,他就是這樣的:
而後在web服務器
收到一個http請求以後,就會轉給servlet容器
,而後再由容器交給servlet去處理。
經過對servlet的簡單瞭解,忽然發現不少我學過的東西並無我想象的那樣沒用,不少時候,咱們遇到的事情或是問題,他們可能都是想通的。也許,對目前所學,咱們並不能看到它的實際做用,可是說不許哪天,曾經不起眼的所學,就會成爲解決問題的關鍵。
相關參考:
https://blog.csdn.net/snarlfu...
https://zh.wikipedia.org/wiki...
https://blog.csdn.net/wabiaoz...