freemarker比jsp更加面向程序化结构,更容易受后端开发的青睐。freemarker支持比jsp更多的功能,还有程序化的function,变量化的macro。freemarker的是:模板+数据模型=输出。freemarker的ftl称为模板。数据模型是在controller中组织的。
和jstl一样,在ftl中可以使用很多标签,ftl中的标签不需要依附于javax.servlet. 标签以#,@作为开始(@为自定义标签使用),常见的标签有:
(1)assign
在模板中定义一个变量,这个变量可以是自定义的,或者是来自别的变量。当来自于别的变量时,属于值拷贝,原始变量的改变并不影响新变量额值。在assign定义时,有两种方式:
A:<#assign variable=variableB>
B:<#assign variable>capture this body</#assign>
在B方案中,可以嵌套使用别的其他标签。
(2)list,break
list用于循环迭代出序列的值,如下使用方式:
<#assign hexiong=["hexiong1","hexiong2","hexiong3"]>
<#list hexiong as x>
${x}
<#if x=="hexiong2"><#break></#if>
</#list>
list循环迭代出序列hexiong里的值,并当循环到hexiong2时,跳出循环。break标签还用于swtich标签中,用于跳出switch。
(3)switch,case,break,default;
分支选择,选择的对象支持字符串和数字。比jstl中的choose霸气多了。
<#assign hexiongvalue="java">
<#switch hexiongvalue>
<#case "c++">
hello c++;
<#break>
<#case "java">
hello java;
<#break>
<#case "javascript">
hello javascript;
<#break>
<#default>
nothing;
</#switch>
(4)if, elseif, else
条件判断,比jstl中的if高大上了很多,支持了elseif和else,终于不用像jstl那样,if就像联排别墅一样。
<#assign hexiongvalue="hello">
<#if hexiongvalue="hexiong">
hexiong
<#elseif hexiongvalue="hello">
hello
<#elseif hexiongvalue="x">
x
<#else>
else
</#if>
freemarker的标签稍微有点bt,特别是体现在对空变量的处理上,如果使用了未处理的空变量,就会出现错误。
在编写模板时,一般需要对空变量进行处理。
1. ${ddd?if_exists} 如果ddd不存在,就会被当成空字符串处理。最后被转义成ddd!
2. <#if ddd??>doSomething</#if>和<#if ddd?exists>doSomething</#if>,判断变量是否存在,如果存在返回true,不存在返回false,?exists会被转义成??
3. ${ddd?default(“hello")}如果变量ddd不存在,则会返回hello。?default(“hello”),会被转化成ddd!”hello”;
4. ${ddd!”hello”},同3一样,如果ddd不存在则返回hello;