freemaker 笔记

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 匹配请求

requestSessionApplication (和ServletContext对应) RequestParameters ,变量中获得容器中的值

RequestParameters["account"]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值