之前文章講到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 |
---|
那我們直接在Spring MVC中來寫html,結果:
令人憤怒的404 |
---|
這是爲什麼?
因爲我們的項目的web.xml中也配置了一個servlet,且路徑也是"/" ,這就導致了原本的
tomcat中的全局servlet失效
我們配置的DispatcherServlet |
---|
我們配置的DispatcherServlet也採用"/"作爲url-pattern,而我們配置的DispatcherServlet是用來攔截控制器的,而不是靜態資源
最終導致了靜態資源的無法訪問
如何解決靜態資源無法訪問的問題?
解決方案一
既然找到了原因,是因爲我們配置了DispatcherServlet而導致靜態資源無法訪問,那麼只能委屈DispatcherServlet另外換一個路徑
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 |
---|
解決方案二
我和DispatcherServlet商量了一下,讓它換一個路徑訪問,它說這樣訪問
太麻煩
了,而且憑什麼要它改路徑,並給我扔過來衣蛾圖片讓自己體會
既然,商量無果,不願意改路徑還要靜態資源正常訪問
那麼只能追加配置了
<!-- 解決無法訪問靜態資源的問題
額外增加一個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後端和大數據開發
如果這篇文章有幫助到你,希望你給我一個
大大的贊
如果有什麼問題,希望你能留言
和我一起研究
,學習靠自覺,分享靠自願