4
JackLin的博客
首页
分类
标签
生活
时间轴
关于我
友链
搜索
管理员
SpringBoot中Controller返回路径问题
JavaWeb
SpringBoot
SpringMVC
Thymeleaf
发布日期:
2020-04-15 11:38:51
阅读量:
172
所属分类:
SpringBoot
### SpringBoot是如何根据路径寻址文件的 要想知道Controller中的返回路径究竟如何填写,我们就必须知道SpringBoot是如何解析我们写的路径的。 关于这部分内容,我们得首先从SpringMVC开始说起。 #### (1)SpringMVC中路径问题 熟悉SpringMVC的小伙伴都知道SpringMVC的基本访问流程,如何不熟悉的话可以参考我的这篇博客:xxx #### (2)SpringBoot中解析路径 和SpringMVC类似,我们也是需要找到他的视图解析器相关的配置文件。 `WebMvcAutoConfiguration` `ResourceProperties` 这类配置文件再SpringBoot中一般是xxxProperties.java 的格式;所以我们找到 `ThymeleafProperties.java` 在这个类里面我们可以很清楚的看到如下代码: ``` @ConfigurationProperties(prefix = "spring.thymeleaf") public class ThymeleafProperties { private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8; public static final String DEFAULT_PREFIX = "classpath:/templates/"; public static final String DEFAULT_SUFFIX = ".html"; // 剩余代码... } ``` 是不是有种似曾相识的感觉,这里的 prefix = "spring.thymeleaf" 表示我们在 application.yaml 文件中进行相关的配置,需要以 spring.thymeleaf 开头。 接下来有3个常量: - DEFAULT_ENCODING 设置了一下Thymeleaf的默认编码 - DEFAULT_PREFIX 设置了解析时的前缀 - DEFAULT_SUFFIX 设置了解析时的后缀 就是说如果我们在Controller中直接返回一个字符串,例如 return "main"; 那么SpringBoot就会去 templates/static 目录下面去寻找以 main 开头, .html 结尾的文件,也就是去寻找 main.html 文件。 #### (3)关于重定向 如果在Controller中需要重定向,那么在开头尽量添加上 / ,避免出现不必要的麻烦,因为 / 代码根目录。 如果不加的话,而且在Controller类上面又添加l @ ResponeBody 注解,如下所示,可能出现资源找不到情况。 ``` @Controller @RequestMapping("/admin") public class BlogController { @RequestMapping("/addBlog") public String addBlog() { return "redirect:/admin/Blog"; } } ``` - 如果是 `return "redirect:/admin/Blog";` 那么地址栏将会显示 http://localhost/admin/Blog - 如果是 `return "redirect:admin/Blog";` 那么地址栏将会显示 http://localhost/admin/admin/Blog 前面多了一个 amdin,就是因为我们在类上面添加了 @ RequestMapping("/admin") 造成的原因 #### (4)关于部署到服务器上(本地可以运行,服务器上报500错误) ##### 1. 部署到服务器上的时候, return 语句前面不需要加上 /,否则会报错 ``` @RequestMapping("/Blog") public String blog(Model model) { // 逻辑代码 return "main/blog"; } ``` - 如上面代码所示,直接返回 "main/blog" 就行了,如果返回 "/main/blog" 就或报错 ##### 2. 需要严格的遵守Thymeleaf的相关规范 **例如,使用Thymeleaf抽取公共页面时,前面也不能加 / ** ``` <!-- 文章页面:头部导航栏--> <div th:replace="~{common/commonsfile::article-topbar}"></div> ``` - 第一个common前面不能加 /