1. 配置项
Configuration cfg = new Configuration(Configuration.VERSION_2_3_26);
1.1 设置模板文件加载文件夹
// 文件目录路径
cfg.setDirectoryForTemplateLoading(new File(dir));
// class.getResource()
cfg.setClassForTemplateLoading(StuFtl.class, "/a/b");绝对路径
cfg.setClassForTemplateLoading(StuFtl.class,"");相对路径
// web 项目
cfg.setServletContextForTemplateLoading(context, "/ftl");
// 实现 templateLoader
cfg.setTemplateLoader(templateLoader);
//设置多个查找路径
FileTemplateLoader ftl2 = new FileTemplateLoader(new File("H:/pf/eclipse/workspace/xun/src/main/java/com/xun"));
ClassTemplateLoader ctl = new ClassTemplateLoader(StuFtl.class, "");
MultiTemplateLoader md=new MultiTemplateLoader(new TemplateLoader[] { ftl2, ctl });//如果在模板路径1中没有找到,就会到模板路径2查找
cfg.setTemplateLoader(md);
//模板缓存设置 getTemplate 方法调用的时候会缓存模板,默认每5秒检查有没有更新,
cfg.setTemplateUpdateDelayMilliseconds(1000*60);//设置检查更新的时间
cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));// 缓存配置 强引用 和 软引用的数量配置
1.1.共享变量设置,在多个模板中都能访问到该变量,共享变量会被root 中定义的变量覆盖
cfg.setSharedVariable("author","xm");
如在 tmp1.ftl writer by ${author}
,temp2.ftl writer by ${author}
1.1.设置字符编码
cfg.setDefaultEncoding("UTF-8");//模板文件的编码
cfg.setOutputEncoding("UTF-8");// 输出流的编码
1.1.设置日期和数字格式
// 参考 DecimalFormat df=new DecimalFormat("0.00¥"); # 不存在就省略
cfg.setNumberFormat("0.00¥");// 保留两位小数
// freemarker 不能识别 java date的数据类型,在模板中使用时需要增加 ?date
cfg.setDateFormat("yyyy 年 MM 月 dd 日");
cfg.setDateTimeFormat("yyyy-MM-dd HH:mm:ss");
cfg.setTimeFormat("HH:mm:ss");
1.1 设置模板处理报错器
TemplateExceptionHandler.DEBUG_HANDLER; //打印错误消息,抛去异常
TemplateExceptionHandler.HTML_DEBUG_HANDLER // 打印html格式的异常消息,抛出异常
TemplateExceptionHandler.IGNORE_HANDLER // 忽略异常
TemplateExceptionHandler.RETHROW_HANDLER //抛出异常
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.DEBUG_HANDLER);
cfg.setLogTemplateExceptions(false);// 不记录日志 double logging of exceptions
1.1 设置bean wrap ?
将java 对象转换为ftl的对象 BeansWrapper (不推荐),DefaultObjectWrapper
使用BeansWrapper 的条件
1.集合或者map 能够修改,
2.
cfg.setObjectWrapper(new DefaultObjectWrapper(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS));
在模板文件中使用 #setting 命令
Configurable.setSetting 查看更多设置
1.2 获得模板
Template temp = cfg.getTemplate("list.ftl");
1.3 模板数据
Map<String, Object> root = new HashMap<String, Object>();
root.put("user", "123boss<>");
1.4输出内容
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
2.数据类型
接口类 实现类 对应的java类型
TemplateNumberModel SimpleNumber number
TemplateScalarModel SimpleScalar string
TemplateDateModel SimpleDate data
TemplateHashModel SimpleHash
hash
TemplateSequenceModel SimpleSequence list
TemplateCollectionModel
SimpleCollection Iterator
扩展方法
定义MyTempMethod实现 TemplateMethodModelEx
数据中增加 root.put("myMethod", new MyTempMethod());
模板中使用${myMethod(2,3,4)}
自定义指令
实现 TemplateDirectiveModel
env env.getOut()
params :表示属性
loopVars : 表示循环变量?
body :render
execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
root.put("myDirect",new MyDirectiveModelImpl())
// 调用static 方法 ${statics["java.lang.System"].currentTimeMillis()}
${File.separator}
BeansWrapper wrapper = BeansWrapper.getDefaultInstance();
TemplateHashModel staticModels = wrapper.getStaticModels();
TemplateHashModel fileStatics =
(TemplateHashModel) staticModels.get("java.io.File");
Template temp4 = cfg.getTemplate("static.ftl");
Map<String, Object> root4 = new HashMap<String, Object>();
root4.put("statics", BeansWrapper.getDefaultInstance().getStaticModels());
root4.put("File", fileStatics);
temp4.process(root4, out);
3.常用指令
3.1字符串
contains 包含
index_of last_index_of ensure_ends_with
starts_with ends_with
left_pad right_pad trim
lower_case upper_case capitalize
html split substring
length
foo?string("yes", "no")
3.2 日期
<#assign someDate = "10/25/1995"?date("MM/dd/yyyy")>
<#assign someTime = "15:05:30"?time("HH:mm:ss")>
<#assign someDatetime = "1995-10-25 03:05 PM"?datetime("yyyy-MM-dd
?string["yyyy-MM-dd hh:mm:ss "]
3.3 数字
${234324?string["0.0#"]}
3.4 序列
<#assign colors = ["red", "green", "blue"]>
${colors?join(", ")}
${colors?last}
${colors?first}
${colors?size}
${colors?seq_contains("blue")?string("yes","no")}
${colors?seq_index_of("green")}
${colors?seq_last_index_of("blue", 1)}
hash 语法
<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>
循环变量中的函数
<#list ['a', 'b', 'c'] as x>
${x?index}
</#list>
<#list ['a', 'b', 'c'] as i>${i?has_next?c} </#list>
<#list ['a', 'b', 'c', 'd'] as i>${i?is_even_item?c} </#list>
<#list ['a', 'b', 'c'] as i>${i?is_first?c} </#list>
<#list ['a', 'b', 'c', 'd'] as i>${i?is_odd_item?c} </#list>
<#list ['r', 'w', 'x', 's'] as flag>
${flag?switch('r', 'readable', 'w' 'writable', 'x', 'executable', 'unknown flag: ' + flag)}
</#list>
3.5 判断类型
is_string
3.6 其他方法
assign 创建变量
<#globalname=value> 创建全局变量
if elseif else
import 创建一个新的命名空间,将
<#import "/libs/mylib.ftl" as my>
include 被包含的文件和包含它的模板共享变量
setting 设置模板的变量
switch case break default
4.指令扩展
5.整合到web中
5.1 整合到jsp 中
配置 servlet freemarker.ext.servlet.FreemarkerServlet 匹配请求
request
,Session
,Application
(和ServletContext
对应) RequestParameters
,变量中获得容器中的值
RequestParameters["account"]