测试类
/**
* HelloFreeMaker.java
* com.lin.freemaker
* zlj
* Jul 18, 2012
*
*/
package com.lin.freemaker;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.lin.bean.Student;
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* Class HelloFreeMaker
* @author zlj
* @version
* @Date Jul 18, 2012 2:12:41 PM
*/
public class HelloFreeMaker {
private Configuration cfg;
public void init() throws IOException{
cfg=new Configuration();
File file=new File("src/templates");
if(!file.exists()){
file.mkdir();
}
cfg.setDirectoryForTemplateLoading(new File("src/templates"));
}
public void process()throws Exception{
Map<String, Object> root=new HashMap<String, Object>();
List<Student> list=new ArrayList<Student>();
list.add(new Student("123","000"));
list.add(new Student("234","001"));
list.add(new Student("456","001"));
root.put("name", "zlj");
root.put("msg", "FreeMaker实例");
root.put("list", list);
Template t=cfg.getTemplate("test.ftl");
t.process(root, new OutputStreamWriter(System.out));
}
public static void main(String[] args) throws Exception {
HelloFreeMaker hf=new HelloFreeMaker();
hf.init();
hf.process();
}
}
测试文件
test.ftl
FreeMarker 基本语法测试
<#--动态赋值-->
${name}
${msg}
<#--
freenarker 标签类似html标签
开始标签:(<#directivename parameters> 结束标签:</#directivename>) -->
<#--取list类型数据-->
<#list list as student>
student.name的值为: ${student.name}
<#if student.name="123">
if语法
<#elseif student.name="234">
else if 语法
<#else>
else 语法
</#if>
</#list>
<#-- x_index 变量索引 x_has_next 是否有下一个 break 跳出循环 -->
<#list ["星期一","星期二","星期三","星期四","星期五"] as x>
${x_index +1}. ${x} <#if x_has_next>,</#if>
<#if x = "星期四">
<#break>
</#if>
</#list>
<#--宏定义 类似c语言的宏定义-->
<#macro greet person>
<font size="+2"> Hello ${person}!</font>
</#macro>
<#--在宏定义中使用循环变量,通常用来重复嵌套内容,基本用法为:作为nested指令的参数,传递循环变量的实际值,而在调用自定义指令时,在标记的参数后面指定循环变量的名字。-->
<#macro repeat count>
<#list 1..count as x>
<#nested x,x/2,x==count />
</#list>
</#macro>
<@repeat count=4;c,halfc,last>
${c}, ${halfc} ,${last?string} <#-- 必须将bool值转换成strin 才能正常输出-->
<#if last>
last!
</#if>
</@repeat>
<#--调用定义的标签 需要使用 <@ -->
<@greet person="${name}" />
<#-- <#assign price = 42 /> 定义变量
根据默认格式(#setting 指令设置)将表达式结果转换成文本输出。 -->
<#setting number_format = "currency" />
<#assign price = 42 />
${price}
${price?string}
${price?string.number}
${price?string.currency}
${price?string.percent}
<#-- 输出值为日期值:根据默认格式(由 #setting 指令设置)将表达式结果转换成文本输出,可以使用内建的字符串函数格式化单个插值,-->
<#assign lastUpdated = "2009-01-07 15:05"?datetime("yyyy-MM-dd HH:mm") />
${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")};
${lastUpdated?string("EEE,MMM d,yy")};
${lastUpdated?string("EEEE,MMMM dd,yyyy,hh:mm:ss a '('zzz')'")};
${lastUpdated?string.short};
${lastUpdated?string.long};
${lastUpdated?string.full};
<#-- 数字格式化插值可采用#{expr;format}的形式来格式化数字,其中format可以是:
mX:小数部分最小X位 四舍五入
MX:小数部分最大X位
例如: -->
<#assign x = 2.582 />
<#assign y=4 />
#{x;M2};
#{y;M2};
#{x;m1};
#{y;m1};
#{x;m1M2};
#{y;m1M2};
<#-- Map集合
Map对象使用花括号包括,Map中的key-value对之间以英文冒号(:)隔开,多组key-value对之间以英文逗号(,) 隔开 例如 -->
<#assign score = {"语文":78,"数学":83,"Java":89} />
<#list score?keys as x>
${x}--->${score[x]};
</#list>
<#--截取字符串 -->
<#assign book="疯狂Ajax讲义" />
${book[0]}
${book[4]}
${book[1..4]}
<#-- 使用内建的函数。-->
<#assign x = 5>
${(x/2)?int?string.number}
${1.1?int}
${1.999?int}
${-1.9999?int}
${-1.1?int}
<#assign test="Tom & Jerry123" />
${test?html}
${test?upper_case?html}
测试结果 控制台输出
FreeMarker 基本语法测试
zlj
FreeMaker实例
student.name的值为: 123
if语法
student.name的值为: 234
else if 语法
student.name的值为: 456
else 语法
1. 星期一 ,
2. 星期二 ,
3. 星期三 ,
4. 星期四 ,
1, 0.5 ,false
2, 1 ,false
3, 1.5 ,false
4, 2 ,true
last!
<font size="+2"> Hello zlj!</font>
¥42.00
¥42.00
42
¥42.00
4,200%
2009-01-07 15:05:00 中国标准时间;
星期三,一月 7,09;
星期三,一月 07,2009,03:05:00 下午 (CST);
09-1-7 下午3:05;
2009年1月7日 下午03时05分00秒;
2009年1月7日 星期三 下午03时05分00秒 CST;
2.58;
4;
2.6;
4.0;
2.58;
4.0;
语文--->¥78.00;
数学--->¥83.00;
Java--->¥89.00;
疯
a
狂Aja
2
¥1.00
¥1.00
-¥1.00
-¥1.00
Tom & Jerry123
TOM & JERRY123