萬分感謝原文作者:_licho
原文鏈接:https://blog.csdn.net/qq_30920821/article/details/78328608
Web容器中DefaultServlet詳解
一、什么是DefaultServlet
我們以最熟悉的Tomcat服務器為例。我們都知道Jsp和servlet都需要web容器才能運行。但是實際上呢我們的web應用中可以沒有任何servlet或者jsp(至少表面上是這樣的)只需要一個web.xml,設置在servlet 3.0中,這個也可以省略。但是我們同樣可以通過鏈接來訪問應用內的資源文件。例如.jpg,.html,.js這類的靜態文件。這就是DefaultServlet的作用了。它在tomat的安裝目錄下的conf/web.xml中有定義。該web.xml對於所有tomcat加載的的web application都會應用,會和application本身指定的web.xml進行合並。
<!--在conf/web.xml中的DefaultServlet的定義-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--defaultServletMapping-->
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
配置分析:
- 非常熟悉的配置對不對,這就是一個非常常見的servlet配置。該servlet的name為default,其對應的servlet-class類為
org.apache.catalina.servlets.DefaultServlet
。 - 對應的init-param標簽中兩個初始化參數,一個是debug,這個參數設置了debug的級別。一個是listings參數,該參數的作用是當對應URL並沒有對應一個資源時,是否要顯示資源目錄,該參數配置為了false,也就是不顯示。
- load-on-startup為1是說明當應用啟動時就在加載該servlet,默認的情況下是用戶第一次訪問該servlet方法時才會實例化並加載servlet。
- DefaultServlet的servlet-mapping配置的為/,很多帖子或者書籍上都說/的URL映射符會映射除了*.xxx類帶后綴的地址URL,事實上/映射可以處理所有的請求,一般只有defaultServlet會配置為/,如果自定義的Servlet也配置為/,那么將會覆蓋defaultservlet的配置。
二、JspServlet的作用
同理,在Tomcat Server中運行的web application,對於類似於.jsp的java動態服務頁同樣不需要我們自己處理。我們可以直接通過一個URL例如/index.jsp來訪問到該頁面,這是因為在conf/web.xml中有一個JspServlet來處理這類請求。
<!--在conf/web.xml中有定義-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
...............
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
配置分析
- 文檔解釋: The JSP page compiler and execution servlet, which is the mechanism ,used by Tomcat to support JSP pages. Traditionally, this servlet ,is mapped to the URL pattern “*.jsp”. This servlet supports the,following initialization parameters (default values are in square brackets)。
- 直接翻譯:JSP頁的編譯和執行Servlet, 是Tomcat支持JSP頁面的機制。另外,這個servlet被映射的URL模式為”*.jsp”。 同時也支持一些初始化參數。它們都具有一些默認值。具體解釋可以看conf/web.xml中的注釋。
三、DefaultServlet在實際開發中的應用。
-
JSP/Servlet架構的web項目
這類架構的項目無需顯示配置DefaultSerlvet,一般來說,jsp后綴請求會交給JspServlet,靜態資源請求圖片等會交給DefaultServlet處理。 -
SSM中DispatcherServlet的URL配置
- ”.do,.action等配置”,當servlet-mapping配置為*.do這類帶指定后綴的時候,靜態資源文件依舊可以交給DefaultServlet處理。(.do的DispatcherServlet不會攔截類似.jsp,*.jpg的請求)
<!-- Spring MVC -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>SpringMVC</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
- mapping為“/”的配置,當DispatcherServlet的mapping配置為/的時候,這時候會覆蓋DefaultServlet的配置(DispathcerServlet會更先匹配到),那么對於.jpg,.png類似這種靜態資源就得不到處理(之前是defaultServlet)會處理,所以這類資源就會得到404錯誤。所以我們需要有額外的配置來解決這個問題。
- 繼續通過DefaultServlet來處理。我們在應用的web.xml中將常用的靜態資源URL映射到defaultServlet上。
<!--通過defaultServlet來處理jpg-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<!--通過DefaultServlet來處理png-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<!--通過defaultServlet來處理.js文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<!--通過defaultServlet來處理.css文件-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
- 通過Spring的mvc:resource來配置資源映射,將靜態資源的映射進行放行。
<!-- 放行靜態資源 -->
<!--放行js文件-->
<mvc:resources location="/js/" mapping="/js/**"/> <!--放行css文件-->
<mvc:resources location="/css/" mapping="/css/**"/>
<!--放行img類的資源文件-->
<mvc:resources location="/images/" mapping="/images/**"/>
通過Spring MVC的<mvc:default-handler/>
:通過這個標簽可以啟動Spring
MVC定義的一個類似於Tomcat的DefaultServlet的DefaultServletHttpRequestHandler類。
<mvc:default-servlet-handler />