【发布时间】:2019-11-19 10:03:27
【问题描述】:
我使用 Spring Initilizr 创建了一个 Spring Boot 应用程序。然后我包含了Apache's Freemarker 模板引擎来从我的项目中加载模板。默认情况下,引擎从以下位置加载模板:src/main/resources/templates/ 文件夹。
当用户访问网页http://localhost:8080 时,我正在尝试加载一个简单的index.ftl 文件作为模板。但我需要从src/main/webapp/ 文件夹加载模板。每当我尝试从 resources 文件夹外部加载模板时,模板引擎都无法找到模板。
我已经阅读了各种教程和 Stack Overflow 问题。没有人回答我的问题,我被 404 ERROR 卡住了,因为引擎无法找到文件。
文件结构为:
|-src
|---main
|-----java
|-------MainApplication.java
|-------controllers
|---------ViewController.java
|-----resources
|-------static
|-------templates
|-------application.properties
|-----webapp
|-------index.ftl
经过大量挖掘,我发现了一篇帖子,他们建议更改模板引擎搜索文件的位置。它建议在 application.properties 中添加以下行:
spring.freemarker.enabled=true
spring.freemarker.template-loader-path=classpath:src/main/webapp/
这似乎根本不起作用。
当我访问http://localhost:8080 的网页时,我正在尝试解析简单的索引页面。我编写了以下代码来映射ViewController.java 中的 HTTP 请求:
@RequestMapping("/")
public ModelAndView home(Model model)
{
return new ModelAndView("index");
}
不知道是我完全弄错了还是我错过了一些配置。
【问题讨论】:
-
使用源代码路径 (
src) 几乎是不正确的(考虑一下,您只部署一个 jar 或 war 或 ear,都不包含源代码)。由于文件在 servlet 上下文中,当然您应该只使用/作为模板加载器路径(这通常意味着 servlet 上下文资源,而不是类路径资源)。 -
好的。谢谢..我会更改代码。尽管如此,我如何确保可以将上下文路径设置为指向
webapps文件夹..?我知道这很愚蠢,但真的很吃我的头.. -
在 Maven 中
src/main/webapps对应于 Servlet 上下文根目录,即它复制到输出war文件的根目录中的内容(如果有,请尝试)。所以在运行时它的内容应该可以通过ServletContext.getResource访问。如果模板路径不是以 URL 方案开头(如classpath:),对于 Spring Web 应用程序,它应该默认从ServletContext加载,因此路径已经相对于 Servlet 上下文根。当然,它假设一个适当的构建,等等,但这就是想法。 -
stackoverflow.com/a/55451851/592355 可能会有帮助/重复警告!!!
-
对于 spring boot 静态上下文使用
spring.mvc.static-path-pattern=见 docs.spring.io/spring-boot/docs/current/reference/html/…
标签: java spring-boot freemarker