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& && 3:Tomcat server.xml中設置編碼html& &text/html;charset=UTF-8& &&
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=UTF85:將文件用記事本或者EditPlus打開,另存為UTF-8格式以上5種基本可以告別tomcat中文亂碼問題.connectionTimeout="20000"
推薦閱讀:
TAG:Web開發 | Java | ApacheTomcat | Servlet | SpringMVC框架 |