我使用Spring Initilizr创建了一个Spring Boot Application。然后,我包括Apache's Freemarker
模板引擎,以从我的项目中加载模板。默认情况下,引擎从以下位置加载模板:src/main/resources/templates/
文件夹。
当用户访问网页index.ftl
时,我试图加载一个简单的http://localhost:8080
文件作为模板。但是我需要从src/main/webapp/
文件夹中加载模板。每当我尝试从resources
文件夹外部加载模板时,模板引擎都无法找到模板。
我经历了各种教程和堆栈溢出问题。没有人回答我的问题,我被困在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");
}
不知道我是完全搞错了还是错过了一些配置。
最佳答案
从Spring文档:
如果您的应用程序是,请不要使用src / main / webapp目录
包装为罐子。尽管此目录是一个通用标准,但它
仅适用于战争包装,大多数人默默忽略
产生战争时建立工具。src/main/webapp
与Web存档相关联,在您生成war时将由maven war插件打包。
假设您需要一个单独的位置来保存ftl模板,并且仍然希望将其打包为jar,则可以按照以下步骤操作。
将资源条目添加到build in pom文件中,以便资源插件可以将该目录复制到classpath。
<build>
<resources>
<resource>
<directory>src/main/webapp</directory>
</resource>
<resources>
<build>
更改加载程序路径以从类路径的根目录读取。
spring.freemarker.template-loader-path=classpath:
如果仅用于ftl模板,则将目录更改为
src/main/ftls
以避免混淆,并在资源中更新该目录。更新
我实际上想构建一个WAR部署程序包
您必须使用war插件来建立战争。添加插件并将包装更改为pom中的war。
有关传统部署的更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html#howto-create-a-deployable-war-file