已经不知道多长时间没有碰到让我做页面的问题了, 于是乎,灾难来了,让我做运营后台的页面,想了一想还是复习复习吧,正好整理一下很久之前用过的技术。。。FreeMarker的Debug参考这里和这里
一、FreeMarker的使用
- FreeMarker中的模型:
- hash(如Map或JavaBean对象, 可用对象的
.
的形式访问);- 输出hash中的属性;
${(<property-bean>.<property-name>)!"<default-value>"}
- 前面的()中任意一级的值不存在就会显示后面的<default-value>
- 输出hash中的方法;
${<property-bean>.<method-name>()!"<default-value>"}
- 输出hash中的属性;
- sequence(数组或者列表等可遍历/迭代的对象);
- scalars(插值:存储的简单值, 整型, 字符串等),不能直接调用这些对象上的方法,但是可以使用FreeMarker内置的一些方法;
- 常用方式:
- 直接输出scalars,
${<property-name>}
,如果找不到property-name, 就会报错; - 处理不存在的scalars值:
${<property-name>!"<default-value>"}
- 直接输出scalars,
- 内建函数的使用, 在这种方式上, 虽然这个值是一个对象, 但是不应该调用这个对象的方法,只能通过FreeMarker中的内建(内置)函数来解决, 如String, Date
- 从某个字符串的指定索引num开始截取, 截取到最后:
${str?substring(<num>)}
; - 从某个字符串的指定索引num开始截取, 截取长度为length:
${str?substring(<num>, <length>)}
; - 日期的显示:
${(<date-obj>?string("<date-format>"))!"<default-value>"}
- 从某个字符串的指定索引num开始截取, 截取到最后:
- 常用方式:
- hash(如Map或JavaBean对象, 可用对象的
-
FTL指令。常见的FTL指令:
- 判断,也可以使用单等号或者双等号意义一样
<#if <condition>??> ... <#elseif> ... <#else> ... </#if> ```html
- 判断FreeMarker上下文总是否有某个变量
<#if <property-name>??> </if>
- 遍历
<#list <sequence> as <item>> ${<item>} </#list>
- 注释:
<#-- <notes-content> -->
- 导入
- <#include "<resource-path>" />
- 主要用于导入静态的公共资源;
- <#import "<resource-path>" />
- 主要用于涉及到内部函数以及变量声明导入;
- 除了FreeMarker中的模型和FTL指令,其他都是静态文本,原样输出;
- select回显, 编写JS代码:
<script type="text/javascript"> $("<select-selector> option[value=${<selected-value>}]").attr("selected" , "selected"); </script>
- <#include "<resource-path>" />
- 定义变量
- <#assign <variable-name> = "<variable-value>">
- <variable-name>:变量名
- <variable-value>:变量的值
- 获取使用${<variable-name>}
- <#assign <variable-name> = <json-string>?eval>
- 把JSON字符串转换成JSON对象
- <#assign <variable-name> = "<variable-value>">
- 判断,也可以使用单等号或者双等号意义一样
- FreeMarker常用的内置函数
- Sequence的内置函数
- sequence?first :返回sequence的第一个值。
- sequence?last:返回sequence的最后一个值。
- sequence?reverse:将sequence的现有顺序反转,即倒序排序
- sequence?size:返回sequence的大小
- sequence?sort :将sequence中的对象转化为字符串后顺序排序
- sequence?sort_by(value):按sequence中对象的属性value进行排序
- 注意:sequence不能为null
- Hash的内置函数
- hash?keys
- 返回hash里的所有key,返回结果为sequence
- hash?values
- 返回hash里的所有value,返回结果为sequence
- hash?keys
- string内置函数
- substring(start,length)从一个字符串中截取子串
- start:截取子串开始的索引,start必须大于等于0,小于等于end
- length: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。
- cap_first 将字符串中的第一个单词的首字母变为大写。
- uncap_first将字符串中的第一个单词的首字母变为小写。
- capitalize将字符串中的所有单词的首字母变为大写
- date,time,datetime将字符串转换为日期
- 注意:如果指定的字符串格式不正确将引发错误
- ends_with 判断某个字符串是否由某个子串结尾,返回布尔值 注意:布尔值必须转换为字符串才能输出
- html 用于将字符串中的<、>、&和"替换为对应得<>":&
- index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。
- start参数用于指定从字符串的那个索引处开始搜索,start为数字值。
- 如果start大于字符串长度,则start取值等于字符串长度,如果start小于0,则start取值为0。
- length返回字符串的长度
- lower_case将字符串转为小写
- upper_case将字符串转为大写
- contains 判断字符中是否包含某个子串。返回布尔值 注意:布尔值必须转换为字符串才能输出 13.number将字符串转换为数字
- replace用于将字符串中的一部分从左到右替换为另外的字符串。
- split使用指定的分隔符将一个字符串拆分为一组字符串
- trim 删除字符串首尾空格
- substring(start,length)从一个字符串中截取子串
- 数字内置函数
- Freemarker中预订义了三种数字格式:number,currency(货币)和percent(百分比)其中number为默认的数字格式转换
- c:用于将数字转换为字符串
- string:用于将数字转换为字符串
- Freemarker中预订义了三种数字格式:number,currency(货币)和percent(百分比)其中number为默认的数字格式转换
- 布尔值内置函数
- string 用于将布尔值转换为字符串输出 true转为"true",false转换为"false"
- foo?string("yes","no")如果布尔值是true,那么返回"yes",否则返回no
- Sequence的内置函数
- 常见用法
- 判断是否为空:
- <#if xx?exists>
- <#if xx??>
- <#if xx?default('xxx')> :不然当xxList没有数据的时候 ,很大很大一个黄页就等着你了
- 数据类型转换:
- ${xx?string} //字符串
- ${xx?number}//整数
- ${xx?currency}//小数
- ${xx?percent} //百分比
- 截取字符串长度:有的时候我们在页面中不需要显示那么长的字符串,比如新闻标题,这样用下面的列子就可以自定义显示的长度
<#if news.title?length lt 13 > ${news.title} <#else> ${news.title[0..12]} </#if>
- list操作: 拼接成字符串
<#list seq as x> ${x_index + 1}. ${x} <#if x_has_next>,</#if> </#list>
- 在每个对象的后面添加_index,那么就代表当前的索引值;
- 判断是否为空:
二、Freemarker中相对比较全的配置
<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="false" />
<property name="prefix" value="" />
<property name="suffix" value=".html" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="exposeRequestAttributes" value="false" />
<property name="exposeSessionAttributes" value="false" />
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="requestContextAttribute" value="rc"></property>
</bean>
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="" />
<property name="freemarkerVariables">
<map>
<entry key="myfreemarker" value-ref="myfreemarker" />
<entry key="my_freemarker_" value-ref="my_freemarker" />
<entry key="aa" value-ref="test2" />
</map>
</property>
<property name="freemarkerSettings">
<props>
<prop key="tag_syntax">auto_detect</prop>
<prop key="template_update_delay">5</prop>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">#</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="auto_import">/WEB-INF/ftl/in.ftl as s</prop>
<prop key="classic_compatible">true</prop>
</props>
</property>
</bean>
三、编码示例
Configuration configure = new Configuration(Configuration.getVersion());
configure.setDirectoryForTemplateLoading(new File("templates"));
configure.setDefaultEncoding("UTF-8");
Template template = configure.getTemplate("test.ftl");
Writer writer = new FileWriter("<file-name>");
Dog dog = new Dog();
template.process(dog, writer);
writer.close();