freemarker模板转换

使用场景:

公司业务中需要发送短信/微信/邮件,会有固定的模板,然后使用用户数据替换模板中的数据,这种替换的方式,就用到了freemarker

流程概述

java代码构建传输数据,查询数据库获取到模板,把传输数据替换到模板里,最终拿到替换后的数据,进行短信或者邮件发送

freemarker依赖

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

相关配置

这些配置都用不到,看看就行,如果在classPath下面有模板,就需要配置这些东西,没有就不用配置

server:
  port: 8888
spring:
  application:
    name: freemarker
  freemarker:
    # 是否开启缓存
    cache: false
    # 编码格式
    charset: utf-8
    # 是否暴露request
    expose-request-attributes: true
    # 是否暴露session
    expose-session-attributes: true
    # context暴露为rpc名称
    request-context-attribute: rpc
    # 模板文件后缀
    suffix: .ftl
    # 模板路径
    template-loader-path: classpath:/template/

controller层使用

import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author wangtuanyuan
 * @Date: 2022/5/15 13:46
 * @Description: 短信模板/微信消息模板/邮件消息模板使用示例
 */
@RestController
public class FkConotroller {

    @GetMapping("/convert")
    public String freemarkerProcess() throws Exception {
        // map的key和value,模拟从别处调过来的数据,传过来时需要把key和value一起传递过来
        Map<String, Object> srcMap = new HashMap<>();
        srcMap.put("e0", "张三");
        srcMap.put("e1", "先生");
        srcMap.put("e2", "11111");
        srcMap.put("e3", "2024");
        srcMap.put("e4", "3");
        srcMap.put("e5", "20");
        srcMap.put("e6", "77777");
        srcMap.put("e7", "8888");

        // 模拟从数据库查询出的模板
        String fmk = "尊敬的${e0}${e1},您好!您申请的尾号${e2}的保险合同“保单贷款”保全业务,已于${e3}年${e4}月${e5}日生效,贷款金${e6}元将于近期转至您尾号为${e7}的账户中,请您注意查收。";

        // 模板转换后的数据,该数据为需要发送的内容
        String string = this.convertFm(srcMap, fmk);

        // 拼装别的数据(比如手机号、邮箱号等),进行短信或者邮件的发送

        // 方法完成,可以不用返回,这里为了方便查看数据
        return string;
    }

    /**
     * @Author wangtuanyuan
     * @Date 2022-05-15 13:38
     * @Param map- 替换到模板内的数据
     * @Param dataForm-需要替换的模板
     * @Description 模拟从数据库查询出模板(dataForm),通过java代码的方式传参数据(map)
     **/
    public String convertFm(Map<String, Object> map, String dataForm) throws IOException, TemplateException {
        // 1.初始化配置类
        Configuration cfg = new Configuration(Configuration.getVersion());
        // 2.指定模板通过字符串方式加载
        StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
        String templateName = "content";
        stringTemplateLoader.putTemplate(templateName, dataForm);
        cfg.setTemplateLoader(stringTemplateLoader);
        // 3.获取模板,抛出IOException
        Template template = cfg.getTemplate(templateName);
        // 4.解析模板,抛出TemplateException
        StringWriter writer = new StringWriter();
        // 5.使用提供的数据模型执行模板,将生成的输出写入提供的 Writer
        template.process(map, writer);
        return writer.toString();
    }
}

最终数据展示

可以使用该json串进行数据发送调用

尊敬的张三先生,您好!您申请的尾号11111的保险合同“保单贷款”保全业务,已于2024年3月20日生效,贷款金77777元将于近期转至您尾号为8888的账户中,请您注意查收。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Freemarker 模板中,可以使用内置函数 `.time` 来打印时间戳。 具体使用方法是在模板中使用 `${.time}` 这样的表达式,Freemarker 将会把当前时间戳以毫秒为单位打印出来。 例如,下面是一个简单的模板,用于打印当前时间戳: ``` <p>当前时间戳:${.time}</p> ``` 如果你想把时间戳以其他格式打印出来,可以使用 Freemarker 的时间格式函数。例如,要把时间戳以 yyyy-MM-dd HH:mm:ss 的格式打印出来,可以使用如下表达式: ``` <p>当前时间:${.time?string("yyyy-MM-dd HH:mm:ss")}</p> ``` 请注意,Freemarker 使用的是 UTC 时间,因此打印出来的时间可能与你本地的时间不同。如果你需要打印本地时间,可以使用 `.now` 函数来代替 `.time` 函数。 例如,要把本地时间以 yyyy-MM-dd HH:mm:ss 的格式打印出来,可以使用如下表达式: ``` <p>当前时间:${.now?string("yyyy-MM-dd HH:mm:ss")}</p> ``` 希望这些信息能帮到你! ### 回答2: 在 Freemarker 模板中,我们可以通过使用内置的日期和时间函数来打印时间戳。 要打印当前时间戳,可以使用如下的指令: ``` ${.now?long} ``` 该指令中,`now` 是一个内置的日期/时间对象,而 `?long` 表示将其转换为长整型即 Unix 时间戳。 如果你有一个具体的时间对象,你可以通过使用 `?long` 进行转换后再打印时间戳,例如: ``` ${myDate?long} ``` 其中 `myDate` 是一个 Date 对象。 需要注意的是,Freemarker 默认使用服务器的时区进行日期和时间的计算和显示,如果需要使用其他时区,可以使用内置的 `tz` 函数进行转换,例如: ``` ${.now?long} ``` 以上的指令将会使用服务器的时区进行日期转换,如果需要使用特定时区,可以进行如下修改: ``` ${.now?long} ``` 其中 `myTimeZone` 是一个已定义的时区,如 "GMT+8"。 通过上述方法,我们可以在 Freemarker 模板中轻松实现打印时间戳的功能。 ### 回答3: 在Freemarker模板中,我们可以使用内置的Date类型来处理时间戳,实现打印时间戳的功能。 首先,我们需要将时间戳转换为Date对象。可以使用`eval`内建指令来执行此操作。例如,假设我们有一个名为`timestamp`的变量存储时间戳,我们可以使用下面的语法将其转换为Date对象: ``` <#assign date = (timestamp * 1000)?eval?datetime> ``` 上述代码将`timestamp`乘以1000,以将其从秒转换为毫秒的时间戳,并通过`?eval?datetime`将其转换为Date对象,然后将其赋值给`date`变量。 接下来,我们就可以使用Freemarker的日期格式化指令来打印时间戳了。例如,我们可以使用`?string`内置函数将Date对象按照想要的格式转换为字符串,然后将其输出到模板上。以下是一个示例: ``` 时间戳:${timestamp} 转换后的日期:${date?string("yyyy-MM-dd HH:mm:ss")} ``` 上述代码将会在模板上输出时间戳和经过格式化后的日期。 总结起来,要在Freemarker模板中打印时间戳,我们需要先将时间戳转换为Date对象,然后使用日期格式化指令将其按照想要的格式输出到模板上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值