Spring MVC中servlet-context.xml的mvc:resources静态资源映射失效求助
你遇到的核心问题是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:
这样所有相对路径都会自动基于Web应用的上下文路径解析,彻底避免路径错误。<head> <base href="${pageContext.request.contextPath}/"> <!-- 其他头部内容 --> <link rel="stylesheet" type="text/css" media="screen" href="css/some.css"> </head>
4. 验证配置有效性
启动应用后,尝试直接访问静态资源(比如http://localhost:8080/你的应用名/css/some.css),如果能正常返回资源内容,说明映射配置已经生效。同时确保控制器能正常处理请求,返回login视图时可以正确转发到/WEB-INF/views/login.html。
内容的提问来源于stack exchange,提问作者Siddharth

