Spring Boot多页面无法加载resources/static下CSS/JS文件问题
你遇到的核心问题是相对路径解析差异导致的:index.jsp在根路径下,相对路径能正确指向static目录;但validate-configuration.jsp的URL带有路径前缀(比如/validate-configuration),相对路径会被错误地拼接在这个前缀后面,导致资源请求404。
下面是几种靠谱的解决方案,按推荐程度排序:
1. 使用绝对路径引用资源(最稳妥)
在JSP中通过${pageContext.request.contextPath}获取应用的上下文路径,拼接成绝对路径引用静态资源:
<!-- CSS引用 --> <link rel="stylesheet" href="${pageContext.request.contextPath}/static/style.css"> <!-- JS引用 --> <script src="${pageContext.request.contextPath}/static/js/jquery-2.1.1.min.js"></script>
这样不管当前页面的URL是什么,资源请求都会指向http://localhost:8090/static/xxx(如果应用有上下文路径,会自动加上,比如http://localhost:8090/myapp/static/xxx),完全避免相对路径的坑。
2. 给页面设置<base>标签
在validate-configuration.jsp的<head>标签内添加<base>标签,统一指定页面所有相对路径的基准URL:
<head> <base href="${pageContext.request.contextPath}/"> <!-- 之后的相对路径都会基于上面的基准 --> <link rel="stylesheet" href="static/style.css"> <script src="static/js/jquery-2.1.1.min.js"></script> </head>
这个方法的好处是不用修改每个资源的引用路径,一次配置全页面生效。
3. 检查Controller的URL映射
确认validate-configuration.jsp对应的Controller映射是否带有额外前缀,比如:
@RequestMapping("/validate-configuration") public String showValidatePage() { return "validate-configuration"; }
这种情况下页面的URL是/validate-configuration,如果用相对路径static/style.css,浏览器会解析成/validate-configuration/static/style.css,自然找不到资源。前面两种方法已经能解决这个问题,这里只是帮你理解问题根源。
4. 确认Spring Boot静态资源配置(兜底检查)
Spring Boot默认会把resources/static目录下的资源映射到/**路径,也就是说/static/xxx可以直接访问到resources/static/xxx。如果你自定义了WebMvcConfigurer,确保没有覆盖这个默认规则:
@Configuration public class WebConfig implements WebMvcConfigurer { // 不要写错误的资源映射,比如下面这种是多余的,但如果写了要确保路径正确 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/static/"); } }
如果没有自定义配置,这一步可以忽略,Spring Boot已经帮你处理好了。
内容的提问来源于stack exchange,提问作者Nick

