freemarkerstrutslistborderactionstring
?
目录(?)[-]
- freemarker在struts2里面的整合
- 基本的输出
- 逻辑判断
- 循环
- 其他指令
- 宏
?
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?>
?
转自:http://www.blogjava.net/nod0620/articles/325561.html
?
黑色头发:http://heisetoufa.iteye.com