變量的定義與顯示
1.定義字符串
<#assign str='a'>
<#assign str2 ="b">
<#assign sb =str+str2>${sb}結(jié)果為ab
<#assign sb =str+1>${sb}結(jié)果為a1
2.定義數(shù)字
<#assign x = 1>
<#assign y = 2>
<#assign z = x+y> ${z}結(jié)果為3
3.定義list
<#assign list0 = [0,1,"2"]>
4.定義map
<#assign map0 = {"1":"a","2":"b"}>
5.定義boolean類型
<#assign bl= false>
${bl?c}顯示false
變量的運(yùn)算
1.都為數(shù)值類型時 為正常運(yùn)算
2.其中有字符串時為字符串拼接
基礎(chǔ)標(biāo)簽
1.條件判斷<#if (bl)>
<#assign a = 2>
<#if (a=1)>
a=1
<#elseif (a=2)>
a=2
<#else>
a=other
</#if>
2.循環(huán)標(biāo)簽與中斷標(biāo)簽<#list list as obj>
<#list list as obj>
<#if (obj_index=2)><#break></#if>
</#list>
3.禁止轉(zhuǎn)換標(biāo)簽<#noparse>
<#noparse>
${a}
</#noparse>//被noparse包圍的區(qū)域?qū)⒉粫晦D(zhuǎn)換,結(jié)果顯示${a}
4.導(dǎo)入其他freemarker文本標(biāo)簽<#include>
a. 創(chuàng)建base.ftl如下
<#assign a = 1>
abc
b. 創(chuàng)建test.ftl如下
<#include '../base.ftl'>//中的文本與變量同時被導(dǎo)入進(jìn)來
${a}
顯示結(jié)果為
abc
1
5.導(dǎo)入定義與函數(shù)標(biāo)簽<#import as xxx>
a. 創(chuàng)建base.ftl如下
<#assign a = 1>
abc
b. 創(chuàng)建test.ftl如下
<#import '../base.ftl' as obj>//中的文本與變量同時被導(dǎo)入進(jìn)來
${obj.a}
顯示結(jié)果為
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.格式化數(shù)據(jù)
#{2.555;M2}//最多保留兩位小數(shù) 結(jié)果為2.56
#{2;M2}//最多保留兩位小數(shù) 結(jié)果為2
#{2.555;m2}//保留到兩位小數(shù) 結(jié)果為2.56
#{2;m2}//保留到兩位小數(shù) 結(jié)果為2.00
${123456?string(',###')}//每3位用逗號分割 結(jié)果為123,456
${123456.1?string(',###.##')}//每3位用逗號分割并最多保留兩位小數(shù) 結(jié)果為123,456.1
${123456.1?string(',###.00')}//每3位用逗號分割并保留到2位小數(shù) 結(jié)果為123,456.10
${datetime?string('yyyy-MM-dd HH:mm')} //格式化日期
4.去掉空格與換行符
<#t> 去掉左右空白和回車換行
<#lt>去掉左邊空白和回車換行
<#rt>去掉右邊空白和回車換行
<#nt>取消上面的效果
常用函數(shù)
1.exists判斷該變量是否存在
2.is_sequence判斷變量是否是集合
3.is_hash判斷變量是否是map
字符串函數(shù)
${"abc"?length} //字符串長度
${" abc "?trim} //去掉左右空格
${"1"?number+2} //轉(zhuǎn)換數(shù)字類型 結(jié)果為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}//判斷是否以某字符串結(jié)尾
${"abc"?contains('b')?c} //判斷是否包含字符
${"123"?matches('\\d+')?c} //判斷是否匹配正則表達(dá)式
${"<>&"?html} //html轉(zhuǎn)碼
<#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'/>//結(jié)果顯示 hello world
2.java中自定義指令
a. 創(chuàng)建類并實現(xiàn)TemplateDirectiveModel接口
b. 使用env輸出數(shù)據(jù)
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>//輸出結(jié)果-----------------------lg
- 自定義函數(shù) <#function avg param0 param1><#return '?'/></#function>
<#function test a>
<#return 'hello ${a}'>
</#function>
${test('world')}//輸出hello world
- java中自定義函數(shù)
a. 實現(xiàn)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返回值
定義一個需要被調(diào)用方法的類(自創(chuàng)類似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文件獲取參數(shù)
*/
Object objs[] = new Object[list.size() - 1];
for (int i = 1; i < list.size(); i++) {
objs[i - 1] = FreeMarkerModelUtil.parse(list.get(i));
}
/*
* 方法轉(zhuǎn)發(fā)核心類(請根據(jù)需要自行書寫)
*/
MethodDispatcher d = new MethodDispatcher();
d.methodManager.putMethod(FreemarkerAction.class);//初始化該類需要被調(diào)用的方法
Object obj = null;
try {
obj = d.invoke(str, objs);
return obj;
} catch (Throwable e) {
e.printStackTrace();
}
return null;
}
}
引入已經(jīng)定義好的invokeMethod類
<#assign invoke= "net.lgpage.freemarker.method.InvokeMethod"?new()>
${invoke('test/abc/2','lg')} //該行代碼效果會去調(diào)用FreemarkerAction類中hehe(String id,String name,Admin admin)方法,最終結(jié)果顯示hello:2