freemarker+springboot db方式读取模板配置

1、什么是freemarker

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
在这里插入图片描述

这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。
以上介绍来源于官网翻译介绍,具体可参照:Freemarker在线手册

2、springboot引用freemarker

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

3、实现从DB读取模板

freemarker默认是读取的文件系统模板,这种方式对于模板频繁添加更新的场景不是太适合,所以需要改造一下,让freemarker能够读取db配置模板,主要就是实现TemplateLoader接口,程序如下:

@Component("databaseTemplateLoader")
public class DatabaseTemplateLoader implements TemplateLoader {

    @Autowired
    private FreemarkerTemplateMapper freemarkerTemplateMapper;

    @Override
    public Object findTemplateSource(String name) throws IOException {
        return freemarkerTemplateMapper.selectByPrimaryKey(Integer.parseInt(name.split("_")[0]));
    }

    @Override
    public long getLastModified(Object templateSource) {
        FreemarkerTemplateDO freemarkerTemplateDO = (FreemarkerTemplateDO)templateSource;
        return freemarkerTemplateDO.getUpdateTime().getTime();
    }

    @Override
    public Reader getReader(Object templateSource, String encoding) throws IOException {
        return new StringReader(((FreemarkerTemplateDO) templateSource).getContent());
    }

    @Override
    public void closeTemplateSource(Object templateSource) throws IOException {
        return;
    }

让freemarker加载这个模板加载器

@Configuration
public class FreemarkerConfig {
    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer(DatabaseTemplateLoader databaseTemplateLoader) {
        FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
        configurer.setPreTemplateLoaders(databaseTemplateLoader);
        return configurer;
    }
}

模板配置表sql如下:

CREATE TABLE `freemarker_template` (
  `id` int(12) NOT NULL AUTO_INCREMENT,
  `content` text NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4、使用

可将模板输出到文件或者取到模板替换后的效果,一个简单例子如下:

    // 注入freemarker
    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;
    
        public void writeHtmlBlogPostFile(){

        File page = new File("/data/test/1.txt");

        try(Writer pageWriter = new OutputStreamWriter(new FileOutputStream(page), StandardCharsets.UTF_8)) {
            Template template = freeMarkerConfigurer.getConfiguration().getTemplate("1");
            template.process(createTestData(), pageWriter);
            log.info(FreeMarkerTemplateUtils.processTemplateIntoString(template, createTestData()));
            log.info("Writing of html file completed successfully!");
        }catch(Exception e) {
            log.error("File writing using the Freemarker template engine failed!", e);
        }

    }

dataModel可以是Map,可以利用fastJSON将entity转为map

private Map josnToMap(Object entity) {
        return JSON.parseObject(JSON.toJSONString(entity), Map.class);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值