related: [Java-three-part]
非空判断
xml
<#if healthData.inoculateList??>
</#if>
<#if healthData.inoculateList??>
</#if>
空值时输出为空
FreeMarker对null值的处理
输出name的值:${name}。如果name为null,就会报错。
输出name的值:${name!}。如果name为null,就不会报错,什么也没输出。(重点)
输出name的值:${name!"默认值"}。如果name为null,就输出”默认值”字符串。(重点)
输出name的值:${name!100}。如果name为null,就输出100。
输出user.name的值:${(user.name)!"默认值”},如果user或name为null,就输出默认值。(重点)
输出user.name的值:${user.name!"默认值”},如果user为null会报错,如果name为null,就输出默认值。
使用default内建函数来处理:${user.name?default('vakin')} (较繁琐)
js
${healthData.healthException3!}
${healthData.healthException3!}
数值判断大小
gt
: great thanlt
: less than
= =: 相等
xml
<#if healthData.hospitalizedList?? && healthData.hospitalizedList?size gt 0>
</#if>
<#if healthData.hospitalizedList?? && healthData.hospitalizedList?size gt 0>
</#if>
循环
xml
<#list healthData.hospitalizedList as value>
</#list>
<#list healthData.hospitalizedList as value>
</#list>
时间
Built-ins for date/time/date-time values - Apache FreeMarker Manual
js
${value.sickbedEndDate?date} // yyyy-MM-dd 这个不同环境输出的格式似乎可能不同,保险期间可以使用 date[?'yyyy-MM-dd')
${healthData.happenTime?string["yyyy年MM月dd日"]}
${lastUpdated?time}
${date?string("yyyy/MM/dd HH:mm:ss")} // 为空的时候不报错
${value.sickbedEndDate?date} // yyyy-MM-dd 这个不同环境输出的格式似乎可能不同,保险期间可以使用 date[?'yyyy-MM-dd')
${healthData.happenTime?string["yyyy年MM月dd日"]}
${lastUpdated?time}
${date?string("yyyy/MM/dd HH:mm:ss")} // 为空的时候不报错
整数显示问题
问题: 如果整数超过三位,默认显示逗号,例如 1234 会显示为 1,234
便捷的解决方法:
- 使用
?c
转字符串<td>${id?c}</td>
- 实体类中使用字符串类型
函数
在 freemarker 中使用自定义的函数的两种方法介绍 | ckJava
方法之一:renderModel中添加包含function的实体类
java
public class FreeMakerFuncRender {
public List<String> renderDict(Integer dictCode, List<HdHealthDictPO> dictList) {
....略
}
}
@Data
public class FullHealthReportRenderDto {
private FreeMakerFuncRender funcRender;
...略
}
// freemarker
<#list funcRender.renderDict(334, dictList) as value>
${value}
</#list>
public class FreeMakerFuncRender {
public List<String> renderDict(Integer dictCode, List<HdHealthDictPO> dictList) {
....略
}
}
@Data
public class FullHealthReportRenderDto {
private FreeMakerFuncRender funcRender;
...略
}
// freemarker
<#list funcRender.renderDict(334, dictList) as value>
${value}
</#list>
代码复用
- macro 提取通用逻辑代码
- include 拆分文件、引用文件
<#include "xxxPartial/record.ftl" />
html
<#macro renderSelection model dict min>
<span class="new-selected-item-wrap">
<span style="display: inline-block;padding-right: 3px;">
<#list funcRender.renderSelectIndex(model, dict, dictList, min) as item>
<div class="new-select-item">
${item}
</div><#if item?has_next> /</#if>
</#list>
</span>
</span>
</#macro>
// 使用
<@renderSelection model="${healthData.mainSymptoms!}" dict=334 min=10/>
<#macro renderSelection model dict min>
<span class="new-selected-item-wrap">
<span style="display: inline-block;padding-right: 3px;">
<#list funcRender.renderSelectIndex(model, dict, dictList, min) as item>
<div class="new-select-item">
${item}
</div><#if item?has_next> /</#if>
</#list>
</span>
</span>
</#macro>
// 使用
<@renderSelection model="${healthData.mainSymptoms!}" dict=334 min=10/>
java
private <T> List<T> makeListDefaultData(List<T> originData, int minRowSize, Class<T> typeArgumentClass) {
// 住院史,空的时候至少展示两个
if (CollectionUtils.isEmpty(originData)) {
List<T> newList = new ArrayList<>();
for (int i = 0; i < minRowSize; i++) {
try {
newList.add(typeArgumentClass.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
return newList;
}
// 如果有数据,并且>=2,直接返回
if (originData.size() >= minRowSize) {
return originData;
}
// 如果不够两个,需要进行补齐两个
List<T> newList = new ArrayList<>(originData);
for (int i = 0; i < minRowSize - originData.size(); i++) {
try {
newList.add(typeArgumentClass.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
return newList;
}
private <T> List<T> makeListDefaultData(List<T> originData, int minRowSize, Class<T> typeArgumentClass) {
// 住院史,空的时候至少展示两个
if (CollectionUtils.isEmpty(originData)) {
List<T> newList = new ArrayList<>();
for (int i = 0; i < minRowSize; i++) {
try {
newList.add(typeArgumentClass.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
return newList;
}
// 如果有数据,并且>=2,直接返回
if (originData.size() >= minRowSize) {
return originData;
}
// 如果不够两个,需要进行补齐两个
List<T> newList = new ArrayList<>(originData);
for (int i = 0; i < minRowSize - originData.size(); i++) {
try {
newList.add(typeArgumentClass.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
return newList;
}