天天看點

Springmvc 靜态檔案問題

Springmvc  靜态檔案問題

在web.xml 配置下面代碼的時候

<!-- 配置SpringMVC核心控制器: -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置DispatcherServlet的初始化參數:設定檔案的路徑和檔案名稱 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>      

要注意這裡的/,如果在web.xml中配置的是/*,那麼連jsp也會攔截。

Springmvc 靜态檔案問題

如果配置的是/,那麼除了jsp以外的靜态資源檔案會被攔截,以外,因為tomcat中也有一個web.xml,裡面有2個servelt,一個是DefaultServlet,它的url-pattern為/,而springmvc的也會/,會進行覆寫,導緻靜态資源檔案失效。jsp能通路的原因是沒有覆寫JspServlet的配置。

   <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>


    <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>

  <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 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>      
    • mvc:default-servlet-handler/> 将在 SpringMVC 上下文中定義一個 DefaultServletHttpRequestHandler,它會對進入 DispatcherServlet 的請求進行篩查,如果發現是沒有經過映射的請求,就将該請求交由 WEB 應用伺服器預設的 Servlet 處理,如果不是靜态資源的請求,才由 DispatcherServlet 繼續處理。
    • 一般 WEB 應用伺服器預設的 Servlet 的名稱都是 default。若所使用的 WEB 伺服器的預設 Servlet 名稱不是 default,則需要通過 default-servlet-name 屬性顯式指定

繼續閱讀