当前位置: 首页 > 知识库问答 >
问题:

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

郎俊雅
2023-03-14

我使用Spring Initilizr创建了一个Spring启动应用程序。然后我加入了Apache的Freemarker模板引擎,从我的项目中加载模板。默认情况下,引擎从以下文件夹加载模板:src/main/resources/templates/文件夹。

我正在尝试加载一个简单的索引。ftl用户访问网页时作为模板的文件http://localhost:8080。但是我需要从src/main/webapp/文件夹加载模板。每当我尝试从resources文件夹外部加载模板时,模板引擎都无法找到模板。

我已经阅读了各种教程和堆栈溢出问题。没有人回答我的问题,我陷入了一个404错误,因为引擎无法找到文件。

文件结构为:

|-src
|---main
|-----java
|-------MainApplication.java
|-------controllers
|---------ViewController.java
|-----resources
|-------static
|-------templates
|-------application.properties
|-----webapp
|-------index.ftl

经过大量挖掘,我发现了一篇帖子,他们建议更改模板引擎搜索文件的位置。它建议在应用程序中添加以下行。特性:

spring.freemarker.enabled=true
spring.freemarker.template-loader-path=classpath:src/main/webapp/

这似乎根本不起作用。

当我访问位于的网页时,我正在尝试解析简单索引页http://localhost:8080.我已经编写了以下代码来映射ViewController中的HTTP请求。java

@RequestMapping("/")
public ModelAndView home(Model model)
{
    return new ModelAndView("index");
}

不知道我是否完全弄错了,或者我错过了一些配置。

共有2个答案

牛嘉谊
2023-03-14

编辑

在嵌入式tomcat中,您可以在应用程序属性中定义静态资源路径

 spring.mvc.static-path-pattern=

若您部署到tomcat,那个么在tomcat中使用可以在服务器内部定义。可以保存freemarker文件的xml静态上下文,如

 <Context docBase="/home/stuff" path="/static" />

A

薄涵衍
2023-03-14

从Spring文档:

如果应用程序打包为jar,请不要使用src/main/webapp目录。尽管此目录是一个通用标准,但它仅适用于war打包,并且在生成war时,大多数构建工具都会忽略它。

src/main/webapp与web存档相关联,并将在生成war时由maven war插件打包。

假设您需要一个单独的位置来保存ftl模板,并且您仍然希望打包为jar,那么您可以按照以下步骤进行操作。

在构建pom文件中添加资源条目,以便资源插件可以将该目录复制到类路径。

<build>
    <resources>
      <resource>
         <directory>src/main/webapp</directory>
     </resource>
    <resources>
<build>

将加载程序路径更改为从类路径的根读取。

spring.freemarker.template-loader-path=classpath:

如果它只适用于ftl模板,我会将目录更改为src/main/ftls,以避免混淆并在资源中更新相同的内容。

更新

实际上我想建立一个WAR部署包

你必须使用war插件来构建war。在pom中添加插件并将包装更改为war。

有关传统部署的更多信息:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html#howto-创建一个可部署的war文件

 类似资料:
  • 我正在使用SpringBoot和thymeleaf从html模板生成文档。 随着模板的不断变化,我希望ti从外部加载模板,只是从外部添加或删除模板,而不是重新部署应用程序。 作为POC,使用/resources文件夹时效果良好。 这就是错误: 解析模板“凭证”时出错,该模板可能不存在,或者任何已配置的模板解析程序都无法访问该模板 这就是背景: applycation.yml 这是我的方法:其中te

  • 快速开始 安装模块 # 安装koa模板使用中间件 npm install --save koa-views # 安装ejs模板引擎 npm install --save ejs 使用模板引擎 demo源码 https://github.com/ChenShenhai/koa2-note/blob/master/demo/ejs/ 文件目录 ├── package.json ├── index.js

  • 在我的应用程序中,所有freemarker模板都位于/templates/ftl/中,因此在应用程序部署期间,我加载了一个类,我调用了一个扩展FreemarkerManager并具有方法的类 这样,当我需要加载模板文件时,我可以这样做: 仅在一种特定情况下,我需要获得一个来自完全不同路径的模板(而不是/templates/ftl/)。 如何在这个特定的时刻声明模板加载的第二个目录,而不破坏所有调用

  • 我正在尝试使用从多个位置加载模板。这个项目是使用开发的。 我有两个maven项目: > 我的网站:maven的主要项目,包含自定义模板,例如WEB-INF/ftl/landing/login。ftl 通用模板:包含位于WEB-INF/ftl的通用freemarker模板,例如WEB-INF/ftl/landing/login。ftl 例如,Freemarker的想法是在“我的网站”中搜索登陆/登录

  • 问题内容: 到目前为止,直到未模块化的Java,您只需将文件放入以确保它位于类路径中,然后使用 从classpath的几乎任何地方开始。 现在有了模块,地块变厚了。 我的项目设置如下: 配置文件放在里面。 项目运行于 由于主类不是位于我自己的项目中,而是位于外部框架模块中,因此看不到。现在的问题是,是否有办法以某种方式将我的配置文件放入模块或打开它?我是否必须更改框架上游加载文件的方式? 我尝试在

  • 我的项目设置如下: 配置文件放在中。 运行项目时使用 如何以最佳实用的方式实现这一点,使它能够像在Java8中一样工作,并且尽可能少的改动?