更新時間:2020-12-09 17:30:50 來源:動力節(jié)點 瀏覽1294次
很多Java初學者容易把Servlet和太多東西聯(lián)系起來,其實Servlet本身在Tomcat中是“非常被動”的一個角色,處理的事情也很簡單。網(wǎng)絡請求與響應,不是他的主要職責,它其實更偏向于業(yè)務代碼。所謂的Request和Response是Tomcat傳給它,用來處理請求和響應的工具,但它本身不處理這些。下文為大家詳細介紹Tomcat中Servlet。
Servlet就是一個普通的類,只不過這個類能夠接受和處理請求,并且做出響應。提到Servlet就繞不開Servlet容器,那么什么又是Servlet容器呢?通俗的講就是實現(xiàn)Servlet標準管理輔助Servlet類工作的工具。Servlet和Servlet容器在我看來就是子彈和槍的關(guān)系,通過對標準化接口的實現(xiàn)互相配合,彼此依存又獨立發(fā)展。在大部分的情況下我們又稱Servlet容器為服務器,常用的有Tomcat等。
為了迎接HTTP的到來,首先我們需要有一個Servlet類,并且告訴Servlet容器自己的存在,這兩個準備步驟就是創(chuàng)建Servlet類和寫入配置文件。類和Servlet容器之間的配合是通過接口實現(xiàn)的,一個類只需要實現(xiàn)特定的接口,就可以稱為一個Servlet類,并且能夠被Servlet所接受,這就是所謂的接口的解耦和。
在Tomcat中擁有一個Servlet類的三種方案:
1. 直接實現(xiàn)Servlet接口(interface)
2. 繼承GenericServlet類(abstract)
3. 繼承HttpServlet類(abstract)
在直接實現(xiàn)或者間接實現(xiàn)Servlet接口之后我們需要重寫其中的service方法,到此Servlet就準備好了。然后需要我們寫入配置文件,配置文件是一個固定的寫法,主要就是為了告訴Servlet容器自己在哪。
接受請求Servlet容器開啟服務之后就可以迎接request的到來了,當這個HTTP請求到達Servlet容器(以Tomcat為例)的時候,Tomcat看到有HTTP來,就把它帶到要去的那個地方(項目名),到了地點之后,Tomcat會拿出花名冊(web.xml)讓request挑一個(0.0)。
結(jié)果,不用挑有指定的,那就好辦了。Tomcat在部署文件中找 servlet-mapping 中與之匹配的 url-pattern,根據(jù)這個url-pattern的servlet-name 映射到真正的 servlet-class ,然后調(diào)用相應的 Servlet 類。
通過以上的步驟Tomcat就找到了HTTP想要見到的那個Servlet了,但是這個類也許準備好了,也許沒有,我們假定這個request是第一次來。這時候就開始了Servlet的生命周期了。
1.因為是第一次請求,Tomcat會調(diào)用Servlet類的無參構(gòu)造方法,創(chuàng)建這個Servlet的對象。
2.之后初始化,會調(diào)用init方法,這個方法會對Servlet類做一些初始化的工作,需要注意的這個方法在Servlet的一生中只會執(zhí)行這么一次。像初始化這么重要的事兒只進行一次是有現(xiàn)實意義的,畢竟如果可以多次的話,我早就一米八了。
3.初始化之后一個Servlet就正式的進入服務狀態(tài)可以接客了,這時候就會調(diào)用service方法,接受HTTP的request,并對這個請求做一些服務項目,剪個頭發(fā)之類啊,最后再把面目全非的請求送走,不,這時候應該叫響應response。聽說每次剪頭發(fā)都像整容,可惜好久沒有剪過頭發(fā)了。
4.經(jīng)過第一個請求之后,再有HTTP過來的時候,Servlet會直接調(diào)用service方法為其服務,畢竟誰一輩子也不能接一個客戶初始化一次吧。
5.最后當服務關(guān)閉的時候,會銷毀這個對象,在銷毀前會調(diào)用destroy方法。
Tomcat中Servlet實際上可以看成是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規(guī)范編寫一個Java類。而Tomcat本質(zhì)上是一個免費的開放源代碼的Servlet容器,Servlet容器在Servlet的生命周期內(nèi)包容和管理Servlet。Servlet被編譯為平臺獨立的字節(jié)碼,可以被動態(tài)地加載到支持Java技術(shù)的Tomcat服務器中運行。至于Servlet容器的相關(guān)知識,在本站的Tomcat服務器教程中有詳細講解,不要錯過哦。