FreeMarker是一个用Java语言编写的模板引擎。它基于模板来生成文本输出。Freemarker与web容器无关,即在web运行时,它并不知道servlet或者HTTP,它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java等。目前在企业中,主要用freemarker做静态页面或是页面展示。
其实在我的理解freemarker就是一种工具,它能把jsp页面转换成静态页面,为用户的访问节省时间,同样减少服务器的压力。
从我自己测试以及看网上大家的评论可以得出FreeMarker具备以下优点:
1、逻辑分离好,View层不出现逻辑代码,可维护性好
2、美工和技术的工作分离
3、速度快,省去了Jsp编译过程
在Maven中使用它:
<dependency>
<groupId>freemarkergroupId>
<artifactId>freemarkerartifactId>
<version>2.3.9version>
dependency>
org.springframework.web.servlet.view.freemarker.FreeMarkerView
/WEB-INF/webpage/
5
UTF-8
UTF-8
yyyy-MM-dd HH:mm:ss
HH:mm:ss
0.####
true,false
true
auto_detect
UTF-8
//index.ftl
Inserttitle here
${username}
@RequestMapping(value = "/aaa",method = RequestMethod.GET)
public String select(Model model)
{
model.addAttribute("username","Hello world");
return "index";
}
语法:
${emp.name?if_exists} // 变量存在,输出该变量,否则不输出 ${emp.name!} // 变量存在,输出该变量,否则不输出 ${emp.name?default("xxx")} // 变量不存在,取默认值xxx ${emp.name!"xxx"} // 变量不存在,取默认值xxx
常用内部函数:
${"123
456"?html} // 对字符串进行HTML编码,对html中特殊字符进行转义 ${"str"?cap_first} // 使字符串第一个字母大写 ${"Str"?lower_case} // 将字符串转换成小写 ${"Str"?upper_case} // 将字符串转换成大写 ${"str"?trim} // 去掉字符串前后的空白字符
字符串的两种拼接方式拼接:
${"hello${emp.name!}"} // 输出hello+变量名 ${"hello"+emp.name!} // 使用+号来连接,输出hello+变量名
可以通过如下语法来截取子串:
<#assign str = "abcdefghijklmn"/> // 方法1 ${str?substring(0,4)} // 输出abcd // 方法2 ${str[0]}${str[4]} // 结果是ae ${str[1..4]} // 结果是bcde // 返回指定字符的索引 ${str?index_of("n")}
${emp.date?string('yyyy-MM-dd')} //日期格式
${emp.name?string.number} // 输出20 ${emp.name?string.currency} // ¥20.00 ${emp.name?string.percent} // 20% ${1.222?int} // 将小数转为int,输出1 <#setting number_format="percent"/> // 设置数字默认输出方式('percent',百分比) <#assign answer=42/> // 声明变量 answer 42 #{answer} // 输出 4,200% ${answer?string} // 输出 4,200% ${answer?string.number} // 输出 42 ${answer?string.currency} // 输出 ¥42.00 ${answer?string.percent} // 输出 4,200% #{answer} // 输出 42
数字格式化插值可采用#{expr;format}形式来格式化数字,其中format可以是: mX:小数部分最小X位 MX:小数部分最大X位
如下面的例子: <#assign x=2.582/> <#assign y=4/> #{x; M2} // 输出2.58 #{y; M2} // 输出4 #{x; m2} // 输出2.58 #{y; m2} // 输出4.0 #{x; m1M2} // 输出2.58 #{x; m1M2} // 输出4.0
<#assign foo=false/> // 声明变量,插入布尔值进行显示,注意不要用引号 ${foo?string("yes","no")} // 当为true时输出"yes",否则输出"no"
申明变量的几种方式
<#assign name=value> <#assign name1=value1 name2=value2 ... nameN=valueN> <#assign same as above... in namespacehash> <#assign name> capture this #assign> <#assign name in namespacehash> capture this #assign>
<#if condition> ... <#elseif condition2> ... <#elseif condition3> ... <#else> ... #if>
<#switch value> <#case refValue1> .... <#break> <#case refValue2> .... <#break> <#case refValueN> .... <#break> <#default>
// 遍历集合: <#list empList! as emp> ${emp.name!} #list>
empList?size // 取集合的长度 emp_index: // int类型,当前对象的索引值 emp_has_next: // boolean类型,是否存在下一个对象
// 集合长度判断 <#if empList?size != 0>#if> // 判断=的时候,注意只要一个=符号,而不是==
// 截取子集合: empList[3..5] //返回empList集合的子集合,子集合中的元素是empList集合中的第4-6个元素
// seq_contains:判断序列中的元素是否存在 <#assign x = ["red", 16, "blue", "cyan"]> ${x?seq_contains("blue")?string("yes", "no")} // yes ${x?seq_contains("yellow")?string("yes", "no")} // no ${x?seq_contains(16)?string("yes", "no")} // yes ${x?seq_contains("16")?string("yes", "no")} // no
// sort_by:排序(升序) <#list movies?sort_by("showtime") as movie>#list> // sort_by:排序(降序) <#list movies?sort_by("showtime")?reverse as movie>#list>
freemarker常见语法大全
FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}
${book.name?if_exists } //用于判断如果存在,就输出这个值
${book.name?default(‘xxx’)}//默认值xxx
${book.name!"xxx"}//默认值xxx
${book.date?string('yyyy-MM-dd')} //日期格式
${book?string.number} 20 //三种不同的数字格式
${book?string.currency}--<#-- $20.00 -->
${book?string.percent}—<#-- 20% -->
List使用样例-List元素为User对象:
<#list userList as listUser>
List对象User Id值:${listUser.userId}
#list>
Map使用样例-Map Values元素为Scalar :
<#list scalarMap?keys as mykey>
Scalar Map key is :${mykey}
Scalar Map value is:${scalarMap[mykey]}
#list>
Map使用样例-Map Values元素为User对象:
<#list userMap?keys as key1>
<#assign mapUser="${userMap[key1]}" >
User Object is :${mapUser}
语法:http://blog.csdn.net/hafsky/article/details/5343140