新换了工作,与想象差距也太大了
最近沦落到做报表了,我就崩溃
看不惯别人不断的拼字符串,还写了个架子帮助拼接字符串,就用了freemaker
不废话了
1.freemarker在struts2里面的整合
<actionname="Action1" class="com.abc.Action1">
<result type="freemarker">/fm.ftl</result>
</action>
<result type="freemarker">/fm.ftl</result>
</action>
这里没有涉及到struts2的标签的使用,如果需要使用struts2的标签可能需要额外的配置,本人对使用标签持反对意见.
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
相关推荐
不错的FreeMarker教程,FreeMarker的模板文件并不比HTML页面复杂多少:文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:;格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分...
freemarker\Freemarker教程_中文版
这是一个Freemarker的中文版教程,适合想要学习Freemarker的初学者下载
freemarker操作手册-完整freemarker教程:完整的freemarker操作手册,对需要学习了解freemarker的人有一定帮助
FreeMarker教程
freemarker 教程 使用手册 Freemarker 手册 用于 2.3.16
freemarker教程
Java生成word文档Freemarker教程 详细说明文档,帮组文档
Freemarker教程 中文版 不错的选择。 大家看看把 绝对的中文
FreeMarker教程+快速入门 doc文件 学习^_^
Freemarker教程_中文版,初级入门人员必备神器!
Freemarker 教程 保证质量 框架语言,欢迎下载呀
Freemarker 教程(总结)
压缩包包含FreeMarker设计指南,Freemarker教程+中文版,参考手册等
freeMarker 教程 word版本的 很适合初学者 可以替代jsp的
FreeMarker教程中文版,不带有目录,期望看清楚后下载。
Java模板引擎Freemarker教程.docx ,收集了Java模板引擎Freemarker的一些基本用法
一篇很全面的freemarker教程reeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:...