【问题标题】:Spring MVC 4 + Thymeleaf: static resources 404 errorSpring MVC 4 + Thymeleaf:静态资源 404 错误
【发布时间】:2017-04-07 22:20:02
【问题描述】:

我正在使用 Spring 4.3.4 + Spring MVC + Thymeleaf 3.0.2 开发一个 webapp。顺便说一句,我还没有集成 Spring Security,所以没有任何安全策略。

问题很简单:浏览器没有加载静态资源(错误404)

这是我的项目文件夹结构,这是一个标准的 maven 结构(我已将静态资源放在 /src/main/resources/static 上,但我也试过 /src/main/webapp//src/main/webapp/WEB-INF/):


例如,这就是我如何在我的页面上链接 CSS(相信我,文件 /src/main/resources/static/assets/css/style.css确实存在):

<link th:href="@{/assets/css/style.css}" type="text/css" />

据我所知,我不需要 ResourceHandler 来处理 /src/main/resourcess/static/assets/ 上的内容,这应该已经可用在 /assets/,但它不起作用,所以在我的 spring java 配置中,我也做了一些尝试,例如:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("classpath:/static/assets/**").addResourceLocations("/assets/");
    registry.addResourceHandler("classpath:/static/pages/**").addResourceLocations("/pages/");
}

在任何情况下都无法访问 CSS 和 JS 文件。

我的调度器 servlet 映射到根目录 /:

<servlet-mapping>
    <servlet-name>myappDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

如果我在浏览器上检查 HTML,我可以看到上面的标签变成:

<link href="/myapp/assets/css/style.css" rel="stylesheet" type="text/css">

这对我来说看起来很正确,对吧?

那么,如果我尝试访问 css,为什么会收到 404 错误?我是不是忘记了什么重要的事情?

谢谢你,
卢卡

【问题讨论】:

    标签: css spring spring-mvc http-status-code-404 thymeleaf


    【解决方案1】:

    为了解决这个问题,我需要更改我的文件夹结构,将静态资源移动到 /webapp/ 文件夹中。我很确定有办法将 CSS 和 JS 留在 /resources/ 文件夹中,但我没有让它工作,所以这是我的新文件夹结构:

    然后我设置了资源处理程序映射:

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("/assets/**").addResourceLocations("/assets/");
    }
    

    这是 HTML 模板中使用的 link 标签(适用于页面的动态和静态加载):

    <link th:href="@{/assets/css/style.css}" href="../../assets/css/style.css"  rel="stylesheet" type="text/css" />
    

    【讨论】:

      【解决方案2】:

      删除资源处理程序映射,

      然后改成

      <link th:href="@{/assets/css/style.css}" href="../static/assets/css/style.css" type="text/css" />
      

      【讨论】:

      • 我已经尝试过使用和不使用资源处理程序映射,结果是一样的。此外,你的标签和我的一模一样,除了添加了 href 属性,它会在视图渲染期间被 thymeleaf 引擎忽略(它只会在你打开 .html 时生效静态模板)。