问题描述
- 一个业务需求,需要在后端通过代码渲染一个,列表如下图所示(下图只是一个示意):
这个表格的特点就是数据重复比较多,结构简单,我们可以通过 Java 代码直接拼字符串。但是这样的问题就会导致,代码非常的难看。在 Java 代码中混杂着很多样式代码,可读性和可维护性比较差。所以我就 pass
着这个方案。
于是我就想到,通过模板 + 参数的方式来实现,这样可以做到结构和参数的分离,经过比较我选择了通过 FreeMarker
模板来定义结构,最终完成字符串模板的定义。
代码实现
-
导入依赖,这里我是基于
spring-boot
为基础的。
1
|
implementation 'org.springframework.boot:spring-boot-starter-freemarker' |
- FreeMarker 工具方法,主要是实现模板文件的读取和渲染。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
@Slf4j public class FreeMarkerUtils { static Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); static { cfg.setEncoding(Locale.ENGLISH, "utf-8" ); cfg.setTemplateLoader( new SpringTemplateLoader( new DefaultResourceLoader(), "templates/" )); } /** * 获取模板 * * @param templateName * @return */ public static Template getTpl(String templateName){ try { Template template = cfg.getTemplate(templateName); return template; } catch (Exception e) { log.error( "获取模板失败 {}" ,templateName,e); return null ; } } /** * 获取模板写入后的内容 * * @param templateName * @param model * @return */ public static Optional<String> getTplText(String templateName, Map<String, Object> model){ try { Template template = cfg.getTemplate(templateName); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); return Optional.ofNullable(text); } catch (Exception e) { log.error( "获取模板内容失败 {}" ,templateName,e); return Optional.empty(); } } } |
- 定义模板,如下所示(下面知识一个示意):
1
2
3
|
<#list list as item> ${item.url} | ${item.name} | ${item.age} </#list> |
- 使用模板并且返回渲染后的字符串,最终返回字符串。
1
2
3
|
Map<String, Object> model = new HashMap<>(); model.put( "list" , new ArrayList()) FreeMarkerUtils.getTplText( "a.html" , model); |
问题总结
- 我们使用模板的方式可以减少字符串的拼接,提高代码的可维护性。
- 如果我们系统中代码风格比较统一,我们可以通过这种方式来生成代码(只需要对数据库的 table meta 进行读取,然后再定义 Java 代码模板即可)。
到此这篇关于在Java中FreeMarker 模板来定义字符串模板的文章就介绍到这了,更多相关FreeMarker 定义字符串内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://juejin.cn/post/7082008020783202311