步骤 1: 添加依赖

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

步骤 2: 配置 FreeMarker配置

## Freemarker 配置
## 文件配置路径
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftlh
spring.freemarker.charset=UTF-8
spring.freemarker.cache=false

步骤 3: 创建 FreeMarker 模板文件
在 src/main/resources/templates/ 目录下创建 FreeMarker 模板文件,例如 hello.ftlh:

<!DOCTYPE html>
<html>
<head>
    <title>Welcome</title>
</head>
<body>
    <h1>Hello, ${name}!</h1>
</body>
</html>

这个模板文件将会展示一个简单的欢迎消息,${name} 将会在渲染时被替换为实际的名字。

步骤 4: 创建 Controller
创建一个 Spring Boot 控制器,用于处理请求并渲染 FreeMarker 模板:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("name", "World");
        return "hello"; // 这里返回的是模板文件的名称,不包括后缀
    }
}

以上为简单的接入FreeMark渲染FreeMarker 模板


以下可使用FreeMarkerTemplateUtils工具, 渲染自己想要实现的功能, 比如公式的拼接/公式计算等功能

步骤一: 创建相关渲染使用的类:目的通过外层的抽象类统一调用
渲染的实现

渲染枚举类

import lombok.Getter;

@Getter
public enum FormulaTemplateCodeEnum {

    REGULAR_FORMULA("薪酬-普通公式","RegularFormulaModel"),
    CONDITIONAL_FORMULA("薪酬-条件公式","ConditionalFormulaModel"),
    ;

    private final String name;
    private final String label;
    private final String modelName;

    FormulaTemplateCodeEnum(String label,String modelName) {
        this.name = this.name();
        this.label = label;
        this.modelName = modelName;
    }

}

抽象类: 子类继承改抽象类

@Data
public abstract class AbstractFormulaTemplateModel {

    private FormulaTemplateCodeEnum templateCode;

}

子类自行根据业务自行调整:以下为例子

@Data
@ApiModel("薪酬-普通公式模板DTO")
public class RegularFormulaModel extends AbstractFormulaTemplateModel {

    @ApiModelProperty("条件组") 
    private List<FormulaFieldDTO> formulaList;

}

service接口:

public interface FormulaTemplateService {

    String transformFormulateByWriteTemplate(AbstractFormulaTemplateModel model);

}

service实现:

import freemarker.template.Configuration;
import freemarker.template.TemplateException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

@Service
@RequiredArgsConstructor
@Slf4j
public class FormulaTemplateServiceImpl implements FormulaTemplateService {

    private final Configuration configuration;

    @Override
    public String transformFormulateByWriteTemplate(AbstractFormulaTemplateModel model) {
        try {
            log.info("根据模板:{}开始转换成公式", model.getTemplateCode().getName());
            return FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(model.getTemplateCode().getName() + ".ftlh"), model);
        } catch (IOException | TemplateException e) {
            log.error("获取模板异常", e);
            throw new ServiceException("公式模板转换异常");
        }
    }

以上创建好了统一调用的渲染实现

步骤二:创建 FreeMarker 模板文件:
在 src/main/resources/templates/ 目录下创建 FreeMarker 模板文件,比如CONDITIONAL_FORMULA.ftlh
(注意文件命名与FormulaTemplateCodeEnum枚举里的命名一致),
是通过指定枚举进行路由到FreeMark文件进行渲染.

CONDITIONAL_FORMULA.ftlh内容如下(以下为列子,自行根据业务调整): 我这边目的是拼接条件公式:

<#-- 条件公式 -->
${formulaItem};

<#-- 输出条件组 -->
<#list formulaList as formula>
    <#if formula_index == 0>
        <#-- 第一个条件 -->
        if (
            <#assign ifConditionValue = "">
            <#list formula.ifConditionList as ifCondition>
                <#if ifCondition.parent?? || ifCondition.type == "TEXT">
                    <#assign ifConditionValue = ifConditionValue + "'" +  ifCondition.value?no_esc + "'">
                <#else>
                    <#assign ifConditionValue = ifConditionValue + ifCondition.value?no_esc>
                </#if>
            </#list>
            ${ifConditionValue}
        ){
            ${formulaItem} =
            <#assign elseConditionValue = "">
            <#list formula.elseConditionList as elseCondition>
                <#assign elseConditionValue += elseCondition.value?no_esc>
            </#list>
            ${elseConditionValue}
        }
    <#else>
        <#-- 不是第一个条件 -->
        <#-- 输出 elseif 条件 -->
        else if (
            <#assign ifConditionValue = "">
            <#list formula.ifConditionList as ifCondition>
                <#if ifCondition.parent??>
                    <#assign ifConditionValue = ifConditionValue + r"'" +  ifCondition.value?no_esc + r"'">
                <#else>
                    <#assign ifConditionValue = ifConditionValue + ifCondition.value?no_esc>
                </#if>
            </#list>
            ${ifConditionValue}
        ){
            ${formulaItem} =
            <#assign elseConditionValue = "">
            <#list formula.elseConditionList as elseCondition>
                <#assign elseConditionValue += elseCondition.value?no_esc>
            </#list>
            ${elseConditionValue}
        }
    </#if>
</#list>
else {
    ${formulaItem} =
    <#assign otherValue = "">
    <#list otherList as other>
        <#assign otherValue += other.value?no_esc>
    </#list>
    ${otherValue}
 }

步骤三: 举例子调用

        AbstractFormulaTemplateModel model = new ConditionalFormulaModel();
        model.setFormulaItem("应收");
        model.setTemplateCode(FormulaTemplateCodeEnum.CONDITIONAL_FORMULA);
        ...
        ...

        String formulate = formulaTemplateService.transformFormulateByWriteTemplate(model);

指尖上的Ken
1 声望1 粉丝