什么是Tomcat响应静态资源?
Tomcat訪問(wèn)所有的資源,都是用Servlet來(lái)實(shí)現(xiàn)的,所以Tomcat又叫Servlet容器,什么都交給Servlet來(lái)處理。當(dāng)然,靜態(tài)資源也不例外。靜態(tài)資源可以理解為前端的固定頁(yè)面,如css,html,js,jpg,png等。對(duì)于靜態(tài)資源,Tomcat最后會(huì)交由一個(gè)叫做DefaultServlet的類來(lái)處理,DefaultServlet處理靜態(tài)資源的過(guò)程就是Tomcat響應(yīng)靜態(tài)資源。
可能你習(xí)慣性的打開(kāi)Tomcat,在部署了一個(gè)應(yīng)用之后,就開(kāi)始查看其運(yùn)行結(jié)果,或者更多的關(guān)注Servlet內(nèi)的邏輯是否正確。至于靜態(tài)資源處理這個(gè)事,可能不曾留意過(guò)。那我們一起來(lái)看看,Tomcat是如何響應(yīng)靜態(tài)資源的。
本質(zhì)上講,Tomcat對(duì)于所有的靜態(tài)資源,會(huì)做統(tǒng)一處理。也就是在所有你沒(méi)有配置URL匹配的地方,Tomcat這個(gè)全局統(tǒng)一處理的配置就開(kāi)始接管工作了。那么,倘若我們沒(méi)有配置這個(gè)東西,它怎么生效呢?
在Tomcat的conf目錄下,就是有全局配置文件server.xml在同一個(gè)目錄下,有一個(gè)web.xml,打開(kāi)它之后,你會(huì)發(fā)現(xiàn)這樣的說(shuō)明:
The default servlet for all web applications, that serves static
resources. It processes all requests that are not mapped to other
servlets with servlet mappings.
再向下,你會(huì)看到關(guān)于這個(gè)全局處理的Servlet聲明,也就是處理靜態(tài)資源的DefaultServlet類。此處,它還有一個(gè)名為listings的初始化參數(shù),默認(rèn)值為false。這個(gè)參數(shù)主要作用,是在沒(méi)有welcome文件時(shí),控制應(yīng)用目錄內(nèi)的文件是否允許列表顯示。如果設(shè)置為true,就會(huì)常見(jiàn)的FTP服務(wù)器一樣,把應(yīng)用目錄下的文件都列了出來(lái),像下面這個(gè)樣子。當(dāng)然,這個(gè)樣式也是可以自已定義的。
那么,既然url-pattern配置的是 / ,那不就應(yīng)該響應(yīng)所有的請(qǐng)求了么?
對(duì),我們上面說(shuō)明中也提到了,是匹配所有你沒(méi)定義的Servlet-mapping的請(qǐng)求。而之所以自己定義的Servlet可以優(yōu)先生效,則是因?yàn)門(mén)omcat內(nèi)的Servlet配置,是嚴(yán)格按照聲明順序初始化,并按此順序響應(yīng)請(qǐng)求,一層層按此比對(duì),有一個(gè)可以響應(yīng)請(qǐng)求,就用其處理。
下面我們來(lái)看DefaultServlet中,靜態(tài)資源響應(yīng)處理的部分源碼,文件位于org.apache.catalina.servlets.DefaultServlet文件中。首先是這個(gè)文件,一般資源請(qǐng)求,都會(huì)走GET方法。
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
// Serve the requested resource, including the data content
serveResource(request, response, true, fileEncoding);
}
serveResource這個(gè)方法內(nèi)容較多,放在這里查看不太方便。大致總結(jié)下,首先會(huì)判斷要請(qǐng)求的資源是否存在,文件是否可讀,之后,根據(jù)資源的類型,設(shè)置響應(yīng)頭的content-type,判斷文件的時(shí)間,設(shè)置超時(shí)時(shí)間等,最終是流的讀寫(xiě)。
整個(gè)應(yīng)用內(nèi)的資源存放在resources這個(gè)變量?jī)?nèi),聲明如下:
/**
- The complete set of web application resources
*/
protected transient WebResourceRoot resources = null;
這塊和上面內(nèi)容有關(guān)聯(lián)的地方是,讀取文件的時(shí)候,會(huì)判斷請(qǐng)求的路徑對(duì)應(yīng)的資源是否為一個(gè)文件夾,如果是目錄,就會(huì)判斷l(xiāng)istings這個(gè)參數(shù),為true時(shí)才會(huì)列出內(nèi)容,否則直接返回內(nèi)容找不到,即404。代碼如下:
if (resource.isDirectory()) {
// Skip directory listings if we have been configured to
// suppress them
if (!listings) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
request.getRequestURI());
return;
}
簡(jiǎn)而言之,Tomcat響應(yīng)靜態(tài)資源主要還是依靠著DefaultServlet類進(jìn)行的。只有熟練掌握DefaultServlet類的用法,自然而然也就掌握了Tomcat響應(yīng)靜態(tài)資源的方法。想要學(xué)習(xí)更多的Tomcat服務(wù)器相關(guān)的知識(shí),可以觀看本站的Tomcat服務(wù)器教程,讓我們熟悉Tomcat理論知識(shí)的同時(shí),還提供有大量的源碼讓我們進(jìn)行實(shí)戰(zhàn)演練。
本文來(lái)自千鋒教育,轉(zhuǎn)載請(qǐng)注明出處。
總結(jié)
以上是生活随笔為你收集整理的什么是Tomcat响应静态资源?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTML5的基本入门格式介绍
- 下一篇: 推荐的这5个高效在线工具,每一个都很良心