使用springmvc註解開發關於靜態資源被攔截的解決方案
初次接觸到springmvc,在編寫自己的專案等時候,出現jQuery不能訪問的情形,在使用ajax傳送請求的時候出現jQuery不能被找到的情況,出現404紅碼!
自己的專案結構如下
對於這樣的情形,小編也是第一次遇到,剛開始小編將自己的jsp頁面以及jQuery檔案都是放在WEB-INF目錄之下的,後面經過別人的講解,將jQuery以及靜態配置檔案放在WEB-INF目錄之下其實不好,因為js是通過url進行載入,而WEB-INF目錄下的檔案是無法直接通過url進行載入獲取,所以會存在攔截的問題,所以小編也建議大家不要將這些檔案放在WEB-INF目錄下啦!
痛定思痛,有了別人的建議,彷彿猶如神明降世,為我注入無上榮耀學習之光,學習的黑暗生涯彷彿被人用強光手電筒指明瞭前進的方向,我悟了!於是聰明如我的我這次不僅將js檔案放在了webapp目錄下,甚至連我的jsp資料夾也一起移動,這裡僅僅是做測試,希望大家不要糾結檔案目錄
本以為學習道路可以繼續,結果紅紅火火的404又讓我面對了現實
之前的無上榮耀之光彷彿被人用麻袋重新罩住,對不起,剛才亮錯了!!
因此我覺得可能是自己的jQuery路徑沒有編寫正確,所以重新編寫了一下路徑,發現IDEA對自己的選擇路徑是有響應的,並且路徑經過自己的再三審查是沒有問題的,所以排除自己的路徑問題!
<script src="../WEB-INF/jquery/jquery-3.3.1.min.js"></script>
因為沒有學習到攔截器,也不會存在自己編寫的攔截器攔截的問題!這可把我難住了,莫非這是上天的暗示,小夥子,Java水很深,你把握不住!!
自己沒有把握住的東西,還好別人把握得牢牢的,經過多方請教!發現是配置DispatcherServlet的時候出現的問題!什麼是DispatcherServlet呢?
一般的MVC框架中C(Controller)都會存在一個Dispatcher(排程器、分發器),負責根據客戶端所發出的URL進行排程分發,找到相應的action進行呼叫。在SpringMVC中,DispatcherServlet就是充當這樣的一個角色,其全名是org.springframework.web.servlet.DispatcherServlet 。
要使用這個selvet,需要將它部署在web.xml檔案中
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:config/springmvc-servlet.xml</param-value> </init-param> <!-- 表示容器再啟動時立即載入servlet --> <load-on-startup>1</load-on-startup> <!--支援非同步處理--> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- 處理所有URL --> <url-pattern>/</url-pattern> </servlet-mapping>
在DispatcherServlet初始化時,SpringMVC框架將在web應用程式WEB-INF目錄中尋找[servlet-name] -servlet.xml的檔案,也就是我上面<servlet-name>寫的springmvc,我的配置檔案是叫這個名字,如果配置檔案放在別的地方就需要使用<init-param>元素來進行檔案配置。
排程程式selvet被配置為<load-on-startup>1</load-on-startup>,這意味著該servlet應該在部署應用程式時由selvet容器建立,而不是在請求達到此請求的時候建立。這樣做是為了減少第一個請求的響應時間,因為DispatcherServlet在啟動時做了很多工作來掃描和查詢所以控制器和請求對映。
小編在這裡的配置路徑是/,會處理所有的url,因此jQuery的訪問路徑會被攔截,因此不能被找到,對於這樣的情況小編是這樣處理的:
我在自己的pringmvc-servlet.xml檔案中加入了以下程式碼
<mvc:annotation-driven/>
<mvc:resources mapping="/jquery/**" location="/jquery/"/>
<mvc:annotation-driven/>
這句程式碼的作用是:
相當於註冊了DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter兩個bean,
配置一些messageconverter。即解決了@Controller註解的使用前提配置。
<mvc:resources mapping="/jquery/**" location="/jquery/"/>
這句程式碼的作用是: 採用spring自帶<mvc:resources>方法。如此就不必另外新增一個mvc來處理靜態資源。而mvc知道靜態資源所處的位置是在jQuery資料夾。
說明:
location元素表示webapp目錄下的jquery包下的所有檔案;
mapping元素表示以/jquery開頭的所以請求路徑;
作用: DispatcherServlet不會攔截以/jquery開頭的所有請求路徑,並當作靜態資源交給servlet處理
經過自己的一番努力,最終成功的200了!
又成功的通關啦!!希望自己的一點點小經驗可以對大家有幫助,如果其中有不正確的地方希望大家可以對我進行一個指點,大家互相學習進步!!