****************************指 令 ****************************************
1,插值
用户名:${user.name}
组名:${user.group.name}
2,if..else..
<#if user.age lt 18>
${user.name}还是一个小孩
<#else>
${user.name}是成年人了
</#if>
4,list...
<#assign seq = ["winter", "spring", "summer", "autumn"]/>
<#list seq as x>
${x_index + 1}. ${x}<#if x_has_next>,</#if>
</#list>
5,noparse指令 (错误)
指定FreeMarker不处理该指定里包含的内容
<#assign books = ["winter", "spring", "summer", "autumn"]/>
<#noparse>
<#list books as book>
<tr><td>${book.name}<td>作者:${book.author}
</#list>
</#noparse>
6,compress 指令
移除html,xml中多余的空白,仅保留一个空白</br>
<#compress>
1 2 3 4 5
test only
I said, test only
</#compress>
忽略标记中的空白(查看源文件)
--
1 <#t/>
2<#t/>
3<#lt/>
4
5<#rt/>
6
--
7,escape,noescape 转义指令
html转义 防范xss攻击(区别需查看源文件),主要用法是将整个文档包裹在转义指令内
<#assign title="<title>req & resp</title>"/>
<#escape x as x?html>
First name: ${title}
<#noescape>Last name: ${title}</#noescape>
</#escape>
8,setting 系统环境设置
locale 输出本地化语言
number_format 用来转化数字到字符串的格式设置[computer,currency,percent]
boolean_format
date_format
time_format
datetime_format
time_zone </br>
classic_compatible 兼容传统模式
<#setting locale="hu_hu"/>
${1.2}
<#setting locale="en_US"/>
${1.2}
9,macro,nested,return宏变量指令
nested执行自定义指令开始和结束标签中间的模板片段
<@list items=["mouse", "elephant", "python"] title="Animals"/>
<#macro list title items>
${title?cap_first}:
<#list items as x>
*${x?cap_first}
</#list>
</#macro>
<#macro repeat count>
<#list 1..count as x>
<#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4; c, half, last>
${c}. ${half}
<#if last>
Last!
</#if>
</@repeat>
10,用户自定义指令@
<#--定义一个自定义指令 -->
<#macro book>
j2ee
</#macro>
<#--使用刚才定义的指令-->
<@book />
11,function 函数指令
区别于宏对象,带返回值
<#function avg x y>
<#return (x + y) / 2>
</#function>
${avg(10, 20)}
12,attempt,recover 异常处理指令
<#attempt>
正确: ${user.name}
<#recover>
异常.
</#attempt>
13,include指令 嵌入页
<#assign me = "李善福"/>
<span><strong><span><#include "/copyright.ftl" encoding="UTF-8"></span></strong></span>
14,import指令 导入宏库
<#import "mylib.ftl" as my/>
<@my.copyright '李善福'/>
<#import "mylib.ftl" as my/>
<@my.list items=["mouse", "elephant", "python"] title="Animals"/>
****************************内建函数 ****************************************
<#assign str1="freemarker截取字符串"/>
字符串截取:
字符串长度:
${str1?length}
字符串替换:
${str1?replace("ee","EE")}
首字母大写:
${str1?cap_first}
首字母小写:
${str1?uncap_first}
单词首字母大写:
${str1?capitalize}
全部转小写:
${str1?lower_case}
全部转大写:
${str1?upper_case}
是否“字符串”结尾
${str1?ends_with("字符串")?string}
是否“free”开头
${str1?starts_with("free")?string}
是否包含字符串"marker"
${str1?contains("marker")?string}
mar 索引所在位置-前
${str1?index_of("mar")}
mar 索引所在位置-后
${str1?last_index_of("mar")}
距左边距:
${str1?left_pad(10)}
距右边距:
${str1?right_pad(10)}
去掉字符串首尾空格:
${str1?trim}
分词列表大小:
${str1?word_list?size}
<hr/>
<#assign str7="aaa;bbb;ccc"/>
<#list str7?split(";") as fileName>
${fileName}<br/>
</#list>
<#assign str2="200"/>
转换为数字:
${str2?number}<br/>
<hr/>
<#assign date1="2009-10-12"?date("yyyy-MM-dd")>
<#assign date2="9:28:20"?time("HH:mm:ss")>
<#assign date3="2009-10-12 9:28:20"?datetime("yyyy-MM-dd HH:mm:ss")>
转换为日期:
${date1}
转换为时间:
${date2}
转换为时间戳:
${date3}
<#assign str3 = 'The "foo" bean.'>
字符串转义:
${str3?j_string}<br/>
<#assign str4 = "Readonly 's pet name is 'Cross Bone''">
js转义:
${str4?js_string}
<#assign str5>
{"res":"0","msg":"OK","count":"3","pagenum":"1","pagesize":"1","totalpage":"1","userlist":[{"id":"1","name":"aa","sex":"男","age":"22"},{"id":"2","name":"bb","sex":"男","age":"21"},{"id":"3","name":"cc","sex":"女","age":"20"}]}
</#assign>
<#assign json=str5?eval />
json转义:
<#list json.userlist as item>
id:${item.id}, name:${item.name},sex:${item.sex}
</#list>
<br/>
<#assign str6 = "Tom&Jerry">
html转义(查看源):
${str6?html}
正则匹配
<#if "fxo"?matches("f.?o")>
Matches.
<#else>
Does not match.
</#if>
<br/>
---------------------------------------------------
Freemarker 对空值的判断
1,如果name为null,freemarker就会报错。如果需要判断对象是否为空
<#if name??>
</#if>
<#if (user.name)??>
</#if>
<#if user.name??>
</#if>
2,设置默认值来避免对象为空的错误
${name!''}
3,name为user的属性时,user,name都有可能为空
${(user.name)!''}
4,name为user的属性时,name有可能为空
${user.name!''}
${student.birthday}改为${student.birthday?string('yyyy-MM-dd HH:mm:ss')}
---------------------------------------------------
偏好设置
Window|MyEclipse|Validation
保留manual(手动)部分,build下只留"classpath dependency Validator"
手动验证: 右键文件 -> Myeclipse -> Run Validation
---------------------------------------------------
basePath
1,viewResolverFtl
<!-- 获取绝对路径basePath -->
<property name="requestContextAttribute" value="request" />
2,ftl
<#assign base=request.contextPath />
3,js
<base id="base" href="${base}">
var base = document.getElementById("base").href;
4,与后台交互
_send = function(async, url, value, success, error) {
$.ajax({
async : async,
url : base + '/' + url,
contentType : "application/x-www-form-urlencoded; charset=utf-8",
data : value,
dataType : 'json',
type : 'post',
success : function(data) {
success(data);
},
error : function(data) {
error(data);
}
});
};
---------------------------------------------------
freemark获取context方法
1,taglibs.ftl
<#macro basePath>
<#if springMacroRequestContext.getContextPath()=="/">
<#else>
${springMacroRequestContext.getContextPath()}
</#if>
</#macro>
<#global contextPath><@basePath/></#global>
2,在ftl文件中引入
<#import "/spring.ftl" as spring />
<#include "/common/taglibs.ftl" />
3,在其它文件里 ${contextPath} 就可以获取根目录了