-
FreeMarker,模板引擎,是一款视图层的组件,用于解析服务器端数据并展示在视图层
查看全部 -
视图层组件,不是框架查看全部
-
#macro(宏指令)语法:
<#macro macro_name param1[=defaultValue1] param2[=defaultValue2] [paramExt...] > //可变参数以Map形式传入
template_code //封装的模板代码片段
[<#nested loopVar1, loopVar2/>] //嵌套模板, 定义的多个参数以逗号分隔
</#macro>
调用:
<@macro_name param1=${param1} param2=${param2}[;loopVar1, loopVar2]> //插入nested的参数
[${loopVar1}, ${loopVar2}]
${paramExt['key']} //可变参数取值
</@macro_name>
用于封装模板片段
#function语法:
<#function function_name param1 param2>
<#return param1 + param2>
</function>
调用:
${function_name(param1, param2)}
函数只是实现功能
查看全部 -
list?chunk(n) //设定分成n块
?eval执行前面的代码
查看全部 -
字符串内建函数
?cap_first //首字母大写
?start_with
?ends_with
?split
?contains
?trim
?date //转换为date类型
?datetime
?time
处理数字的内建函数
x?string("0.##")
?round
?floor
?ceiling
处理listd的内建函数
?first
?last
?seq_contains
?seq_index_of
?reverse
?sort_by
?chunk 分块处理
其他内建函数
is函数:
?is_string
?is_number
?is_method
(),has_content函数 //将一个对象视为整体
eval //求值
查看全部 -
自定义指令
语法:
1. 指令以@开头
2. 传入的多个参数以空格分隔
3. 参数与返回值之间以分号间隔
4. 多个返回值以逗号分隔
代码实现:
1. 创建自定义指令接口TemplateDirectiveModel实现类
2. 实现接口的execute()方法
env: 环境变量
params: 指令参数key=value对
loopVars: 循环变量
body: 指令内容
除了params,其他都能为null
public void execute(Environment env, Map params, TemplateMode[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOExecption {
TemplateScalarModel param1 = (TemplateScalarModel) params.get("param1"); //获取指令参数值
TemplateScalarModel param2 = (TemplateScalarModel) params.get("param2");
loopVars[0] = TemplateBooleanModel.TRUE; //设定指令返回值
loopVars[1] = new SimpleSequence(list);
body.render(env.getOut()); //返回指令执行结果
}
3. 在Spring中配置freemarkerVariables
<property name="freemarkerVariables">
<map>
<entry key="directiveName" value-ref="directiveBeanId" />
</map>
</property>
查看全部 -
list常用指令
list?sort //对list排序
list?reverse //反转降序
list?size //获取list个数
#list list?sort as item
${item_index} //获取元素在集合中的索引值
查看全部 -
自定义函数
1. 实现TemplateMethodModelEx接口
2. 实现其中exec()方法
//args是自定义函数的所有参数的lis集合
public Object exec(List args) throws TemplateModelException {
//获取的参数需要转化为SimpleSequence对象, freemarker的数据模型对象
SimpleSequence arg0 = (SimpleSequence) args.get(0);
List<BigDecimal> list = arg0.toList(); //将第一个参数转为它原本的类型, 在freemarkeer 2.3.22之后该方法被标记为过时的(@Deprecated)
//实现的代码
return object;
}
3. 将该实现类对象传递给html页面,参数名就是freemarker自定义函数的函数名
modelAndView.addObject("函数名", templateMethodModelEx);
4. 在html中直接通过函数名()调用自定义函数
注: 不使用simpleSequence.toList()方法转换simpleSequence封装的list的方式(网上尚未查询到相关资料,该方式是基于simpleSequence.toList()的源码和官方api编写的)
1. SimpleSquence simpleSequence = (SimpleSequence) args.get(0);
2. 根据页面传递过来的list类型重新创建新的list
List<Integer> list = new ArrayList<>();
3. 获取DefaultObjectWrapperBuilder对象
DefaultObjectWrapperBuilder builder = new DefaultObjectWrapperBuilder(Cinfiguration.getVersion()); //Cinfiguration.getVersion()自动获取当前freemarker的版本
4. 创建DefaultObjectWrapper对象
DefaultObjectWrapper objectWrapper = builder.build();
5. 遍历simpleSequence(遍历的每个元素都是TemplateModel对象), 使用DefaultObjectWrapper的unwrap()或tryUnwrapTo()方法将TemplateModel转化为Java类型,向list添加转化后的对象
for (int i=0; i < simpleSequence.size(); i++) {
list.add(objectWrapper.unwrap(simpleSequence.get(i), Integer.class));
}
6. 根据需求处理list并将处理后的list返回页面
查看全部 -
String基本操作指令
substring(startIndex, endIndex) //截取字符串
length //长度
upper_case //大写
lower_case //小写
index_of('str') //首次出现位置
last_index_of('str') //最后出现位置
replace(‘old’, 'new') //替换子字符串
查看全部 -
补充表达式指令
"+": 字符串连接,集合连接
"[index]": 下标取值
自定义函数
实现TemplateMethodModeEx接口
自定义指令
实现TemplateDirectiveModel
查看全部 -
<#switch var>
<#case value1>
...
<#break>
<#case value2>
...
<#break>
</#switch>
查看全部 -
freemarker条件语句
1. if...else...
<#if 条件>
...
<#else>
...
</#if>
2. if...elseif...else...
<#if 条件>
...
<#elseif 条件2>
...
<#else>
...
</#if>
3. <#if var??> | <#if var?exists>
判断var是否存在(不为null)
查看全部 -
对Map取值
map?keys //获取所有的key组成的set
<#list map?keys as key> //遍历key
${map[key]} 获取key对应的value
查看全部 -
object.var! //对最近的变量进行判断是否为null
(object.var)! //对整体进行判断是否为null
查看全部 -
<#assign varName="value"> //定义变量赋值
查看全部
举报