問題產生:
因為我們在web.xml中寫了 攔截所有請求,當然包括了靜態資源,所以頁面需要引用css或js的話,該請求也會被攔截,例如:
在style.css中寫一個簡單樣式,加個背景顏色
-
body{
-
background-color: antiquewhite;
-
}
然后在index.jsp頁面引用該樣式:<link rel="stylesheet" href="/css/style.css">
再一次運行項目,會看到並沒有樣式,F12可以看到在調用style.css的時候報了404錯誤,這是因為被DispatcherServlet攔截了
解決辦法:
方案一:攔截器中增加針對靜態資源不進行過濾(涉及spring-mvc.xml)
注意:需引入mvc命名空間
-
<!-- 添加注解驅動 -->
-
<mvc:annotation-driven/>
-
<!--
-
通過mvc:resources設置靜態資源,這樣servlet就會處理這些靜態資源,而不通過控制器
-
設置不過濾內容,比如:css,js,img 等資源文件
-
location指的是本地的真是路徑,mapping指的是映射到的虛擬路徑。
-
-->
-
<mvc:resources mapping= "/css/**" location="/css/"/>
方案二:使用默認的servlet處理靜態資源(涉及spring-mvc.xml,web.xml)
-
<!--啟用默認Servlet-->
-
<mvc: default-servlet-handler/>
<mvc:default-servlet-handler/> 這個,點擊打開這個可以看到如下信息:
這里面有兩個信息非常重要:第一是default Servlet,這個值得是容器默認的Servlet,其實就是tomcat默認的Servlet;第二:路徑的轉換,我們可以看出是轉換到/的路徑;
/的路徑指的是webapp的路徑(此處一定注意不是WEB-INF,WEB-INF路徑的訪問是受權限控制的,tomcat維護權限)。這樣配置的意思就是說所有的按照規則訪問靜態資源的請求都會匹配到對應的webapp下的路徑:
-
<!--增加對靜態資源的處理,當前的設置必須在Spring的Dispatcher的前面-->
-
<servlet-mapping>
-
<servlet-name> default</servlet-name>
-
<url-pattern>*.css</url-pattern>
-
<url-pattern>/css /*</url-pattern>
-
</servlet-mapping>
而這個標簽起作用的前提就是需要我們把靜態資源放在webapp下,而非WEB-INF下,否則還是會無效
方案三:修改spring的全局攔截設置為*.do的攔截(涉及web.xml)
-
<!-- 攔截所有請求 -->
-
<servlet-mapping>
-
<servlet-name>dispatcher</servlet-name>
-
<!--<url-pattern>/</url-pattern>-->
-
<url-pattern>*. do</url-pattern>
-
</servlet-mapping>
這時,我們瀏覽器的所有訪問路徑就要變成:http://localhost:8080/xxx/xxx.do

比較總結:
--------------------- 本文來自 van久 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/qq_40594137/article/details/79112700?utm_source=copy