問題:
目錄結構如下:
css和images這兩個靜態資源無法訪問,打開tomcat服務後,直接去瀏覽器訪問
localhost:8080/css/main.css
失敗
解決方案1
查看訪問路徑是否正確,tomcat配置的虛擬路徑有沒有加在瀏覽器的訪問中
如果虛擬路徑設置的是一個斜杆/
,那麼直接訪問靜態資源是正確的訪問路徑
否則需要加上你配置的或者默認的虛擬路徑在訪問路徑前
比如我的application context
不是一個斜杆,而是/newDome_war_exploded
,那麼正確的訪問路徑是
localhost:8080/newDome_war_exploded/css/main.css
解決方案2
如果tomcat配置的是/
或者訪問路徑正確仍是無法獲得靜態資源,則查看web.xml中mvc的配置,你的前端控制器是不是全部攔截,即爲/
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<welcome-file-list>
<welcome-file>/WEB-INF/pages/welcome.jsp</welcome-file>
</welcome-file-list>
<!--配置Spring的監聽器,默認只加載WEB-INF目錄下的applicationContext.xml配置文件-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--設置配置文件的路徑-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加載springmvc.xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--啓動服務器,創建該servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--解決中文亂碼的過濾器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
上面的web.xml中的dispatcherServlet
的攔截路徑爲/
,則是攔截所有請求,包括靜態資源,那麼解決方案又有三種:
- 1、配置
<url-pattern>/</url-pattern>
爲<url-pattern>*.do</url-pattern>
,表示只攔截以.do
結尾的請求,這樣的好處是靜態資源不會被攔截,可以很好的訪問,但壞處是你的前端請求需要每次在末尾加上.do
- 2、仍然還是
/
攔截全部請求,在最後加上default來過濾靜態資源(推薦)
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加載springmvc.xml配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--啓動服務器,創建該servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- mvc對靜態資源放行 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
- 3、web.xml仍然保持原樣,對springmvc.xml進行靜態資源過濾(推薦)
<!--開啓註解掃描,只掃描Controller註解-->
<context:component-scan base-package="com.cheng">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!--配置的視圖解析器對象-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--過濾靜態資源-->
<mvc:resources location="/css/" mapping="/css/**" />
<mvc:resources location="/js/" mapping="/js/**" />
<mvc:resources location="/images/" mapping="/images/**" />
<!--開啓SpringMVC註解的支持-->
<mvc:annotation-driven/>
表示對於/css/**
之類的請求一律不攔截
解決方案3
方案2任意一種配置後樓主即可訪問成功靜態資源
但仍會有特列存在,在此添加解決方案3,如果之前的所有辦法都試過了,還是無法訪問靜態資源,那麼一定是編譯有問題。
首先刪除target包
去build中rebuild一下
如果是maven項目,再打開maven,點擊第二個按鈕
再次運行你的springmvc項目,靜態資源得以訪問成功!
如果本文章對你有所幫助,請點個贊支持一下作者~