我們講到servlet可以理解服務(wù)器端處理數(shù)據(jù)的java小程序饲帅,那么誰來負(fù)責(zé)管理servlet呢拓萌?這時候我們就要用到web容器睦优。它幫助我們管理著servlet等壳咕,使我們只需要將重心專注于業(yè)務(wù)邏輯。
什么是web容器血淌?
servlet沒有main方法矩欠,那我們?nèi)绾螁右粋€servlet,如何結(jié)束一個servlet悠夯,如何尋找一個servlet等等癌淮,都受控于另一個java應(yīng)用,這個應(yīng)用我們就稱之為web容器沦补。
我們最常見的tomcat就是這樣一個容器乳蓄。如果web服務(wù)器應(yīng)用得到一個指向某個servlet的請求,此時服務(wù)器不是把servlet交給servlet本身策彤,而是交給部署該servlet的容器栓袖。要有容器向servlet提供http請求和響應(yīng),而且要由容器調(diào)用servlet的方法店诗,如doPost或者doGet裹刮。
web容器的作用
servlet需要由web容器來管理,那么采取這種機制有什么好處呢庞瘸?
通信支持
利用容器提供的方法捧弃,你可以簡單的實現(xiàn)servlet與web服務(wù)器的對話。否則你就要自己建立server搜創(chuàng)可貼擦囊,監(jiān)聽端口违霞,創(chuàng)建新的流等等一系列復(fù)雜的操作。而容器的存在就幫我們封裝這一系列復(fù)雜的操作瞬场。使我們能夠?qū)W⒂趕ervlet中的業(yè)務(wù)邏輯的實現(xiàn)买鸽。生命周期管理
容器負(fù)責(zé)servlet的整個生命周期。如何加載類贯被,實例化和初始化servlet眼五,調(diào)用servlet方法妆艘,并使servlet實例能夠被垃圾回收。有了容器看幼,我們就不用花精力去考慮這些資源管理垃圾回收之類的事情批旺。多線程支持
容器會自動為接收的每個servlet請求創(chuàng)建一個新的java線程,servlet運行完之后诵姜,容器會自動結(jié)束這個線程汽煮。聲明式實現(xiàn)安全
利用容器,可以使用xml部署描述文件來配置安全性棚唆,而不必將其硬編碼到servlet中暇赤。jsp支持
容器將jsp翻譯成java!
容器如何處理請求
client點擊一個URL瑟俭,其URL指向一個servlet而不是靜態(tài)界面翎卓。
容器識別出這個請求索要的是一個servlet,所以創(chuàng)建兩個對象:
- httpservletrequest
- httpservletresponse
容器根據(jù)請求中的URL找到對應(yīng)的servlet摆寄,為這個請求創(chuàng)建或分配一個線程,并把兩個對象request和response傳遞到servlet線程中坯门。
容器調(diào)用servlet的service()方法微饥。根據(jù)請求的不同類型,service()方法會調(diào)用doGet()或者doPost()方法古戴。
doGet()方法生成動態(tài)頁面欠橘,然后把這個頁面填入到response對象中,此時现恼,容器仍然擁有response對象的引用肃续。
線程結(jié)束。容器把response對象轉(zhuǎn)換成http響應(yīng)叉袍,傳回client始锚,并銷毀response和request對象。
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有三個名字:
- 客戶知道的URL名
<url-pattern>/Ch1Servlet</url-pattern>
- 部署人員知道的秘密的內(nèi)部名
<servlet-name>Ch1Servlet</servlet-name>
- 實際文件名
<servlet-class>ch1Servlet.Ch1Servlet</servlet-class>