允许Apache的FreeMarker模板引擎从Resources文件夹外部加载模板

时间:2019-07-09 19:35:47

标签: java spring-boot freemarker

我使用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");
}

不知道我是完全搞错了还是错过了一些配置。

2 个答案:

答案 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。

有关传统部署的更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html#howto-create-a-deployable-war-file

答案 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。