Freemarker - 基础篇(下)

简介: Freemarker - 基础篇(下)

12、自定义指令image.png

自定义指令步骤:

(1)在spring-servlet.xml中配置properties标签。

(2)需要实现接口TemplateDirectiveModel,并重写execute方法。

(3)在前端中使用“@配置文件properties的key”

Freemark 语法:

内建指令:“#”开头

自定义指令:“@”开头

Ps:因为入参是K-V形式,所以不需要逗号分割,而出参是List形式,所以需要逗号分割。

package pers.li.springbootfreemarker.tags;
import freemarker.core.Environment;
import freemarker.template.*;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
@Component
public class CustomTagDirective implements TemplateDirectiveModel {
    /**
     *
     * @param environment   环境变量
     * @param map   指令参数:储存所需要的值
     * @param templateModels    循环变量
     * @param templateDirectiveBody 指令内容
     * @throws TemplateException    map不能为null,其余均可为null
     * @throws IOException
     */
    @Override
    public void execute(Environment environment, Map map, TemplateModel[] templateModels, TemplateDirectiveBody templateDirectiveBody) throws TemplateException, IOException {
        //        DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_23);
        //         environment.setVariable("listParentBanks", builder.build().wrap(bankBranchService.listParents()));
        //参数读取
        TemplateScalarModel user = (TemplateScalarModel) map.get("user");
        TemplateScalarModel role = (TemplateScalarModel) map.get("role");
        //结果封装
        if("123456".equals(user.getAsString()) && "admin".equals(role.getAsString())){
            templateModels[0] = TemplateBooleanModel.TRUE;
        }
        ArrayList<String> strings = new ArrayList<String>();
        strings.add("add");
        strings.add("update");
        strings.add("delete");
        strings.add("select");
        templateModels[1] = new SimpleSequence(strings);
        templateDirectiveBody.render(environment.getOut());
    }
}
<h1>
    自定义指令:使用@开始
</h1>
<h3>
    1.用户123456是否拥有admin角色,并返回admin权限
</h3>
<ul>
    <!--入参:user='123456' role='admin'-->
    <!--出参:result1,result2-->
    <@role user='123456' role='admin';result1,result2>
        <#if result1>
            我的角色是 admin
        </#if>
        <#list result2 as item>
            我的权限是 ${item}
        </#list>
    </@role>
</ul>

image.png步骤1image.png步骤2image.png步骤3

13、常用内建函数image.pngimage.pngimage.pngimage.png

<h1>
   内建函数:
</h1>
<h3>
    1.处理字符串的内建函数:
</h3>
<ul>
    <li>substring:</li>
    <li>cap_first:首字母大写</li>
    <li>ends_with:以。。。结尾</li>
    <li>contains:包含</li>
    <#assign var1="01/03/2017"?date("MM/dd/yyyy")/>
    <#assign var2="15:05:30"?time('HH:mm:ss')/>
    <#assign var3="2015-12-31 03:05 PM"?datetime('yyyy-MM-dd hh:mm')/>
    <li>date:${var1}   </li>
    <li>datetime:${var3}</li>
    <li>time:${var2}</li>
    <li>starts_with:</li>
    <li>index_of:</li>
    <li>last_index_of:</li>
    <#list 'a|b|c'?split("|") as item>
        <li>split:${item}</li>
    </#list>
    <li>trim:</li>
</ul>
<h3>
    2.处理数字的内建函数:
</h3>
<ul>
    <li>string:x?string("0.##") --> 转换为保留两位小数点-四舍五入</li>
    <li>round:四舍五入</li>
    <li>floor:去掉小数点</li>
    <li>ceiling:进一</li>
    <#assign num=3.1415926/>
    <li>${num?string("0.##")}</li>
    <li>${num?round}</li>
    <li>${num?floor}</li>
    <li>${num?ceiling}</li>
</ul>
<h3>
    3.处理List的内建函数:
</h3>
<ul>
    <li>first:第一个值</li>
    <li>last:最后一值</li>
    <li>seq_contains:序列是否包含</li>
    <li>seq_index_of:序列位置</li>
    <li>size:大小</li>
    <li>reverse:倒转list</li>
    <li>sort:升序</li>
    <li>sort_by:根据某属性排序</li>
    <li>chunk:分块处理</li>
    <#assign nums=[1,2,3,4,7,8,9,0,11,12,13,14]/>
    <li>集合分组个数:${nums?chunk(5)?size}</li>
    <li>遍历最后一组数据:</li>
    <#list nums?chunk(5)?last as item>
        <li>${item}</li>
    </#list>
</ul>
<h3>
    3.其他内建函数:
</h3>
<ul>
    <#assign isstr='hello'/>
    <li>is_string:是否字符串 ${isstr?is_string?string('yes','no')}</li>
    <li>is_number:是否数字   ${isstr?is_number?string('yes','no')}</li>
    <li>is_method:是否方法</li>
    <li>has_content:判断是否有内容 ${isstr?has_content?string('yes','no')}</li>
    <li>eval求值-->字符串先连接再转换为整数:${'1'+'2'?eval}</li>
    <li></li>
</ul>

Ps1:has_content ~ !:判断空。

Ps2:eval:将string类型转化为int类型。

14、macro、function指令image.png

<h1>
    macro宏指令,function指令
</h1>
<ul>
    <!--定义指令-带默认值--无返回值-->
    <#macro macro_name param1 param2 paramn='默认值'>
        <li>macro指令:-->参数:${param1} | ${param2}|${paramn}</li>
    </#macro>
    <!--定义指令-带多个参数--参数类型map--无返回值-->
    <#macro macro_name_2 param1 param2 paramn...>
        <li>macro指令:-->参数:${param1} | ${param2}|${paramn['param3']}</li>
        <li>${paramn?size}</li>
        <#list paramn?keys as key>
            <li>${key!}:${(paramn[key])!}</li>
        </#list>
    </#macro>
    <!--调用指令--无返回值-->
    <@macro_name param1='参数1' param2='参数2' paramn='参数N'/>
    <@macro_name param1='参数1' param2='参数2' />
    <@macro_name_2 param1='参数1' param2='参数2' param3='多个参数' param4='n+1'/>
    <!--定义有返回值的宏指令-->
    <#macro returnVal param1 >
        <li>指令获取的参数:${param1!}</li>
        <#nested param1,"指令返回的参数!"></br>
    </#macro>
    <!--调用:return1,2分别对应nested后的参数-->
    <@returnVal param1="java";return1,return2>
        <font color="red">hello,${return1}|${return2}</font>
    </@returnVal>
    <@returnVal param1="python";return1,return2>
        <font color="green">hello,${return1}|${return2}</font>
    </@returnVal>
    <li>_______________________________________________________</li>
    <!--函数定义:加和函数-->
    <#function sum nums...>
        <#local sum = 0>
        <#list nums as num>
            <#local sum = sum + num>
        </#list>
        <#if nums?size != 0>
            <#return sum >
        </#if>
    </#function>
    <!--函数定义:均值函数-->
    <#function avg nums...>
        <#local sum = 0>
        <#list nums as num>
            <#local sum = sum + num>
        </#list>
        <#if nums?size != 0>
            <#return sum / nums?size>
        </#if>
    </#function>
    <!--调用-->
    <li>调用加和:${sum(1,2,3,4)}</li>
    <li>调用平均:${avg(1,2,3,4)}</li>
</ul>

总结:image.png

目录
相关文章
|
缓存 网络协议 安全
49. 【Android教程】HTTP 使用详解
49. 【Android教程】HTTP 使用详解
401 1
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
2748 0
SpringBoot——SpringBoot中使用过滤器Filter的两种方式
|
7月前
|
机器学习/深度学习 传感器 自然语言处理
基于Transformer架构的时间序列数据去噪技术研究
本文介绍了一种基于Transformer架构的时间序列去噪模型。通过生成合成数据训练,模型在不同噪声条件下展现出强去噪能力。文章详细解析了Transformer的输入嵌入、位置编码、自注意力机制及前馈网络等关键组件,并分析实验结果与注意力权重分布。研究为特定任务的模型优化和专业去噪模型开发奠定了基础。
466 14
基于Transformer架构的时间序列数据去噪技术研究
|
JavaScript 测试技术 索引
js数组方法汇总
js数组方法汇总
311 55
|
缓存 监控 JavaScript
computed 属性和 watch 方法的性能比较
【10月更文挑战第3天】
167 4
|
数据挖掘 数据处理 Python
【Python DataFrame 专栏】Python DataFrame 入门指南:从零开始构建数据表格
【5月更文挑战第19天】本文介绍了Python数据分析中的核心概念——DataFrame,通过导入`pandas`库创建并操作DataFrame。示例展示了如何构建数据字典并转换为DataFrame,以及进行数据选择、添加修改列、计算统计量、筛选和排序等操作。DataFrame适用于处理各种规模的表格数据,是数据分析的得力工具。掌握其基础和应用是数据分析之旅的重要起点。
444 2
【Python DataFrame 专栏】Python DataFrame 入门指南:从零开始构建数据表格
【正则表达式】正则表达式同时支持验证手机号码和座机号码
【正则表达式】正则表达式同时支持验证手机号码和座机号码
Element UI 表单【详解】-- 表单校验,表单元素排列在一行,常用表单元素等
Element UI 表单【详解】-- 表单校验,表单元素排列在一行,常用表单元素等
548 0
|
存储 数据挖掘 关系型数据库
DataFrame 与数据库交互:从导入到导出
【5月更文挑战第19天】本文介绍了如何在数据分析中实现DataFrame与MySQL数据库之间的数据交互。通过`pandas`的`read_sql`函数可将数据库中的数据导入DataFrame,处理后使用数据库游标执行插入或更新操作将数据导回。注意数据类型匹配、数据完整性和一致性。对于大量数据,可采用分块读取和批量操作提升效率。这种交互能结合数据库的存储管理和DataFrame的分析功能,提高数据处理效率。
446 2
|
缓存 算法 JavaScript
vue中组件保活<keep-alive>的使用
vue中组件保活<keep-alive>的使用
845 1