12、自定义指令
自定义指令步骤:
(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>
步骤1步骤2步骤3
13、常用内建函数
<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指令
<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>