Spring Boot动态生成、加载模板文件

Spring Boot动态生成、加载模板文件

背景

bpm表单设计器在线生成html模板文件,需要保存到项目中,对表单进行查看、编辑。

方法一

直接生成文件保存到 Spring Boot 默认的模板文件目录下,即classpath:template

此方法简单粗暴,开发环境运行有效。但是使用JAR包部署到线上环境后存在问题:由于classpath的资源目录存在于JAR包下,而在Java程序运行时,不能直接将文件写入已经打包好的JAR文件中,并期望通过classpath:template这样的方式来访问。这是因为JAR文件是一个压缩文件,用于分发和部署Java应用程序,而它的内容在构建时是固定的。一旦JAR文件被创建,它的内容就不能在运行时被修改。

需求是在线生成表单后,立即可以对表单进行查看、编辑,很显然这个方法是不可行的。

方法二

自定义模板路径。

spring.thymeleaf.prefix=classpath:/mytemplates/  
spring.thymeleaf.suffix=.html

spring:  
  thymeleaf:  
    prefix: classpath:/mytemplates/  
    suffix: .html

可以把路径写在配置文件中,使模板引擎每次都读取自定义目录下的模板文件。此方法也不能解决问题,因为自定义的路径还是在项目中,并没有办法满足上述的需求。

最终解决方法

方法二中的自定义模板路径,其实是对Spring Boot 默认的模板解析器进行修改。我们完全可以自定义一个新的模板解析器,并从文件系统的目录中读取并解析模板文件。以下是详细的步骤:

添加依赖

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

<!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
</dependency>

自定义模板解析器

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.thymeleaf.spring5.SpringTemplateEngine;  
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;  
import org.thymeleaf.spring5.templateresolver.FileSystemTemplateResolver;  
import org.thymeleaf.templateresolver.ITemplateResolver;  
  
import java.util.Arrays;  
import java.util.HashSet;  
import java.util.Set;  
  
@Configuration  
public class ThymeleafConfig {  
  
    // 模板引擎的配置
    @Bean  
    public SpringTemplateEngine templateEngine(ITemplateResolver... templateResolvers) {  
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();  
        Set<ITemplateResolver> templateResolverSet = new HashSet<>(Arrays.asList(templateResolvers));  
        templateEngine.setTemplateResolvers(templateResolverSet);  
        return templateEngine;  
    }  
  
    // 默认模板解析器
    @Bean  
    public ITemplateResolver classpathTemplateResolver() {  
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();  
        resolver.setPrefix("classpath:/templates/");  
        resolver.setSuffix(".html");  
        resolver.setTemplateMode(TemplateMode.HTML);  
        resolver.setCharacterEncoding("UTF-8"); 
        resolver.setOrder(2);
        return resolver;  
    }  
  
    // 自定义一个额外的文件系统模板解析器
    @Bean  
    public ITemplateResolver fileSystemTemplateResolver() {  
        FileSystemTemplateResolver resolver = new FileSystemTemplateResolver();  
        resolver.setPrefix("/path/to/your/templates/"); // 指定文件系统的模板路径  
        resolver.setSuffix(".html");  
        resolver.setTemplateMode(TemplateMode.HTML);  
        resolver.setCharacterEncoding("UTF-8");  
        resolver.setCheckExistence(true);  
        resolver.setOrder(1); //优先使用此解析器
        resolver.setCacheable(false); //解析器级别的缓存
        return resolver;  
    }  
}

以上代码做到了既要去解析项目中自带的模板文件,又要对系统运行过程中新生成的模板文件进行解析。

值得注意的点:

  • 解析器的优先级使用setOrder定义。

  • 使用setCacheable可以定义解析器级别缓存禁用,这既满足了修改历史表单的需求,也不影响系统性能。

  • 模板解析器的实现类不止以上两种,有兴趣可以去了解。

    在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架。它简化了基于Spring的应用程序的开发过程,提供了自动配置和约定大于配置的原则。LibreOffice是一个开源的办公套件软件,它提供了创建和编辑Word文档等功能。Freemarker是一个适用于Java平台的模板引擎,可以实现动态生成文本文件,比如docx文档。 在Spring Boot应用程序中使用LibreOffice和Freemarker来动态生成docx文档的过程如下: 1. 在pom.xml文件中添加相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.libreoffice</groupId> <artifactId>libreoffice-java</artifactId> <version>1.1.0</version> </dependency> ``` 2. 创建一个Freemarker模板文件,用于定义生成docx文档的格式和内容。模板文件可以包含动态的变量,比如用户的姓名、日期等。 3. 在Spring Boot的主类中创建一个API接口,用于接收生成docx文档的请求。可以使用`@GetMapping`或`@PostMapping`注解指定API的路径。 4. 在API的方法中,使用Freemarker的模板引擎来动态生成docx文档。可以使用`Configuration`类来加载模板文件,使用`Template`类来渲染模板生成文档内容。 5. 使用LibreOffice的Java API来将docx文档转换为其他文件格式,比如PDF。可以使用`OfficeManager`类来启动一个LibreOffice实例,使用`OfficeDocumentConverter`类来执行转换操作。 6. 将生成的docx文档保存到服务器指定的目录,并返回给客户端进行下载。 通过以上步骤,就可以在Spring Boot应用程序中利用Freemarker模板和LibreOffice实现动态生成docx文档的功能了。这样可以更加灵活和方便地生成各种格式的文档,并且可以自定义文档的内容和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值