最近写SpringBoot项目时遇到的一个问题,在本地运行很正常,一点毛病都没有,直到package
打包部署到服务器上运行的时候就出现问题了,而且不是一个页面有这个的问题,经过网上多处查询,说Controller
层的返回页面方法要注意/
但是我的的确没有/
也报错了,于是我把关注点锁定到Thymelefa
页面
在之前写项目的经验中我知道如果显示有关Thymeleaf的错误都逃不脱两个点
Controller
成的页面跳转方法错误
(如果方法里只是简单的写了一行return
的话,就可以断定是页面的问题了)Thymelefa
页面错误
(如果你的页面也没有报错或者是IDE编辑器误报的话,那么你可能和我遇到的是同一个问题)
正文
这是我的Controller.java
@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内如过多,我就只截取部分进行展示
<!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
<!-- 引入页面头header-fragment -->
<nav th:replace="~{/admin/public::header-nav}"></nav>
这里使用 th:replace
引用 template\admin\public.html
下的header-nav
<!-- 引入页面头header-fragment -->
<nav th:fragment="header-nav" class="xxxx">xxxxxxx.....</nav>
这也没问题,本地运行能正常显示,关键问题就在打jar包上,因为打jar包后目录结构有改变(可以自己用解压软件解压查看)
当你在admin
前面加上/
后,Thymelaf就会到根目录去找admin/public.html
(也就是绝对路径)
相对路径
- …/ 表示当前文件所在的目录的上一级目录
- ./ 表示当前文件所在的目录(可以省略)
绝对路径
- / 表示当前站点的根目录(根目录等价于
绝对路径
)
例如:D:\Lete\Project\src\main\resources\templates\admin\public.html
总结
只需要将admin
前面的/
去掉即可
<!-- 引入页面头header-fragment -->
<nav th:replace="~{admin/public::header-nav}"></nav>
这样就可以正常运行了
至于为什么在本地运行正常,这我也说不清楚
博主使用的是IDEA 2020
版
以后编写代码时要注意观察