1. 程式人生 > 其它 >使用springmvc註解開發關於靜態資源被攔截的解決方案

使用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了!

 又成功的通關啦!!希望自己的一點點小經驗可以對大家有幫助,如果其中有不正確的地方希望大家可以對我進行一個指點,大家互相學習進步!!