1. 程式人生 > >springmvc攔截器靜態資源的訪問 前臺css js樣式載入的問題

springmvc攔截器靜態資源的訪問 前臺css js樣式載入的問題

原文:https://blog.csdn.net/hodaddy/article/details/78684799 

首先先說一下springmvc在web.xml中配置的詳情

<!--在web.xml中配置springmvcl的資訊-->   <servlet>        <servlet-name>springmvc</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!-- 將springmvc.xml寫在原始檔下必須加這個 -->        <init-param>         <param-name>contextConfigLocation</param-name>         <param-value>classpath:springmvc.xml</param-value>        </init-param>        <!-- 載入順序,數字大於0的整數越小優先順序越高,0是預設不載入用到在載入 --> <!-- 專案啟動的時候回初始化spring核心控制器,專案啟動時間長,         但是第一次訪問速度快,不加的話,第一次訪問變慢-->        <load-on-startup>1</load-on-startup>        </servlet>     <servlet-mapping>   <servlet-name>springmvc</servlet-name>   <url-pattern>/</url-pattern>   </servlet-mapping>

<url-pattern>/</url-pattern>這一行 配置/ 和/*是有區別的

<url-pattern>/</url-pattern> 不會匹配到jsp頁面

<url-pattern>/*</url-pattern> 會匹配jsp頁面,即該jsp頁面進入spring的DispatcherServlet

所以當我們請求時,即執行controller中的方法後返回的jsp檢視會進入了DispatcherServlet

導致該jsp無法找到,所以報404錯誤。

當我們配置攔截器的時候必須要加上資源對映,不然訪問不了這些靜態資源

<mvc:resources location="/static/" mapping="/static/**" /> <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/> 這樣寫表示這些資源在webapp下,如果實在WEB-INF下那麼

<mvc:resources location="WEB-INF/static/" mapping="/static/**" />

兩個*表示該檔案下所有的子資料夾以及子檔案

攔截器的配置

<mvc:interceptors>

<mvc:interceptor>

<!--這裡配置攔截的url,**即所有資源都攔截--> <mvc:mapping path="/**"/> <!--springmvc 排除登入的請求,不需要在攔截器對url多判斷--> <mvc:exclude-mapping path="/**/login"/> <mvc:exclude-mapping path="/**/login.*"/> <mvc:exclude-mapping path="/static/**"/> <bean id="loginInterceptor" class="com.m2.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> 

今天在做專案時發現一個有意思的問題

如果專案是剛建立,使用者配置springmvc時配置的是/

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

而且後臺方法資源 @RequestMapping("page/{page}")這種型別的

前臺引入css,js的時候前面必須獲取上下文路徑,即request.getContextPath();

以<link rel="stylesheet" href="<%=path %>/static/css/login-register.css" type="text/css"></link>為例,

首先假設你本頁的資源是http://localhost:8085/page/home

如果是<link rel="stylesheet" href="/static/css/login-register.css" type="text/css"></link>這樣

那麼載入該頁面後,這個靜態資源就無法載入,他會顯示<link rel="stylesheet" href="page/static/css/login-register.css" type="text/css"></link>

這個連結找不到,導致你無法載入,一旦<link rel="stylesheet" href="<%=path %>/static/css/login-register.css" type="text/css"></link>後

系統匹配到該靜態資源後,刪除了<%=path %>依然可以加載出來