Skip to content

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 than
lt: 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
便捷的解决方法:

  1. 使用?c转字符串 <td>${id?c}</td>
  2. 实体类中使用字符串类型

函数

在 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}&nbsp;&nbsp;  
</#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}&nbsp;&nbsp;  
</#list>

代码复用

freemarker实现通用布局的模板拆分与复用 – 哈呜.王

  • 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;  
}