最近写SpringBoot项目时遇到的一个问题,在本地运行很正常,一点毛病都没有,直到package打包部署到服务器上运行的时候就出现问题了,而且不是一个页面由这个的问题,经过网上多处查询,说Controller层的返回页面方法要注意/但是我的的确没有/也报错了,于是我把关注点说定到Thymelefa页面
在之前写项目的经验中我知道如果显示有关Thymeleaf的错误都逃不脱两个点

  1. Controller成的页面跳转方法错误
    (如果方法里只是简单的写了一行return的话,就可以断定是页面的问题了)
  2. Thymelefa页面错误
    (如果你的页面也没有报错或者是IDE编辑器误报的话,那么你可能和我遇到的是同一个问题)

正文

这是我的Controller.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
@RequestMapping("/admin")
public class ToAdminNav {

// @Autowired 省略。。。

/*后台首页*/
@GetMapping({"/index.html","/index"})
public String toAdmin(Model mod){
// 以下的model查询出来的都由数据(我以及Debug过了)
mod.addAttribute("user",userService.selUser());
mod.addAttribute("blog",blogService.getTotalBlogs());
mod.addAttribute("category",categoryService.getTotalCategories());
mod.addAttribute("tag",tagService.getTotalTags());
mod.addAttribute("link",linkService.getTotalLinks());
mod.addAttribute("comment",commentService.getTotalBlogComments(null));
mod.addAttribute("date",this.date());
// 那么关键就是 return 了,我的后台首页当然是在template\admin\index.html 所以这肯定没问题(毕竟本地都能完美跳转)
return "admin/index";
}
}

页面template\admin\index.html
由于html内如过多,我就只截取部分进行展示

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{/admin/public::head(${user.getAuthor()}+' | 首页管理')}">
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<!-- 引入页面头header-fragment -->
<nav th:replace="~{/admin/public::header-nav}"></nav>
<!-- 引入工具栏sidebar-fragment -->
<aside th:replace="~{/admin/public::aside(${user.getAvatar()},${user.getAuthor()},1)}"></aside>
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper" id="content-wrapper">

从上面的html可以看出我的template\admin\下因该有个public.html公共html

1
2
<!-- 引入页面头header-fragment -->
<nav th:replace="~{/admin/public::header-nav}"></nav>

这里使用 th:replace 引用 template\admin\public.html下的header-nav

1
2
<!-- 引入页面头header-fragment -->
<nav th:fragment="header-nav" class="xxxx">xxxxxxx.....</nav>

这也没问题,本地运行能正常显示,关键问题就在打jar包上,因为打jar包后目录结构有改变(可以自己用解压软件解压查看)
当你在admin前面加上/后,Thymelaf就会到根目录去找admin/public.html(也就是绝对路径)

相对路径

  1. ../ 表示当前文件所在的目录的上一级目录
  2. ./ 表示当前文件所在的目录(可以省略)

绝对路径

  1. / 表示当前站点的根目录(根目录等价于绝对路径)
    例如:D:\Lete\Project\src\main\resources\templates\admin\public.html

总结

只需要将admin前面的/去掉即可

1
2
<!-- 引入页面头header-fragment -->
<nav th:replace="~{admin/public::header-nav}"></nav>

这样就可以正常运行了

至于问什么在本地运行正常,这我也说不清楚
博主使用的是IDEA 2020

以后编写代码时要注意观察