Springboot Thymeleaf 在控制器中使用多级路径时无法找到静态资源

Posted

技术标签:

【中文标题】Springboot Thymeleaf 在控制器中使用多级路径时无法找到静态资源【英文标题】:Springboot Thymeleaf unable to find static resources when using multilevel path in controller 【发布时间】:2021-05-23 07:48:27 【问题描述】:

我正在使用带有百里香叶的 Springboot mvc。我有一个典型的项目结构。 当我映射像http://<context-url>/anything 这样的简单路径时,它能够加载静态资源 但是当我使用像http://<context-url>/controllerpath/anything 这样的多级路径时它不起作用。

端点示例如下: 它正在工作

@GetMapping(path="/list")
    public ModelAndView getAdminList() 

        List<Admin> adminList = adminService.getAdminList();
        System.out.println(adminList);

        ModelAndView mav = new ModelAndView("home/main");
        mav.addObject("name", "Test");
        mav.addObject("list", adminList);
        return mav;
    

但是当我尝试在@Getmapping 路径中添加一些东西时

@GetMapping(path="/admin/list")
    public ModelAndView getAdminList() 

        List<Admin> adminList = adminService.getAdminList();
        System.out.println(adminList);

        ModelAndView mav = new ModelAndView("home/main");
        mav.addObject("name", "Test");
        mav.addObject("list", adminList);
        return mav;
    

它会加载模板,但不会加载 js 和 css 等静态资源。

我尝试在模板中添加../

<link href="../dist/css/style.min.css" rel="stylesheet">
<script src="../assets/libs/popper.js/dist/umd/popper.min.js"></script>
<script src="../assets/libs/bootstrap/dist/js/bootstrap.min.js"></script>

然后它可以工作,但我不想在我的模板中使用../。 我们是否有任何其他配置可以解决此问题。 TIA。

【问题讨论】:

你需要使用Thymeleaf风格的配置&lt;link th:src="@/dist/css/style.min.css rel="stylesheet"&gt;&lt;script th:src="@/assets/libs/popper.js/dist/umd/popper.min.js"&gt;&lt;/script&gt; 【参考方案1】:

您在模板中链接的资源不应与当前路径相关。当您不使用 / 启动资源 src/href 路径时,它们会变成相对 URL。因此,您需要指定从根目录开始的 src/href 路径,以 / 开头。

所以在你的情况下,它会是:/dist/css/style.min.css/assets/libs/&lt;file names&gt;

Thymeleaf 提供了一个方便的功能,可以通过 @ 链接应用程序中的 URL。使用@ 将自动将上下文路径(如果有)添加到所有 URL。正如@Kedar 在评论中提到的那样,您最终会得到以下结果:

<link th:href="@/dist/css/style.min.css" rel="stylesheet">
<script th:src="@/assets/libs/popper.js/dist/umd/popper.min.js"></script>
<script th:src="@/assets/libs/bootstrap/dist/js/bootstrap.min.js"></script>

【讨论】:

以上是关于Springboot Thymeleaf 在控制器中使用多级路径时无法找到静态资源的主要内容,如果未能解决你的问题,请参考以下文章

「SpringBoot实战」视图技术-Thymeleaf

SpringBoot——SpringBoot集成Thymeleaf

SpringBoot——SpringBoot集成Thymeleaf

Thymeleaf模板引擎

Spring Boot:在没有控制器的情况下使用 thymeleaf 处理 html 文件

控制器从 Thymeleaf 发送空对象 - Spring Boot