FreeMarker使用小结

1. FreeMarker模板引擎的使用: 模板 + 数据模型 = 输出
  1) FreeMarker模板:一个普通文本文件,其中使用了一些FreeMarker的特别标记。
  2) 数据模型:存放了数据的数据结构,通常是一个Hash存储结构(如:HashMap)
  3) FreeMarker框架负责将一个数据模型中的数据合并到模板中,从而生成输出。
 
2. 配置使用环境: 下载(http://www.freemarker.org/)并把freemarker-2.x.x.jar添加到应用程序的classpath下。

 

3. Java应用:
   1) 创建数据模型: Map<String, Object> root = new HashMap<String,Object>();
   2) 创建模板文件: templates/first.ftl
   3) 合并:
//创建一个Configuration实例来初始freeMarker的配置 //在classpath下添加一个名为freemarker.properties
Configuration cfg = new Configuration();
//设置模板文件的存放目录
cfg.setDirectoryForTemplateLoading(new File("templates"));
//加载指定的模板
Template t = cfg.getTemplate("first.ftl");
//处理合并
t.process(root, new OutputStreamWriter(System.out));

 

4. web应用中直接使用FreeMarker: 在Servlet的请求处理方法中:
//创建一个Configuration实例来初始freeMarker的配置
Configuration cfg = new Configuration();
//设置模板文件的存放目录
cfg.setServletContextForTemplateLoading(getServletContext(),"/templates");
//加载指定的模板
Template t = cfg.getTemplate("first.ftl", "UTF-8");
//处理合并
t.process(root, response.getWriter());

 

★5. FTL(FreeMarker模板语言)语法:

1) 模板文件由4部分组成:
   a) 文本:直接输出的部分
   b) 注释:<#--  注释内容 -->  不会输出
   c) 插值(interpolation):${表达式} 或 #{表达式} ,将使用数据模型中的数据替换后再输出
   d) FTL指令:
       内置(预定义)指令:<#指令名 属性名="值">主体</#指令名>  如:<#if user??>${user.loginname}</#if>
       自定义指令: <@指令名 属性名="值">主体</@指令名>

 

2) 插值规则
 a) 表达式放置在插值语法${}之中,用于输出表达式的值。
 b) 表达式的值的类型可以是:字符串、 数字、布尔、日期时间、序列、Hash结构
 c) 表达式支持Java中的所有运算符:
     算术运算符:+、-、*、/、%
     比较运算符:==(eq)、!=(ne)、>(gt)、>=(gte)、<(lt)、<=(lte)
     逻辑运算符:&&(and)、||(or)、!(not)
     三目运算符:? :

 d) 内置函数:
    Ⅰ) 使用方式:表达式?函数名[(实参)]
    Ⅱ) 字符串的常用内置函数: substring(from[, to])、html、length、trim、url
            示例:<#setting url_escaping_charset="UTF-8"> 、exp?url[("UTF-8")]
    Ⅲ) 数字的常用内置函数:c、string[(数字模式串)]、
    Ⅳ) 布尔的内置函数:string[("男", "女")]
    Ⅴ) 内置的常用日期时间函数:string[("格式模式串")]、datetime、date、time
 e) 序列:
         在FTL中定义的序列:由方括号包括,各元素用英文逗号分隔如:<#assign seq=["winter", "spring", "summer",  "autumn"]>
         也可以用数字范围(递增、反递增)定义数字序列: <#assign nums=101..105>  或 <#assign nums=105..101>
         在数据模型中:可以是List对象、Set对象
         序列的常用内置函数:size、sort[("指定字段作排序依据")]
 f) Hash结构:
         在FTL文件中直接定义时:由大括号包括,由逗号分隔键/值列表,键和值之间用冒号分隔。键必须是字符串。

           如: <#assign scores={"语文":78, "数学":89, "英语":87}> ${scores.语文}
         在数据模型中:可以是Map对象
         Hash结构的内置函数:size、keys、values

 

3) FreeMarker中的空值判断
  a) 判断是否为空值:用??(?if_exists,?exists) 如果不为空返回true,否则返回false。
  b) 通过Configuration设置:Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);
  c) 属性配置方式:在freemarker.properties文件中classic_compatible=true
  d) 通过ftl设置:在ftl文件头前加入<#setting classic_compatible=true>
  e) 在FTL中遍历序列、Hash结构时:<#if userList??><#list userList as user>....</#list></#if>
 
4) 常用内置指令:
  a) if/else
<#if condition>
  ...
<#elseif condition2>
  ...
<#elseif condition3>
  ...
...
<#else>
  ...
</#if>

  b) switch/case
<#switch value>
  <#case refValue1>
    ...
    <#break>
  <#case refValue2>
    ...
    <#break>
  ...
  <#case refValueN>
    ...
    <#break>
  <#default>
    ...
</#switch>

  c) list
<#list sequence as item>  <#-- item_index 当前迭代项的索引 -->
    ...
</#list>

  d) include 包含指定文件。类似于JSP中的include标准动作
<#include "文件路径" [encoding="charset"] [parse=true|false]>

  e) import 导入指定模板中的所有变量。
<#import "文件路径"  as hash>
 
  f) noparse 不处理该指令中包含的内容
<#noparse>
  …
</#noparse>

  g) assign: 为当前模板页面创建或替换一个顶层变量
<#assign name=value>
<#assign name1=value1 name2=value2 ... nameN=valueN>

  h) global:创建或替换一个命名空间全局范围作用域的顶层变量
  i) local:创建或替换一个局部作用域的顶层变量
  j)setting 设置FreeMarker运行时的属性.语法:<#setting name=value> 
    name常用的有:
       locale:该模板所使用的语言环境选项。en,zh,zh_CN,zh_TW
       number_format:数字格式化输出的格式
       boolean_format:布尔值格式化输出的格式
       date_format,time_format,datetime_format:日期时间格式化输出的格式
       time_zone:格式化输出日期时间所使用的时区。
       url_escaping_charset:URL编码的字符集。

  k) 自定义指令:<#macro 指令名 属性名...>...</#macro>
     用自定义指令写的一个分页标签参见本人博客:http://blog.csdn.net/qjyong/archive/2009/10/18/4693142.aspx

 

6. Web应用中整合FreeMarker:FreeMarker提供了FreemarkerServlet类来整合模板到Web应用中:
  1) 这个Servlet在数据模型中放置了三个Hash结构:
      Request, Session, Application,分别用来访问请求,会话,应用上下文中的属性。
      访问作用域中的属性时,没有指定Hash结构名,它会依次按Request,Session,Application顺序搜索。
  2) 它还提供了一个名为RequestParameters的Hash结构,用来访问HTTP请求中的参数数据。
 
7. Struts2中整合FreeMarker: Struts2默认就是使用FreeMarker来产生所有UI标签的HTML标记。
  1) 提供了FreeMarkerResult来支持FTL页面。
     <result type="freemarker">/templates/info.ftl</result>
  2) FreeMarker针对Struts2提供了以下内置Hash结构:
     a) stack: 代表ValueStack本身

     b) action: 代表刚刚执行过的Action实例
     c) response: 代表HpptServletResponse实例
     d) res: 代表HpptServletResponse实例
     e) request: 代表HpptServletRequest实例
     f) req: 代表HpptServletRequest实例
     g) session: 代表HpptSession实例
     h) application: 代表ServletContext实例
     i) base: 代表用户请求的上下文路径

 

8. 使用FreeMarker完成页面的静态化:

FreeMarker官方参考文档总共有四份,它们分别是  Designer's Guide(网上已有翻译,主要从FreeMarker 的概念上介绍)  Programmer's Guide(本文档所以翻译的部分,主要从框架的设计方面介绍)  XML Processing Guide(对XML数据模型处理的介绍)  Reference(FreeMarker 的参考文档,语言使用介绍) 中文翻译之所以选择 Programmer's Guide 是因为个人觉得该部分对如何实现 FreeMarker 进行了比较深入的阐述。有助于读者很好的了解其运作机制,以及去理解其他 模板引擎(如Velocity)的工作机理。 注:由于原文档部分内容直译可能难于被读者理解,所以有些地方采用意译为主,因此在翻译用词上 难 免 可 能 会 有 出 入 , 大 家 对 翻 译 的 内 容 有 任 何 意 见 都 可 以 给 我 直 接 发 邮 件 告 知 motomagice@yahoo.com.cn 目录 前言.........................................................................3 一、快速入门..............................................................4 1.1、创建配置实例..............................................................................4 1.2、创建数据模型(Data Model) ..........................................................4 1.3、获取模版(template) ..................................................................5 1.4、把模版与数据模型合并...................................................................6 1.5、完整的代码 ................................................................................6 二、数据模型(Data Model) ..........................................7 2.1、基础类型...................................................................................7 2.2、Scalar类型(单值对应的Data Model)...............................................8 2.3、容器类型...................................................................................8 2.4、方法变量...................................................................................9 2.5、转换器变量 .............................................................................. 10 2.6、节点变量................................................................................. 12 2.7、对象包裹................................................................................. 12 三、配置(Configuration)........................................... 15 3.1、基础....................................................................................... 15 3.2、共享变量................................................................................. 15 3.3、配置参数................................................................................. 16 3.4、加载模板................................................................................. 17 3.5、异常处理................................................................................. 19 四、其它说明............................................................ 20 4.1、变量....................................................................................... 20 4.2、字符编码................................................................................. 20 4.3、多线程.................................................................................... 21 4.5、Bean 包裹................................................................................ 21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值