Spring MVC訪問靜態資源總出錯?看這裏,原理給你講清楚

之前文章講到Spring MVC的基礎概念,基本開發流程,和如何在Spring MVC中傳值接受參數以及Spring MVC的跳轉(重定向和轉發)

之前文章鏈接
Spring MVC從0到1,推薦新手收藏(超詳細)

這篇文章文章講Spring MVC訪問靜態資源

靜態資源

  • 靜態資源(內容不會改變的資源):HTML,js文件,css文件,圖片文件等都是靜態資源

  • 或者換一句話說:在所有的客戶訪問同一頁面時,獲取到的內容是相同的,不會因爲用戶的不同而改變

靜態文件沒有url-pattern,所以默認是訪問不到的,之所以可以訪問,是因爲,tomcat中有一個全局的servlet:org.apache.catalina.servlets,DefaultServlet,它的url-pattern是"/"是全局默認的Servlet.

所以每個項目中不能匹配的靜態資源的請求,有這個Servlet來處理

Tomcat中的web.xml中有默認的全局的servlet
image-20200624175845591
image-20200624175854436

那我們直接在Spring MVC中來寫html,結果:

令人憤怒的404
image-20200624175503374

image-20200624180230532

這是爲什麼?

因爲我們的項目的web.xml中也配置了一個servlet,且路徑也是"/" ,這就導致了原本的tomcat中的全局servlet失效

我們配置的DispatcherServlet
image-20200624181437473

我們配置的DispatcherServlet也採用"/"作爲url-pattern,而我們配置的DispatcherServlet是用來攔截控制器的,而不是靜態資源

最終導致了靜態資源的無法訪問

如何解決靜態資源無法訪問的問題?

解決方案一

既然找到了原因,是因爲我們配置了DispatcherServlet而導致靜態資源無法訪問,那麼只能委屈DispatcherServlet另外換一個路徑

image-20200624181326859

DispatcherServlet採用其他的url-pattern ,比如: *.action

此時,所有訪問handler(也就是控制器中具體的方法)的路徑都要以action結尾!

    <!-- 配置前端控制器-->
    <servlet>
        <servlet-name>mvc_leiyu</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 將後端控制器的配置給前端(核心)控制器 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc.xml</param-value>
        </init-param>
        <!-- 可選配置 懶漢式加載 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>mvc_leiyu</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
該handler的訪問路徑:http://localhost:8080/data/test1.action
image-20200624181706459

解決方案二

我和DispatcherServlet商量了一下,讓它換一個路徑訪問,它說這樣訪問太麻煩了,而且憑什麼要它改路徑,並給我扔過來衣蛾圖片讓自己體會

image-20200624182153245

既然,商量無果,不願意改路徑還要靜態資源正常訪問

那麼只能追加配置了

    <!-- 解決無法訪問靜態資源的問題
    額外增加一個handler,且其RequestMapper爲"/**"  可以匹配到所有的請求,但是優先級最低
    所以如果其他所有的handler都匹配不上,請求會轉向"/**"  ,恰好,這個handler就是處理靜態資源的
    處理方式:將請求轉會到tomcat中名爲dafault的Servlet,讓tomcat處理
    -->
    <mvc:default-servlet-handler/>

解決方案三

當爭吵不休時,最終還是靜態資源讓了步,靜態資源願意約束自己,給自己訪問時路徑發生一點變化

在webapp目錄下創建html目錄,用來放靜態的html資源,其他的靜態資源同理

配置

<mvc:resources mapping="/html/**" location="/hhh/" />
  • mapping是訪問路徑,location是靜態資源的存放路徑(建議同名,見名知意,爲了講述原理,這裏不同名)
  • 將/html/** 中/**匹配到的內容,拼接在/hhh後就是資源的實際的路徑
  • http://…/html/a.html 訪問的資源時/hhh/a.html
  • http://…/page/b.html 訪問的資源時/page/b.html

我是雷雨,一個普本科的學生,主要專注於Java後端和大數據開發

如果這篇文章有幫助到你,希望你給我一個大大的贊
如果有什麼問題,希望你能留言和我一起研究,學習靠自覺,分享靠自願

轉載註明出處
https://blog.csdn.net/qq_40742223

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章