Web容器中DefaultServlet詳解

OkidoGreen發表於2020-04-05

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>

配置分析: 
1. 非常熟悉的配置對不對,這就是一個非常常見的servlet配置。該servlet的name為default,其對應的servlet-class類為org.apache.catalina.servlets.DefaultServlet。 
2. 對應的init-param標籤中兩個初始化引數,一個是debug,這個引數設定了debug的級別。一個是listings引數,該引數的作用是當對應URL並沒有對應一個資源時,是否要顯示資源目錄,該引數配置為了false,也就是不顯示。 
3. load-on-startup為1是說明當應用啟動時就在載入該servlet,預設的情況下是使用者第一次訪問該servlet方法時才會例項化並載入servlet。 
4. 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>

配置分析 
1. 文件解釋: 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)。 
2. 直接翻譯: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為“/”的配置,當Dispatcher Servlet的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 />

相關文章