这样会遇到一个问题,当数据超过3位的时候,freemarker会自动用逗号截取 格式如:2,008
如何解决呢?
1> 加.toString(),如:${(userId).toString()}
2> 加?c,如:${(userId)?c}
3> freemarker配置文件freemarker.properties加上number_format=#
判断是否为空:
1.<#if xx[0]?exists>
2.<#if xx??>
3.<#if xx?default("xxx")>
不然当没有数据的时候 ,很大很大一个黄页就等着你了
序列号:
有时候页面的table需要在第一列显示序号 只需要使用 _index 即可 不过是从0开始的 你可以+1 比如:
<#list list as a>
${a_index+1}
</#list>
数据类型转换:
${xx?string} //字符串
${xx?number}//整数
${xx?currency}//小数
${xx?percent}//百分比
截取字符串长度:
有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度
< lt. <= lte. > gt. >= gte
<#if jstbqkVO.gzdd?length lt 8>
<a href>${jstbqkVO.gzdd?default("")}</a>
<#else>
<a href title="${jstbqkVO.gzdd}">${jstbqkVO.gzdd[0..3]?default("")}...</a>
</#if>
意思就是如果这个字符串的长度小于8,那么就正常显示,反之则取4位
嵌套list:
很多时候,数据库里存储的都是编号,而页面上需要显示的汉字,而且不在一张表里,看列子
<#list jsskList as jsskVO>
<#list kcList as kcVO>
<#if kcVO.kch=jsskVO.kch> (kcVO里有编号和名称,而jsskVO里只有编号)
${kcVO.kcm}
</#if>
</#list>
</#list>
排序:
1.升序.sort_by()
<#list list?sort_by("字段") as x>
</#list>
2.降序.sort_by()?reverse
<#list list?sort_by("字段")?reverse as x>
</#list>
去空格:
${xx?trim}
格式化日期:
${date?string("yyyy-MM-dd HH:mm:ss ")}
${date?string("yyyyMMdd ")}
-------------------------------------------------------------------------------------------------------------------
- 一、常用语法
- EG.一个对象BOOK
- 1、输出$...{book.name}
- 2、空值判断:$...{book.name?if_exists},
- $...{book.name?default(‘xxx’)}//默认值xxx
- $...{book.name!"xxx"}//默认值xxx
- 3、日期格式:$...{book.date?string('yyyy-MM-dd')}
- 4、数字格式:$...{book?string.number}--20
- $...{book?string.currency}--<#--$20.00-->
- $...{book?string.percent}—<#--20%-->
- 5、插入布尔值:
-
<#assignfoo=true/>
- $...{foo?string("yes","no")}<#--yes-->
-
- 二、内置方法
- 1、数字型
-
<#assignanswer=42/>
- $...{answer}
- $...{answer?string}<#--thesameas$...{answer}-->
- $...{answer?string.number}
- $...{answer?string.currency}
- $...{answer?string.percent}
-
-
<#settingnumber_format="0.###E0"/>
-
- $...{12345?string("0.####E0")}
-
-
- $...{answer?string("number")}等同于:$...{answer?string.number}.
-
- 2、日期型:
- 预定义格式包括:short,middle和long。
- $...{openingTime?string.short}
- $...{openingTime?string.medium}
- $...{openingTime?string.long}
- 组合使用:$...{lastUpdated?string.short_long}
- $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}
-
- 3、逻辑型
- foo?string
- foo?string("yes","no")
- 4、序列的内置方法:
- first
- last
- seq_contains
- $...{x?seq_contains("blue")?string("yes","no")}
- seq_index_of
- seq_last_index_of
- reverse
- size
- sort
- sort_by
- 多层次的hash排序
-
<#assignmembers=[
- ...{"name":...{"first":"Joe","last":"Smith"},"age":40},
- ...{"name":...{"first":"Fred","last":"Crooger"},"age":35},
- ...{"name":...{"first":"Amanda","last":"Fox"},"age":25}]>
- Sortedbyname.last:
-
<#listmembers?sort_by(['name','last'])asm>
- -$...{m.name.last},$...{m.name.first}:$...{m.age}yearsold
-
</#list>
-
- chunk:将一个序列分解成几个序列。
-
<#assignseq=['a','b','c','d','e','f','g','h','i','j']>
-
<#listseq?chunk(4)asrow>
-
<#listrowascell>$...{cell}</#list>
-
</#list>
-
<#listseq?chunk(4,'-')asrow>
-
<#listrowascell>$...{cell}</#list>
-
</#list>
- chunk经常用于分栏或者表格输出的格式。
- 5、hash内置方法:
- keys:
- values:
- 三、序列
- 由逗号分隔的变量列表,由方括号限定,类似java中的一维数组
-
-
<#assignseq=["winter","spring","summer","autumn"]>
-
<#listseqasx>
- ${x_index+1}.${x}
-
-
<#ifx_has_next>,
-
-
</#list>
-
- 输出
- 1.winter,
- 2.spring,
- 3.summer,
- 4.autumn
-
- 四、Hashes(散列)
-
- 由逗号分隔的键-值列表,由大括号限定,键和值之间用冒号分隔:{"name":"greenmouse","price":150},键和值都是表达式,但是键必须是字符串。
-
<#assignages=...{"Joe":23,"Fred":25}+...{"Joe":30,"Julia":18}>
- Joeis$...{ages.Joe}
- Fredis$...{ages.Fred}
- Juliais$...{ages.Julia}
- 结果:
- -Joeis30
- -Fredis25
- -Juliais18
- 五、freemarker的空值和默认值
-
- ${user?if_exists}
-
- ${user?default('yourname')}
-
- 判断对象是不是null
-
<#ifmouse?exists>
- Mousefound
-
<#else>
-
- 或<#ifbook.name??>
-
- Mousefound
-
</#if>
- list空值判断<#ifbookList?size=0>
-
- 六、算术运算
- 比较操作符-<#ifexpression>...</#if>
- 1.)使用=(或==,完全相等)测试两个值是否相等,使用!=测试两个值是否不相等
- 2.)=和!=两边必须是相同类型的值,否则会产生错误,例如<#if1="1">会引起错误
- 3.)Freemarker是精确比较,所以"x"、"x"和"X"是不相等的
- 4.)对数字和日期可以使用<、<=、>和>=,但不能用于字符串
- 5.)由于Freemarker会将>解释成FTL标记的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if(x>y)>,另一种替代的方法是,使用lt、lte、gt和gte来替代<、<=、>和>=
-
- 逻辑操作符-&&(and)、||(or)、!(not),只能用于布尔值,否则会产生错误
-
<#ifx<12&&color="green">
- Wehavelessthan12things,andtheyaregreen.
-
</#if>
-
<#if!hot><#--herehotmustbeaboolean-->
- It'snothot.
-
</#if>
-
- 内置函数-用法类似访问hash(散列)的子变量,只是使用"?"替代".",例如:user?upper_case
- 下面列出常用的一些函数:
- 对于字符串
- html-对字符串进行HTML编码
- cap_first-使字符串第一个字母大写
- lower_case-将字符串转换成小写
- trim-去掉字符串前后的空白字符
- 对于Sequences(序列)
- size-获得序列中元素的数目
- 对于数字
- int-取得数字的整数部分(如-1.9?int的结果是-1)
-
- 例一:
-
-
<#--test的值为Tom&Jerry-->
- $...{test?html}
- $...{test?upper_case?html}
- 结果:
- Tom&Jerry
- TOM&JERRY
-
- 例二:
-
-
<#--seasons的值为"winter","spring","summer","autumn"-->
- $...{seasons?size}
- $...{seasons[1]?cap_first}<#--leftsidecanbyanyexpression-->
- $...{"horse"?cap_first}
- 结果:
- 4
- Spring
- Horse
-
- 方法的调用
- $...{repeat("What",3)}
- $...{repeat(repeat("x",2),3)+repeat("What",4)?upper_case}
- 结果:
- WhatWhatWhat
- xxxxxxWHATWHATWHATWHAT
-
- 操作符优先顺序
- 后缀[subvarName][subStringRange].(methodParams)
- 一元+expr、-expr、!
- 内建?
- 乘法*、/、%
- 加法+、-
- 关系<、>、<=、>=(lt、lte、gt、gte)
- 相等=、!=
- 逻辑&&
- 逻辑||
- 数字范围..
-
- 三.)Interpolation:由$...{...}或#...{...}两种类型,输出计算值,可以定义输出的格式
- 例一:
-
-
<#settingnumber_format="currency"/>
-
<#assignanswer=42/>
- $...{answer}
- $...{answer?string}<#--thesameas$...{answer}-->
- $...{answer?string.number}
- $...{answer?string.currency}
- $...{answer?string.percent}
- 结果:
- $42.00
- $42.00
- 42
- $42.00
- 4,200%
-
- 例二:
-
- $...{lastUpdated?string("yyyy-MM-ddHH:mm:sszzzz")}
- $...{lastUpdated?string("EEE,MMMd,''yy")}
- $...{lastUpdated?string("EEEE,MMMMdd,yyyy,hh:mm:ssa'('zzz')'")}
- 结果:
- 2003-04-0821:24:44PacificDaylightTime
- Tue,Apr8,'03
- Tuesday,April08,2003,09:24:44PM(PDT)
-
- 例三:
-
-
<#assignfoo=true/>
- $...{foo?string("yes","no")}
- 结果:
- yes
-
- 例四:
-
-
<#--xis2.582andyis4-->
- #...{x;M2}<#--2.58-->
- #...{y;M2}<#--4-->
- #...{x;m1}<#--2.6-->
- #...{y;m1}<#--4.0-->
- #...{x;m1M2}<#--2.58-->
- #...{y;m1M2}<#--4.0-->
- 说明:mX-小数部分最小X位;MX-小数部分最大X位。
-
- 四.)注释:<#--和-->
-
- 下面是一个常用的模板例子:
-
-
<p>Wehavetheseanimals:
-
<tableborder=1>
-
<tr><th>Name<th>Price
-
<#listanimalsasbeing>
- <tr>
- <td>
-
<#ifbeing.size="large"><b></#if>
- $...{being.name}
-
<#ifbeing.size="large"></b></#if>
-
<td>$...{being.price}Euros
-
</#list>
-
</table>
-
<#include"/copyright_footer.html">
- 注意点:
- 1.)FreeMarker是区分大小写的;
- 2.)FTL标记不能位于另一个FTL标记内部,例如:<#if<#include'foo'>='bar'>...</if>;
- 3.)$...{…}只能在文本中使用;
- 4.)多余的空白字符会在模板输出时去除;
- 5.)如果使用的指令不存在,会产生一个错误消息。
-
<#--x的值设定为5-->
- $...{x*x-100}
- $...{x/2}
- $...{12%10}
- 结果:
- -75
- 2.5
- 2
-
- 注意:操作符两边必须是数字;使用"+"时,如果一边是数字,一边是字符串,就会自动将数字转换为字符串。
- 使用内建的指令int获得整数部分:
- $...{(x/2)?int}
- $...{1.1?int}
- $...{1.999?int}
- $...{-1.1?int}
- $...{-1.999?int}
- 结果:
- 2
- 1
- 1
- -1
- -1
分享到:
相关推荐
模板定义则是在`.ftl`文件中使用`<#assign...>`创建一个变量,然后将其关联到Java类实例。 3. **使用自定义标签** 在`.ftl`文件中,可以通过`<@myTag...>`调用自定义标签,其中`myTag`是Java类的别名。标签的参数...
### Freemark标签运用知识点 #### 一、Freemarker简介 Freemarker 是一款功能强大的模板引擎,由 Apache 软件基金会所维护的一个开放源码项目。它主要用于生成动态 HTML 页面,但也支持生成 XML、Java 源代码等...
在模板实例中,`<#list>`指令用于迭代列表,如遍历`animals`并打印每个动物的名称和价格。`<#assign>`用于分配变量,如`<#assign user = "John">`。`<#if>`和`<#else>`则用于条件判断。 FreeMarker的灵活性和简洁性...
这通常是通过`Configuration`对象的`setSharedVariable`方法完成的,将你的自定义指令类实例绑定到一个特定的名字,这个名字就是你在模板中使用的标签名。 3. 使用自定义标签:在模板文件中,你可以像使用内置标签...
- **实例解析**:通过实际的代码片段,演示如何使用FreeMarker模板语言解决常见问题。 - **最佳实践**:提供模板设计的最佳实践,帮助避免常见的陷阱和提高模板的可读性。 这个中文教程资料合集是学习和提升...
在FreeMarker实例中,我们可以看到如何使用其基本语法和功能来生成静态页面或者动态内容。尽管这个实例可能不包含自动生成模板代码这样的高级功能,但它会涵盖一些基础和核心的概念: 1. **模板语言**:FreeMarker...
这个“FreeMarker 2.3.19 中文教程”会涵盖这些主题,并深入讲解每个概念的使用方法和实例,帮助开发者更好地理解和运用FreeMarker,提升Web开发效率。通过学习,你可以熟练掌握如何创建模板、处理数据模型、配置...
在代码中,使用FreeMarker API加载模板文件,创建`Template`对象,然后用数据模型实例化`Map`对象。通过`Configuration`对象的`process`方法,将模板与数据模型合并,生成Word文档的字节流。最后,你可以选择将这个...
这个压缩包包含的资源全面地涵盖了FreeMark的相关知识,包括文档、实例和JAR包,下面我们将详细探讨这些知识点。 1. **FreeMarker基本概念** FreeMarker是一个基于模板的语言,它允许开发者编写模板,模板中包含了...
FreeMarker模板中主要包含静态数据和FTL标签(FreeMarker Template Language,FreeMarker模板语言),在处理模板时,静态数据原封不动地输出,而FTL标签则根据数据模型中的数据动态生成相应的输出。数据模型是一个...
Servlet与FreeMarker是Java Web开发中的两个重要技术,它们经常被组合使用来构建动态网站。...同时,标签中的“源码”和“工具”提示,意味着要关注底层实现和工具的使用,这对于提升开发技能非常有帮助。
5. **生成文档**:使用配置好的FreeMarker实例和数据模型来解析模板,然后将结果写入到Word文档。 ```java Template template = cfg.getTemplate("user_template.ftl"); User user = new User(); user.setName...
使用FTL标签时, 应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样.如果全用不存在的指令,FreeMarker不会使用模板输出,而是产生一个错误消息.FreeMarker会忽略FTL标签中的空白字符.值得注意的是, /> 和...
3. **初始化ECharts实例**:在JavaScript中,使用`echarts.init`方法初始化ECharts实例,指定图表容器的ID。 4. **定义图表配置**:创建一个配置对象,设置图表的类型、数据、样式、交互等选项。 5. **加载图表**...
1. **扩展Struts2模板**:默认情况下,`<s:textfield>`生成的是XHTML格式的`<input>`标签。若需要生成带`<label>`的完整输入框,可以通过自定义Struts2的主题实现,创建自己的模板目录,修改`theme.properties`,并...
4.4 输出处理:`<@>`和`<#>`标签用于输出处理,例如`<@include file="header.ftl">`可以包含其他模板。 4.5 自定义函数:通过`freemarker.template.utility`包中的工具类或者自定义`DirectiveModel`,可以实现模板...
在实例应用方面,文档会进一步讲解如何应用FreeMarker,例如如何创建模板、如何在模板中使用变量和标签、如何利用宏和函数等高级特性。这些实例将帮助开发者掌握FreeMarker的常用语法和高级特性,进而在实际的项目中...
创建 FreeMarker 配置实例是使用 FreeMarker 的第一步。这通常涉及指定模板文件的加载路径: ```java Configuration cfg = new Configuration(Configuration.VERSION_2_3_28); cfg.setDirectoryForTemplateLoading...
例如,如果你希望在一个表格中填充多行数据,你可能需要在XML模板的`<w:tbl>`节点内设置循环结构,使用FreeMarker的`<#list>`标签,以遍历数据列表并逐行输出。\n\n**二、FreeMarker配置与使用**\n\n在Java代码中,...
根据提供的信息,我们可以总结出关于`freeMarket`模板引擎的一些关键知识点和实例应用: ### 1. 变量表达式 (${...}) 在`freeMarket`中,使用`${...}`来引用变量或者执行简单的表达式。 - **示例**: `${user},...