Servlet 运行工作原理详解
Servlet 運(yùn)行工作原理詳解
瓜子二手車 秋季校招內(nèi)推郵箱:liyoule@guazi.com,歡迎投簡歷哦
一、研發(fā)類校招
1.研發(fā)工程師(前端/后端/云平臺開發(fā))
2.算法
3.測試開發(fā)
4.數(shù)據(jù)倉庫
5.安全工程師
二、運(yùn)營/數(shù)據(jù)分析類職位校招
1.數(shù)據(jù)分析(商業(yè)分析/經(jīng)營分析/業(yè)務(wù)分析等)
2.運(yùn)營(品類運(yùn)營)
三、產(chǎn)品類職位校招
1、產(chǎn)品經(jīng)理
投遞方式:郵件發(fā)送簡歷至liyoule@guazi.com.郵件主題: [校招簡歷投遞] 姓名-學(xué)校-崗位
投遞截止時間: 2021/12/31 24:00
正文開始:
事實(shí)上,servlet就是一個Java接口,interface! 打開idea,ctrl + shift + n,搜索servlet,就可以看到是一個只有5個方法的interface!
所以,提問中說的網(wǎng)絡(luò)協(xié)議、http什么的,servlet根本不管!也管不著!
那servlet是干嘛的?很簡單,接口的作用是什么?規(guī)范唄!
servlet接口定義的是一套處理網(wǎng)絡(luò)請求的規(guī)范,所有實(shí)現(xiàn)servlet的類,都需要實(shí)現(xiàn)它那五個方法,其中最主要的是兩個生命周期方法 init()和destroy(),還有一個處理請求的service(),也就是說,所有實(shí)現(xiàn)servlet接口的類,或者說,所有想要處理網(wǎng)絡(luò)請求的類,都需要回答這三個問題:
你初始化時要做什么
你銷毀時要做什么
你接受到請求時要做什么
這是Java給的一種規(guī)范!就像阿西莫夫的機(jī)器人三大定律、行尸走肉里Rick的那三個問題一樣,規(guī)范!
servlet是一個規(guī)范,那實(shí)現(xiàn)了servlet的類,就能處理請求了嗎?
答案是,不能。
你可以隨便谷歌一個servlet的hello world教程,里面都會讓你寫一個servlet,相信我,你從來不會在servlet中寫什么監(jiān)聽8080端口的代碼,servlet不會直接和客戶端打交道!
那請求怎么來到servlet呢?答案是servlet容器,比如我們最常用的tomcat,同樣,你可以隨便谷歌一個servlet的hello world教程,里面肯定會讓你把servlet部署到一個容器中,不然你的servlet壓根不會起作用。
tomcat才是與客戶端直接打交道的家伙,他監(jiān)聽了端口,請求過來后,根據(jù)url等信息,確定要將請求交給哪個servlet去處理,然后調(diào)用那個servlet的service方法,service方法返回一個response對象,tomcat再把這個response返回給客戶端。
Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的服務(wù)器端程序。其主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動態(tài)Web內(nèi)容。狹義的Servlet是指Java語言實(shí)現(xiàn)的一個接口,廣義的Servlet是指任何實(shí)現(xiàn)了這個Servlet接口的類,一般情況下,人們將Servlet理解為后者。
Servlet運(yùn)行于支持Java的應(yīng)用服務(wù)器中。從原理上講,Servlet可以響應(yīng)任何類型的請求,但絕大多數(shù)情況下Servlet只用來擴(kuò)展基于HTTP協(xié)議的Web服務(wù)器。
最早支持Servlet標(biāo)準(zhǔn)的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服務(wù)器開始支持標(biāo)準(zhǔn)的Servlet。
工作流程
Web Client 向Servlet容器(Tomcat)發(fā)出Http請求
Servlet容器接收Web Client的請求
Servlet容器創(chuàng)建一個HttpRequest對象,將Web Client請求的信息封裝到這個對象中。
Servlet容器創(chuàng)建一個HttpResponse對象
Servlet容器調(diào)用HttpServlet對象的service方法,把HttpRequest對象與HttpResponse對象作為參數(shù)傳給 HttpServlet 對象。
HttpServlet調(diào)用HttpRequest對象的有關(guān)方法,獲取Http請求信息。
HttpServlet調(diào)用HttpResponse對象的有關(guān)方法,生成響應(yīng)數(shù)據(jù)。
Servlet容器把HttpServlet的響應(yīng)結(jié)果傳給Web Client。
處理請求流程
用戶點(diǎn)擊一個鏈接,指向了一個servlet而不是一個靜態(tài)頁面。
容器“看出”這個請求是一個Servlet,所以它創(chuàng)建了兩個對象HttpServletRequest和HttpServletResponse。
容器根據(jù)請求中的URL找到正確的Servlet,為這個請求創(chuàng)建或分配一個線程,并把請求和響應(yīng)對象傳遞給這個Servlet線程。
容器調(diào)用Servlet的service()方法。根據(jù)請求的不同類型,service()方法會調(diào)用doGet()或doPost()方法。這里假設(shè)調(diào)用doGet()方法。
doGet()方法生成動態(tài)頁面,并把這個頁面“塞到”響應(yīng)對象里,需要注意的是,容器還有響應(yīng)對象的一個引用!
線程結(jié)束,容器把響應(yīng)對象轉(zhuǎn)換為一個HTTP響應(yīng),并把它發(fā)回給客戶,然后刪除請求和響應(yīng)對象。
工作原理
1、首先簡單解釋一下Servlet接收和響應(yīng)客戶請求的過程,首先客戶發(fā)送一個請求,Servlet是調(diào)用service()方法對請求進(jìn)行響應(yīng)的,通過源代碼可見,service()方法中對請求的方式進(jìn)行了匹配,選擇調(diào)用doGet,doPost等這些方法,然后再進(jìn)入對應(yīng)的方法中調(diào)用邏輯層的方法,實(shí)現(xiàn)對客戶的響應(yīng)。在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法的,HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實(shí)現(xiàn)doGet或doPost等這些方法。
2、每一個自定義的Servlet都必須實(shí)現(xiàn)Servlet的接口,Servlet接口中定義了五個方法,其中比較重要的三個方法涉及到Servlet的生命周期,分別是上文提到的init(),service(),destroy()方法。GenericServlet是一個通用的,不特定于任何協(xié)議的Servlet,它實(shí)現(xiàn)了Servlet接口。而HttpServlet繼承于GenericServlet,因此HttpServlet也實(shí)現(xiàn)了Servlet接口。所以我們定義Servlet的時候只需要繼承HttpServlet即可。
3、Servlet接口和GenericServlet是不特定于任何協(xié)議的,而HttpServlet是特定于HTTP協(xié)議的類,所以HttpServlet中實(shí)現(xiàn)了service()方法,并將請求ServletRequest、ServletResponse 強(qiáng)轉(zhuǎn)為HttpRequest 和 HttpResponse。
總結(jié)
以上是生活随笔為你收集整理的Servlet 运行工作原理详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于基于jsp+mysql+Spring
- 下一篇: AxureUX中后台管理信息系统通用原型