Springboot Thymeleaf 在控制器中使用多级路径时无法找到静态资源
Springboot Thymeleaf unable to find static resources when using multilevel path in controller
我将 Springboot mvc 与 thymeleaf 一起使用。我有一个典型的项目结构。
当我映射像 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.
您在模板中 link 的资源不应与当前路径相关。如果您的资源 src/href 路径不以 /
开头,它们就会变成相对 URL。因此,您需要从以 /
.
开始的根指定 src/href 路径
所以在你的情况下,它将是:/dist/css/style.min.css
和 /assets/libs/<file names>
。
Thymeleaf 通过 @{}
为 link 应用程序中的 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 mvc 与 thymeleaf 一起使用。我有一个典型的项目结构。
当我映射像 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.
您在模板中 link 的资源不应与当前路径相关。如果您的资源 src/href 路径不以 /
开头,它们就会变成相对 URL。因此,您需要从以 /
.
所以在你的情况下,它将是:/dist/css/style.min.css
和 /assets/libs/<file names>
。
Thymeleaf 通过 @{}
为 link 应用程序中的 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>