tomcat中對靜態資源的訪問也會用servlet來處理嗎?

在不配置default servlet的情況下,靜態資源的請求會被某個Servlet處理嗎?又或者說,我其他什麼都不配置,就配置一個過濾器,能截獲靜態資源的請求嗎?


Tomcat訪問所有的資源,都是用Servlet來實現的。

在Tomcat看來,資源分3種

1. 靜態資源,如css,html,js,jpg,png等

2. Servlet

3. JSP

對於靜態資源,Tomcat最後會交由一個叫做DefaultServlet的類來處理

對於Servlet ,Tomcat最後會交由一個叫做 InvokerServlet的類來處理

對於JSP,Tomcat最後會交由一個叫做JspServlet的類來處理

所以Tomcat又叫Servlet容器嘛,什麼都交給Servlet來處理。

那麼什麼時候調用哪個Servlet呢? 有一個類叫做org.apache.tomcat.util.http.mapper.Mapper,它一共進行了7個大的規則判斷,第7個,就是判斷是否是該用DefaultServlet。

簡單地說。。。先看是不是servlet,然後看是不是jsp,如果都不是,那麼就是你DefaultServlet的活兒了。

到了DefaultServlet之後,就是一個普通的HttpServlet了,doPost方法會交由doGet處理:

doGet又交由一個叫做 serveResource的方法處理

在serveResource方法里又瞎搞八搞了許多事情,最後在一個叫做copy()方法里,把靜態資源對應的輸入流 讀取出來,扔到了輸出流里,這樣你的瀏覽器就看到數據了。


它在這裡。


當然會啦,要不然為什麼正規的項目前面都有一個靜態伺服器?(一般是nginx,apache,他們除了了做負載均衡這些,最重要的是處理靜態文件)

如果沒有前面的靜態伺服器,所有的資源都用tomcat的靜態資源servlet處理,都會佔掉了一個tomcat的線程池的一個線程,這樣tomcat的性能就會受到非常大的影響。


default servlet是在全局web.xml($CATALINA_BASE/conf/web.xml)中默認啟用的用於支持靜態文件和目錄瀏覽等功能的,所以靜態資源的請求是會被這個Servlet處理的,也因為靜態資源是會被servlet處理的,所以它門也被納入tomcat http請求的生命周期管理了,因此自然也可以編寫過濾器來截獲之,比如用來統一設置靜態文件的緩存策略等。


瀉藥

對不起,這個問題我不會:(


會。servlet主要有三個作用:1.獲取表單信息;2.處理業務邏輯;3.分發轉向。

靜態資源一般不涉及資料庫讀寫,所以一般不會有業務邏輯處理。但是靜態資源也有&

&表單信息,也會有頁面轉發和重定向,這就需要通過servlet來處理。


處理靜態資源的DefaultServlet會在tomcat的conf目錄下的web.xml里配置,同樣配置的還有處理jsp的JspServlet.它們都在tomcat啟動時創建並初始化。


著作權歸作者所有。

商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

作者:cfpl12011124

鏈接:Tomcat容器運行靜態資源

來源:CSDN博客

1:html頁面設置編碼 &

2:web.xml中設置編碼

&

&htm&

&text/html;charset=UTF-8&

&

&

&html&

&text/html;charset=UTF-8&

&

3:Tomcat server.xml中設置編碼

& connectionTimeout="20000"

redirectPort="8443" URIEncoding="UTF-8"/&>

4:如果是IDE啟動,設置啟動參數 Debug configurations-&>tomat 8.0-&>argument

-Dfile.encoding=UTF8

如果是Tomcat服務形式啟動,設置catalina.bat

set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%" -Dfile.encoding=UTF8

5:將文件用記事本或者EditPlus打開,另存為UTF-8格式

以上5種基本可以告別tomcat中文亂碼問題.


推薦閱讀:

TAG:Web開發 | Java | ApacheTomcat | Servlet | SpringMVC框架 |