You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC中servlet-context.xml的mvc:resources静态资源映射失效求助

解决Spring MVC中静态资源无法访问的问题

你遇到的核心问题是WEB-INF目录下的静态资源无法被正确映射,同时mvc:default-servlet-handler的配置和静态资源映射规则存在冲突。下面是一步步的具体解决方案:

1. 修正mvc:resources的配置

你的servlet-context.xml里的静态资源映射有几个细节错误,直接导致资源无法被定位:

  • mapping需要以/开头,确保是基于Web应用根目录的绝对路径匹配
  • location的路径要精准,注意末尾的斜杠(避免路径拼接时出错)
  • js的location多了一个冗余斜杠,需要去掉

修正后的配置如下:

<mvc:resources mapping="/css/**" location="/WEB-INF/Template/css/" />
<mvc:resources mapping="/img/**" location="/WEB-INF/Template/img/" />
<mvc:resources mapping="/js/**" location="/WEB-INF/Template/js/" />

2. 理清mvc:default-servlet-handler的作用

这个标签的作用是让DispatcherServlet无法处理的请求(比如未映射的静态资源)转交给容器默认的Servlet处理,但容器默认Servlet本身是无权访问WEB-INF目录下资源的——这就是为什么你取消注释后页面能打开,但静态资源依然404的原因。

你可以保留mvc:default-servlet-handler,但它只会处理不在mvc:resources映射范围内的其他外部静态资源(如果有的话),核心还是靠mvc:resources来映射WEB-INF内的资源。

3. 修正页面中静态资源的引用路径

你的login.html里用的是相对路径(比如css/some.css),如果页面是通过Spring视图解析器转发的(比如访问路径是/login),浏览器会自动把请求路径解析成/login/css/some.css,这显然和我们的映射规则不匹配。

解决方法有两种:

  • 使用绝对路径引用:给所有资源路径加上开头的/,表示基于Web应用根目录
    <link rel="stylesheet" type="text/css" media="screen" href="/css/some.css">
    
  • 在页面头部添加<base>标签,统一指定基准URL:
    <head>
      <base href="${pageContext.request.contextPath}/">
      <!-- 其他头部内容 -->
      <link rel="stylesheet" type="text/css" media="screen" href="css/some.css">
    </head>
    
    这样所有相对路径都会自动基于Web应用的上下文路径解析,彻底避免路径错误。

4. 验证配置有效性

启动应用后,尝试直接访问静态资源(比如http://localhost:8080/你的应用名/css/some.css),如果能正常返回资源内容,说明映射配置已经生效。同时确保控制器能正常处理请求,返回login视图时可以正确转发到/WEB-INF/views/login.html。


内容的提问来源于stack exchange,提问作者Siddharth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:57:12