步骤 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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。