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

目录
相关文章
|
1月前
|
XML Java 数据格式
freemarker使用总结
freemarker使用总结
|
1月前
|
XML Java 数据格式
freemarker
freemarker
|
5月前
|
XML 数据格式
SpringMVC中使用FreeMarker实践
SpringMVC中使用FreeMarker实践
28 0
|
5月前
|
缓存
FreeMarker实践总结
FreeMarker实践总结
25 1
|
前端开发 Java
Freemarker - 基础篇(上)
Freemarker - 基础篇(上)
312 0
Freemarker - 基础篇(上)
|
开发框架 前端开发 Java
FreeMarker简介
FreeMarker简介
138 0
|
Web App开发 安全 Java
一篇很全面的freemarker教程
FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:格式部分,不会输出 3,插值:即${...}或#{..
1728 0
|
Java Maven