我使用Spring Initilizr创建了一个Spring Boot应用程序。然后,我加入了Apache's Freemarker
模板引擎来从我的项目中加载模板。默认情况下,引擎从以下位置加载模板:src/main/resources/templates/
文件夹。
当用户访问网页index.ftl
时,我正在尝试加载一个简单的http://localhost:8080
文件作为模板。但是我需要从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");
}
不知道我是完全搞错了还是错过了一些配置。
答案 0 :(得分:1)
来自Spring文档:
如果您的应用程序是,请不要使用src / main / webapp目录 包装为罐子。尽管此目录是通用标准,但它 仅适用于战争包装,大多数人默默忽略 当您发动战争时建立工具。
src/main/webapp
与Web存档相关联,在您生成战争时将由maven war插件打包。
假设您需要一个单独的位置来保存ftl模板,并且仍然希望将其打包为jar,则可以按照以下步骤操作。
在build in pom文件中添加资源条目,以便资源插件可以将该目录复制到classpath。
<build>
<resources>
<resource>
<directory>src/main/webapp</directory>
</resource>
<resources>
<build>
更改加载程序路径以从类路径的ROOT中读取。
spring.freemarker.template-loader-path=classpath:
如果仅用于ftl模板,则将目录更改为src/main/ftls
以避免混淆并在资源中更新该目录。
更新
我实际上想构建一个WAR部署软件包
您必须使用war插件来建立战争。添加插件并将包装更改为pom中的war。
答案 1 :(得分:0)
编辑
在嵌入式tomcat中,您可以在application-properties中定义静态资源路径
spring.mvc.static-path-pattern=
如果您部署到tomcat,则在tomcat中使用可以在server.xml static context内定义,该文件可以保存freemarker文件,如下所示:
<Context docBase="/home/stuff" path="/static" />
在
<Context>
元素内添加了<Host>
元素。上下文具有两个属性:docBase是磁盘上包含静态文件的目录,而path是您要在其上提供文件的URL。