問(wèn)題: 什么是容器? 什么是JSP容器? JSP容器的作用是什么? 什么是JSP引擎? 分析: 這些問(wèn)題是相同的,都是描述JSP或者Servlet對(duì)象是如何被管理或者運(yùn)行的。 回答: 首先應(yīng)該明白,JSP或者Servlet本身的運(yùn)行與普通客戶端程序是不相同的,客戶端程序是我們直接調(diào)用的,而JSP或者Servlet的運(yùn)行需要服務(wù)器,通常稱為應(yīng)用服務(wù)器,服務(wù)器負(fù)責(zé)創(chuàng)建JSP或者Servlet對(duì)象,然后調(diào)用JSP對(duì)象或者Servlet對(duì)象的相應(yīng)方法。 由誰(shuí)完成JSP或者Servlet對(duì)象的創(chuàng)建、方法的調(diào)用的呢?由容器完成,或者稱為JSP容器。 容器是用來(lái)容納其它組件的,這些組件包括JSP或者Servlet,完成這些組件對(duì)象的創(chuàng)建、方法的調(diào)用以及對(duì)象的銷毀。 容器如何知道創(chuàng)建哪個(gè)JSP或者Servlet的對(duì)象的呢?對(duì)于JSP,是根據(jù)文件名字確定的,對(duì)于Servlet,是通過(guò)web.xml中的配置確定的。 容器如何知道調(diào)用JSP或者Servlet的哪個(gè)方法?對(duì)于JSP,JSP頁(yè)面會(huì)被轉(zhuǎn)換成Java類,而頁(yè)面中的內(nèi)容會(huì)被轉(zhuǎn)換成Java類中的某個(gè)方法中的內(nèi)容,而這個(gè)方法的名字是固定的,容器會(huì)調(diào)用這個(gè)方法。對(duì)于Servlet,用戶需要根據(jù)請(qǐng)求的類型編寫(xiě)doGet或者doPost方法,容器會(huì)根據(jù)請(qǐng)求的方式是get還是post分別調(diào)用doGet或者doPost。 而事實(shí)上,Tomcat在大多數(shù)情況下充當(dāng)servlet的容器,也就是說(shuō):在寫(xiě)完JSP代碼后進(jìn)行第一次執(zhí)行時(shí),tomcat(servlet容器)先將JSP代碼翻譯成servlet類(java代碼),然后實(shí)例化該類,再調(diào)用該類的init,service,destory等進(jìn)行生命周期服務(wù)。當(dāng)客戶端再進(jìn)行第二次訪問(wèn)請(qǐng)求時(shí),此時(shí)就沒(méi)有servlet容器的翻譯這一步了,因?yàn)橹胺g的java代碼會(huì)一直保存,以便于后面的訪問(wèn)不再進(jìn)行翻譯,可大大提高訪問(wèn)效率。所以,JSP頁(yè)面在第一次被訪問(wèn)時(shí),其所花費(fèi)的時(shí)間是最長(zhǎng)的。 |
|