问题描述

html 页面直接浏览器打开正常,通过 mvc 启动发现资源加载不到。

解决方案

springboot查找静态资源的相关配置项:

# 应用上下文配置
server.servlet.context-path=/myprojectname

# 默认配置会自动在 /public /static /resources 目录寻找静态资源, 故不需要 /static 等前缀
spring.mvc.static-path-pattern=/**

# SpringMvc(ModelAndView) 视图前缀 prefix/xxx/xxx.html, 可不设,如果static目录下有以工程名命名的文件夹,则可以设置(如: /static/project/css)
spring.mvc.view.prefix=${server.servlet.context-path}

使用方式

html 引用静态文件

<link href="/myprojectname/css/bootstrap.css" rel="stylesheet">
<script src="/myprojectname/js/jquery.js">

静态资源404问题总结

若设置 server.servlet.context-path=/myprojectname 则每个静态资源都需要加上该值, 否则会出现404的问题

./ 和 / 的区别

./ 相对路径, 会动态匹配当前请求的路径作为前缀(如: 若Controller 的 RequestMapping(“/login”)):

则实际请求路径为 http://ip:port/login/css/bootstrap.css, 很明显不可能每个页面都有bootstrap.css, 所以就会出现404

(换句话说: 请求地址”http://ip:port/login/login.html”, 则login.html引入的 <link href="./css/bootstrap.css"> 的实际请求路径为 http://ip:port/login/css/bootstrap.css)

/url 绝对路径: 实际请求路径 http://ip:port/css/bootstrap.css, 若设置 server.servlet.context-path, 依然报404

参考资料

SpringBoot处理全局统一异常

SpringBoot ErrorController 实践

SpringBoot 处理异常方式