我們講到servlet可以理解服務(wù)器端處理數(shù)據(jù)的java小程序,那么誰(shuí)來(lái)負(fù)責(zé)管理servlet呢?這時(shí)候我們就要用到web容器。它幫助我們管理著servlet等,使我們只需要將重心專(zhuān)注于業(yè)務(wù)邏輯。
什么是web容器?
servlet沒(méi)有main方法,那我們?nèi)绾螁?dòng)一個(gè)servlet,如何結(jié)束一個(gè)servlet,如何尋找一個(gè)servlet等等,都受控于另一個(gè)java應(yīng)用,這個(gè)應(yīng)用我們就稱(chēng)之為web容器。
我們最常見(jiàn)的tomcat就是這樣一個(gè)容器。如果web服務(wù)器應(yīng)用得到一個(gè)指向某個(gè)servlet的請(qǐng)求,此時(shí)服務(wù)器不是把servlet交給servlet本身,而是交給部署該servlet的容器。要有容器向servlet提供http請(qǐng)求和響應(yīng),而且要由容器調(diào)用servlet的方法,如doPost或者doGet。
web容器的作用
servlet需要由web容器來(lái)管理,那么采取這種機(jī)制有什么好處呢?
通信支持
利用容器提供的方法,你可以簡(jiǎn)單的實(shí)現(xiàn)servlet與web服務(wù)器的對(duì)話(huà)。否則你就要自己建立server搜創(chuàng)可貼,監(jiān)聽(tīng)端口,創(chuàng)建新的流等等一系列復(fù)雜的操作。而容器的存在就幫我們封裝這一系列復(fù)雜的操作。使我們能夠?qū)W⒂趕ervlet中的業(yè)務(wù)邏輯的實(shí)現(xiàn)。生命周期管理
容器負(fù)責(zé)servlet的整個(gè)生命周期。如何加載類(lèi),實(shí)例化和初始化servlet,調(diào)用servlet方法,并使servlet實(shí)例能夠被垃圾回收。有了容器,我們就不用花精力去考慮這些資源管理垃圾回收之類(lèi)的事情。多線(xiàn)程支持
容器會(huì)自動(dòng)為接收的每個(gè)servlet請(qǐng)求創(chuàng)建一個(gè)新的java線(xiàn)程,servlet運(yùn)行完之后,容器會(huì)自動(dòng)結(jié)束這個(gè)線(xiàn)程。聲明式實(shí)現(xiàn)安全
利用容器,可以使用xml部署描述文件來(lái)配置安全性,而不必將其硬編碼到servlet中。jsp支持
容器將jsp翻譯成java!
容器如何處理請(qǐng)求
client點(diǎn)擊一個(gè)URL,其URL指向一個(gè)servlet而不是靜態(tài)界面。
容器識(shí)別出這個(gè)請(qǐng)求索要的是一個(gè)servlet,所以創(chuàng)建兩個(gè)對(duì)象:
- httpservletrequest
- httpservletresponse
容器根據(jù)請(qǐng)求中的URL找到對(duì)應(yīng)的servlet,為這個(gè)請(qǐng)求創(chuàng)建或分配一個(gè)線(xiàn)程,并把兩個(gè)對(duì)象request和response傳遞到servlet線(xiàn)程中。

容器調(diào)用servlet的service()方法。根據(jù)請(qǐng)求的不同類(lèi)型,service()方法會(huì)調(diào)用doGet()或者doPost()方法。

doGet()方法生成動(dòng)態(tài)頁(yè)面,然后把這個(gè)頁(yè)面填入到response對(duì)象中,此時(shí),容器仍然擁有response對(duì)象的引用。

線(xiàn)程結(jié)束。容器把response對(duì)象轉(zhuǎn)換成http響應(yīng),傳回client,并銷(xiāo)毀response和request對(duì)象。
URL與servlet映射模式
<servlet>
<servlet-name>Ch1Servlet</servlet-name>
<servlet-class>ch1Servlet.Ch1Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch1Servlet</servlet-name>
<url-pattern>/Ch1Servlet</url-pattern>
</servlet-mapping>
servlet有三個(gè)名字:
- 客戶(hù)知道的URL名
<url-pattern>/Ch1Servlet</url-pattern> - 部署人員知道的秘密的內(nèi)部名
<servlet-name>Ch1Servlet</servlet-name> - 實(shí)際文件名
<servlet-class>ch1Servlet.Ch1Servlet</servlet-class>