变量的定义与显示
1.定义字符串
<#assign str='a'>
<#assign str2 ="b">
<#assign sb =str+str2>${sb}结果为ab
<#assign sb =str+1>${sb}结果为a1
2.定义数字
<#assign x = 1>
<#assign y = 2>
<#assign z = x+y> ${z}结果为3
3.定义list
<#assign list0 = [0,1,"2"]>
4.定义map
<#assign map0 = {"1":"a","2":"b"}>
5.定义boolean类型
<#assign bl= false>
${bl?c}显示false
变量的运算
1.都为数值类型时 为正常运算
2.其中有字符串时为字符串拼接
基础标签
1.条件判断<#if (bl)>
<#assign a = 2>
<#if (a=1)>
a=1
<#elseif (a=2)>
a=2
<#else>
a=other
#if>
2.循环标签与中断标签<#list list as obj>
<#list list as obj>
<#if (obj_index=2)><#break>#if>
#list>
3.禁止转换标签<#noparse>
<#noparse>
${a}
#noparse>//被noparse包围的区域将不会被转换,结果显示${a}
4.导入其他freemarker文本标签<#include>
a. 创建base.ftl如下
<#assign a = 1>
abc
b. 创建test.ftl如下
<#include '../base.ftl'>//中的文本与变量同时被导入进来
${a}
显示结果为
abc
1
5.导入定义与函数标签<#import as xxx>
a. 创建base.ftl如下
<#assign a = 1>
abc
b. 创建test.ftl如下
<#import '../base.ftl' as obj>//中的文本与变量同时被导入进来
${obj.a}
显示结果为
1
List的使用
1.list偏移
<#assign list = [1,2,"3"]>
${list[0]+list[1]}
2.list判断存在元素
<#assign list = [1,2,"3"]>
${list?seq_contains(1)?c}显示true
${list?seq_contains("3")?c}显示true
3.list的大小
${list?size}
4.list的遍历
<#list list as obj>
${obj_index}.${obj} //x_index为list的索引
#list>
Map的使用
1.map遍历key
<#assign map = {"1":"a","2":"b","3":"c"}>
<#list map?keys as key>
${key}:${map[key]}
#list>
2.map查找value
<#assign key="2">
${map[key]}或${map["2"]}
3.判断map是否存在某个key
${map["2"]?exists?string('存在','不存在')}
${map?keys[1]?exists?string('存在','不存在')}
Freemarker技巧
1.打印$
<#assign dl='$'>
${dl}
${r'$abc'}
2.避免未定义变量(miss)错误
${a!""}
<#assign a = 'a'><#assign b = 'b'>
${(a+b+":")!""}//若a或b其中一个不存在则为""都存在则为ab:
${a?default("0")}
3.格式化数据
#{2.555;M2}//最多保留两位小数 结果为2.56
#{2;M2}//最多保留两位小数 结果为2
#{2.555;m2}//保留到两位小数 结果为2.56
#{2;m2}//保留到两位小数 结果为2.00
${123456?string(',###')}//每3位用逗号分割 结果为123,456
${123456.1?string(',###.##')}//每3位用逗号分割并最多保留两位小数 结果为123,456.1
${123456.1?string(',###.00')}//每3位用逗号分割并保留到2位小数 结果为123,456.10
${datetime?string('yyyy-MM-dd HH:mm')} //格式化日期
4.去掉空格与换行符
<#t> 去掉左右空白和回车换行
<#lt>去掉左边空白和回车换行
<#rt>去掉右边空白和回车换行
<#nt>取消上面的效果
常用函数
1.exists判断该变量是否存在
2.is_sequence判断变量是否是集合
3.is_hash判断变量是否是map
字符串函数
${"abc"?length} //字符串长度
${" abc "?trim} //去掉左右空格
${"1"?number+2} //转换数字类型 结果为3
${" abc "?substring(1,3)} //字符串截取
${"abcabd"?replace('a','c')} //替换所有字符
${"abcabd"?split('b')[0]} //分割字符串
${" abc "?index_of('a')} //第一个字符串索引
${" abc "?last_index_of('a')} //最后一个字符串索引
${"abc"?cap_first} //首字母大写
${"abc"?uncap_first} //首字母小写
${"abc"?upper_case} //全部字母大写
${"abc"?lower_case} //全部字母小写
${"abcabd"?starts_with('b')?c} //判断是否以某字符串开头
${"abcabd"?ends_with('b')?c}//判断是否以某字符串结尾
${"abc"?contains('b')?c} //判断是否包含字符
${"123"?matches('\\d+')?c} //判断是否匹配正则表达式
${"<>&"?html} //html转码
<#setting url_escaping_charset='UTF-8'>
${"localhost/a.html?name=李渊"?url}或者
${"localhost/a.html?name=李渊"?url('UTF-8')}//url编码
Freemarker高级用法
1.自定义指令<#macro method param0 param1="?" param2="?">#macro>
<#macro hello name="lg">hello ${name}#macro>
<@hello name='world'/>//结果显示 hello world
2.java中自定义指令
a. 创建类并实现TemplateDirectiveModel接口
b. 使用env输出数据
public class TestDirective implements TemplateDirectiveModel {
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException {
env.getOut().write("-----------------------");
SimpleScalar ss = (SimpleScalar) params.get("name");
String name = ss.getAsString();
if(name!=null){
env.getOut().write(name);
}
}
}
c. 在ftl文件中引入java方法,并使用
<#assign test= "net.lgpage.ant.test.UpperDirective2"?new()> //引入方法
<@test name='lg'>@upper>//输出结果-----------------------lg
- 自定义函数 <#function avg param0 param1><#return '?'/>#function>
<#function test a>
<#return 'hello ${a}'>
#function>
${test('world')}//输出hello world
- java中自定义函数
a. 实现TemplateMethodModelEx接口
public class TestMethodModel implements TemplateMethodModelEx{
@Override
public Object exec(List list) throws TemplateModelException {
return list.toString();
}
}
b. 引入方法并使用
<#assign md= "net.lgpage.ant.test.TestMethodModel"?new()>
${md('1',' 2')}
Freemarker任意获取java返回值
定义一个需要被调用方法的类(自创类似Spring中的controller的东西)
@PathRedirect("test")
public class FreemarkerAction {
public String hello(){
return "hello";
}
@PathRedirect("/xixi")
public String hehe(){
return "hello";
}
@PathRedirect("/abc/{id}")
public String hehe(String id,String name,Admin admin){
if(admin == null)return "hello:"+id;
System.out.println("终于成功了"+id+",还传了名字"+name+",还给了个对象"+admin.getEmail());
return "hello:"+id;
}
}
定义InvokeMethod类
public class InvokeMethod implements TemplateMethodModelEx {
@Override
public Object exec(List list) throws TemplateModelException {
String str = FreeMarkerModelUtil.parse(list.get(0), String.class);
/*
* 从ftl文件获取参数
*/
Object objs[] = new Object[list.size() - 1];
for (int i = 1; i < list.size(); i++) {
objs[i - 1] = FreeMarkerModelUtil.parse(list.get(i));
}
/*
* 方法转发核心类(请根据需要自行书写)
*/
MethodDispatcher d = new MethodDispatcher();
d.methodManager.putMethod(FreemarkerAction.class);//初始化该类需要被调用的方法
Object obj = null;
try {
obj = d.invoke(str, objs);
return obj;
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
}
引入已经定义好的invokeMethod类
<#assign invoke= "net.lgpage.freemarker.method.InvokeMethod"?new()>
${invoke('test/abc/2','lg')} //该行代码效果会去调用FreemarkerAction类中hehe(String id,String name,Admin admin)方法,最终结果显示hello:2