1.freemarker在struts2里面的整合
<actionname="Action1"
class="com.abc.Action1">
<result type="freemarker">/fm.ftl</result>
</action>
这里没有涉及到struts2的标签的使用,如果需要使用struts2的标签可能需要额外的配置,本人对使用标签持反对意见.
<result type="freemarker">/fm.ftl</result>
</action>
2.基本的输出
基本输出: ${student.name} (student的定义在本文末尾)
空值判断:${student.name?if_exists}
默认值: ${student.name?default(‘xxx’)}或者${ book.name!"xxx"}
日期格式:${student.birthday?string('yyyy-MM-dd')}
数字格式:${student.age?string.number}--->20
${student.age?string.currency}---> < #-- $20.00 -- >
${student.age?string.percent}—--> < #-- 20% -- >
传递url的参数: < a href ='search.htm?name=${student.name?url}' >查询 </ a > 对于中文参数,freemarker会自动给我们编码
boolean值: < #assign flag =ture />
${flag?string("yes","no")} < #-- yes -- >
每次输出的时候最好是带个默认值,否则没有被赋值的变量就会抛出异常,那个黄黄的freemarker出错页面,真是让人看了太难过了
空值判断:${student.name?if_exists}
默认值: ${student.name?default(‘xxx’)}或者${ book.name!"xxx"}
日期格式:${student.birthday?string('yyyy-MM-dd')}
数字格式:${student.age?string.number}--->20
${student.age?string.currency}---> < #-- $20.00 -- >
${student.age?string.percent}—--> < #-- 20% -- >
传递url的参数: < a href ='search.htm?name=${student.name?url}' >查询 </ a > 对于中文参数,freemarker会自动给我们编码
boolean值: < #assign flag =ture />
${flag?string("yes","no")} < #-- yes -- >
每次输出的时候最好是带个默认值,否则没有被赋值的变量就会抛出异常,那个黄黄的freemarker出错页面,真是让人看了太难过了
3 逻辑判断
a:if else 形式
<
#if
condition
>
.
< #elseif condition2 >
< #elseif condition3 >
.
< #else >
< #if
.
< #elseif condition2 >
< #elseif condition3 >
.
< #else >
< #if
b:switch 形式
<
#switch
value
>
< #case refValue1 >
< #break >
< #case refValue2 >
< #break >
< #case refValueN >
< #break >
< #default >
</ #switch >
< #case refValue1 >
< #break >
< #case refValue2 >
< #break >
< #case refValueN >
< #break >
< #default >
</ #switch >
4 循环
遍历普通list:
< #list someList as item >
</ #list >
遍历list的前面几项:
< #assign x =3 >
< #list 1..x as i >
${i}
</ #list >
遍历map:
< #list nameMap.keySet() as name >
${nameMap.get(name)}
</ #list >
或者
< #list nameMap?keys as name >
${nameMap.get(name)}
</ #list >
list排序输出:
< #list someList?sort_by(["name"]) as item >
${item.name}
</ #list >
按照属性name进行排序(默认升序)
< #list somelist?sort_by(["name"])?reverse as item >
${item.name}
</ #list >
按照属性name进行降序排序
list指令还隐含了两个循环变量:item_index:当前迭代项在所有迭代项中的位置,是数字值。
item_has_next:用于判断当前迭代项是否是所有迭代项中的最后一项。
map 关于map的key,它必须是String,这个在一定程度上限制了后台程序对于map的表达。
< #list someList as item >
</ #list >
遍历list的前面几项:
< #assign x =3 >
< #list 1..x as i >
${i}
</ #list >
遍历map:
< #list nameMap.keySet() as name >
${nameMap.get(name)}
</ #list >
或者
< #list nameMap?keys as name >
${nameMap.get(name)}
</ #list >
list排序输出:
< #list someList?sort_by(["name"]) as item >
${item.name}
</ #list >
按照属性name进行排序(默认升序)
< #list somelist?sort_by(["name"])?reverse as item >
${item.name}
</ #list >
按照属性name进行降序排序
list指令还隐含了两个循环变量:item_index:当前迭代项在所有迭代项中的位置,是数字值。
item_has_next:用于判断当前迭代项是否是所有迭代项中的最后一项。
map 关于map的key,它必须是String,这个在一定程度上限制了后台程序对于map的表达。
5 其他指令
freemarker 大于 小于 大于等于 小于等于比较符
大于 gt
小于 lt
大于等于 gte
小于等于 lte
使用方法很简单
< #if x gt 1 >
..
</ #if >
struts2环境中freemarker读取后台程序的静态变量和静态方法
${stack.findValue("@package.ClassName@method")}
${stack.findValue("@package.ClassName@property")}
大于 gt
小于 lt
大于等于 gte
小于等于 lte
使用方法很简单
< #if x gt 1 >
..
</ #if >
struts2环境中freemarker读取后台程序的静态变量和静态方法
${stack.findValue("@package.ClassName@method")}
${stack.findValue("@package.ClassName@property")}
6 宏
1 基本用法
宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:
< #macro greet >
< font size ="+2" >Hello Joe! </ font >
</ #macro >
调用宏时,与使用freemarker的其他指令类似,只是使用@替代FTL标记中的#:
< @greet />
2 在macro指令中可以在宏变量之后定义参数,如:
< #macro greet person >
< font size ="+2" >Hello ${person}! </ font >
</ #macro >
可以这样使用这个宏变量: < @greet person ="Fred" />
但是下面的代码具有不同的意思: < @greet person =Fred />
这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式。
宏可以有多参数,下面是一个例子:
< #macro greet person color >
< font size ="+2" color ="${color}" >Hello ${person}! </ font >
</ #macro >
可以这样使用该宏变量,其中参数的次序是无关的: < @greet person ="Fred" color ="black" />
可以在定义参数时指定缺省值,否则,在调用宏的时候,必须对所有参数赋值:
< #macro greet person color ="black" >
< font size ="+2" color ="${color}" >Hello ${person}! </ font >
</ #macro >
注意:宏的参数是局部变量,只能在宏定义中有效。
3 在宏里嵌套内容
< #nested >指令会执行宏调用指令开始和结束标记之间的模板片断,举一个简单的例子:
< #macro border >
< table >
< tr >< td >
< #nested >
</ tr ></ td >
</ table >
</ #macro >
执行宏调用: < @border >The bordered text </ @border >
宏是和某个变量关联的模板片断,以便在模板中通过用户定义指令使用该变量,下面是一个例子:
< #macro greet >
< font size ="+2" >Hello Joe! </ font >
</ #macro >
调用宏时,与使用freemarker的其他指令类似,只是使用@替代FTL标记中的#:
< @greet />
2 在macro指令中可以在宏变量之后定义参数,如:
< #macro greet person >
< font size ="+2" >Hello ${person}! </ font >
</ #macro >
可以这样使用这个宏变量: < @greet person ="Fred" />
但是下面的代码具有不同的意思: < @greet person =Fred />
这意味着将Fred变量的值传给person参数,该值不仅是字符串,还可以是其它类型,甚至是复杂的表达式。
宏可以有多参数,下面是一个例子:
< #macro greet person color >
< font size ="+2" color ="${color}" >Hello ${person}! </ font >
</ #macro >
可以这样使用该宏变量,其中参数的次序是无关的: < @greet person ="Fred" color ="black" />
可以在定义参数时指定缺省值,否则,在调用宏的时候,必须对所有参数赋值:
< #macro greet person color ="black" >
< font size ="+2" color ="${color}" >Hello ${person}! </ font >
</ #macro >
注意:宏的参数是局部变量,只能在宏定义中有效。
3 在宏里嵌套内容
< #nested >指令会执行宏调用指令开始和结束标记之间的模板片断,举一个简单的例子:
< #macro border >
< table >
< tr >< td >
< #nested >
</ tr ></ td >
</ table >
</ #macro >
执行宏调用: < @border >The bordered text </ @border >