springmvc的靜態資源無法訪問解決方法(基本全面)

問題:

目錄結構如下:
在這裏插入圖片描述

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項目,靜態資源得以訪問成功!

如果本文章對你有所幫助,請點個贊支持一下作者~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章